Lines Matching +full:micbias3 +full:- +full:microvolt
1 // SPDX-License-Identifier: GPL-2.0-only
3 * Copyright (c) 2018-2021, The Linux Foundation. All rights reserved.
4 * Copyright (c) 2022-2023, Qualcomm Innovation Center, Inc. All rights reserved.
25 #include <sound/soc-dapm.h>
30 #include "wcd-clsh-v2.h"
31 #include "wcd-mbhc-v2.h"
217 "vdd-rxtx", "vdd-io", "vdd-buck", "vdd-mic-bias", "vdd-px",
220 static const SNDRV_CTL_TLVD_DECLARE_DB_MINMAX(ear_pa_gain, 600, -1800);
424 port_num = ch_info->port_num; in wcd939x_sdw_connect_port()
425 ch_mask = ch_info->ch_mask; in wcd939x_sdw_connect_port()
427 port_config->num = port_num; in wcd939x_sdw_connect_port()
430 port_config->ch_mask |= ch_mask; in wcd939x_sdw_connect_port()
432 port_config->ch_mask &= ~ch_mask; in wcd939x_sdw_connect_port()
439 return wcd939x_sdw_connect_port(&wcd->ch_info[ch_id], in wcd939x_connect_port()
440 &wcd->port_config[port_num - 1], in wcd939x_connect_port()
448 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in wcd939x_codec_enable_rxclk()
508 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in wcd939x_codec_hphl_dac_event()
523 if (wcd939x->comp1_enable) { in wcd939x_codec_hphl_dac_event()
529 if (!wcd939x->comp2_enable || in wcd939x_codec_hphl_dac_event()
562 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in wcd939x_codec_hphr_dac_event()
565 dev_dbg(component->dev, "%s wname: %s event: %d\n", __func__, in wcd939x_codec_hphr_dac_event()
566 w->name, event); in wcd939x_codec_hphr_dac_event()
580 if (wcd939x->comp2_enable) { in wcd939x_codec_hphr_dac_event()
586 if (!wcd939x->comp1_enable || in wcd939x_codec_hphr_dac_event()
618 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in wcd939x_codec_ear_dac_event()
631 wcd_clsh_ctrl_set_state(wcd939x->clsh_info, WCD_CLSH_EVENT_PRE_DAC, in wcd939x_codec_ear_dac_event()
650 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in wcd939x_codec_enable_hphr_pa()
652 int hph_mode = wcd939x->hph_mode; in wcd939x_codec_enable_hphr_pa()
656 if (wcd939x->ldoh) in wcd939x_codec_enable_hphr_pa()
660 wcd_clsh_ctrl_set_state(wcd939x->clsh_info, WCD_CLSH_EVENT_PRE_DAC, in wcd939x_codec_enable_hphr_pa()
662 wcd_clsh_set_hph_mode(wcd939x->clsh_info, CLS_H_HIFI); in wcd939x_codec_enable_hphr_pa()
681 set_bit(HPH_PA_DELAY, &wcd939x->status_mask); in wcd939x_codec_enable_hphr_pa()
691 if (test_bit(HPH_PA_DELAY, &wcd939x->status_mask)) { in wcd939x_codec_enable_hphr_pa()
692 if (!wcd939x->comp2_enable) in wcd939x_codec_enable_hphr_pa()
703 clear_bit(HPH_PA_DELAY, &wcd939x->status_mask); in wcd939x_codec_enable_hphr_pa()
713 enable_irq(wcd939x->hphr_pdm_wd_int); in wcd939x_codec_enable_hphr_pa()
716 disable_irq_nosync(wcd939x->hphr_pdm_wd_int); in wcd939x_codec_enable_hphr_pa()
722 if (!wcd939x->comp2_enable) in wcd939x_codec_enable_hphr_pa()
730 wcd_mbhc_event_notify(wcd939x->wcd_mbhc, in wcd939x_codec_enable_hphr_pa()
732 set_bit(HPH_PA_DELAY, &wcd939x->status_mask); in wcd939x_codec_enable_hphr_pa()
740 if (test_bit(HPH_PA_DELAY, &wcd939x->status_mask)) { in wcd939x_codec_enable_hphr_pa()
741 if (!wcd939x->comp2_enable) in wcd939x_codec_enable_hphr_pa()
745 clear_bit(HPH_PA_DELAY, &wcd939x->status_mask); in wcd939x_codec_enable_hphr_pa()
747 wcd_mbhc_event_notify(wcd939x->wcd_mbhc, in wcd939x_codec_enable_hphr_pa()
755 wcd_clsh_ctrl_set_state(wcd939x->clsh_info, WCD_CLSH_EVENT_POST_PA, in wcd939x_codec_enable_hphr_pa()
757 if (wcd939x->ldoh) in wcd939x_codec_enable_hphr_pa()
770 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in wcd939x_codec_enable_hphl_pa()
772 int hph_mode = wcd939x->hph_mode; in wcd939x_codec_enable_hphl_pa()
774 dev_dbg(component->dev, "%s wname: %s event: %d\n", __func__, in wcd939x_codec_enable_hphl_pa()
775 w->name, event); in wcd939x_codec_enable_hphl_pa()
779 if (wcd939x->ldoh) in wcd939x_codec_enable_hphl_pa()
782 wcd_clsh_ctrl_set_state(wcd939x->clsh_info, WCD_CLSH_EVENT_PRE_DAC, in wcd939x_codec_enable_hphl_pa()
784 wcd_clsh_set_hph_mode(wcd939x->clsh_info, CLS_H_HIFI); in wcd939x_codec_enable_hphl_pa()
804 set_bit(HPH_PA_DELAY, &wcd939x->status_mask); in wcd939x_codec_enable_hphl_pa()
814 if (test_bit(HPH_PA_DELAY, &wcd939x->status_mask)) { in wcd939x_codec_enable_hphl_pa()
815 if (!wcd939x->comp1_enable) in wcd939x_codec_enable_hphl_pa()
825 clear_bit(HPH_PA_DELAY, &wcd939x->status_mask); in wcd939x_codec_enable_hphl_pa()
834 enable_irq(wcd939x->hphl_pdm_wd_int); in wcd939x_codec_enable_hphl_pa()
837 disable_irq_nosync(wcd939x->hphl_pdm_wd_int); in wcd939x_codec_enable_hphl_pa()
843 if (!wcd939x->comp1_enable) in wcd939x_codec_enable_hphl_pa()
851 wcd_mbhc_event_notify(wcd939x->wcd_mbhc, WCD_EVENT_PRE_HPHL_PA_OFF); in wcd939x_codec_enable_hphl_pa()
852 set_bit(HPH_PA_DELAY, &wcd939x->status_mask); in wcd939x_codec_enable_hphl_pa()
860 if (test_bit(HPH_PA_DELAY, &wcd939x->status_mask)) { in wcd939x_codec_enable_hphl_pa()
861 if (!wcd939x->comp1_enable) in wcd939x_codec_enable_hphl_pa()
865 clear_bit(HPH_PA_DELAY, &wcd939x->status_mask); in wcd939x_codec_enable_hphl_pa()
867 wcd_mbhc_event_notify(wcd939x->wcd_mbhc, in wcd939x_codec_enable_hphl_pa()
873 wcd_clsh_ctrl_set_state(wcd939x->clsh_info, WCD_CLSH_EVENT_POST_PA, in wcd939x_codec_enable_hphl_pa()
875 if (wcd939x->ldoh) in wcd939x_codec_enable_hphl_pa()
887 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in wcd939x_codec_enable_ear_pa()
904 enable_irq(wcd939x->ear_pdm_wd_int); in wcd939x_codec_enable_ear_pa()
907 disable_irq_nosync(wcd939x->ear_pdm_wd_int); in wcd939x_codec_enable_ear_pa()
917 wcd_clsh_ctrl_set_state(wcd939x->clsh_info, WCD_CLSH_EVENT_POST_PA, in wcd939x_codec_enable_ear_pa()
931 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in wcd939x_codec_enable_dmic()
937 switch (w->shift) { in wcd939x_codec_enable_dmic()
971 dev_err(component->dev, "%s: Invalid DMIC Selection\n", __func__); in wcd939x_codec_enable_dmic()
972 return -EINVAL; in wcd939x_codec_enable_dmic()
981 if (w->shift == 2) in wcd939x_codec_enable_dmic()
1000 if (w->shift == 2) in wcd939x_codec_enable_dmic()
1015 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in wcd939x_tx_swr_ctrl()
1020 bank = wcd939x_swr_get_current_bank(wcd939x->sdw_priv[AIF1_CAP]->sdev); in wcd939x_tx_swr_ctrl()
1024 if (strnstr(w->name, "ADC", sizeof("ADC"))) { in wcd939x_tx_swr_ctrl()
1027 if (test_bit(WCD_ADC1, &wcd939x->status_mask)) in wcd939x_tx_swr_ctrl()
1028 mode |= tx_mode_bit[wcd939x->tx_mode[WCD_ADC1]]; in wcd939x_tx_swr_ctrl()
1029 if (test_bit(WCD_ADC2, &wcd939x->status_mask)) in wcd939x_tx_swr_ctrl()
1030 mode |= tx_mode_bit[wcd939x->tx_mode[WCD_ADC2]]; in wcd939x_tx_swr_ctrl()
1031 if (test_bit(WCD_ADC3, &wcd939x->status_mask)) in wcd939x_tx_swr_ctrl()
1032 mode |= tx_mode_bit[wcd939x->tx_mode[WCD_ADC3]]; in wcd939x_tx_swr_ctrl()
1033 if (test_bit(WCD_ADC4, &wcd939x->status_mask)) in wcd939x_tx_swr_ctrl()
1034 mode |= tx_mode_bit[wcd939x->tx_mode[WCD_ADC4]]; in wcd939x_tx_swr_ctrl()
1037 rate = wcd939x_get_clk_rate(ffs(mode) - 1); in wcd939x_tx_swr_ctrl()
1045 if (strnstr(w->name, "ADC", sizeof("ADC"))) { in wcd939x_tx_swr_ctrl()
1083 ret = -EINVAL; in wcd939x_get_adc_mode()
1092 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in wcd939x_codec_enable_adc()
1102 set_bit(w->shift, &wcd939x->status_mask); in wcd939x_codec_enable_adc()
1111 clear_bit(w->shift, &wcd939x->status_mask); in wcd939x_codec_enable_adc()
1150 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in wcd939x_adc_enable_req()
1161 wcd939x_tx_channel_config(component, w->shift, true); in wcd939x_adc_enable_req()
1162 mode = wcd939x_get_adc_mode(wcd939x->tx_mode[w->shift]); in wcd939x_adc_enable_req()
1164 dev_info(component->dev, "Invalid ADC mode\n"); in wcd939x_adc_enable_req()
1165 return -EINVAL; in wcd939x_adc_enable_req()
1168 switch (w->shift) { in wcd939x_adc_enable_req()
1213 wcd939x_tx_channel_config(component, w->shift, false); in wcd939x_adc_enable_req()
1216 switch (w->shift) { in wcd939x_adc_enable_req()
1270 int micb_index = micb_num - 1; in wcd939x_micbias_control()
1287 dev_err(component->dev, "%s: Invalid micbias number: %d\n", in wcd939x_micbias_control()
1289 return -EINVAL; in wcd939x_micbias_control()
1294 wcd939x->pullup_ref[micb_index]++; in wcd939x_micbias_control()
1295 if (wcd939x->pullup_ref[micb_index] == 1 && in wcd939x_micbias_control()
1296 wcd939x->micb_ref[micb_index] == 0) in wcd939x_micbias_control()
1302 if (wcd939x->pullup_ref[micb_index] > 0) in wcd939x_micbias_control()
1303 wcd939x->pullup_ref[micb_index]--; in wcd939x_micbias_control()
1304 if (wcd939x->pullup_ref[micb_index] == 0 && in wcd939x_micbias_control()
1305 wcd939x->micb_ref[micb_index] == 0) in wcd939x_micbias_control()
1311 wcd939x->micb_ref[micb_index]++; in wcd939x_micbias_control()
1312 if (wcd939x->micb_ref[micb_index] == 1) { in wcd939x_micbias_control()
1349 wcd_mbhc_event_notify(wcd939x->wcd_mbhc, in wcd939x_micbias_control()
1353 wcd_mbhc_event_notify(wcd939x->wcd_mbhc, in wcd939x_micbias_control()
1357 if (wcd939x->micb_ref[micb_index] > 0) in wcd939x_micbias_control()
1358 wcd939x->micb_ref[micb_index]--; in wcd939x_micbias_control()
1360 if (wcd939x->micb_ref[micb_index] == 0 && in wcd939x_micbias_control()
1361 wcd939x->pullup_ref[micb_index] > 0) in wcd939x_micbias_control()
1365 else if (wcd939x->micb_ref[micb_index] == 0 && in wcd939x_micbias_control()
1366 wcd939x->pullup_ref[micb_index] == 0) { in wcd939x_micbias_control()
1368 wcd_mbhc_event_notify(wcd939x->wcd_mbhc, in wcd939x_micbias_control()
1375 wcd_mbhc_event_notify(wcd939x->wcd_mbhc, in wcd939x_micbias_control()
1379 wcd_mbhc_event_notify(wcd939x->wcd_mbhc, in wcd939x_micbias_control()
1391 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in wcd939x_codec_enable_micbias()
1392 int micb_num = w->shift; in wcd939x_codec_enable_micbias()
1414 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in wcd939x_codec_enable_micbias_pullup()
1415 int micb_num = w->shift; in wcd939x_codec_enable_micbias_pullup()
1440 struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; in wcd939x_tx_mode_get()
1441 int path = e->shift_l; in wcd939x_tx_mode_get()
1443 ucontrol->value.enumerated.item[0] = wcd939x->tx_mode[path]; in wcd939x_tx_mode_get()
1453 struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; in wcd939x_tx_mode_put()
1454 int path = e->shift_l; in wcd939x_tx_mode_put()
1456 if (wcd939x->tx_mode[path] == ucontrol->value.enumerated.item[0]) in wcd939x_tx_mode_put()
1459 wcd939x->tx_mode[path] = ucontrol->value.enumerated.item[0]; in wcd939x_tx_mode_put()
1472 ucontrol->value.integer.value[0] = wcd939x->hph_mode; in wcd939x_rx_hph_mode_get()
1484 mode_val = ucontrol->value.enumerated.item[0]; in wcd939x_rx_hph_mode_put()
1486 if (mode_val == wcd939x->hph_mode) in wcd939x_rx_hph_mode_put()
1489 if (wcd939x->variant == CHIPID_WCD9390) { in wcd939x_rx_hph_mode_put()
1498 wcd939x->hph_mode = mode_val; in wcd939x_rx_hph_mode_put()
1512 wcd939x->hph_mode = mode_val; in wcd939x_rx_hph_mode_put()
1517 dev_dbg(component->dev, "%s: Invalid HPH Mode\n", __func__); in wcd939x_rx_hph_mode_put()
1518 return -EINVAL; in wcd939x_rx_hph_mode_put()
1524 struct soc_mixer_control *mc = (struct soc_mixer_control *)(kcontrol->private_value); in wcd939x_get_compander()
1528 if (mc->shift) in wcd939x_get_compander()
1529 ucontrol->value.integer.value[0] = wcd939x->comp2_enable ? 1 : 0; in wcd939x_get_compander()
1531 ucontrol->value.integer.value[0] = wcd939x->comp1_enable ? 1 : 0; in wcd939x_get_compander()
1539 struct soc_mixer_control *mc = (struct soc_mixer_control *)(kcontrol->private_value); in wcd939x_set_compander()
1542 struct wcd939x_sdw_priv *wcd = wcd939x->sdw_priv[AIF1_PB]; in wcd939x_set_compander()
1543 bool value = !!ucontrol->value.integer.value[0]; in wcd939x_set_compander()
1544 int portidx = wcd->ch_info[mc->reg].port_num; in wcd939x_set_compander()
1546 if (mc->shift) in wcd939x_set_compander()
1547 wcd939x->comp2_enable = value; in wcd939x_set_compander()
1549 wcd939x->comp1_enable = value; in wcd939x_set_compander()
1552 wcd939x_connect_port(wcd, portidx, mc->reg, true); in wcd939x_set_compander()
1554 wcd939x_connect_port(wcd, portidx, mc->reg, false); in wcd939x_set_compander()
1565 ucontrol->value.integer.value[0] = wcd939x->ldoh ? 1 : 0; in wcd939x_ldoh_get()
1576 if (wcd939x->ldoh == !!ucontrol->value.integer.value[0]) in wcd939x_ldoh_put()
1579 wcd939x->ldoh = !!ucontrol->value.integer.value[0]; in wcd939x_ldoh_put()
1793 struct soc_mixer_control *mixer = (struct soc_mixer_control *)kcontrol->private_value; in wcd939x_get_swr_port()
1796 struct wcd939x_sdw_priv *wcd = wcd939x->sdw_priv[mixer->shift]; in wcd939x_get_swr_port()
1797 unsigned int portidx = wcd->ch_info[mixer->reg].port_num; in wcd939x_get_swr_port()
1799 ucontrol->value.integer.value[0] = wcd->port_enable[portidx] ? 1 : 0; in wcd939x_get_swr_port()
1820 struct soc_mixer_control *mixer = (struct soc_mixer_control *)kcontrol->private_value; in wcd939x_set_swr_port()
1823 struct wcd939x_sdw_priv *wcd = wcd939x->sdw_priv[mixer->shift]; in wcd939x_set_swr_port()
1824 unsigned int portidx = wcd->ch_info[mixer->reg].port_num; in wcd939x_set_swr_port()
1826 wcd->port_enable[portidx] = !!ucontrol->value.integer.value[0]; in wcd939x_set_swr_port()
1828 wcd939x_connect_port(wcd, portidx, mixer->reg, wcd->port_enable[portidx]); in wcd939x_set_swr_port()
1856 dev_err(component->dev, "%s: invalid number of buttons: %d\n", in wcd939x_mbhc_program_btn_thr()
1865 dev_dbg(component->dev, "%s: btn_high[%d]: %d, vth: %d\n", in wcd939x_mbhc_program_btn_thr()
1893 dev_dbg(component->dev, "%s: HS pull up current:%d\n", in wcd939x_mbhc_hph_l_pull_up_control()
1927 return -EINVAL; in wcd939x_get_micb_vout_ctl_val()
1930 return (micb_mv - 1000) / 50; in wcd939x_get_micb_vout_ctl_val()
1955 return -EINVAL; in wcd939x_mbhc_micb_adjust_voltage()
1957 mutex_lock(&wcd939x->micb_lock); in wcd939x_mbhc_micb_adjust_voltage()
1963 * to avoid slow micbias ramp-up or down enable pull-up in wcd939x_mbhc_micb_adjust_voltage()
1964 * momentarily, change the micbias value and then re-enable in wcd939x_mbhc_micb_adjust_voltage()
1983 dev_dbg(component->dev, "%s: micb_num: %d, cur_mv: %d, req_mv: %d, micb_en: %d\n", in wcd939x_mbhc_micb_adjust_voltage()
2007 mutex_unlock(&wcd939x->micb_lock); in wcd939x_mbhc_micb_adjust_voltage()
2018 return -EINVAL; in wcd939x_mbhc_micb_ctrl_threshold_mic()
2024 if (wcd939x->micb2_mv >= WCD_MBHC_THR_HS_MICB_MV) in wcd939x_mbhc_micb_ctrl_threshold_mic()
2027 micb_mv = req_en ? WCD_MBHC_THR_HS_MICB_MV : wcd939x->micb2_mv; in wcd939x_mbhc_micb_ctrl_threshold_mic()
2081 dev_dbg(component->dev, in wcd939x_mbhc_get_result_params()
2088 denom = (x1 * d1) - (1 << (14 - zdet_param->noff)); in wcd939x_mbhc_get_result_params()
2091 else if (x1 < wcd939x_mbhc_mincode_param[zdet_param->noff]) in wcd939x_mbhc_get_result_params()
2094 dev_dbg(component->dev, "%s: d1=%d, c1=%d, x1=0x%x, z_val=%d(milliOhm)\n", in wcd939x_mbhc_get_result_params()
2117 WCD939X_ZDET_ANA_CTL_MAXV_CTL, zdet_param->ldo_ctl); in wcd939x_mbhc_zdet_ramp()
2119 zdet_param->btn5); in wcd939x_mbhc_zdet_ramp()
2121 zdet_param->btn6); in wcd939x_mbhc_zdet_ramp()
2123 zdet_param->btn7); in wcd939x_mbhc_zdet_ramp()
2125 WCD939X_ZDET_ANA_CTL_RANGE_CTL, zdet_param->noff); in wcd939x_mbhc_zdet_ramp()
2127 WCD939X_ZDET_RAMP_CTL_TIME_CTL, zdet_param->nshift); in wcd939x_mbhc_zdet_ramp()
2137 dev_dbg(component->dev, "%s: ramp for HPH_L, noff = %d\n", in wcd939x_mbhc_zdet_ramp()
2138 __func__, zdet_param->noff); in wcd939x_mbhc_zdet_ramp()
2152 dev_dbg(component->dev, "%s: ramp for HPH_R, noff = %d\n", in wcd939x_mbhc_zdet_ramp()
2153 __func__, zdet_param->noff); in wcd939x_mbhc_zdet_ramp()
2169 q1_cal = (10000 - ((q1 & GENMASK(6, 0)) * 10)); in wcd939x_wcd_mbhc_qfuse_cal()
2180 struct wcd939x_priv *wcd939x = dev_get_drvdata(component->dev); in wcd939x_wcd_mbhc_calc_impedance()
2199 /* For NO-jack, disable L_DET_EN before Z-det measurements */ in wcd939x_wcd_mbhc_calc_impedance()
2200 if (wcd939x->mbhc_cfg.hphl_swh) in wcd939x_wcd_mbhc_calc_impedance()
2229 dev_dbg(component->dev, "%s: impedance on HPH_L = %d(ohms)\n", in wcd939x_wcd_mbhc_calc_impedance()
2240 dev_dbg(component->dev, "%s: impedance on HPH_R = %d(ohms)\n", in wcd939x_wcd_mbhc_calc_impedance()
2246 dev_dbg(component->dev, in wcd939x_wcd_mbhc_calc_impedance()
2256 dev_dbg(component->dev, in wcd939x_wcd_mbhc_calc_impedance()
2259 wcd_mbhc_set_hph_type(wcd939x->wcd_mbhc, WCD_MBHC_HPH_MONO); in wcd939x_wcd_mbhc_calc_impedance()
2278 z_diff1 = z1ls > z_mono ? z1ls - z_mono : z_mono - z1ls; in wcd939x_wcd_mbhc_calc_impedance()
2279 z_diff2 = *zl > z1ls ? *zl - z1ls : z1ls - *zl; in wcd939x_wcd_mbhc_calc_impedance()
2281 dev_dbg(component->dev, "%s: stereo plug type detected\n", in wcd939x_wcd_mbhc_calc_impedance()
2283 wcd_mbhc_set_hph_type(wcd939x->wcd_mbhc, WCD_MBHC_HPH_STEREO); in wcd939x_wcd_mbhc_calc_impedance()
2285 dev_dbg(component->dev, "%s: MONO plug type detected\n", in wcd939x_wcd_mbhc_calc_impedance()
2287 wcd_mbhc_set_hph_type(wcd939x->wcd_mbhc, WCD_MBHC_HPH_MONO); in wcd939x_wcd_mbhc_calc_impedance()
2305 /* For NO-jack, re-enable L_DET_EN after Z-det measurements */ in wcd939x_wcd_mbhc_calc_impedance()
2306 if (wcd939x->mbhc_cfg.hphl_swh) in wcd939x_wcd_mbhc_calc_impedance()
2349 if (wcd939x->mbhc_cfg.moist_rref == R_OFF || wcd939x->typec_analog_mux) { in wcd939x_mbhc_moisture_config()
2356 if (!wcd939x->mbhc_cfg.hphl_swh) { in wcd939x_mbhc_moisture_config()
2357 dev_dbg(component->dev, "%s: disable moisture detection for NC\n", in wcd939x_mbhc_moisture_config()
2365 WCD939X_CTL_2_M_RTH_CTL, wcd939x->mbhc_cfg.moist_rref); in wcd939x_mbhc_moisture_config()
2375 wcd939x->mbhc_cfg.moist_rref); in wcd939x_mbhc_moisture_detect_en()
2386 if (wcd939x->mbhc_cfg.moist_rref == R_OFF || wcd939x->typec_analog_mux) { in wcd939x_mbhc_get_moisture_status()
2393 if (!wcd939x->mbhc_cfg.hphl_swh) { in wcd939x_mbhc_get_moisture_status()
2394 dev_dbg(component->dev, "%s: disable moisture detection for NC\n", in wcd939x_mbhc_get_moisture_status()
2451 ucontrol->value.integer.value[0] = wcd_mbhc_get_hph_type(wcd939x->wcd_mbhc); in wcd939x_get_hph_type()
2459 struct soc_mixer_control *mc = (struct soc_mixer_control *)(kcontrol->private_value); in wcd939x_hph_impedance_get()
2462 bool hphr = mc->shift; in wcd939x_hph_impedance_get()
2465 wcd_mbhc_get_impedance(wcd939x->wcd_mbhc, &zl, &zr); in wcd939x_hph_impedance_get()
2466 dev_dbg(component->dev, "%s: zl=%u(ohms), zr=%u(ohms)\n", __func__, zl, zr); in wcd939x_hph_impedance_get()
2467 ucontrol->value.integer.value[0] = hphr ? zr : zl; in wcd939x_hph_impedance_get()
2487 struct wcd_mbhc_intr *intr_ids = &wcd939x->intr_ids; in wcd939x_mbhc_init()
2489 intr_ids->mbhc_sw_intr = regmap_irq_get_virq(wcd939x->irq_chip, in wcd939x_mbhc_init()
2491 intr_ids->mbhc_btn_press_intr = regmap_irq_get_virq(wcd939x->irq_chip, in wcd939x_mbhc_init()
2493 intr_ids->mbhc_btn_release_intr = regmap_irq_get_virq(wcd939x->irq_chip, in wcd939x_mbhc_init()
2495 intr_ids->mbhc_hs_ins_intr = regmap_irq_get_virq(wcd939x->irq_chip, in wcd939x_mbhc_init()
2497 intr_ids->mbhc_hs_rem_intr = regmap_irq_get_virq(wcd939x->irq_chip, in wcd939x_mbhc_init()
2499 intr_ids->hph_left_ocp = regmap_irq_get_virq(wcd939x->irq_chip, in wcd939x_mbhc_init()
2501 intr_ids->hph_right_ocp = regmap_irq_get_virq(wcd939x->irq_chip, in wcd939x_mbhc_init()
2504 wcd939x->wcd_mbhc = wcd_mbhc_init(component, &mbhc_cb, intr_ids, wcd_mbhc_fields, true); in wcd939x_mbhc_init()
2505 if (IS_ERR(wcd939x->wcd_mbhc)) in wcd939x_mbhc_init()
2506 return PTR_ERR(wcd939x->wcd_mbhc); in wcd939x_mbhc_init()
2520 wcd_mbhc_deinit(wcd939x->wcd_mbhc); in wcd939x_mbhc_deinit()
2903 vout_ctl_1 = wcd939x_get_micb_vout_ctl_val(wcd939x->micb1_mv); in wcd939x_set_micbias_data()
2904 vout_ctl_2 = wcd939x_get_micb_vout_ctl_val(wcd939x->micb2_mv); in wcd939x_set_micbias_data()
2905 vout_ctl_3 = wcd939x_get_micb_vout_ctl_val(wcd939x->micb3_mv); in wcd939x_set_micbias_data()
2906 vout_ctl_4 = wcd939x_get_micb_vout_ctl_val(wcd939x->micb4_mv); in wcd939x_set_micbias_data()
2908 return -EINVAL; in wcd939x_set_micbias_data()
2910 regmap_update_bits(wcd939x->regmap, WCD939X_ANA_MICB1, in wcd939x_set_micbias_data()
2912 regmap_update_bits(wcd939x->regmap, WCD939X_ANA_MICB2, in wcd939x_set_micbias_data()
2914 regmap_update_bits(wcd939x->regmap, WCD939X_ANA_MICB3, in wcd939x_set_micbias_data()
2916 regmap_update_bits(wcd939x->regmap, WCD939X_ANA_MICB4, in wcd939x_set_micbias_data()
2957 * \-handle_nested_irq(0)
2958 * \- regmap_irq_thread()
2959 * \- handle_nested_irq(i)
2981 wcd->virq = irq_domain_create_linear(NULL, 1, &wcd_domain_ops, NULL); in wcd939x_irq_init()
2982 if (!(wcd->virq)) { in wcd939x_irq_init()
2984 return -EINVAL; in wcd939x_irq_init()
2987 return devm_regmap_add_irq_chip(dev, wcd->regmap, in wcd939x_irq_init()
2988 irq_create_mapping(wcd->virq, 0), in wcd939x_irq_init()
2990 &wcd->irq_chip); in wcd939x_irq_init()
2996 struct sdw_slave *tx_sdw_dev = wcd939x->tx_sdw_dev; in wcd939x_soc_codec_probe()
2997 struct device *dev = component->dev; in wcd939x_soc_codec_probe()
3001 time_left = wait_for_completion_timeout(&tx_sdw_dev->initialization_complete, in wcd939x_soc_codec_probe()
3005 return -ETIMEDOUT; in wcd939x_soc_codec_probe()
3008 snd_soc_component_init_regmap(component, wcd939x->regmap); in wcd939x_soc_codec_probe()
3014 wcd939x->variant = snd_soc_component_read_field(component, in wcd939x_soc_codec_probe()
3018 wcd939x->clsh_info = wcd_clsh_ctrl_alloc(component, WCD939X); in wcd939x_soc_codec_probe()
3019 if (IS_ERR(wcd939x->clsh_info)) { in wcd939x_soc_codec_probe()
3021 return PTR_ERR(wcd939x->clsh_info); in wcd939x_soc_codec_probe()
3028 regmap_write(wcd939x->regmap, in wcd939x_soc_codec_probe()
3034 wcd939x->hphr_pdm_wd_int = regmap_irq_get_virq(wcd939x->irq_chip, in wcd939x_soc_codec_probe()
3036 wcd939x->hphl_pdm_wd_int = regmap_irq_get_virq(wcd939x->irq_chip, in wcd939x_soc_codec_probe()
3038 wcd939x->ear_pdm_wd_int = regmap_irq_get_virq(wcd939x->irq_chip, in wcd939x_soc_codec_probe()
3041 ret = request_threaded_irq(wcd939x->hphr_pdm_wd_int, NULL, wcd939x_wd_handle_irq, in wcd939x_soc_codec_probe()
3049 ret = request_threaded_irq(wcd939x->hphl_pdm_wd_int, NULL, wcd939x_wd_handle_irq, in wcd939x_soc_codec_probe()
3057 ret = request_threaded_irq(wcd939x->ear_pdm_wd_int, NULL, wcd939x_wd_handle_irq, in wcd939x_soc_codec_probe()
3066 disable_irq_nosync(wcd939x->hphr_pdm_wd_int); in wcd939x_soc_codec_probe()
3067 disable_irq_nosync(wcd939x->hphl_pdm_wd_int); in wcd939x_soc_codec_probe()
3068 disable_irq_nosync(wcd939x->ear_pdm_wd_int); in wcd939x_soc_codec_probe()
3070 switch (wcd939x->variant) { in wcd939x_soc_codec_probe()
3075 dev_err(component->dev, in wcd939x_soc_codec_probe()
3077 __func__, wcd939x->variant); in wcd939x_soc_codec_probe()
3085 dev_err(component->dev, in wcd939x_soc_codec_probe()
3087 __func__, wcd939x->variant); in wcd939x_soc_codec_probe()
3097 dev_err(component->dev, "mbhc initialization failed\n"); in wcd939x_soc_codec_probe()
3104 free_irq(wcd939x->ear_pdm_wd_int, wcd939x); in wcd939x_soc_codec_probe()
3106 free_irq(wcd939x->hphl_pdm_wd_int, wcd939x); in wcd939x_soc_codec_probe()
3108 free_irq(wcd939x->hphr_pdm_wd_int, wcd939x); in wcd939x_soc_codec_probe()
3110 wcd_clsh_ctrl_free(wcd939x->clsh_info); in wcd939x_soc_codec_probe()
3121 free_irq(wcd939x->ear_pdm_wd_int, wcd939x); in wcd939x_soc_codec_remove()
3122 free_irq(wcd939x->hphl_pdm_wd_int, wcd939x); in wcd939x_soc_codec_remove()
3123 free_irq(wcd939x->hphr_pdm_wd_int, wcd939x); in wcd939x_soc_codec_remove()
3125 wcd_clsh_ctrl_free(wcd939x->clsh_info); in wcd939x_soc_codec_remove()
3131 struct wcd939x_priv *wcd = dev_get_drvdata(comp->dev); in wcd939x_codec_set_jack()
3134 return wcd_mbhc_start(wcd->wcd_mbhc, &wcd->mbhc_cfg, jack); in wcd939x_codec_set_jack()
3136 wcd_mbhc_stop(wcd->wcd_mbhc); in wcd939x_codec_set_jack()
3156 /* Get USB-C plug orientation to provide swap event for MBHC */
3162 wcd939x->typec_orientation = orientation; in wcd939x_typec_switch_set()
3171 unsigned int previous_mode = wcd939x->typec_mode; in wcd939x_typec_mux_set()
3173 if (!wcd939x->wcd_mbhc) in wcd939x_typec_mux_set()
3174 return -EINVAL; in wcd939x_typec_mux_set()
3176 if (wcd939x->typec_mode != state->mode) { in wcd939x_typec_mux_set()
3177 wcd939x->typec_mode = state->mode; in wcd939x_typec_mux_set()
3179 if (wcd939x->typec_mode == TYPEC_MODE_AUDIO) in wcd939x_typec_mux_set()
3180 return wcd_mbhc_typec_report_plug(wcd939x->wcd_mbhc); in wcd939x_typec_mux_set()
3182 return wcd_mbhc_typec_report_unplug(wcd939x->wcd_mbhc); in wcd939x_typec_mux_set()
3191 struct device_node *np = dev->of_node; in wcd939x_dt_parse_micbias_info()
3195 rc = of_property_read_u32(np, "qcom,micbias1-microvolt", &prop_val); in wcd939x_dt_parse_micbias_info()
3197 wcd->micb1_mv = prop_val / 1000; in wcd939x_dt_parse_micbias_info()
3201 rc = of_property_read_u32(np, "qcom,micbias2-microvolt", &prop_val); in wcd939x_dt_parse_micbias_info()
3203 wcd->micb2_mv = prop_val / 1000; in wcd939x_dt_parse_micbias_info()
3207 rc = of_property_read_u32(np, "qcom,micbias3-microvolt", &prop_val); in wcd939x_dt_parse_micbias_info()
3209 wcd->micb3_mv = prop_val / 1000; in wcd939x_dt_parse_micbias_info()
3211 dev_info(dev, "%s: Micbias3 DT property not found\n", __func__); in wcd939x_dt_parse_micbias_info()
3213 rc = of_property_read_u32(np, "qcom,micbias4-microvolt", &prop_val); in wcd939x_dt_parse_micbias_info()
3215 wcd->micb4_mv = prop_val / 1000; in wcd939x_dt_parse_micbias_info()
3225 if (!wcd939x->typec_analog_mux || !wcd939x->typec_switch) in wcd939x_swap_gnd_mic()
3229 typec_switch_set(wcd939x->typec_switch, in wcd939x_swap_gnd_mic()
3230 wcd939x->typec_orientation == TYPEC_ORIENTATION_REVERSE ? in wcd939x_swap_gnd_mic()
3239 struct wcd_mbhc_config *cfg = &wcd939x->mbhc_cfg; in wcd939x_populate_dt_data()
3245 wcd939x->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_LOW); in wcd939x_populate_dt_data()
3246 if (IS_ERR(wcd939x->reset_gpio)) in wcd939x_populate_dt_data()
3247 return dev_err_probe(dev, PTR_ERR(wcd939x->reset_gpio), in wcd939x_populate_dt_data()
3257 cfg->mbhc_micbias = MIC_BIAS_2; in wcd939x_populate_dt_data()
3258 cfg->anc_micbias = MIC_BIAS_2; in wcd939x_populate_dt_data()
3259 cfg->v_hs_max = WCD_MBHC_HS_V_MAX; in wcd939x_populate_dt_data()
3260 cfg->num_btn = WCD939X_MBHC_MAX_BUTTONS; in wcd939x_populate_dt_data()
3261 cfg->micb_mv = wcd939x->micb2_mv; in wcd939x_populate_dt_data()
3262 cfg->linein_th = 5000; in wcd939x_populate_dt_data()
3263 cfg->hs_thr = 1700; in wcd939x_populate_dt_data()
3264 cfg->hph_thr = 50; in wcd939x_populate_dt_data()
3273 np = of_graph_get_remote_node(dev->of_node, 0, 0); in wcd939x_populate_dt_data()
3275 wcd939x->typec_analog_mux = true; in wcd939x_populate_dt_data()
3276 cfg->typec_analog_mux = true; in wcd939x_populate_dt_data()
3277 cfg->swap_gnd_mic = wcd939x_swap_gnd_mic; in wcd939x_populate_dt_data()
3286 gpiod_set_value(wcd939x->reset_gpio, 1); in wcd939x_reset()
3289 gpiod_set_value(wcd939x->reset_gpio, 0); in wcd939x_reset()
3300 struct wcd939x_priv *wcd939x = dev_get_drvdata(dai->dev); in wcd939x_codec_hw_params()
3301 struct wcd939x_sdw_priv *wcd = wcd939x->sdw_priv[dai->id]; in wcd939x_codec_hw_params()
3309 struct wcd939x_priv *wcd939x = dev_get_drvdata(dai->dev); in wcd939x_codec_free()
3310 struct wcd939x_sdw_priv *wcd = wcd939x->sdw_priv[dai->id]; in wcd939x_codec_free()
3318 struct wcd939x_priv *wcd939x = dev_get_drvdata(dai->dev); in wcd939x_codec_set_sdw_stream()
3319 struct wcd939x_sdw_priv *wcd = wcd939x->sdw_priv[dai->id]; in wcd939x_codec_set_sdw_stream()
3332 .name = "wcd939x-sdw-rx",
3345 .name = "wcd939x-sdw-tx",
3367 * Get USBSS type-c switch to send gnd/mic swap events in wcd939x_bind()
3371 if (wcd939x->typec_analog_mux) { in wcd939x_bind()
3372 wcd939x->typec_switch = fwnode_typec_switch_get(dev->fwnode); in wcd939x_bind()
3373 if (IS_ERR(wcd939x->typec_switch)) in wcd939x_bind()
3374 return dev_err_probe(dev, PTR_ERR(wcd939x->typec_switch), in wcd939x_bind()
3375 "failed to acquire orientation-switch\n"); in wcd939x_bind()
3386 wcd939x->rxdev = wcd939x_sdw_device_get(wcd939x->rxnode); in wcd939x_bind()
3387 if (!wcd939x->rxdev) { in wcd939x_bind()
3389 ret = -EINVAL; in wcd939x_bind()
3392 wcd939x->sdw_priv[AIF1_PB] = dev_get_drvdata(wcd939x->rxdev); in wcd939x_bind()
3393 wcd939x->sdw_priv[AIF1_PB]->wcd939x = wcd939x; in wcd939x_bind()
3395 wcd939x->txdev = wcd939x_sdw_device_get(wcd939x->txnode); in wcd939x_bind()
3396 if (!wcd939x->txdev) { in wcd939x_bind()
3398 ret = -EINVAL; in wcd939x_bind()
3401 wcd939x->sdw_priv[AIF1_CAP] = dev_get_drvdata(wcd939x->txdev); in wcd939x_bind()
3402 wcd939x->sdw_priv[AIF1_CAP]->wcd939x = wcd939x; in wcd939x_bind()
3403 wcd939x->tx_sdw_dev = dev_to_sdw_dev(wcd939x->txdev); in wcd939x_bind()
3409 if (!device_link_add(wcd939x->rxdev, wcd939x->txdev, DL_FLAG_STATELESS | in wcd939x_bind()
3412 ret = -EINVAL; in wcd939x_bind()
3416 if (!device_link_add(dev, wcd939x->txdev, DL_FLAG_STATELESS | in wcd939x_bind()
3419 ret = -EINVAL; in wcd939x_bind()
3423 if (!device_link_add(dev, wcd939x->rxdev, DL_FLAG_STATELESS | in wcd939x_bind()
3426 ret = -EINVAL; in wcd939x_bind()
3431 wcd939x->regmap = wcd939x_swr_get_regmap(wcd939x->sdw_priv[AIF1_CAP]); in wcd939x_bind()
3432 if (IS_ERR(wcd939x->regmap)) { in wcd939x_bind()
3434 ret = PTR_ERR(wcd939x->regmap); in wcd939x_bind()
3444 wcd939x->sdw_priv[AIF1_PB]->slave_irq = wcd939x->virq; in wcd939x_bind()
3445 wcd939x->sdw_priv[AIF1_CAP]->slave_irq = wcd939x->virq; in wcd939x_bind()
3454 regmap_read(wcd939x->regmap, WCD939X_DIGITAL_CHIP_ID1, &id1); in wcd939x_bind()
3455 regmap_read(wcd939x->regmap, WCD939X_EAR_STATUS_REG_1, &status1); in wcd939x_bind()
3475 device_link_remove(dev, wcd939x->rxdev); in wcd939x_bind()
3477 device_link_remove(dev, wcd939x->txdev); in wcd939x_bind()
3479 device_link_remove(wcd939x->rxdev, wcd939x->txdev); in wcd939x_bind()
3481 put_device(wcd939x->txdev); in wcd939x_bind()
3483 put_device(wcd939x->rxdev); in wcd939x_bind()
3488 if (wcd939x->typec_analog_mux) in wcd939x_bind()
3489 typec_switch_put(wcd939x->typec_switch); in wcd939x_bind()
3500 device_link_remove(dev, wcd939x->txdev); in wcd939x_unbind()
3501 device_link_remove(dev, wcd939x->rxdev); in wcd939x_unbind()
3502 device_link_remove(wcd939x->rxdev, wcd939x->txdev); in wcd939x_unbind()
3503 put_device(wcd939x->txdev); in wcd939x_unbind()
3504 put_device(wcd939x->rxdev); in wcd939x_unbind()
3548 if (!wcd939x->typec_analog_mux) in wcd939x_add_typec()
3579 struct device_node *np = dev->of_node; in wcd939x_add_slave_components()
3581 wcd939x->rxnode = of_parse_phandle(np, "qcom,rx-device", 0); in wcd939x_add_slave_components()
3582 if (!wcd939x->rxnode) { in wcd939x_add_slave_components()
3583 dev_err(dev, "%s: Rx-device node not defined\n", __func__); in wcd939x_add_slave_components()
3584 return -ENODEV; in wcd939x_add_slave_components()
3587 of_node_get(wcd939x->rxnode); in wcd939x_add_slave_components()
3589 component_compare_of, wcd939x->rxnode); in wcd939x_add_slave_components()
3591 wcd939x->txnode = of_parse_phandle(np, "qcom,tx-device", 0); in wcd939x_add_slave_components()
3592 if (!wcd939x->txnode) { in wcd939x_add_slave_components()
3593 dev_err(dev, "%s: Tx-device node not defined\n", __func__); in wcd939x_add_slave_components()
3594 return -ENODEV; in wcd939x_add_slave_components()
3596 of_node_get(wcd939x->txnode); in wcd939x_add_slave_components()
3598 component_compare_of, wcd939x->txnode); in wcd939x_add_slave_components()
3606 struct device *dev = &pdev->dev; in wcd939x_probe()
3612 return -ENOMEM; in wcd939x_probe()
3615 mutex_init(&wcd939x->micb_lock); in wcd939x_probe()
3620 return -EINVAL; in wcd939x_probe()
3649 struct device *dev = &pdev->dev; in wcd939x_remove()
3660 { .compatible = "qcom,wcd9390-codec" },
3661 { .compatible = "qcom,wcd9395-codec" },