Lines Matching +full:min +full:- +full:output +full:- +full:impedance

1 // SPDX-License-Identifier: GPL-2.0-only
2 // Copyright (c) 2018-2020, The Linux Foundation. All rights reserved.
20 #include <sound/soc-dapm.h>
24 #include "wcd-clsh-v2.h"
25 #include "wcd-mbhc-v2.h"
191 static const SNDRV_CTL_TLVD_DECLARE_DB_MINMAX(ear_pa_gain, 600, -1800);
192 static const DECLARE_TLV_DB_SCALE(line_gain, -3000, 150, 0);
348 struct regmap *rm = wcd938x->regmap; in wcd938x_io_init()
407 port_num = ch_info->port_num; in wcd938x_sdw_connect_port()
408 ch_mask = ch_info->ch_mask; in wcd938x_sdw_connect_port()
410 port_config->num = port_num; in wcd938x_sdw_connect_port()
413 port_config->ch_mask |= ch_mask; in wcd938x_sdw_connect_port()
415 port_config->ch_mask &= ~ch_mask; in wcd938x_sdw_connect_port()
422 return wcd938x_sdw_connect_port(&wcd->ch_info[ch_id], in wcd938x_connect_port()
423 &wcd->port_config[port_num - 1], in wcd938x_connect_port()
431 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in wcd938x_codec_enable_rxclk()
470 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in wcd938x_codec_hphl_dac_event()
489 if (wcd938x->comp1_enable) { in wcd938x_codec_hphl_dac_event()
494 if (!wcd938x->comp2_enable || (snd_soc_component_read(component, in wcd938x_codec_hphl_dac_event()
524 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in wcd938x_codec_hphr_dac_event()
543 if (wcd938x->comp2_enable) { in wcd938x_codec_hphr_dac_event()
548 if (!wcd938x->comp1_enable || in wcd938x_codec_hphr_dac_event()
578 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in wcd938x_codec_ear_dac_event()
583 wcd938x->ear_rx_path = in wcd938x_codec_ear_dac_event()
586 if (wcd938x->ear_rx_path & EAR_RX_PATH_AUX) { in wcd938x_codec_ear_dac_event()
606 if (wcd938x->comp1_enable) in wcd938x_codec_ear_dac_event()
613 if (wcd938x->flyback_cur_det_disable == 0) in wcd938x_codec_ear_dac_event()
616 wcd938x->flyback_cur_det_disable++; in wcd938x_codec_ear_dac_event()
617 wcd_clsh_ctrl_set_state(wcd938x->clsh_info, in wcd938x_codec_ear_dac_event()
620 wcd938x->hph_mode); in wcd938x_codec_ear_dac_event()
623 if (wcd938x->ear_rx_path & EAR_RX_PATH_AUX) { in wcd938x_codec_ear_dac_event()
637 if (wcd938x->comp1_enable) in wcd938x_codec_ear_dac_event()
657 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in wcd938x_codec_aux_dac_event()
671 if (wcd938x->flyback_cur_det_disable == 0) in wcd938x_codec_aux_dac_event()
674 wcd938x->flyback_cur_det_disable++; in wcd938x_codec_aux_dac_event()
675 wcd_clsh_ctrl_set_state(wcd938x->clsh_info, in wcd938x_codec_aux_dac_event()
678 wcd938x->hph_mode); in wcd938x_codec_aux_dac_event()
693 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in wcd938x_codec_enable_hphr_pa()
695 int hph_mode = wcd938x->hph_mode; in wcd938x_codec_enable_hphr_pa()
699 if (wcd938x->ldoh) in wcd938x_codec_enable_hphr_pa()
702 wcd_clsh_ctrl_set_state(wcd938x->clsh_info, WCD_CLSH_EVENT_PRE_DAC, in wcd938x_codec_enable_hphr_pa()
704 wcd_clsh_set_hph_mode(wcd938x->clsh_info, CLS_H_HIFI); in wcd938x_codec_enable_hphr_pa()
714 wcd_clsh_set_hph_mode(wcd938x->clsh_info, hph_mode); in wcd938x_codec_enable_hphr_pa()
717 set_bit(HPH_PA_DELAY, &wcd938x->status_mask); in wcd938x_codec_enable_hphr_pa()
728 if (test_bit(HPH_PA_DELAY, &wcd938x->status_mask)) { in wcd938x_codec_enable_hphr_pa()
729 if (!wcd938x->comp2_enable) in wcd938x_codec_enable_hphr_pa()
739 clear_bit(HPH_PA_DELAY, &wcd938x->status_mask); in wcd938x_codec_enable_hphr_pa()
748 enable_irq(wcd938x->hphr_pdm_wd_int); in wcd938x_codec_enable_hphr_pa()
751 disable_irq_nosync(wcd938x->hphr_pdm_wd_int); in wcd938x_codec_enable_hphr_pa()
757 if (!wcd938x->comp2_enable) in wcd938x_codec_enable_hphr_pa()
763 wcd_mbhc_event_notify(wcd938x->wcd_mbhc, in wcd938x_codec_enable_hphr_pa()
765 set_bit(HPH_PA_DELAY, &wcd938x->status_mask); in wcd938x_codec_enable_hphr_pa()
773 if (test_bit(HPH_PA_DELAY, &wcd938x->status_mask)) { in wcd938x_codec_enable_hphr_pa()
774 if (!wcd938x->comp2_enable) in wcd938x_codec_enable_hphr_pa()
778 clear_bit(HPH_PA_DELAY, &wcd938x->status_mask); in wcd938x_codec_enable_hphr_pa()
780 wcd_mbhc_event_notify(wcd938x->wcd_mbhc, in wcd938x_codec_enable_hphr_pa()
786 wcd_clsh_ctrl_set_state(wcd938x->clsh_info, WCD_CLSH_EVENT_POST_PA, in wcd938x_codec_enable_hphr_pa()
788 if (wcd938x->ldoh) in wcd938x_codec_enable_hphr_pa()
800 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in wcd938x_codec_enable_hphl_pa()
802 int hph_mode = wcd938x->hph_mode; in wcd938x_codec_enable_hphl_pa()
806 if (wcd938x->ldoh) in wcd938x_codec_enable_hphl_pa()
809 wcd_clsh_ctrl_set_state(wcd938x->clsh_info, WCD_CLSH_EVENT_PRE_DAC, in wcd938x_codec_enable_hphl_pa()
811 wcd_clsh_set_hph_mode(wcd938x->clsh_info, CLS_H_HIFI); in wcd938x_codec_enable_hphl_pa()
820 wcd_clsh_set_hph_mode(wcd938x->clsh_info, hph_mode); in wcd938x_codec_enable_hphl_pa()
823 set_bit(HPH_PA_DELAY, &wcd938x->status_mask); in wcd938x_codec_enable_hphl_pa()
834 if (test_bit(HPH_PA_DELAY, &wcd938x->status_mask)) { in wcd938x_codec_enable_hphl_pa()
835 if (!wcd938x->comp1_enable) in wcd938x_codec_enable_hphl_pa()
844 clear_bit(HPH_PA_DELAY, &wcd938x->status_mask); in wcd938x_codec_enable_hphl_pa()
854 enable_irq(wcd938x->hphl_pdm_wd_int); in wcd938x_codec_enable_hphl_pa()
857 disable_irq_nosync(wcd938x->hphl_pdm_wd_int); in wcd938x_codec_enable_hphl_pa()
863 if (!wcd938x->comp1_enable) in wcd938x_codec_enable_hphl_pa()
869 wcd_mbhc_event_notify(wcd938x->wcd_mbhc, WCD_EVENT_PRE_HPHL_PA_OFF); in wcd938x_codec_enable_hphl_pa()
870 set_bit(HPH_PA_DELAY, &wcd938x->status_mask); in wcd938x_codec_enable_hphl_pa()
878 if (test_bit(HPH_PA_DELAY, &wcd938x->status_mask)) { in wcd938x_codec_enable_hphl_pa()
879 if (!wcd938x->comp1_enable) in wcd938x_codec_enable_hphl_pa()
883 clear_bit(HPH_PA_DELAY, &wcd938x->status_mask); in wcd938x_codec_enable_hphl_pa()
885 wcd_mbhc_event_notify(wcd938x->wcd_mbhc, in wcd938x_codec_enable_hphl_pa()
891 wcd_clsh_ctrl_set_state(wcd938x->clsh_info, WCD_CLSH_EVENT_POST_PA, in wcd938x_codec_enable_hphl_pa()
893 if (wcd938x->ldoh) in wcd938x_codec_enable_hphl_pa()
905 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in wcd938x_codec_enable_aux_pa()
907 int hph_mode = wcd938x->hph_mode; in wcd938x_codec_enable_aux_pa()
922 enable_irq(wcd938x->aux_pdm_wd_int); in wcd938x_codec_enable_aux_pa()
925 disable_irq_nosync(wcd938x->aux_pdm_wd_int); in wcd938x_codec_enable_aux_pa()
932 wcd_clsh_ctrl_set_state(wcd938x->clsh_info, in wcd938x_codec_enable_aux_pa()
937 wcd938x->flyback_cur_det_disable--; in wcd938x_codec_enable_aux_pa()
938 if (wcd938x->flyback_cur_det_disable == 0) in wcd938x_codec_enable_aux_pa()
949 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in wcd938x_codec_enable_ear_pa()
951 int hph_mode = wcd938x->hph_mode; in wcd938x_codec_enable_ear_pa()
959 wcd938x->ear_rx_path = snd_soc_component_read(component, in wcd938x_codec_enable_ear_pa()
961 if (wcd938x->ear_rx_path & EAR_RX_PATH_AUX) in wcd938x_codec_enable_ear_pa()
968 if (!wcd938x->comp1_enable) in wcd938x_codec_enable_ear_pa()
982 if (wcd938x->ear_rx_path & EAR_RX_PATH_AUX) in wcd938x_codec_enable_ear_pa()
983 enable_irq(wcd938x->aux_pdm_wd_int); in wcd938x_codec_enable_ear_pa()
985 enable_irq(wcd938x->hphl_pdm_wd_int); in wcd938x_codec_enable_ear_pa()
988 if (wcd938x->ear_rx_path & EAR_RX_PATH_AUX) in wcd938x_codec_enable_ear_pa()
989 disable_irq_nosync(wcd938x->aux_pdm_wd_int); in wcd938x_codec_enable_ear_pa()
991 disable_irq_nosync(wcd938x->hphl_pdm_wd_int); in wcd938x_codec_enable_ear_pa()
994 if (!wcd938x->comp1_enable) in wcd938x_codec_enable_ear_pa()
999 if (wcd938x->ear_rx_path & EAR_RX_PATH_AUX) in wcd938x_codec_enable_ear_pa()
1006 wcd_clsh_ctrl_set_state(wcd938x->clsh_info, WCD_CLSH_EVENT_POST_PA, in wcd938x_codec_enable_ear_pa()
1009 wcd938x->flyback_cur_det_disable--; in wcd938x_codec_enable_ear_pa()
1010 if (wcd938x->flyback_cur_det_disable == 0) in wcd938x_codec_enable_ear_pa()
1023 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in wcd938x_codec_enable_dmic()
1027 switch (w->shift) { in wcd938x_codec_enable_dmic()
1057 dev_err(component->dev, "%s: Invalid DMIC Selection\n", in wcd938x_codec_enable_dmic()
1059 return -EINVAL; in wcd938x_codec_enable_dmic()
1094 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in wcd938x_tx_swr_ctrl()
1099 bank = (wcd938x_swr_get_current_bank(wcd938x->sdw_priv[AIF1_CAP]->sdev)) ? 0 : 1; in wcd938x_tx_swr_ctrl()
1104 if (strnstr(w->name, "ADC", sizeof("ADC"))) { in wcd938x_tx_swr_ctrl()
1107 if (test_bit(WCD_ADC1, &wcd938x->status_mask)) in wcd938x_tx_swr_ctrl()
1108 mode |= tx_mode_bit[wcd938x->tx_mode[WCD_ADC1]]; in wcd938x_tx_swr_ctrl()
1109 if (test_bit(WCD_ADC2, &wcd938x->status_mask)) in wcd938x_tx_swr_ctrl()
1110 mode |= tx_mode_bit[wcd938x->tx_mode[WCD_ADC2]]; in wcd938x_tx_swr_ctrl()
1111 if (test_bit(WCD_ADC3, &wcd938x->status_mask)) in wcd938x_tx_swr_ctrl()
1112 mode |= tx_mode_bit[wcd938x->tx_mode[WCD_ADC3]]; in wcd938x_tx_swr_ctrl()
1113 if (test_bit(WCD_ADC4, &wcd938x->status_mask)) in wcd938x_tx_swr_ctrl()
1114 mode |= tx_mode_bit[wcd938x->tx_mode[WCD_ADC4]]; in wcd938x_tx_swr_ctrl()
1131 if (strnstr(w->name, "ADC", sizeof("ADC"))) { in wcd938x_tx_swr_ctrl()
1169 ret = -EINVAL; in wcd938x_get_adc_mode()
1178 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in wcd938x_codec_enable_adc()
1189 set_bit(w->shift, &wcd938x->status_mask); in wcd938x_codec_enable_adc()
1194 clear_bit(w->shift, &wcd938x->status_mask); in wcd938x_codec_enable_adc()
1233 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in wcd938x_adc_enable_req()
1245 wcd938x_tx_channel_config(component, w->shift, 1); in wcd938x_adc_enable_req()
1246 mode = wcd938x_get_adc_mode(wcd938x->tx_mode[w->shift]); in wcd938x_adc_enable_req()
1248 dev_info(component->dev, "Invalid ADC mode\n"); in wcd938x_adc_enable_req()
1249 return -EINVAL; in wcd938x_adc_enable_req()
1251 switch (w->shift) { in wcd938x_adc_enable_req()
1288 wcd938x_tx_channel_config(component, w->shift, 0); in wcd938x_adc_enable_req()
1291 switch (w->shift) { in wcd938x_adc_enable_req()
1340 int micb_index = micb_num - 1; in wcd938x_micbias_control()
1357 dev_err(component->dev, "%s: Invalid micbias number: %d\n", in wcd938x_micbias_control()
1359 return -EINVAL; in wcd938x_micbias_control()
1364 wcd938x->pullup_ref[micb_index]++; in wcd938x_micbias_control()
1365 if ((wcd938x->pullup_ref[micb_index] == 1) && in wcd938x_micbias_control()
1366 (wcd938x->micb_ref[micb_index] == 0)) in wcd938x_micbias_control()
1372 if (wcd938x->pullup_ref[micb_index] > 0) in wcd938x_micbias_control()
1373 wcd938x->pullup_ref[micb_index]--; in wcd938x_micbias_control()
1375 if ((wcd938x->pullup_ref[micb_index] == 0) && in wcd938x_micbias_control()
1376 (wcd938x->micb_ref[micb_index] == 0)) in wcd938x_micbias_control()
1381 wcd938x->micb_ref[micb_index]++; in wcd938x_micbias_control()
1382 if (wcd938x->micb_ref[micb_index] == 1) { in wcd938x_micbias_control()
1397 wcd_mbhc_event_notify(wcd938x->wcd_mbhc, in wcd938x_micbias_control()
1401 wcd_mbhc_event_notify(wcd938x->wcd_mbhc, in wcd938x_micbias_control()
1407 if (wcd938x->micb_ref[micb_index] > 0) in wcd938x_micbias_control()
1408 wcd938x->micb_ref[micb_index]--; in wcd938x_micbias_control()
1410 if ((wcd938x->micb_ref[micb_index] == 0) && in wcd938x_micbias_control()
1411 (wcd938x->pullup_ref[micb_index] > 0)) in wcd938x_micbias_control()
1415 else if ((wcd938x->micb_ref[micb_index] == 0) && in wcd938x_micbias_control()
1416 (wcd938x->pullup_ref[micb_index] == 0)) { in wcd938x_micbias_control()
1418 wcd_mbhc_event_notify(wcd938x->wcd_mbhc, in wcd938x_micbias_control()
1424 wcd_mbhc_event_notify(wcd938x->wcd_mbhc, in wcd938x_micbias_control()
1428 wcd_mbhc_event_notify(wcd938x->wcd_mbhc, in wcd938x_micbias_control()
1440 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in wcd938x_codec_enable_micbias()
1441 int micb_num = w->shift; in wcd938x_codec_enable_micbias()
1463 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in wcd938x_codec_enable_micbias_pullup()
1464 int micb_num = w->shift; in wcd938x_codec_enable_micbias_pullup()
1489 struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; in wcd938x_tx_mode_get()
1490 int path = e->shift_l; in wcd938x_tx_mode_get()
1492 ucontrol->value.enumerated.item[0] = wcd938x->tx_mode[path]; in wcd938x_tx_mode_get()
1502 struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; in wcd938x_tx_mode_put()
1503 int path = e->shift_l; in wcd938x_tx_mode_put()
1505 if (wcd938x->tx_mode[path] == ucontrol->value.enumerated.item[0]) in wcd938x_tx_mode_put()
1508 wcd938x->tx_mode[path] = ucontrol->value.enumerated.item[0]; in wcd938x_tx_mode_put()
1519 ucontrol->value.enumerated.item[0] = wcd938x->hph_mode; in wcd938x_rx_hph_mode_get()
1530 if (wcd938x->hph_mode == ucontrol->value.enumerated.item[0]) in wcd938x_rx_hph_mode_put()
1533 wcd938x->hph_mode = ucontrol->value.enumerated.item[0]; in wcd938x_rx_hph_mode_put()
1544 if (wcd938x->comp1_enable) { in wcd938x_ear_pa_put_gain()
1545 dev_err(component->dev, "Can not set EAR PA Gain, compander1 is enabled\n"); in wcd938x_ear_pa_put_gain()
1546 return -EINVAL; in wcd938x_ear_pa_put_gain()
1551 ucontrol->value.integer.value[0]); in wcd938x_ear_pa_put_gain()
1565 mc = (struct soc_mixer_control *)(kcontrol->private_value); in wcd938x_get_compander()
1566 hphr = mc->shift; in wcd938x_get_compander()
1569 ucontrol->value.integer.value[0] = wcd938x->comp2_enable; in wcd938x_get_compander()
1571 ucontrol->value.integer.value[0] = wcd938x->comp1_enable; in wcd938x_get_compander()
1582 int value = ucontrol->value.integer.value[0]; in wcd938x_set_compander()
1587 mc = (struct soc_mixer_control *)(kcontrol->private_value); in wcd938x_set_compander()
1588 hphr = mc->shift; in wcd938x_set_compander()
1590 wcd = wcd938x->sdw_priv[AIF1_PB]; in wcd938x_set_compander()
1593 wcd938x->comp2_enable = value; in wcd938x_set_compander()
1595 wcd938x->comp1_enable = value; in wcd938x_set_compander()
1597 portidx = wcd->ch_info[mc->reg].port_num; in wcd938x_set_compander()
1600 wcd938x_connect_port(wcd, portidx, mc->reg, true); in wcd938x_set_compander()
1602 wcd938x_connect_port(wcd, portidx, mc->reg, false); in wcd938x_set_compander()
1613 ucontrol->value.integer.value[0] = wcd938x->ldoh; in wcd938x_ldoh_get()
1624 if (wcd938x->ldoh == ucontrol->value.integer.value[0]) in wcd938x_ldoh_put()
1627 wcd938x->ldoh = ucontrol->value.integer.value[0]; in wcd938x_ldoh_put()
1854 struct soc_mixer_control *mixer = (struct soc_mixer_control *)kcontrol->private_value; in wcd938x_get_swr_port()
1855 int dai_id = mixer->shift; in wcd938x_get_swr_port()
1856 int portidx, ch_idx = mixer->reg; in wcd938x_get_swr_port()
1859 wcd = wcd938x->sdw_priv[dai_id]; in wcd938x_get_swr_port()
1860 portidx = wcd->ch_info[ch_idx].port_num; in wcd938x_get_swr_port()
1862 ucontrol->value.integer.value[0] = wcd->port_enable[portidx]; in wcd938x_get_swr_port()
1874 (struct soc_mixer_control *)kcontrol->private_value; in wcd938x_set_swr_port()
1875 int ch_idx = mixer->reg; in wcd938x_set_swr_port()
1877 int dai_id = mixer->shift; in wcd938x_set_swr_port()
1880 wcd = wcd938x->sdw_priv[dai_id]; in wcd938x_set_swr_port()
1882 portidx = wcd->ch_info[ch_idx].port_num; in wcd938x_set_swr_port()
1883 if (ucontrol->value.integer.value[0]) in wcd938x_set_swr_port()
1888 wcd->port_enable[portidx] = enable; in wcd938x_set_swr_port()
1918 dev_err(component->dev, "%s: invalid number of buttons: %d\n", in wcd938x_mbhc_program_btn_thr()
1927 dev_dbg(component->dev, "%s: btn_high[%d]: %d, vth: %d\n", in wcd938x_mbhc_program_btn_thr()
1982 /* min micbias voltage is 1V and maximum is 2.85V */ in wcd938x_get_micb_vout_ctl_val()
1984 return -EINVAL; in wcd938x_get_micb_vout_ctl_val()
1986 return (micb_mv - 1000) / 50; in wcd938x_get_micb_vout_ctl_val()
2009 return -EINVAL; in wcd938x_mbhc_micb_adjust_voltage()
2011 mutex_lock(&wcd938x->micb_lock); in wcd938x_mbhc_micb_adjust_voltage()
2016 * to avoid slow micbias ramp-up or down enable pull-up in wcd938x_mbhc_micb_adjust_voltage()
2017 * momentarily, change the micbias value and then re-enable in wcd938x_mbhc_micb_adjust_voltage()
2027 ret = -EINVAL; in wcd938x_mbhc_micb_adjust_voltage()
2056 mutex_unlock(&wcd938x->micb_lock); in wcd938x_mbhc_micb_adjust_voltage()
2067 return -EINVAL; in wcd938x_mbhc_micb_ctrl_threshold_mic()
2073 if (wcd938x->micb2_mv >= WCD_MBHC_THR_HS_MICB_MV) in wcd938x_mbhc_micb_ctrl_threshold_mic()
2076 micb_mv = req_en ? WCD_MBHC_THR_HS_MICB_MV : wcd938x->micb2_mv; in wcd938x_mbhc_micb_ctrl_threshold_mic()
2095 regmap_update_bits(wcd938x->regmap, WCD938X_ANA_MBHC_ZDET, 0x20, 0x20); in wcd938x_mbhc_get_result_params()
2097 regmap_read(wcd938x->regmap, WCD938X_ANA_MBHC_RESULT_2, &val); in wcd938x_mbhc_get_result_params()
2102 regmap_read(wcd938x->regmap, WCD938X_ANA_MBHC_RESULT_1, &val1); in wcd938x_mbhc_get_result_params()
2104 regmap_update_bits(wcd938x->regmap, WCD938X_ANA_MBHC_ZDET, 0x20, 0x00); in wcd938x_mbhc_get_result_params()
2112 dev_err(component->dev, "Impedance detect ramp error, c1=%d, x1=0x%x\n", in wcd938x_mbhc_get_result_params()
2117 denom = (x1 * d1) - (1 << (14 - noff)); in wcd938x_mbhc_get_result_params()
2123 dev_dbg(component->dev, "%s: d1=%d, c1=%d, x1=0x%x, z_val=%d (milliohm)\n", in wcd938x_mbhc_get_result_params()
2128 regmap_read(wcd938x->regmap, in wcd938x_mbhc_get_result_params()
2130 regmap_read(wcd938x->regmap, in wcd938x_mbhc_get_result_params()
2149 WCD938X_ZDET_MAXV_CTL_MASK, zdet_param->ldo_ctl); in wcd938x_mbhc_zdet_ramp()
2151 WCD938X_VTH_MASK, zdet_param->btn5); in wcd938x_mbhc_zdet_ramp()
2153 WCD938X_VTH_MASK, zdet_param->btn6); in wcd938x_mbhc_zdet_ramp()
2155 WCD938X_VTH_MASK, zdet_param->btn7); in wcd938x_mbhc_zdet_ramp()
2157 WCD938X_ZDET_RANGE_CTL_MASK, zdet_param->noff); in wcd938x_mbhc_zdet_ramp()
2159 0x0F, zdet_param->nshift); in wcd938x_mbhc_zdet_ramp()
2163 /* Start impedance measurement for HPH_L */ in wcd938x_mbhc_zdet_ramp()
2164 regmap_update_bits(wcd938x->regmap, in wcd938x_mbhc_zdet_ramp()
2166 dev_dbg(component->dev, "%s: ramp for HPH_L, noff = %d\n", in wcd938x_mbhc_zdet_ramp()
2167 __func__, zdet_param->noff); in wcd938x_mbhc_zdet_ramp()
2168 wcd938x_mbhc_get_result_params(component, d1_a, zdet_param->noff, &zdet); in wcd938x_mbhc_zdet_ramp()
2169 regmap_update_bits(wcd938x->regmap, in wcd938x_mbhc_zdet_ramp()
2177 /* Start impedance measurement for HPH_R */ in wcd938x_mbhc_zdet_ramp()
2178 regmap_update_bits(wcd938x->regmap, in wcd938x_mbhc_zdet_ramp()
2180 dev_dbg(component->dev, "%s: ramp for HPH_R, noff = %d\n", in wcd938x_mbhc_zdet_ramp()
2181 __func__, zdet_param->noff); in wcd938x_mbhc_zdet_ramp()
2182 wcd938x_mbhc_get_result_params(component, d1_a, zdet_param->noff, &zdet); in wcd938x_mbhc_zdet_ramp()
2183 regmap_update_bits(wcd938x->regmap, in wcd938x_mbhc_zdet_ramp()
2202 q1_cal = (10000 - ((q1 & 0x7F) * 25)); in wcd938x_wcd_mbhc_qfuse_cal()
2240 regmap_update_bits(wcd938x->regmap, in wcd938x_wcd_mbhc_calc_impedance()
2244 /* For NO-jack, disable L_DET_EN before Z-det measurements */ in wcd938x_wcd_mbhc_calc_impedance()
2245 if (wcd938x->mbhc_cfg.hphl_swh) in wcd938x_wcd_mbhc_calc_impedance()
2246 regmap_update_bits(wcd938x->regmap, in wcd938x_wcd_mbhc_calc_impedance()
2250 regmap_update_bits(wcd938x->regmap, in wcd938x_wcd_mbhc_calc_impedance()
2253 /* Disable surge protection before impedance detection. in wcd938x_wcd_mbhc_calc_impedance()
2254 * This is done to give correct value for high impedance. in wcd938x_wcd_mbhc_calc_impedance()
2256 regmap_update_bits(wcd938x->regmap, in wcd938x_wcd_mbhc_calc_impedance()
2261 /* First get impedance on Left */ in wcd938x_wcd_mbhc_calc_impedance()
2293 dev_dbg(component->dev, "%s: impedance on HPH_L = %d(ohms)\n", in wcd938x_wcd_mbhc_calc_impedance()
2296 /* Start of right impedance ramp and calculation */ in wcd938x_wcd_mbhc_calc_impedance()
2300 (zdet_param_ptr->noff == 0x6)) || in wcd938x_wcd_mbhc_calc_impedance()
2325 dev_dbg(component->dev, "%s: impedance on HPH_R = %d(ohms)\n", in wcd938x_wcd_mbhc_calc_impedance()
2331 dev_dbg(component->dev, in wcd938x_wcd_mbhc_calc_impedance()
2340 dev_dbg(component->dev, in wcd938x_wcd_mbhc_calc_impedance()
2343 wcd_mbhc_set_hph_type(wcd938x->wcd_mbhc, WCD_MBHC_HPH_MONO); in wcd938x_wcd_mbhc_calc_impedance()
2362 z_diff1 = (z1Ls > zMono) ? (z1Ls - zMono) : (zMono - z1Ls); in wcd938x_wcd_mbhc_calc_impedance()
2363 z_diff2 = ((*zl) > z1Ls) ? ((*zl) - z1Ls) : (z1Ls - (*zl)); in wcd938x_wcd_mbhc_calc_impedance()
2365 dev_dbg(component->dev, "%s: stereo plug type detected\n", in wcd938x_wcd_mbhc_calc_impedance()
2367 wcd_mbhc_set_hph_type(wcd938x->wcd_mbhc, WCD_MBHC_HPH_STEREO); in wcd938x_wcd_mbhc_calc_impedance()
2369 dev_dbg(component->dev, "%s: MONO plug type detected\n", in wcd938x_wcd_mbhc_calc_impedance()
2371 wcd_mbhc_set_hph_type(wcd938x->wcd_mbhc, WCD_MBHC_HPH_MONO); in wcd938x_wcd_mbhc_calc_impedance()
2374 /* Enable surge protection again after impedance detection */ in wcd938x_wcd_mbhc_calc_impedance()
2375 regmap_update_bits(wcd938x->regmap, in wcd938x_wcd_mbhc_calc_impedance()
2382 regmap_update_bits(wcd938x->regmap, in wcd938x_wcd_mbhc_calc_impedance()
2385 /* For NO-jack, re-enable L_DET_EN after Z-det measurements */ in wcd938x_wcd_mbhc_calc_impedance()
2386 if (wcd938x->mbhc_cfg.hphl_swh) in wcd938x_wcd_mbhc_calc_impedance()
2387 regmap_update_bits(wcd938x->regmap, in wcd938x_wcd_mbhc_calc_impedance()
2393 regmap_update_bits(wcd938x->regmap, in wcd938x_wcd_mbhc_calc_impedance()
2426 if (wcd938x->mbhc_cfg.moist_rref == R_OFF) { in wcd938x_mbhc_moisture_config()
2433 if (!wcd938x->mbhc_cfg.hphl_swh) { in wcd938x_mbhc_moisture_config()
2434 dev_dbg(component->dev, "%s: disable moisture detection for NC\n", in wcd938x_mbhc_moisture_config()
2442 WCD938X_M_RTH_CTL_MASK, wcd938x->mbhc_cfg.moist_rref); in wcd938x_mbhc_moisture_config()
2451 WCD938X_M_RTH_CTL_MASK, wcd938x->mbhc_cfg.moist_rref); in wcd938x_mbhc_moisture_detect_en()
2462 if (wcd938x->mbhc_cfg.moist_rref == R_OFF) { in wcd938x_mbhc_get_moisture_status()
2469 if (!wcd938x->mbhc_cfg.hphl_swh) { in wcd938x_mbhc_get_moisture_status()
2470 dev_dbg(component->dev, "%s: disable moisture detection for NC\n", in wcd938x_mbhc_get_moisture_status()
2526 ucontrol->value.integer.value[0] = wcd_mbhc_get_hph_type(wcd938x->wcd_mbhc); in wcd938x_get_hph_type()
2541 mc = (struct soc_mixer_control *)(kcontrol->private_value); in wcd938x_hph_impedance_get()
2542 hphr = mc->shift; in wcd938x_hph_impedance_get()
2543 wcd_mbhc_get_impedance(wcd938x->wcd_mbhc, &zl, &zr); in wcd938x_hph_impedance_get()
2544 dev_dbg(component->dev, "%s: zl=%u(ohms), zr=%u(ohms)\n", __func__, zl, zr); in wcd938x_hph_impedance_get()
2545 ucontrol->value.integer.value[0] = hphr ? zr : zl; in wcd938x_hph_impedance_get()
2556 SOC_SINGLE_EXT("HPHL Impedance", 0, 0, INT_MAX, 0,
2558 SOC_SINGLE_EXT("HPHR Impedance", 0, 1, INT_MAX, 0,
2565 struct wcd_mbhc_intr *intr_ids = &wcd938x->intr_ids; in wcd938x_mbhc_init()
2567 intr_ids->mbhc_sw_intr = regmap_irq_get_virq(wcd938x->irq_chip, in wcd938x_mbhc_init()
2569 intr_ids->mbhc_btn_press_intr = regmap_irq_get_virq(wcd938x->irq_chip, in wcd938x_mbhc_init()
2571 intr_ids->mbhc_btn_release_intr = regmap_irq_get_virq(wcd938x->irq_chip, in wcd938x_mbhc_init()
2573 intr_ids->mbhc_hs_ins_intr = regmap_irq_get_virq(wcd938x->irq_chip, in wcd938x_mbhc_init()
2575 intr_ids->mbhc_hs_rem_intr = regmap_irq_get_virq(wcd938x->irq_chip, in wcd938x_mbhc_init()
2577 intr_ids->hph_left_ocp = regmap_irq_get_virq(wcd938x->irq_chip, in wcd938x_mbhc_init()
2579 intr_ids->hph_right_ocp = regmap_irq_get_virq(wcd938x->irq_chip, in wcd938x_mbhc_init()
2582 wcd938x->wcd_mbhc = wcd_mbhc_init(component, &mbhc_cb, intr_ids, wcd_mbhc_fields, true); in wcd938x_mbhc_init()
2583 if (IS_ERR(wcd938x->wcd_mbhc)) in wcd938x_mbhc_init()
2584 return PTR_ERR(wcd938x->wcd_mbhc); in wcd938x_mbhc_init()
2598 wcd_mbhc_deinit(wcd938x->wcd_mbhc); in wcd938x_mbhc_deinit()
2805 /*output widgets tx*/
2882 /*output widgets rx*/
2986 vout_ctl_1 = wcd938x_get_micb_vout_ctl_val(wcd938x->micb1_mv); in wcd938x_set_micbias_data()
2987 vout_ctl_2 = wcd938x_get_micb_vout_ctl_val(wcd938x->micb2_mv); in wcd938x_set_micbias_data()
2988 vout_ctl_3 = wcd938x_get_micb_vout_ctl_val(wcd938x->micb3_mv); in wcd938x_set_micbias_data()
2989 vout_ctl_4 = wcd938x_get_micb_vout_ctl_val(wcd938x->micb4_mv); in wcd938x_set_micbias_data()
2991 return -EINVAL; in wcd938x_set_micbias_data()
2993 regmap_update_bits(wcd938x->regmap, WCD938X_ANA_MICB1, in wcd938x_set_micbias_data()
2995 regmap_update_bits(wcd938x->regmap, WCD938X_ANA_MICB2, in wcd938x_set_micbias_data()
2997 regmap_update_bits(wcd938x->regmap, WCD938X_ANA_MICB3, in wcd938x_set_micbias_data()
2999 regmap_update_bits(wcd938x->regmap, WCD938X_ANA_MICB4, in wcd938x_set_micbias_data()
3031 wcd->virq = irq_domain_create_linear(NULL, 1, &wcd_domain_ops, NULL); in wcd938x_irq_init()
3032 if (!(wcd->virq)) { in wcd938x_irq_init()
3034 return -EINVAL; in wcd938x_irq_init()
3037 return devm_regmap_add_irq_chip(dev, wcd->regmap, in wcd938x_irq_init()
3038 irq_create_mapping(wcd->virq, 0), in wcd938x_irq_init()
3040 &wcd->irq_chip); in wcd938x_irq_init()
3046 struct sdw_slave *tx_sdw_dev = wcd938x->tx_sdw_dev; in wcd938x_soc_codec_probe()
3047 struct device *dev = component->dev; in wcd938x_soc_codec_probe()
3051 time_left = wait_for_completion_timeout(&tx_sdw_dev->initialization_complete, in wcd938x_soc_codec_probe()
3055 return -ETIMEDOUT; in wcd938x_soc_codec_probe()
3058 snd_soc_component_init_regmap(component, wcd938x->regmap); in wcd938x_soc_codec_probe()
3064 wcd938x->variant = snd_soc_component_read_field(component, in wcd938x_soc_codec_probe()
3068 wcd938x->clsh_info = wcd_clsh_ctrl_alloc(component, WCD938X); in wcd938x_soc_codec_probe()
3069 if (IS_ERR(wcd938x->clsh_info)) { in wcd938x_soc_codec_probe()
3071 return PTR_ERR(wcd938x->clsh_info); in wcd938x_soc_codec_probe()
3077 regmap_write(wcd938x->regmap, in wcd938x_soc_codec_probe()
3083 wcd938x->hphr_pdm_wd_int = regmap_irq_get_virq(wcd938x->irq_chip, in wcd938x_soc_codec_probe()
3085 wcd938x->hphl_pdm_wd_int = regmap_irq_get_virq(wcd938x->irq_chip, in wcd938x_soc_codec_probe()
3087 wcd938x->aux_pdm_wd_int = regmap_irq_get_virq(wcd938x->irq_chip, in wcd938x_soc_codec_probe()
3091 ret = request_threaded_irq(wcd938x->hphr_pdm_wd_int, NULL, wcd938x_wd_handle_irq, in wcd938x_soc_codec_probe()
3099 ret = request_threaded_irq(wcd938x->hphl_pdm_wd_int, NULL, wcd938x_wd_handle_irq, in wcd938x_soc_codec_probe()
3107 ret = request_threaded_irq(wcd938x->aux_pdm_wd_int, NULL, wcd938x_wd_handle_irq, in wcd938x_soc_codec_probe()
3116 disable_irq_nosync(wcd938x->hphr_pdm_wd_int); in wcd938x_soc_codec_probe()
3117 disable_irq_nosync(wcd938x->hphl_pdm_wd_int); in wcd938x_soc_codec_probe()
3118 disable_irq_nosync(wcd938x->aux_pdm_wd_int); in wcd938x_soc_codec_probe()
3120 switch (wcd938x->variant) { in wcd938x_soc_codec_probe()
3125 dev_err(component->dev, in wcd938x_soc_codec_probe()
3127 __func__, wcd938x->variant); in wcd938x_soc_codec_probe()
3135 dev_err(component->dev, in wcd938x_soc_codec_probe()
3137 __func__, wcd938x->variant); in wcd938x_soc_codec_probe()
3147 dev_err(component->dev, "mbhc initialization failed\n"); in wcd938x_soc_codec_probe()
3154 free_irq(wcd938x->aux_pdm_wd_int, wcd938x); in wcd938x_soc_codec_probe()
3156 free_irq(wcd938x->hphl_pdm_wd_int, wcd938x); in wcd938x_soc_codec_probe()
3158 free_irq(wcd938x->hphr_pdm_wd_int, wcd938x); in wcd938x_soc_codec_probe()
3160 wcd_clsh_ctrl_free(wcd938x->clsh_info); in wcd938x_soc_codec_probe()
3171 free_irq(wcd938x->aux_pdm_wd_int, wcd938x); in wcd938x_soc_codec_remove()
3172 free_irq(wcd938x->hphl_pdm_wd_int, wcd938x); in wcd938x_soc_codec_remove()
3173 free_irq(wcd938x->hphr_pdm_wd_int, wcd938x); in wcd938x_soc_codec_remove()
3175 wcd_clsh_ctrl_free(wcd938x->clsh_info); in wcd938x_soc_codec_remove()
3181 struct wcd938x_priv *wcd = dev_get_drvdata(comp->dev); in wcd938x_codec_set_jack()
3184 return wcd_mbhc_start(wcd->wcd_mbhc, &wcd->mbhc_cfg, jack); in wcd938x_codec_set_jack()
3186 wcd_mbhc_stop(wcd->wcd_mbhc); in wcd938x_codec_set_jack()
3207 struct device_node *np = dev->of_node; in wcd938x_dt_parse_micbias_info()
3211 rc = of_property_read_u32(np, "qcom,micbias1-microvolt", &prop_val); in wcd938x_dt_parse_micbias_info()
3213 wcd->micb1_mv = prop_val/1000; in wcd938x_dt_parse_micbias_info()
3217 rc = of_property_read_u32(np, "qcom,micbias2-microvolt", &prop_val); in wcd938x_dt_parse_micbias_info()
3219 wcd->micb2_mv = prop_val/1000; in wcd938x_dt_parse_micbias_info()
3223 rc = of_property_read_u32(np, "qcom,micbias3-microvolt", &prop_val); in wcd938x_dt_parse_micbias_info()
3225 wcd->micb3_mv = prop_val/1000; in wcd938x_dt_parse_micbias_info()
3229 rc = of_property_read_u32(np, "qcom,micbias4-microvolt", &prop_val); in wcd938x_dt_parse_micbias_info()
3231 wcd->micb4_mv = prop_val/1000; in wcd938x_dt_parse_micbias_info()
3239 struct device *dev = component->dev; in wcd938x_swap_gnd_mic()
3242 if (wcd938x->us_euro_mux) { in wcd938x_swap_gnd_mic()
3243 if (wcd938x->mux_setup_done) in wcd938x_swap_gnd_mic()
3244 mux_control_deselect(wcd938x->us_euro_mux); in wcd938x_swap_gnd_mic()
3246 ret = mux_control_try_select(wcd938x->us_euro_mux, !wcd938x->mux_state); in wcd938x_swap_gnd_mic()
3249 wcd938x->mux_setup_done = false; in wcd938x_swap_gnd_mic()
3252 wcd938x->mux_setup_done = true; in wcd938x_swap_gnd_mic()
3254 gpiod_set_value(wcd938x->us_euro_gpio, !wcd938x->mux_state); in wcd938x_swap_gnd_mic()
3257 wcd938x->mux_state = !wcd938x->mux_state; in wcd938x_swap_gnd_mic()
3265 struct wcd_mbhc_config *cfg = &wcd938x->mbhc_cfg; in wcd938x_populate_dt_data()
3268 wcd938x->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_LOW); in wcd938x_populate_dt_data()
3269 if (IS_ERR(wcd938x->reset_gpio)) in wcd938x_populate_dt_data()
3270 return dev_err_probe(dev, PTR_ERR(wcd938x->reset_gpio), in wcd938x_populate_dt_data()
3273 if (of_property_present(dev->of_node, "mux-controls")) { in wcd938x_populate_dt_data()
3274 wcd938x->us_euro_mux = devm_mux_control_get(dev, NULL); in wcd938x_populate_dt_data()
3275 if (IS_ERR(wcd938x->us_euro_mux)) { in wcd938x_populate_dt_data()
3276 ret = PTR_ERR(wcd938x->us_euro_mux); in wcd938x_populate_dt_data()
3280 ret = mux_control_try_select(wcd938x->us_euro_mux, wcd938x->mux_state); in wcd938x_populate_dt_data()
3285 wcd938x->mux_setup_done = true; in wcd938x_populate_dt_data()
3287 wcd938x->us_euro_gpio = devm_gpiod_get_optional(dev, "us-euro", GPIOD_OUT_LOW); in wcd938x_populate_dt_data()
3288 if (IS_ERR(wcd938x->us_euro_gpio)) in wcd938x_populate_dt_data()
3289 return dev_err_probe(dev, PTR_ERR(wcd938x->us_euro_gpio), in wcd938x_populate_dt_data()
3290 "us-euro swap Control GPIO not found\n"); in wcd938x_populate_dt_data()
3293 cfg->swap_gnd_mic = wcd938x_swap_gnd_mic; in wcd938x_populate_dt_data()
3295 wcd938x->supplies[0].supply = "vdd-rxtx"; in wcd938x_populate_dt_data()
3296 wcd938x->supplies[1].supply = "vdd-io"; in wcd938x_populate_dt_data()
3297 wcd938x->supplies[2].supply = "vdd-buck"; in wcd938x_populate_dt_data()
3298 wcd938x->supplies[3].supply = "vdd-mic-bias"; in wcd938x_populate_dt_data()
3300 ret = regulator_bulk_get(dev, WCD938X_MAX_SUPPLY, wcd938x->supplies); in wcd938x_populate_dt_data()
3304 ret = regulator_bulk_enable(WCD938X_MAX_SUPPLY, wcd938x->supplies); in wcd938x_populate_dt_data()
3306 regulator_bulk_free(WCD938X_MAX_SUPPLY, wcd938x->supplies); in wcd938x_populate_dt_data()
3312 cfg->mbhc_micbias = MIC_BIAS_2; in wcd938x_populate_dt_data()
3313 cfg->anc_micbias = MIC_BIAS_2; in wcd938x_populate_dt_data()
3314 cfg->v_hs_max = WCD_MBHC_HS_V_MAX; in wcd938x_populate_dt_data()
3315 cfg->num_btn = WCD938X_MBHC_MAX_BUTTONS; in wcd938x_populate_dt_data()
3316 cfg->micb_mv = wcd938x->micb2_mv; in wcd938x_populate_dt_data()
3317 cfg->linein_th = 5000; in wcd938x_populate_dt_data()
3318 cfg->hs_thr = 1700; in wcd938x_populate_dt_data()
3319 cfg->hph_thr = 50; in wcd938x_populate_dt_data()
3328 gpiod_set_value(wcd938x->reset_gpio, 1); in wcd938x_reset()
3331 gpiod_set_value(wcd938x->reset_gpio, 0); in wcd938x_reset()
3342 struct wcd938x_priv *wcd938x = dev_get_drvdata(dai->dev); in wcd938x_codec_hw_params()
3343 struct wcd938x_sdw_priv *wcd = wcd938x->sdw_priv[dai->id]; in wcd938x_codec_hw_params()
3351 struct wcd938x_priv *wcd938x = dev_get_drvdata(dai->dev); in wcd938x_codec_free()
3352 struct wcd938x_sdw_priv *wcd = wcd938x->sdw_priv[dai->id]; in wcd938x_codec_free()
3360 struct wcd938x_priv *wcd938x = dev_get_drvdata(dai->dev); in wcd938x_codec_set_sdw_stream()
3361 struct wcd938x_sdw_priv *wcd = wcd938x->sdw_priv[dai->id]; in wcd938x_codec_set_sdw_stream()
3375 .name = "wcd938x-sdw-rx",
3388 .name = "wcd938x-sdw-tx",
3414 wcd938x->rxdev = wcd938x_sdw_device_get(wcd938x->rxnode); in wcd938x_bind()
3415 if (!wcd938x->rxdev) { in wcd938x_bind()
3417 ret = -EINVAL; in wcd938x_bind()
3420 wcd938x->sdw_priv[AIF1_PB] = dev_get_drvdata(wcd938x->rxdev); in wcd938x_bind()
3421 wcd938x->sdw_priv[AIF1_PB]->wcd938x = wcd938x; in wcd938x_bind()
3423 wcd938x->txdev = wcd938x_sdw_device_get(wcd938x->txnode); in wcd938x_bind()
3424 if (!wcd938x->txdev) { in wcd938x_bind()
3426 ret = -EINVAL; in wcd938x_bind()
3429 wcd938x->sdw_priv[AIF1_CAP] = dev_get_drvdata(wcd938x->txdev); in wcd938x_bind()
3430 wcd938x->sdw_priv[AIF1_CAP]->wcd938x = wcd938x; in wcd938x_bind()
3431 wcd938x->tx_sdw_dev = dev_to_sdw_dev(wcd938x->txdev); in wcd938x_bind()
3435 if (!device_link_add(wcd938x->rxdev, wcd938x->txdev, DL_FLAG_STATELESS | in wcd938x_bind()
3438 ret = -EINVAL; in wcd938x_bind()
3442 if (!device_link_add(dev, wcd938x->txdev, DL_FLAG_STATELESS | in wcd938x_bind()
3445 ret = -EINVAL; in wcd938x_bind()
3449 if (!device_link_add(dev, wcd938x->rxdev, DL_FLAG_STATELESS | in wcd938x_bind()
3452 ret = -EINVAL; in wcd938x_bind()
3456 wcd938x->regmap = dev_get_regmap(&wcd938x->tx_sdw_dev->dev, NULL); in wcd938x_bind()
3457 if (!wcd938x->regmap) { in wcd938x_bind()
3459 ret = -EINVAL; in wcd938x_bind()
3469 wcd938x->sdw_priv[AIF1_PB]->slave_irq = wcd938x->virq; in wcd938x_bind()
3470 wcd938x->sdw_priv[AIF1_CAP]->slave_irq = wcd938x->virq; in wcd938x_bind()
3489 device_link_remove(dev, wcd938x->rxdev); in wcd938x_bind()
3491 device_link_remove(dev, wcd938x->txdev); in wcd938x_bind()
3493 device_link_remove(wcd938x->rxdev, wcd938x->txdev); in wcd938x_bind()
3495 put_device(wcd938x->txdev); in wcd938x_bind()
3497 put_device(wcd938x->rxdev); in wcd938x_bind()
3509 device_link_remove(dev, wcd938x->txdev); in wcd938x_unbind()
3510 device_link_remove(dev, wcd938x->rxdev); in wcd938x_unbind()
3511 device_link_remove(wcd938x->rxdev, wcd938x->txdev); in wcd938x_unbind()
3512 put_device(wcd938x->txdev); in wcd938x_unbind()
3513 put_device(wcd938x->rxdev); in wcd938x_unbind()
3528 np = dev->of_node; in wcd938x_add_slave_components()
3530 wcd938x->rxnode = of_parse_phandle(np, "qcom,rx-device", 0); in wcd938x_add_slave_components()
3531 if (!wcd938x->rxnode) { in wcd938x_add_slave_components()
3532 dev_err(dev, "%s: Rx-device node not defined\n", __func__); in wcd938x_add_slave_components()
3533 return -ENODEV; in wcd938x_add_slave_components()
3536 of_node_get(wcd938x->rxnode); in wcd938x_add_slave_components()
3538 component_compare_of, wcd938x->rxnode); in wcd938x_add_slave_components()
3540 wcd938x->txnode = of_parse_phandle(np, "qcom,tx-device", 0); in wcd938x_add_slave_components()
3541 if (!wcd938x->txnode) { in wcd938x_add_slave_components()
3542 dev_err(dev, "%s: Tx-device node not defined\n", __func__); in wcd938x_add_slave_components()
3543 return -ENODEV; in wcd938x_add_slave_components()
3545 of_node_get(wcd938x->txnode); in wcd938x_add_slave_components()
3547 component_compare_of, wcd938x->txnode); in wcd938x_add_slave_components()
3555 struct device *dev = &pdev->dev; in wcd938x_probe()
3561 return -ENOMEM; in wcd938x_probe()
3564 mutex_init(&wcd938x->micb_lock); in wcd938x_probe()
3590 regulator_bulk_disable(WCD938X_MAX_SUPPLY, wcd938x->supplies); in wcd938x_probe()
3591 regulator_bulk_free(WCD938X_MAX_SUPPLY, wcd938x->supplies); in wcd938x_probe()
3598 struct device *dev = &pdev->dev; in wcd938x_remove()
3607 if (wcd938x->us_euro_mux && wcd938x->mux_setup_done) in wcd938x_remove()
3608 mux_control_deselect(wcd938x->us_euro_mux); in wcd938x_remove()
3610 regulator_bulk_disable(WCD938X_MAX_SUPPLY, wcd938x->supplies); in wcd938x_remove()
3611 regulator_bulk_free(WCD938X_MAX_SUPPLY, wcd938x->supplies); in wcd938x_remove()
3616 { .compatible = "qcom,wcd9380-codec" },
3617 { .compatible = "qcom,wcd9385-codec" },