Lines Matching +full:adc2 +full:-
1 // SPDX-License-Identifier: GPL-2.0-only
2 // Copyright (c) 2023-2024 Qualcomm Innovation Center, Inc. All rights reserved.
19 #include <sound/soc-dapm.h>
23 #include "wcd-clsh-v2.h"
24 #include "wcd-common.h"
25 #include "wcd-mbhc-v2.h"
112 "vdd-rxtx", "vdd-px", "vdd-mic-bias", "vdd-buck",
115 static const SNDRV_CTL_TLVD_DECLARE_DB_MINMAX(ear_pa_gain, 600, -1800);
211 regmap_write(wcd937x->regmap, WCD937X_DIGITAL_INTR_CLEAR_0, 0); in wcd937x_handle_post_irq()
212 regmap_write(wcd937x->regmap, WCD937X_DIGITAL_INTR_CLEAR_1, 0); in wcd937x_handle_post_irq()
213 regmap_write(wcd937x->regmap, WCD937X_DIGITAL_INTR_CLEAR_2, 0); in wcd937x_handle_post_irq()
242 gpiod_set_value(wcd937x->reset_gpio, 1); in wcd937x_reset()
244 gpiod_set_value(wcd937x->reset_gpio, 0); in wcd937x_reset()
302 if (atomic_read(&wcd937x->rx_clk_cnt)) in wcd937x_rx_clk_enable()
313 atomic_inc(&wcd937x->rx_clk_cnt); in wcd937x_rx_clk_enable()
322 if (!atomic_read(&wcd937x->rx_clk_cnt)) { in wcd937x_rx_clk_disable()
323 dev_err(component->dev, "clk already disabled\n"); in wcd937x_rx_clk_disable()
327 atomic_dec(&wcd937x->rx_clk_cnt); in wcd937x_rx_clk_disable()
340 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in wcd937x_codec_hphl_dac_event()
342 int hph_mode = wcd937x->hph_mode; in wcd937x_codec_hphl_dac_event()
356 set_bit(HPH_COMP_DELAY, &wcd937x->status_mask); in wcd937x_codec_hphl_dac_event()
368 if (wcd937x->comp1_enable) { in wcd937x_codec_hphl_dac_event()
376 if (wcd937x->comp2_enable) { in wcd937x_codec_hphl_dac_event()
384 if (test_bit(HPH_COMP_DELAY, &wcd937x->status_mask)) { in wcd937x_codec_hphl_dac_event()
386 clear_bit(HPH_COMP_DELAY, &wcd937x->status_mask); in wcd937x_codec_hphl_dac_event()
415 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in wcd937x_codec_hphr_dac_event()
417 int hph_mode = wcd937x->hph_mode; in wcd937x_codec_hphr_dac_event()
428 set_bit(HPH_COMP_DELAY, &wcd937x->status_mask); in wcd937x_codec_hphr_dac_event()
439 if (wcd937x->comp2_enable) { in wcd937x_codec_hphr_dac_event()
445 if (wcd937x->comp1_enable) { in wcd937x_codec_hphr_dac_event()
454 if (test_bit(HPH_COMP_DELAY, &wcd937x->status_mask)) { in wcd937x_codec_hphr_dac_event()
456 clear_bit(HPH_COMP_DELAY, &wcd937x->status_mask); in wcd937x_codec_hphr_dac_event()
484 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in wcd937x_codec_ear_dac_event()
486 int hph_mode = wcd937x->hph_mode; in wcd937x_codec_ear_dac_event()
506 if (wcd937x->comp1_enable) in wcd937x_codec_ear_dac_event()
513 wcd_clsh_ctrl_set_state(wcd937x->clsh_info, in wcd937x_codec_ear_dac_event()
525 if (wcd937x->comp1_enable) in wcd937x_codec_ear_dac_event()
539 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in wcd937x_codec_aux_dac_event()
541 int hph_mode = wcd937x->hph_mode; in wcd937x_codec_aux_dac_event()
555 wcd_clsh_ctrl_set_state(wcd937x->clsh_info, in wcd937x_codec_aux_dac_event()
575 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in wcd937x_codec_enable_hphr_pa()
577 int hph_mode = wcd937x->hph_mode; in wcd937x_codec_enable_hphr_pa()
581 wcd_clsh_ctrl_set_state(wcd937x->clsh_info, in wcd937x_codec_enable_hphr_pa()
588 set_bit(HPH_PA_DELAY, &wcd937x->status_mask); in wcd937x_codec_enable_hphr_pa()
594 if (test_bit(HPH_PA_DELAY, &wcd937x->status_mask)) { in wcd937x_codec_enable_hphr_pa()
595 if (wcd937x->comp2_enable) in wcd937x_codec_enable_hphr_pa()
599 clear_bit(HPH_PA_DELAY, &wcd937x->status_mask); in wcd937x_codec_enable_hphr_pa()
609 enable_irq(wcd937x->hphr_pdm_wd_int); in wcd937x_codec_enable_hphr_pa()
612 disable_irq_nosync(wcd937x->hphr_pdm_wd_int); in wcd937x_codec_enable_hphr_pa()
613 set_bit(HPH_PA_DELAY, &wcd937x->status_mask); in wcd937x_codec_enable_hphr_pa()
614 wcd_mbhc_event_notify(wcd937x->wcd_mbhc, WCD_EVENT_PRE_HPHR_PA_OFF); in wcd937x_codec_enable_hphr_pa()
617 if (test_bit(HPH_PA_DELAY, &wcd937x->status_mask)) { in wcd937x_codec_enable_hphr_pa()
618 if (wcd937x->comp2_enable) in wcd937x_codec_enable_hphr_pa()
622 clear_bit(HPH_PA_DELAY, &wcd937x->status_mask); in wcd937x_codec_enable_hphr_pa()
625 wcd_mbhc_event_notify(wcd937x->wcd_mbhc, WCD_EVENT_POST_HPHR_PA_OFF); in wcd937x_codec_enable_hphr_pa()
630 wcd_clsh_ctrl_set_state(wcd937x->clsh_info, in wcd937x_codec_enable_hphr_pa()
644 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in wcd937x_codec_enable_hphl_pa()
646 int hph_mode = wcd937x->hph_mode; in wcd937x_codec_enable_hphl_pa()
650 wcd_clsh_ctrl_set_state(wcd937x->clsh_info, in wcd937x_codec_enable_hphl_pa()
657 set_bit(HPH_PA_DELAY, &wcd937x->status_mask); in wcd937x_codec_enable_hphl_pa()
662 if (test_bit(HPH_PA_DELAY, &wcd937x->status_mask)) { in wcd937x_codec_enable_hphl_pa()
663 if (!wcd937x->comp1_enable) in wcd937x_codec_enable_hphl_pa()
667 clear_bit(HPH_PA_DELAY, &wcd937x->status_mask); in wcd937x_codec_enable_hphl_pa()
677 enable_irq(wcd937x->hphl_pdm_wd_int); in wcd937x_codec_enable_hphl_pa()
680 disable_irq_nosync(wcd937x->hphl_pdm_wd_int); in wcd937x_codec_enable_hphl_pa()
681 set_bit(HPH_PA_DELAY, &wcd937x->status_mask); in wcd937x_codec_enable_hphl_pa()
682 wcd_mbhc_event_notify(wcd937x->wcd_mbhc, WCD_EVENT_PRE_HPHL_PA_OFF); in wcd937x_codec_enable_hphl_pa()
685 if (test_bit(HPH_PA_DELAY, &wcd937x->status_mask)) { in wcd937x_codec_enable_hphl_pa()
686 if (!wcd937x->comp1_enable) in wcd937x_codec_enable_hphl_pa()
690 clear_bit(HPH_PA_DELAY, &wcd937x->status_mask); in wcd937x_codec_enable_hphl_pa()
693 wcd_mbhc_event_notify(wcd937x->wcd_mbhc, WCD_EVENT_POST_HPHL_PA_OFF); in wcd937x_codec_enable_hphl_pa()
698 wcd_clsh_ctrl_set_state(wcd937x->clsh_info, in wcd937x_codec_enable_hphl_pa()
712 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in wcd937x_codec_enable_aux_pa()
714 int hph_mode = wcd937x->hph_mode; in wcd937x_codec_enable_aux_pa()
733 enable_irq(wcd937x->aux_pdm_wd_int); in wcd937x_codec_enable_aux_pa()
736 disable_irq_nosync(wcd937x->aux_pdm_wd_int); in wcd937x_codec_enable_aux_pa()
740 wcd_clsh_ctrl_set_state(wcd937x->clsh_info, in wcd937x_codec_enable_aux_pa()
758 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in wcd937x_codec_enable_ear_pa()
760 int hph_mode = wcd937x->hph_mode; in wcd937x_codec_enable_ear_pa()
765 wcd937x->ear_rx_path = snd_soc_component_read(component, in wcd937x_codec_enable_ear_pa()
768 if (wcd937x->ear_rx_path & EAR_RX_PATH_AUX) in wcd937x_codec_enable_ear_pa()
776 if (!wcd937x->comp1_enable) in wcd937x_codec_enable_ear_pa()
788 if (wcd937x->ear_rx_path & EAR_RX_PATH_AUX) in wcd937x_codec_enable_ear_pa()
789 enable_irq(wcd937x->aux_pdm_wd_int); in wcd937x_codec_enable_ear_pa()
791 enable_irq(wcd937x->hphl_pdm_wd_int); in wcd937x_codec_enable_ear_pa()
794 if (wcd937x->ear_rx_path & EAR_RX_PATH_AUX) in wcd937x_codec_enable_ear_pa()
795 disable_irq_nosync(wcd937x->aux_pdm_wd_int); in wcd937x_codec_enable_ear_pa()
797 disable_irq_nosync(wcd937x->hphl_pdm_wd_int); in wcd937x_codec_enable_ear_pa()
800 if (!wcd937x->comp1_enable) in wcd937x_codec_enable_ear_pa()
805 wcd_clsh_ctrl_set_state(wcd937x->clsh_info, in wcd937x_codec_enable_ear_pa()
812 if (wcd937x->ear_rx_path & EAR_RX_PATH_AUX) in wcd937x_codec_enable_ear_pa()
830 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in wcd937x_enable_rx1()
845 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in wcd937x_enable_rx2()
861 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in wcd937x_enable_rx3()
878 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in wcd937x_tx_swr_ctrl()
883 if (event == SND_SOC_DAPM_PRE_PMU && strnstr(w->name, "ADC", sizeof("ADC"))) in wcd937x_tx_swr_ctrl()
884 if (w->shift == 1 && !use_amic3) in wcd937x_tx_swr_ctrl()
885 set_bit(AMIC2_BCS_ENABLE, &wcd937x->status_mask); in wcd937x_tx_swr_ctrl()
893 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in wcd937x_codec_enable_adc()
898 atomic_inc(&wcd937x->ana_clk_count); in wcd937x_codec_enable_adc()
907 if (w->shift == 1 && test_bit(AMIC2_BCS_ENABLE, &wcd937x->status_mask)) in wcd937x_codec_enable_adc()
908 clear_bit(AMIC2_BCS_ENABLE, &wcd937x->status_mask); in wcd937x_codec_enable_adc()
921 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in wcd937x_enable_req()
955 atomic_dec(&wcd937x->ana_clk_count); in wcd937x_enable_req()
956 if (atomic_read(&wcd937x->ana_clk_count) <= 0) { in wcd937x_enable_req()
960 atomic_set(&wcd937x->ana_clk_count, 0); in wcd937x_enable_req()
976 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in wcd937x_codec_enable_dmic()
979 switch (w->shift) { in wcd937x_codec_enable_dmic()
993 dev_err(component->dev, "Invalid DMIC Selection\n"); in wcd937x_codec_enable_dmic()
994 return -EINVAL; in wcd937x_codec_enable_dmic()
1018 int micb_index = micb_num - 1; in wcd937x_micbias_control()
1021 if (micb_index < 0 || (micb_index > WCD937X_MAX_MICBIAS - 1)) { in wcd937x_micbias_control()
1022 dev_err(component->dev, "Invalid micbias index, micb_ind:%d\n", micb_index); in wcd937x_micbias_control()
1023 return -EINVAL; in wcd937x_micbias_control()
1036 dev_err(component->dev, "Invalid micbias number: %d\n", micb_num); in wcd937x_micbias_control()
1037 return -EINVAL; in wcd937x_micbias_control()
1040 mutex_lock(&wcd937x->micb_lock); in wcd937x_micbias_control()
1043 wcd937x->pullup_ref[micb_index]++; in wcd937x_micbias_control()
1044 if (wcd937x->pullup_ref[micb_index] == 1 && in wcd937x_micbias_control()
1045 wcd937x->micb_ref[micb_index] == 0) in wcd937x_micbias_control()
1050 if (wcd937x->pullup_ref[micb_index] > 0) in wcd937x_micbias_control()
1051 wcd937x->pullup_ref[micb_index]++; in wcd937x_micbias_control()
1052 if (wcd937x->pullup_ref[micb_index] == 0 && in wcd937x_micbias_control()
1053 wcd937x->micb_ref[micb_index] == 0) in wcd937x_micbias_control()
1058 wcd937x->micb_ref[micb_index]++; in wcd937x_micbias_control()
1059 atomic_inc(&wcd937x->ana_clk_count); in wcd937x_micbias_control()
1060 if (wcd937x->micb_ref[micb_index] == 1) { in wcd937x_micbias_control()
1080 wcd_mbhc_event_notify(wcd937x->wcd_mbhc, in wcd937x_micbias_control()
1084 wcd_mbhc_event_notify(wcd937x->wcd_mbhc, in wcd937x_micbias_control()
1089 atomic_dec(&wcd937x->ana_clk_count); in wcd937x_micbias_control()
1090 if (wcd937x->micb_ref[micb_index] > 0) in wcd937x_micbias_control()
1091 wcd937x->micb_ref[micb_index]--; in wcd937x_micbias_control()
1092 if (wcd937x->micb_ref[micb_index] == 0 && in wcd937x_micbias_control()
1093 wcd937x->pullup_ref[micb_index] > 0) in wcd937x_micbias_control()
1096 else if (wcd937x->micb_ref[micb_index] == 0 && in wcd937x_micbias_control()
1097 wcd937x->pullup_ref[micb_index] == 0) { in wcd937x_micbias_control()
1099 wcd_mbhc_event_notify(wcd937x->wcd_mbhc, in wcd937x_micbias_control()
1105 wcd_mbhc_event_notify(wcd937x->wcd_mbhc, in wcd937x_micbias_control()
1110 wcd_mbhc_event_notify(wcd937x->wcd_mbhc, in wcd937x_micbias_control()
1112 if (atomic_read(&wcd937x->ana_clk_count) <= 0) { in wcd937x_micbias_control()
1116 atomic_set(&wcd937x->ana_clk_count, 0); in wcd937x_micbias_control()
1120 mutex_unlock(&wcd937x->micb_lock); in wcd937x_micbias_control()
1128 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in __wcd937x_codec_enable_micbias()
1129 int micb_num = w->shift; in __wcd937x_codec_enable_micbias()
1158 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in __wcd937x_codec_enable_micbias_pullup()
1159 int micb_num = w->shift; in __wcd937x_codec_enable_micbias_pullup()
1185 struct sdw_port_config *port_config = &wcd->port_config[port_idx - 1]; in wcd937x_connect_port()
1186 const struct wcd_sdw_ch_info *ch_info = &wcd->ch_info[ch_id]; in wcd937x_connect_port()
1187 u8 port_num = ch_info->port_num; in wcd937x_connect_port()
1188 u8 ch_mask = ch_info->ch_mask; in wcd937x_connect_port()
1190 struct sdw_slave *sdev = wcd->sdev; in wcd937x_connect_port()
1192 port_config->num = port_num; in wcd937x_connect_port()
1194 mstr_port_num = sdev->m_port_map[port_num]; in wcd937x_connect_port()
1195 mstr_ch_mask = ch_info->master_ch_mask; in wcd937x_connect_port()
1198 port_config->ch_mask |= ch_mask; in wcd937x_connect_port()
1199 wcd->master_channel_map[mstr_port_num] |= mstr_ch_mask; in wcd937x_connect_port()
1201 port_config->ch_mask &= ~ch_mask; in wcd937x_connect_port()
1202 wcd->master_channel_map[mstr_port_num] &= ~mstr_ch_mask; in wcd937x_connect_port()
1214 ucontrol->value.integer.value[0] = wcd937x->hph_mode; in wcd937x_rx_hph_mode_get()
1225 mode_val = ucontrol->value.enumerated.item[0]; in wcd937x_rx_hph_mode_put()
1230 if (mode_val == wcd937x->hph_mode) in wcd937x_rx_hph_mode_put()
1242 wcd937x->hph_mode = mode_val; in wcd937x_rx_hph_mode_put()
1246 dev_dbg(component->dev, "%s: Invalid HPH Mode\n", __func__); in wcd937x_rx_hph_mode_put()
1247 return -EINVAL; in wcd937x_rx_hph_mode_put()
1258 mc = (struct soc_mixer_control *)(kcontrol->private_value); in wcd937x_get_compander()
1259 hphr = mc->shift; in wcd937x_get_compander()
1261 ucontrol->value.integer.value[0] = hphr ? wcd937x->comp2_enable : in wcd937x_get_compander()
1262 wcd937x->comp1_enable; in wcd937x_get_compander()
1271 struct wcd937x_sdw_priv *wcd = wcd937x->sdw_priv[AIF1_PB]; in wcd937x_set_compander()
1272 int value = ucontrol->value.integer.value[0]; in wcd937x_set_compander()
1277 mc = (struct soc_mixer_control *)(kcontrol->private_value); in wcd937x_set_compander()
1278 hphr = mc->shift; in wcd937x_set_compander()
1281 if (value == wcd937x->comp2_enable) in wcd937x_set_compander()
1284 wcd937x->comp2_enable = value; in wcd937x_set_compander()
1286 if (value == wcd937x->comp1_enable) in wcd937x_set_compander()
1289 wcd937x->comp1_enable = value; in wcd937x_set_compander()
1292 portidx = wcd->ch_info[mc->reg].port_num; in wcd937x_set_compander()
1295 wcd937x_connect_port(wcd, portidx, mc->reg, true); in wcd937x_set_compander()
1297 wcd937x_connect_port(wcd, portidx, mc->reg, false); in wcd937x_set_compander()
1305 struct soc_mixer_control *mixer = (struct soc_mixer_control *)kcontrol->private_value; in wcd937x_get_swr_port()
1309 int dai_id = mixer->shift; in wcd937x_get_swr_port()
1310 int ch_idx = mixer->reg; in wcd937x_get_swr_port()
1313 wcd = wcd937x->sdw_priv[dai_id]; in wcd937x_get_swr_port()
1314 portidx = wcd->ch_info[ch_idx].port_num; in wcd937x_get_swr_port()
1316 ucontrol->value.integer.value[0] = wcd->port_enable[portidx]; in wcd937x_get_swr_port()
1324 struct soc_mixer_control *mixer = (struct soc_mixer_control *)kcontrol->private_value; in wcd937x_set_swr_port()
1328 int dai_id = mixer->shift; in wcd937x_set_swr_port()
1329 int ch_idx = mixer->reg; in wcd937x_set_swr_port()
1333 wcd = wcd937x->sdw_priv[dai_id]; in wcd937x_set_swr_port()
1335 portidx = wcd->ch_info[ch_idx].port_num; in wcd937x_set_swr_port()
1337 enable = ucontrol->value.integer.value[0]; in wcd937x_set_swr_port()
1339 if (enable == wcd->port_enable[portidx]) { in wcd937x_set_swr_port()
1344 wcd->port_enable[portidx] = enable; in wcd937x_set_swr_port()
1380 dev_err(component->dev, "%s: invalid number of buttons: %d\n", in wcd937x_mbhc_program_btn_thr()
1457 return -EINVAL; in wcd937x_mbhc_micb_adjust_voltage()
1459 mutex_lock(&wcd937x->micb_lock); in wcd937x_mbhc_micb_adjust_voltage()
1464 * to avoid slow micbias ramp-up or down enable pull-up in wcd937x_mbhc_micb_adjust_voltage()
1465 * momentarily, change the micbias value and then re-enable in wcd937x_mbhc_micb_adjust_voltage()
1473 req_vout_ctl = wcd_get_micb_vout_ctl_val(component->dev, req_volt); in wcd937x_mbhc_micb_adjust_voltage()
1475 ret = -EINVAL; in wcd937x_mbhc_micb_adjust_voltage()
1504 mutex_unlock(&wcd937x->micb_lock); in wcd937x_mbhc_micb_adjust_voltage()
1515 return -EINVAL; in wcd937x_mbhc_micb_ctrl_threshold_mic()
1521 if (wcd937x->common.micb_mv[2] >= WCD_MBHC_THR_HS_MICB_MV) in wcd937x_mbhc_micb_ctrl_threshold_mic()
1524 micb_mv = req_en ? WCD_MBHC_THR_HS_MICB_MV : wcd937x->common.micb_mv[2]; in wcd937x_mbhc_micb_ctrl_threshold_mic()
1543 regmap_update_bits(wcd937x->regmap, WCD937X_ANA_MBHC_ZDET, 0x20, 0x20); in wcd937x_mbhc_get_result_params()
1545 regmap_read(wcd937x->regmap, WCD937X_ANA_MBHC_RESULT_2, &val); in wcd937x_mbhc_get_result_params()
1550 regmap_read(wcd937x->regmap, WCD937X_ANA_MBHC_RESULT_1, &val1); in wcd937x_mbhc_get_result_params()
1552 regmap_update_bits(wcd937x->regmap, WCD937X_ANA_MBHC_ZDET, 0x20, 0x00); in wcd937x_mbhc_get_result_params()
1560 dev_err(component->dev, "Impedance detect ramp error, c1=%d, x1=0x%x\n", in wcd937x_mbhc_get_result_params()
1565 denom = (x1 * d1) - (1 << (14 - noff)); in wcd937x_mbhc_get_result_params()
1571 dev_err(component->dev, "%s: d1=%d, c1=%d, x1=0x%x, z_val=%d (milliohm)\n", in wcd937x_mbhc_get_result_params()
1576 regmap_read(wcd937x->regmap, in wcd937x_mbhc_get_result_params()
1578 regmap_read(wcd937x->regmap, in wcd937x_mbhc_get_result_params()
1597 WCD937X_ZDET_MAXV_CTL_MASK, zdet_param->ldo_ctl); in wcd937x_mbhc_zdet_ramp()
1599 WCD937X_VTH_MASK, zdet_param->btn5); in wcd937x_mbhc_zdet_ramp()
1601 WCD937X_VTH_MASK, zdet_param->btn6); in wcd937x_mbhc_zdet_ramp()
1603 WCD937X_VTH_MASK, zdet_param->btn7); in wcd937x_mbhc_zdet_ramp()
1605 WCD937X_ZDET_RANGE_CTL_MASK, zdet_param->noff); in wcd937x_mbhc_zdet_ramp()
1607 0x0F, zdet_param->nshift); in wcd937x_mbhc_zdet_ramp()
1612 regmap_update_bits(wcd937x->regmap, in wcd937x_mbhc_zdet_ramp()
1614 wcd937x_mbhc_get_result_params(component, d1_a, zdet_param->noff, &zdet); in wcd937x_mbhc_zdet_ramp()
1615 regmap_update_bits(wcd937x->regmap, in wcd937x_mbhc_zdet_ramp()
1624 regmap_update_bits(wcd937x->regmap, in wcd937x_mbhc_zdet_ramp()
1626 wcd937x_mbhc_get_result_params(component, d1_a, zdet_param->noff, &zdet); in wcd937x_mbhc_zdet_ramp()
1627 regmap_update_bits(wcd937x->regmap, in wcd937x_mbhc_zdet_ramp()
1646 q1_cal = (10000 - ((q1 & 0x7F) * 25)); in wcd937x_wcd_mbhc_qfuse_cal()
1684 regmap_update_bits(wcd937x->regmap, in wcd937x_wcd_mbhc_calc_impedance()
1688 /* For NO-jack, disable L_DET_EN before Z-det measurements */ in wcd937x_wcd_mbhc_calc_impedance()
1689 if (wcd937x->mbhc_cfg.hphl_swh) in wcd937x_wcd_mbhc_calc_impedance()
1690 regmap_update_bits(wcd937x->regmap, in wcd937x_wcd_mbhc_calc_impedance()
1694 regmap_update_bits(wcd937x->regmap, in wcd937x_wcd_mbhc_calc_impedance()
1700 regmap_update_bits(wcd937x->regmap, in wcd937x_wcd_mbhc_calc_impedance()
1742 zdet_param_ptr->noff == 0x6) || in wcd937x_wcd_mbhc_calc_impedance()
1771 dev_err(component->dev, in wcd937x_wcd_mbhc_calc_impedance()
1780 wcd_mbhc_set_hph_type(wcd937x->wcd_mbhc, WCD_MBHC_HPH_MONO); in wcd937x_wcd_mbhc_calc_impedance()
1799 z_diff1 = (z1ls > zMono) ? (z1ls - zMono) : (zMono - z1ls); in wcd937x_wcd_mbhc_calc_impedance()
1800 z_diff2 = ((*zl) > z1ls) ? ((*zl) - z1ls) : (z1ls - (*zl)); in wcd937x_wcd_mbhc_calc_impedance()
1802 wcd_mbhc_set_hph_type(wcd937x->wcd_mbhc, WCD_MBHC_HPH_STEREO); in wcd937x_wcd_mbhc_calc_impedance()
1804 wcd_mbhc_set_hph_type(wcd937x->wcd_mbhc, WCD_MBHC_HPH_MONO); in wcd937x_wcd_mbhc_calc_impedance()
1807 regmap_update_bits(wcd937x->regmap, in wcd937x_wcd_mbhc_calc_impedance()
1814 regmap_update_bits(wcd937x->regmap, in wcd937x_wcd_mbhc_calc_impedance()
1817 /* For NO-jack, re-enable L_DET_EN after Z-det measurements */ in wcd937x_wcd_mbhc_calc_impedance()
1818 if (wcd937x->mbhc_cfg.hphl_swh) in wcd937x_wcd_mbhc_calc_impedance()
1819 regmap_update_bits(wcd937x->regmap, in wcd937x_wcd_mbhc_calc_impedance()
1825 regmap_update_bits(wcd937x->regmap, in wcd937x_wcd_mbhc_calc_impedance()
1858 if (wcd937x->mbhc_cfg.moist_rref == R_OFF) { in wcd937x_mbhc_moisture_config()
1865 if (!wcd937x->mbhc_cfg.hphl_swh) { in wcd937x_mbhc_moisture_config()
1866 dev_err(component->dev, "%s: disable moisture detection for NC\n", in wcd937x_mbhc_moisture_config()
1874 WCD937X_M_RTH_CTL_MASK, wcd937x->mbhc_cfg.moist_rref); in wcd937x_mbhc_moisture_config()
1883 WCD937X_M_RTH_CTL_MASK, wcd937x->mbhc_cfg.moist_rref); in wcd937x_mbhc_moisture_detect_en()
1894 if (wcd937x->mbhc_cfg.moist_rref == R_OFF) { in wcd937x_mbhc_get_moisture_status()
1901 if (!wcd937x->mbhc_cfg.hphl_swh) { in wcd937x_mbhc_get_moisture_status()
1902 dev_err(component->dev, "%s: disable moisture detection for NC\n", in wcd937x_mbhc_get_moisture_status()
1956 ucontrol->value.integer.value[0] = wcd_mbhc_get_hph_type(wcd937x->wcd_mbhc); in wcd937x_get_hph_type()
1970 mc = (struct soc_mixer_control *)(kcontrol->private_value); in wcd937x_hph_impedance_get()
1971 hphr = mc->shift; in wcd937x_hph_impedance_get()
1972 wcd_mbhc_get_impedance(wcd937x->wcd_mbhc, &zl, &zr); in wcd937x_hph_impedance_get()
1973 ucontrol->value.integer.value[0] = hphr ? zr : zl; in wcd937x_hph_impedance_get()
1993 struct wcd_mbhc_intr *intr_ids = &wcd937x->intr_ids; in wcd937x_mbhc_init()
1995 intr_ids->mbhc_sw_intr = regmap_irq_get_virq(wcd937x->irq_chip, in wcd937x_mbhc_init()
1997 intr_ids->mbhc_btn_press_intr = regmap_irq_get_virq(wcd937x->irq_chip, in wcd937x_mbhc_init()
1999 intr_ids->mbhc_btn_release_intr = regmap_irq_get_virq(wcd937x->irq_chip, in wcd937x_mbhc_init()
2001 intr_ids->mbhc_hs_ins_intr = regmap_irq_get_virq(wcd937x->irq_chip, in wcd937x_mbhc_init()
2003 intr_ids->mbhc_hs_rem_intr = regmap_irq_get_virq(wcd937x->irq_chip, in wcd937x_mbhc_init()
2005 intr_ids->hph_left_ocp = regmap_irq_get_virq(wcd937x->irq_chip, in wcd937x_mbhc_init()
2007 intr_ids->hph_right_ocp = regmap_irq_get_virq(wcd937x->irq_chip, in wcd937x_mbhc_init()
2010 wcd937x->wcd_mbhc = wcd_mbhc_init(component, &mbhc_cb, intr_ids, wcd_mbhc_fields, true); in wcd937x_mbhc_init()
2011 if (IS_ERR(wcd937x->wcd_mbhc)) in wcd937x_mbhc_init()
2012 return PTR_ERR(wcd937x->wcd_mbhc); in wcd937x_mbhc_init()
2026 wcd_mbhc_deinit(wcd937x->wcd_mbhc); in wcd937x_mbhc_deinit()
2045 SOC_SINGLE_TLV("ADC2 Volume", WCD937X_ANA_TX_CH2, 0, 20, 0, analog_gain),
2057 SOC_SINGLE_EXT("ADC2 Switch", WCD937X_ADC2, 1, 1, 0,
2145 static const struct snd_kcontrol_new tx_adc2_mux = SOC_DAPM_ENUM("ADC2 MUX Mux", adc2_enum);
2162 SND_SOC_DAPM_ADC_E("ADC2", NULL, SND_SOC_NOPM, 1, 0,
2169 SND_SOC_DAPM_MIXER_E("ADC2 REQ", SND_SOC_NOPM, 0, 0,
2173 SND_SOC_DAPM_MUX("ADC2 MUX", SND_SOC_NOPM, 0, 0, &tx_adc2_mux),
2363 { "ADC2_MIXER", "Switch", "ADC2 REQ" },
2364 { "ADC2 REQ", NULL, "ADC2" },
2365 { "ADC2", NULL, "ADC2 MUX" },
2366 { "ADC2 MUX", "INP3", "AMIC3" },
2367 { "ADC2 MUX", "INP2", "AMIC2" },
2429 regmap_update_bits(wcd937x->regmap, WCD937X_ANA_MICB1, WCD937X_ANA_MICB_VOUT, in wcd937x_set_micbias_data()
2430 wcd937x->common.micb_vout[0]); in wcd937x_set_micbias_data()
2431 regmap_update_bits(wcd937x->regmap, WCD937X_ANA_MICB2, WCD937X_ANA_MICB_VOUT, in wcd937x_set_micbias_data()
2432 wcd937x->common.micb_vout[1]); in wcd937x_set_micbias_data()
2433 regmap_update_bits(wcd937x->regmap, WCD937X_ANA_MICB3, WCD937X_ANA_MICB_VOUT, in wcd937x_set_micbias_data()
2434 wcd937x->common.micb_vout[2]); in wcd937x_set_micbias_data()
2462 wcd->virq = irq_domain_create_linear(NULL, 1, &wcd_domain_ops, NULL); in wcd937x_irq_init()
2463 if (!(wcd->virq)) { in wcd937x_irq_init()
2465 return -EINVAL; in wcd937x_irq_init()
2468 return devm_regmap_add_irq_chip(dev, wcd->regmap, in wcd937x_irq_init()
2469 irq_create_mapping(wcd->virq, 0), in wcd937x_irq_init()
2471 &wcd->irq_chip); in wcd937x_irq_init()
2478 struct sdw_slave *tx_sdw_dev = wcd937x->tx_sdw_dev; in wcd937x_soc_codec_probe()
2479 struct device *dev = component->dev; in wcd937x_soc_codec_probe()
2484 time_left = wait_for_completion_timeout(&tx_sdw_dev->initialization_complete, in wcd937x_soc_codec_probe()
2488 return -ETIMEDOUT; in wcd937x_soc_codec_probe()
2491 snd_soc_component_init_regmap(component, wcd937x->regmap); in wcd937x_soc_codec_probe()
2501 return -EINVAL; in wcd937x_soc_codec_probe()
2504 wcd937x->clsh_info = wcd_clsh_ctrl_alloc(component, WCD937X); in wcd937x_soc_codec_probe()
2505 if (IS_ERR(wcd937x->clsh_info)) { in wcd937x_soc_codec_probe()
2507 return PTR_ERR(wcd937x->clsh_info); in wcd937x_soc_codec_probe()
2510 wcd937x_io_init(wcd937x->regmap); in wcd937x_soc_codec_probe()
2513 regmap_write(wcd937x->regmap, (WCD937X_DIGITAL_INTR_LEVEL_0 + i), 0); in wcd937x_soc_codec_probe()
2517 wcd937x->hphr_pdm_wd_int = regmap_irq_get_virq(wcd937x->irq_chip, in wcd937x_soc_codec_probe()
2519 wcd937x->hphl_pdm_wd_int = regmap_irq_get_virq(wcd937x->irq_chip, in wcd937x_soc_codec_probe()
2521 wcd937x->aux_pdm_wd_int = regmap_irq_get_virq(wcd937x->irq_chip, in wcd937x_soc_codec_probe()
2525 ret = devm_request_threaded_irq(dev, wcd937x->hphr_pdm_wd_int, NULL, wcd937x_wd_handle_irq, in wcd937x_soc_codec_probe()
2531 ret = devm_request_threaded_irq(dev, wcd937x->hphl_pdm_wd_int, NULL, wcd937x_wd_handle_irq, in wcd937x_soc_codec_probe()
2537 ret = devm_request_threaded_irq(dev, wcd937x->aux_pdm_wd_int, NULL, wcd937x_wd_handle_irq, in wcd937x_soc_codec_probe()
2544 disable_irq_nosync(wcd937x->hphr_pdm_wd_int); in wcd937x_soc_codec_probe()
2545 disable_irq_nosync(wcd937x->hphl_pdm_wd_int); in wcd937x_soc_codec_probe()
2546 disable_irq_nosync(wcd937x->aux_pdm_wd_int); in wcd937x_soc_codec_probe()
2552 dev_err(component->dev, "Failed to add snd_ctls\n"); in wcd937x_soc_codec_probe()
2553 wcd_clsh_ctrl_free(wcd937x->clsh_info); in wcd937x_soc_codec_probe()
2560 dev_err(component->dev, "Failed to add routes\n"); in wcd937x_soc_codec_probe()
2561 wcd_clsh_ctrl_free(wcd937x->clsh_info); in wcd937x_soc_codec_probe()
2568 dev_err(component->dev, "mbhc initialization failed\n"); in wcd937x_soc_codec_probe()
2578 free_irq(wcd937x->aux_pdm_wd_int, wcd937x); in wcd937x_soc_codec_remove()
2579 free_irq(wcd937x->hphl_pdm_wd_int, wcd937x); in wcd937x_soc_codec_remove()
2580 free_irq(wcd937x->hphr_pdm_wd_int, wcd937x); in wcd937x_soc_codec_remove()
2582 wcd_clsh_ctrl_free(wcd937x->clsh_info); in wcd937x_soc_codec_remove()
2588 struct wcd937x_priv *wcd = dev_get_drvdata(comp->dev); in wcd937x_codec_set_jack()
2592 ret = wcd_mbhc_start(wcd->wcd_mbhc, &wcd->mbhc_cfg, jack); in wcd937x_codec_set_jack()
2594 wcd_mbhc_stop(wcd->wcd_mbhc); in wcd937x_codec_set_jack()
2620 value = gpiod_get_value(wcd937x->us_euro_gpio); in wcd937x_swap_gnd_mic()
2621 gpiod_set_value(wcd937x->us_euro_gpio, !value); in wcd937x_swap_gnd_mic()
2630 struct wcd937x_priv *wcd937x = dev_get_drvdata(dai->dev); in wcd937x_codec_hw_params()
2631 struct wcd937x_sdw_priv *wcd = wcd937x->sdw_priv[dai->id]; in wcd937x_codec_hw_params()
2639 struct wcd937x_priv *wcd937x = dev_get_drvdata(dai->dev); in wcd937x_codec_free()
2640 struct wcd937x_sdw_priv *wcd = wcd937x->sdw_priv[dai->id]; in wcd937x_codec_free()
2642 return sdw_stream_remove_slave(wcd->sdev, wcd->sruntime); in wcd937x_codec_free()
2648 struct wcd937x_priv *wcd937x = dev_get_drvdata(dai->dev); in wcd937x_codec_set_sdw_stream()
2649 struct wcd937x_sdw_priv *wcd = wcd937x->sdw_priv[dai->id]; in wcd937x_codec_set_sdw_stream()
2651 wcd->sruntime = stream; in wcd937x_codec_set_sdw_stream()
2660 struct wcd937x_priv *wcd937x = dev_get_drvdata(dai->dev); in wcd937x_get_channel_map()
2661 struct wcd937x_sdw_priv *wcd = wcd937x->sdw_priv[dai->id]; in wcd937x_get_channel_map()
2664 switch (dai->id) { in wcd937x_get_channel_map()
2667 dev_err(dai->dev, "Invalid rx_slot %p or rx_num %p\n", in wcd937x_get_channel_map()
2669 return -EINVAL; in wcd937x_get_channel_map()
2673 rx_slot[i] = wcd->master_channel_map[i]; in wcd937x_get_channel_map()
2679 dev_err(dai->dev, "Invalid tx_slot %p or tx_num %p\n", in wcd937x_get_channel_map()
2681 return -EINVAL; in wcd937x_get_channel_map()
2685 tx_slot[i] = wcd->master_channel_map[i]; in wcd937x_get_channel_map()
2705 .name = "wcd937x-sdw-rx",
2718 .name = "wcd937x-sdw-tx",
2746 wcd937x->rxdev = of_sdw_find_device_by_node(wcd937x->rxnode); in wcd937x_bind()
2747 if (!wcd937x->rxdev) { in wcd937x_bind()
2749 ret = -EINVAL; in wcd937x_bind()
2753 wcd937x->sdw_priv[AIF1_PB] = dev_get_drvdata(wcd937x->rxdev); in wcd937x_bind()
2754 wcd937x->sdw_priv[AIF1_PB]->wcd937x = wcd937x; in wcd937x_bind()
2756 wcd937x->txdev = of_sdw_find_device_by_node(wcd937x->txnode); in wcd937x_bind()
2757 if (!wcd937x->txdev) { in wcd937x_bind()
2759 ret = -EINVAL; in wcd937x_bind()
2763 wcd937x->sdw_priv[AIF1_CAP] = dev_get_drvdata(wcd937x->txdev); in wcd937x_bind()
2764 wcd937x->sdw_priv[AIF1_CAP]->wcd937x = wcd937x; in wcd937x_bind()
2765 wcd937x->tx_sdw_dev = dev_to_sdw_dev(wcd937x->txdev); in wcd937x_bind()
2766 if (!wcd937x->tx_sdw_dev) { in wcd937x_bind()
2768 ret = -EINVAL; in wcd937x_bind()
2776 if (!device_link_add(wcd937x->rxdev, wcd937x->txdev, in wcd937x_bind()
2779 ret = -EINVAL; in wcd937x_bind()
2783 if (!device_link_add(dev, wcd937x->txdev, in wcd937x_bind()
2786 ret = -EINVAL; in wcd937x_bind()
2790 if (!device_link_add(dev, wcd937x->rxdev, in wcd937x_bind()
2793 ret = -EINVAL; in wcd937x_bind()
2797 wcd937x->regmap = wcd937x->sdw_priv[AIF1_CAP]->regmap; in wcd937x_bind()
2798 if (!wcd937x->regmap) { in wcd937x_bind()
2800 ret = -EINVAL; in wcd937x_bind()
2810 wcd937x->sdw_priv[AIF1_PB]->slave_irq = wcd937x->virq; in wcd937x_bind()
2811 wcd937x->sdw_priv[AIF1_CAP]->slave_irq = wcd937x->virq; in wcd937x_bind()
2825 device_link_remove(dev, wcd937x->rxdev); in wcd937x_bind()
2827 device_link_remove(dev, wcd937x->txdev); in wcd937x_bind()
2829 device_link_remove(wcd937x->rxdev, wcd937x->txdev); in wcd937x_bind()
2831 put_device(wcd937x->txdev); in wcd937x_bind()
2833 put_device(wcd937x->rxdev); in wcd937x_bind()
2844 device_link_remove(dev, wcd937x->txdev); in wcd937x_unbind()
2845 device_link_remove(dev, wcd937x->rxdev); in wcd937x_unbind()
2846 device_link_remove(wcd937x->rxdev, wcd937x->txdev); in wcd937x_unbind()
2848 mutex_destroy(&wcd937x->micb_lock); in wcd937x_unbind()
2849 put_device(wcd937x->txdev); in wcd937x_unbind()
2850 put_device(wcd937x->rxdev); in wcd937x_unbind()
2862 struct device_node *np = dev->of_node; in wcd937x_add_slave_components()
2864 wcd937x->rxnode = of_parse_phandle(np, "qcom,rx-device", 0); in wcd937x_add_slave_components()
2865 if (!wcd937x->rxnode) { in wcd937x_add_slave_components()
2866 dev_err(dev, "Couldn't parse phandle to qcom,rx-device!\n"); in wcd937x_add_slave_components()
2867 return -ENODEV; in wcd937x_add_slave_components()
2871 component_compare_of, wcd937x->rxnode); in wcd937x_add_slave_components()
2873 wcd937x->txnode = of_parse_phandle(np, "qcom,tx-device", 0); in wcd937x_add_slave_components()
2874 if (!wcd937x->txnode) { in wcd937x_add_slave_components()
2875 dev_err(dev, "Couldn't parse phandle to qcom,tx-device\n"); in wcd937x_add_slave_components()
2876 return -ENODEV; in wcd937x_add_slave_components()
2880 component_compare_of, wcd937x->txnode); in wcd937x_add_slave_components()
2888 struct device *dev = &pdev->dev; in wcd937x_probe()
2895 return -ENOMEM; in wcd937x_probe()
2898 mutex_init(&wcd937x->micb_lock); in wcd937x_probe()
2899 wcd937x->common.dev = dev; in wcd937x_probe()
2900 wcd937x->common.max_bias = 3; in wcd937x_probe()
2902 wcd937x->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_LOW); in wcd937x_probe()
2903 if (IS_ERR(wcd937x->reset_gpio)) in wcd937x_probe()
2904 return dev_err_probe(dev, PTR_ERR(wcd937x->reset_gpio), in wcd937x_probe()
2907 wcd937x->us_euro_gpio = devm_gpiod_get_optional(dev, "us-euro", GPIOD_OUT_LOW); in wcd937x_probe()
2908 if (IS_ERR(wcd937x->us_euro_gpio)) in wcd937x_probe()
2909 return dev_err_probe(dev, PTR_ERR(wcd937x->us_euro_gpio), in wcd937x_probe()
2910 "us-euro swap Control GPIO not found\n"); in wcd937x_probe()
2912 cfg = &wcd937x->mbhc_cfg; in wcd937x_probe()
2913 cfg->swap_gnd_mic = wcd937x_swap_gnd_mic; in wcd937x_probe()
2920 ret = wcd_dt_parse_micbias_info(&wcd937x->common); in wcd937x_probe()
2924 cfg->mbhc_micbias = MIC_BIAS_2; in wcd937x_probe()
2925 cfg->anc_micbias = MIC_BIAS_2; in wcd937x_probe()
2926 cfg->v_hs_max = WCD_MBHC_HS_V_MAX; in wcd937x_probe()
2927 cfg->num_btn = WCD937X_MBHC_MAX_BUTTONS; in wcd937x_probe()
2928 cfg->micb_mv = wcd937x->common.micb_mv[2]; in wcd937x_probe()
2929 cfg->linein_th = 5000; in wcd937x_probe()
2930 cfg->hs_thr = 1700; in wcd937x_probe()
2931 cfg->hph_thr = 50; in wcd937x_probe()
2933 wcd_dt_parse_mbhc_data(dev, &wcd937x->mbhc_cfg); in wcd937x_probe()
2957 struct device *dev = &pdev->dev; in wcd937x_remove()
2959 component_master_del(&pdev->dev, &wcd937x_comp_ops); in wcd937x_remove()
2968 { .compatible = "qcom,wcd9370-codec" },
2969 { .compatible = "qcom,wcd9375-codec" },