Lines Matching +full:adc2 +full:-
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-common.h"
32 #include "wcd-mbhc-v2.h"
215 "vdd-rxtx", "vdd-io", "vdd-buck", "vdd-mic-bias", "vdd-px",
218 static const SNDRV_CTL_TLVD_DECLARE_DB_MINMAX(ear_pa_gain, 600, -1800);
422 port_num = ch_info->port_num; in wcd939x_sdw_connect_port()
423 ch_mask = ch_info->ch_mask; in wcd939x_sdw_connect_port()
425 port_config->num = port_num; in wcd939x_sdw_connect_port()
428 port_config->ch_mask |= ch_mask; in wcd939x_sdw_connect_port()
430 port_config->ch_mask &= ~ch_mask; in wcd939x_sdw_connect_port()
437 return wcd939x_sdw_connect_port(&wcd->ch_info[ch_id], in wcd939x_connect_port()
438 &wcd->port_config[port_num - 1], in wcd939x_connect_port()
446 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in wcd939x_codec_enable_rxclk()
506 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in wcd939x_codec_hphl_dac_event()
521 if (wcd939x->comp1_enable) { in wcd939x_codec_hphl_dac_event()
527 if (!wcd939x->comp2_enable || in wcd939x_codec_hphl_dac_event()
560 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in wcd939x_codec_hphr_dac_event()
563 dev_dbg(component->dev, "%s wname: %s event: %d\n", __func__, in wcd939x_codec_hphr_dac_event()
564 w->name, event); in wcd939x_codec_hphr_dac_event()
578 if (wcd939x->comp2_enable) { in wcd939x_codec_hphr_dac_event()
584 if (!wcd939x->comp1_enable || in wcd939x_codec_hphr_dac_event()
616 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in wcd939x_codec_ear_dac_event()
629 wcd_clsh_ctrl_set_state(wcd939x->clsh_info, WCD_CLSH_EVENT_PRE_DAC, in wcd939x_codec_ear_dac_event()
648 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in wcd939x_codec_enable_hphr_pa()
650 int hph_mode = wcd939x->hph_mode; in wcd939x_codec_enable_hphr_pa()
654 if (wcd939x->ldoh) in wcd939x_codec_enable_hphr_pa()
658 wcd_clsh_ctrl_set_state(wcd939x->clsh_info, WCD_CLSH_EVENT_PRE_DAC, in wcd939x_codec_enable_hphr_pa()
660 wcd_clsh_set_hph_mode(wcd939x->clsh_info, CLS_H_HIFI); in wcd939x_codec_enable_hphr_pa()
679 set_bit(HPH_PA_DELAY, &wcd939x->status_mask); in wcd939x_codec_enable_hphr_pa()
689 if (test_bit(HPH_PA_DELAY, &wcd939x->status_mask)) { in wcd939x_codec_enable_hphr_pa()
690 if (!wcd939x->comp2_enable) in wcd939x_codec_enable_hphr_pa()
701 clear_bit(HPH_PA_DELAY, &wcd939x->status_mask); in wcd939x_codec_enable_hphr_pa()
711 enable_irq(wcd939x->hphr_pdm_wd_int); in wcd939x_codec_enable_hphr_pa()
714 disable_irq_nosync(wcd939x->hphr_pdm_wd_int); in wcd939x_codec_enable_hphr_pa()
720 if (!wcd939x->comp2_enable) in wcd939x_codec_enable_hphr_pa()
728 wcd_mbhc_event_notify(wcd939x->wcd_mbhc, in wcd939x_codec_enable_hphr_pa()
730 set_bit(HPH_PA_DELAY, &wcd939x->status_mask); in wcd939x_codec_enable_hphr_pa()
738 if (test_bit(HPH_PA_DELAY, &wcd939x->status_mask)) { in wcd939x_codec_enable_hphr_pa()
739 if (!wcd939x->comp2_enable) in wcd939x_codec_enable_hphr_pa()
743 clear_bit(HPH_PA_DELAY, &wcd939x->status_mask); in wcd939x_codec_enable_hphr_pa()
745 wcd_mbhc_event_notify(wcd939x->wcd_mbhc, in wcd939x_codec_enable_hphr_pa()
753 wcd_clsh_ctrl_set_state(wcd939x->clsh_info, WCD_CLSH_EVENT_POST_PA, in wcd939x_codec_enable_hphr_pa()
755 if (wcd939x->ldoh) in wcd939x_codec_enable_hphr_pa()
768 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in wcd939x_codec_enable_hphl_pa()
770 int hph_mode = wcd939x->hph_mode; in wcd939x_codec_enable_hphl_pa()
772 dev_dbg(component->dev, "%s wname: %s event: %d\n", __func__, in wcd939x_codec_enable_hphl_pa()
773 w->name, event); in wcd939x_codec_enable_hphl_pa()
777 if (wcd939x->ldoh) in wcd939x_codec_enable_hphl_pa()
780 wcd_clsh_ctrl_set_state(wcd939x->clsh_info, WCD_CLSH_EVENT_PRE_DAC, in wcd939x_codec_enable_hphl_pa()
782 wcd_clsh_set_hph_mode(wcd939x->clsh_info, CLS_H_HIFI); in wcd939x_codec_enable_hphl_pa()
802 set_bit(HPH_PA_DELAY, &wcd939x->status_mask); in wcd939x_codec_enable_hphl_pa()
812 if (test_bit(HPH_PA_DELAY, &wcd939x->status_mask)) { in wcd939x_codec_enable_hphl_pa()
813 if (!wcd939x->comp1_enable) in wcd939x_codec_enable_hphl_pa()
823 clear_bit(HPH_PA_DELAY, &wcd939x->status_mask); in wcd939x_codec_enable_hphl_pa()
832 enable_irq(wcd939x->hphl_pdm_wd_int); in wcd939x_codec_enable_hphl_pa()
835 disable_irq_nosync(wcd939x->hphl_pdm_wd_int); in wcd939x_codec_enable_hphl_pa()
841 if (!wcd939x->comp1_enable) in wcd939x_codec_enable_hphl_pa()
849 wcd_mbhc_event_notify(wcd939x->wcd_mbhc, WCD_EVENT_PRE_HPHL_PA_OFF); in wcd939x_codec_enable_hphl_pa()
850 set_bit(HPH_PA_DELAY, &wcd939x->status_mask); in wcd939x_codec_enable_hphl_pa()
858 if (test_bit(HPH_PA_DELAY, &wcd939x->status_mask)) { in wcd939x_codec_enable_hphl_pa()
859 if (!wcd939x->comp1_enable) in wcd939x_codec_enable_hphl_pa()
863 clear_bit(HPH_PA_DELAY, &wcd939x->status_mask); in wcd939x_codec_enable_hphl_pa()
865 wcd_mbhc_event_notify(wcd939x->wcd_mbhc, in wcd939x_codec_enable_hphl_pa()
871 wcd_clsh_ctrl_set_state(wcd939x->clsh_info, WCD_CLSH_EVENT_POST_PA, in wcd939x_codec_enable_hphl_pa()
873 if (wcd939x->ldoh) in wcd939x_codec_enable_hphl_pa()
885 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in wcd939x_codec_enable_ear_pa()
902 enable_irq(wcd939x->ear_pdm_wd_int); in wcd939x_codec_enable_ear_pa()
905 disable_irq_nosync(wcd939x->ear_pdm_wd_int); in wcd939x_codec_enable_ear_pa()
915 wcd_clsh_ctrl_set_state(wcd939x->clsh_info, WCD_CLSH_EVENT_POST_PA, in wcd939x_codec_enable_ear_pa()
929 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in wcd939x_codec_enable_dmic()
935 switch (w->shift) { in wcd939x_codec_enable_dmic()
969 dev_err(component->dev, "%s: Invalid DMIC Selection\n", __func__); in wcd939x_codec_enable_dmic()
970 return -EINVAL; in wcd939x_codec_enable_dmic()
979 if (w->shift == 2) in wcd939x_codec_enable_dmic()
998 if (w->shift == 2) in wcd939x_codec_enable_dmic()
1013 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in wcd939x_tx_swr_ctrl()
1018 bank = sdw_slave_get_current_bank(wcd939x->sdw_priv[AIF1_CAP]->sdev); in wcd939x_tx_swr_ctrl()
1022 if (strnstr(w->name, "ADC", sizeof("ADC"))) { in wcd939x_tx_swr_ctrl()
1025 if (test_bit(WCD_ADC1, &wcd939x->status_mask)) in wcd939x_tx_swr_ctrl()
1026 mode |= tx_mode_bit[wcd939x->tx_mode[WCD_ADC1]]; in wcd939x_tx_swr_ctrl()
1027 if (test_bit(WCD_ADC2, &wcd939x->status_mask)) in wcd939x_tx_swr_ctrl()
1028 mode |= tx_mode_bit[wcd939x->tx_mode[WCD_ADC2]]; in wcd939x_tx_swr_ctrl()
1029 if (test_bit(WCD_ADC3, &wcd939x->status_mask)) in wcd939x_tx_swr_ctrl()
1030 mode |= tx_mode_bit[wcd939x->tx_mode[WCD_ADC3]]; in wcd939x_tx_swr_ctrl()
1031 if (test_bit(WCD_ADC4, &wcd939x->status_mask)) in wcd939x_tx_swr_ctrl()
1032 mode |= tx_mode_bit[wcd939x->tx_mode[WCD_ADC4]]; in wcd939x_tx_swr_ctrl()
1035 rate = wcd939x_get_clk_rate(ffs(mode) - 1); in wcd939x_tx_swr_ctrl()
1043 if (strnstr(w->name, "ADC", sizeof("ADC"))) { in wcd939x_tx_swr_ctrl()
1081 ret = -EINVAL; in wcd939x_get_adc_mode()
1090 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in wcd939x_codec_enable_adc()
1100 set_bit(w->shift, &wcd939x->status_mask); in wcd939x_codec_enable_adc()
1109 clear_bit(w->shift, &wcd939x->status_mask); in wcd939x_codec_enable_adc()
1148 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in wcd939x_adc_enable_req()
1159 wcd939x_tx_channel_config(component, w->shift, true); in wcd939x_adc_enable_req()
1160 mode = wcd939x_get_adc_mode(wcd939x->tx_mode[w->shift]); in wcd939x_adc_enable_req()
1162 dev_info(component->dev, "Invalid ADC mode\n"); in wcd939x_adc_enable_req()
1163 return -EINVAL; in wcd939x_adc_enable_req()
1166 switch (w->shift) { in wcd939x_adc_enable_req()
1211 wcd939x_tx_channel_config(component, w->shift, false); in wcd939x_adc_enable_req()
1214 switch (w->shift) { in wcd939x_adc_enable_req()
1268 int micb_index = micb_num - 1; in wcd939x_micbias_control()
1285 dev_err(component->dev, "%s: Invalid micbias number: %d\n", in wcd939x_micbias_control()
1287 return -EINVAL; in wcd939x_micbias_control()
1292 wcd939x->pullup_ref[micb_index]++; in wcd939x_micbias_control()
1293 if (wcd939x->pullup_ref[micb_index] == 1 && in wcd939x_micbias_control()
1294 wcd939x->micb_ref[micb_index] == 0) in wcd939x_micbias_control()
1300 if (wcd939x->pullup_ref[micb_index] > 0) in wcd939x_micbias_control()
1301 wcd939x->pullup_ref[micb_index]--; in wcd939x_micbias_control()
1302 if (wcd939x->pullup_ref[micb_index] == 0 && in wcd939x_micbias_control()
1303 wcd939x->micb_ref[micb_index] == 0) in wcd939x_micbias_control()
1309 wcd939x->micb_ref[micb_index]++; in wcd939x_micbias_control()
1310 if (wcd939x->micb_ref[micb_index] == 1) { in wcd939x_micbias_control()
1347 wcd_mbhc_event_notify(wcd939x->wcd_mbhc, in wcd939x_micbias_control()
1351 wcd_mbhc_event_notify(wcd939x->wcd_mbhc, in wcd939x_micbias_control()
1355 if (wcd939x->micb_ref[micb_index] > 0) in wcd939x_micbias_control()
1356 wcd939x->micb_ref[micb_index]--; in wcd939x_micbias_control()
1358 if (wcd939x->micb_ref[micb_index] == 0 && in wcd939x_micbias_control()
1359 wcd939x->pullup_ref[micb_index] > 0) in wcd939x_micbias_control()
1363 else if (wcd939x->micb_ref[micb_index] == 0 && in wcd939x_micbias_control()
1364 wcd939x->pullup_ref[micb_index] == 0) { in wcd939x_micbias_control()
1366 wcd_mbhc_event_notify(wcd939x->wcd_mbhc, in wcd939x_micbias_control()
1373 wcd_mbhc_event_notify(wcd939x->wcd_mbhc, in wcd939x_micbias_control()
1377 wcd_mbhc_event_notify(wcd939x->wcd_mbhc, in wcd939x_micbias_control()
1389 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in wcd939x_codec_enable_micbias()
1390 int micb_num = w->shift; in wcd939x_codec_enable_micbias()
1412 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in wcd939x_codec_enable_micbias_pullup()
1413 int micb_num = w->shift; in wcd939x_codec_enable_micbias_pullup()
1438 struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; in wcd939x_tx_mode_get()
1439 int path = e->shift_l; in wcd939x_tx_mode_get()
1441 ucontrol->value.enumerated.item[0] = wcd939x->tx_mode[path]; in wcd939x_tx_mode_get()
1451 struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; in wcd939x_tx_mode_put()
1452 int path = e->shift_l; in wcd939x_tx_mode_put()
1454 if (wcd939x->tx_mode[path] == ucontrol->value.enumerated.item[0]) in wcd939x_tx_mode_put()
1457 wcd939x->tx_mode[path] = ucontrol->value.enumerated.item[0]; in wcd939x_tx_mode_put()
1470 ucontrol->value.integer.value[0] = wcd939x->hph_mode; in wcd939x_rx_hph_mode_get()
1482 mode_val = ucontrol->value.enumerated.item[0]; in wcd939x_rx_hph_mode_put()
1484 if (mode_val == wcd939x->hph_mode) in wcd939x_rx_hph_mode_put()
1487 if (wcd939x->variant == CHIPID_WCD9390) { in wcd939x_rx_hph_mode_put()
1496 wcd939x->hph_mode = mode_val; in wcd939x_rx_hph_mode_put()
1510 wcd939x->hph_mode = mode_val; in wcd939x_rx_hph_mode_put()
1515 dev_dbg(component->dev, "%s: Invalid HPH Mode\n", __func__); in wcd939x_rx_hph_mode_put()
1516 return -EINVAL; in wcd939x_rx_hph_mode_put()
1522 struct soc_mixer_control *mc = (struct soc_mixer_control *)(kcontrol->private_value); in wcd939x_get_compander()
1526 if (mc->shift) in wcd939x_get_compander()
1527 ucontrol->value.integer.value[0] = wcd939x->comp2_enable ? 1 : 0; in wcd939x_get_compander()
1529 ucontrol->value.integer.value[0] = wcd939x->comp1_enable ? 1 : 0; in wcd939x_get_compander()
1537 struct soc_mixer_control *mc = (struct soc_mixer_control *)(kcontrol->private_value); in wcd939x_set_compander()
1540 struct wcd939x_sdw_priv *wcd = wcd939x->sdw_priv[AIF1_PB]; in wcd939x_set_compander()
1541 bool value = !!ucontrol->value.integer.value[0]; in wcd939x_set_compander()
1542 int portidx = wcd->ch_info[mc->reg].port_num; in wcd939x_set_compander()
1544 if (mc->shift) in wcd939x_set_compander()
1545 wcd939x->comp2_enable = value; in wcd939x_set_compander()
1547 wcd939x->comp1_enable = value; in wcd939x_set_compander()
1550 wcd939x_connect_port(wcd, portidx, mc->reg, true); in wcd939x_set_compander()
1552 wcd939x_connect_port(wcd, portidx, mc->reg, false); in wcd939x_set_compander()
1563 ucontrol->value.integer.value[0] = wcd939x->ldoh ? 1 : 0; in wcd939x_ldoh_get()
1574 if (wcd939x->ldoh == !!ucontrol->value.integer.value[0]) in wcd939x_ldoh_put()
1577 wcd939x->ldoh = !!ucontrol->value.integer.value[0]; in wcd939x_ldoh_put()
1753 SOC_DAPM_ENUM("ADC2 MUX Mux", adc2_enum);
1791 struct soc_mixer_control *mixer = (struct soc_mixer_control *)kcontrol->private_value; in wcd939x_get_swr_port()
1794 struct wcd939x_sdw_priv *wcd = wcd939x->sdw_priv[mixer->shift]; in wcd939x_get_swr_port()
1795 unsigned int portidx = wcd->ch_info[mixer->reg].port_num; in wcd939x_get_swr_port()
1797 ucontrol->value.integer.value[0] = wcd->port_enable[portidx] ? 1 : 0; in wcd939x_get_swr_port()
1818 struct soc_mixer_control *mixer = (struct soc_mixer_control *)kcontrol->private_value; in wcd939x_set_swr_port()
1821 struct wcd939x_sdw_priv *wcd = wcd939x->sdw_priv[mixer->shift]; in wcd939x_set_swr_port()
1822 unsigned int portidx = wcd->ch_info[mixer->reg].port_num; in wcd939x_set_swr_port()
1824 wcd->port_enable[portidx] = !!ucontrol->value.integer.value[0]; in wcd939x_set_swr_port()
1826 wcd939x_connect_port(wcd, portidx, mixer->reg, wcd->port_enable[portidx]); in wcd939x_set_swr_port()
1854 dev_err(component->dev, "%s: invalid number of buttons: %d\n", in wcd939x_mbhc_program_btn_thr()
1863 dev_dbg(component->dev, "%s: btn_high[%d]: %d, vth: %d\n", in wcd939x_mbhc_program_btn_thr()
1891 dev_dbg(component->dev, "%s: HS pull up current:%d\n", in wcd939x_mbhc_hph_l_pull_up_control()
1942 return -EINVAL; in wcd939x_mbhc_micb_adjust_voltage()
1944 mutex_lock(&wcd939x->micb_lock); in wcd939x_mbhc_micb_adjust_voltage()
1950 * to avoid slow micbias ramp-up or down enable pull-up in wcd939x_mbhc_micb_adjust_voltage()
1951 * momentarily, change the micbias value and then re-enable in wcd939x_mbhc_micb_adjust_voltage()
1959 req_vout_ctl = wcd_get_micb_vout_ctl_val(component->dev, req_volt); in wcd939x_mbhc_micb_adjust_voltage()
1970 dev_dbg(component->dev, "%s: micb_num: %d, cur_mv: %d, req_mv: %d, micb_en: %d\n", in wcd939x_mbhc_micb_adjust_voltage()
1994 mutex_unlock(&wcd939x->micb_lock); in wcd939x_mbhc_micb_adjust_voltage()
2005 return -EINVAL; in wcd939x_mbhc_micb_ctrl_threshold_mic()
2011 if (wcd939x->common.micb_mv[1] >= WCD_MBHC_THR_HS_MICB_MV) in wcd939x_mbhc_micb_ctrl_threshold_mic()
2014 micb_mv = req_en ? WCD_MBHC_THR_HS_MICB_MV : wcd939x->common.micb_mv[1]; in wcd939x_mbhc_micb_ctrl_threshold_mic()
2068 dev_dbg(component->dev, in wcd939x_mbhc_get_result_params()
2075 denom = (x1 * d1) - (1 << (14 - zdet_param->noff)); in wcd939x_mbhc_get_result_params()
2078 else if (x1 < wcd939x_mbhc_mincode_param[zdet_param->noff]) in wcd939x_mbhc_get_result_params()
2081 dev_dbg(component->dev, "%s: d1=%d, c1=%d, x1=0x%x, z_val=%d(milliOhm)\n", in wcd939x_mbhc_get_result_params()
2104 WCD939X_ZDET_ANA_CTL_MAXV_CTL, zdet_param->ldo_ctl); in wcd939x_mbhc_zdet_ramp()
2106 zdet_param->btn5); in wcd939x_mbhc_zdet_ramp()
2108 zdet_param->btn6); in wcd939x_mbhc_zdet_ramp()
2110 zdet_param->btn7); in wcd939x_mbhc_zdet_ramp()
2112 WCD939X_ZDET_ANA_CTL_RANGE_CTL, zdet_param->noff); in wcd939x_mbhc_zdet_ramp()
2114 WCD939X_ZDET_RAMP_CTL_TIME_CTL, zdet_param->nshift); in wcd939x_mbhc_zdet_ramp()
2124 dev_dbg(component->dev, "%s: ramp for HPH_L, noff = %d\n", in wcd939x_mbhc_zdet_ramp()
2125 __func__, zdet_param->noff); in wcd939x_mbhc_zdet_ramp()
2139 dev_dbg(component->dev, "%s: ramp for HPH_R, noff = %d\n", in wcd939x_mbhc_zdet_ramp()
2140 __func__, zdet_param->noff); in wcd939x_mbhc_zdet_ramp()
2156 q1_cal = (10000 - ((q1 & GENMASK(6, 0)) * 10)); in wcd939x_wcd_mbhc_qfuse_cal()
2167 struct wcd939x_priv *wcd939x = dev_get_drvdata(component->dev); in wcd939x_wcd_mbhc_calc_impedance()
2186 /* For NO-jack, disable L_DET_EN before Z-det measurements */ in wcd939x_wcd_mbhc_calc_impedance()
2187 if (wcd939x->mbhc_cfg.hphl_swh) in wcd939x_wcd_mbhc_calc_impedance()
2216 dev_dbg(component->dev, "%s: impedance on HPH_L = %d(ohms)\n", in wcd939x_wcd_mbhc_calc_impedance()
2227 dev_dbg(component->dev, "%s: impedance on HPH_R = %d(ohms)\n", in wcd939x_wcd_mbhc_calc_impedance()
2233 dev_dbg(component->dev, in wcd939x_wcd_mbhc_calc_impedance()
2243 dev_dbg(component->dev, in wcd939x_wcd_mbhc_calc_impedance()
2246 wcd_mbhc_set_hph_type(wcd939x->wcd_mbhc, WCD_MBHC_HPH_MONO); in wcd939x_wcd_mbhc_calc_impedance()
2265 z_diff1 = z1ls > z_mono ? z1ls - z_mono : z_mono - z1ls; in wcd939x_wcd_mbhc_calc_impedance()
2266 z_diff2 = *zl > z1ls ? *zl - z1ls : z1ls - *zl; in wcd939x_wcd_mbhc_calc_impedance()
2268 dev_dbg(component->dev, "%s: stereo plug type detected\n", in wcd939x_wcd_mbhc_calc_impedance()
2270 wcd_mbhc_set_hph_type(wcd939x->wcd_mbhc, WCD_MBHC_HPH_STEREO); in wcd939x_wcd_mbhc_calc_impedance()
2272 dev_dbg(component->dev, "%s: MONO plug type detected\n", in wcd939x_wcd_mbhc_calc_impedance()
2274 wcd_mbhc_set_hph_type(wcd939x->wcd_mbhc, WCD_MBHC_HPH_MONO); in wcd939x_wcd_mbhc_calc_impedance()
2292 /* For NO-jack, re-enable L_DET_EN after Z-det measurements */ in wcd939x_wcd_mbhc_calc_impedance()
2293 if (wcd939x->mbhc_cfg.hphl_swh) in wcd939x_wcd_mbhc_calc_impedance()
2336 if (wcd939x->mbhc_cfg.moist_rref == R_OFF || wcd939x->typec_analog_mux) { in wcd939x_mbhc_moisture_config()
2343 if (!wcd939x->mbhc_cfg.hphl_swh) { in wcd939x_mbhc_moisture_config()
2344 dev_dbg(component->dev, "%s: disable moisture detection for NC\n", in wcd939x_mbhc_moisture_config()
2352 WCD939X_CTL_2_M_RTH_CTL, wcd939x->mbhc_cfg.moist_rref); in wcd939x_mbhc_moisture_config()
2362 wcd939x->mbhc_cfg.moist_rref); in wcd939x_mbhc_moisture_detect_en()
2373 if (wcd939x->mbhc_cfg.moist_rref == R_OFF || wcd939x->typec_analog_mux) { in wcd939x_mbhc_get_moisture_status()
2380 if (!wcd939x->mbhc_cfg.hphl_swh) { in wcd939x_mbhc_get_moisture_status()
2381 dev_dbg(component->dev, "%s: disable moisture detection for NC\n", in wcd939x_mbhc_get_moisture_status()
2438 ucontrol->value.integer.value[0] = wcd_mbhc_get_hph_type(wcd939x->wcd_mbhc); in wcd939x_get_hph_type()
2446 struct soc_mixer_control *mc = (struct soc_mixer_control *)(kcontrol->private_value); in wcd939x_hph_impedance_get()
2449 bool hphr = mc->shift; in wcd939x_hph_impedance_get()
2452 wcd_mbhc_get_impedance(wcd939x->wcd_mbhc, &zl, &zr); in wcd939x_hph_impedance_get()
2453 dev_dbg(component->dev, "%s: zl=%u(ohms), zr=%u(ohms)\n", __func__, zl, zr); in wcd939x_hph_impedance_get()
2454 ucontrol->value.integer.value[0] = hphr ? zr : zl; in wcd939x_hph_impedance_get()
2474 struct wcd_mbhc_intr *intr_ids = &wcd939x->intr_ids; in wcd939x_mbhc_init()
2476 intr_ids->mbhc_sw_intr = regmap_irq_get_virq(wcd939x->irq_chip, in wcd939x_mbhc_init()
2478 intr_ids->mbhc_btn_press_intr = regmap_irq_get_virq(wcd939x->irq_chip, in wcd939x_mbhc_init()
2480 intr_ids->mbhc_btn_release_intr = regmap_irq_get_virq(wcd939x->irq_chip, in wcd939x_mbhc_init()
2482 intr_ids->mbhc_hs_ins_intr = regmap_irq_get_virq(wcd939x->irq_chip, in wcd939x_mbhc_init()
2484 intr_ids->mbhc_hs_rem_intr = regmap_irq_get_virq(wcd939x->irq_chip, in wcd939x_mbhc_init()
2486 intr_ids->hph_left_ocp = regmap_irq_get_virq(wcd939x->irq_chip, in wcd939x_mbhc_init()
2488 intr_ids->hph_right_ocp = regmap_irq_get_virq(wcd939x->irq_chip, in wcd939x_mbhc_init()
2491 wcd939x->wcd_mbhc = wcd_mbhc_init(component, &mbhc_cb, intr_ids, wcd_mbhc_fields, true); in wcd939x_mbhc_init()
2492 if (IS_ERR(wcd939x->wcd_mbhc)) in wcd939x_mbhc_init()
2493 return PTR_ERR(wcd939x->wcd_mbhc); in wcd939x_mbhc_init()
2507 wcd_mbhc_deinit(wcd939x->wcd_mbhc); in wcd939x_mbhc_deinit()
2538 SOC_SINGLE_EXT("ADC2 Switch", WCD939X_ADC2, 1, 1, 0,
2564 SOC_SINGLE_TLV("ADC2 Volume", WCD939X_ANA_TX_CH2, 0, 20, 0,
2590 SND_SOC_DAPM_ADC_E("ADC2", NULL, SND_SOC_NOPM, 1, 0,
2627 SND_SOC_DAPM_MIXER_E("ADC2 REQ", SND_SOC_NOPM, 1, 0, NULL, 0,
2638 SND_SOC_DAPM_MUX("ADC2 MUX", SND_SOC_NOPM, 0, 0, &tx_adc2_mux),
2802 {"ADC2_MIXER", "Switch", "ADC2 REQ"},
2803 {"ADC2 REQ", NULL, "ADC2"},
2804 {"ADC2", NULL, "ADC2 MUX"},
2805 {"ADC2 MUX", "CH2_AMIC1", "AMIC1"},
2806 {"ADC2 MUX", "CH2_AMIC2", "AMIC2"},
2807 {"ADC2 MUX", "CH2_AMIC3", "AMIC3"},
2808 {"ADC2 MUX", "CH2_AMIC4", "AMIC4"},
2809 {"ADC2 MUX", "CH2_AMIC5", "AMIC5"},
2887 regmap_update_bits(wcd939x->regmap, WCD939X_ANA_MICB1, in wcd939x_set_micbias_data()
2888 WCD939X_MICB_VOUT_CTL, wcd939x->common.micb_vout[0]); in wcd939x_set_micbias_data()
2889 regmap_update_bits(wcd939x->regmap, WCD939X_ANA_MICB2, in wcd939x_set_micbias_data()
2890 WCD939X_MICB_VOUT_CTL, wcd939x->common.micb_vout[1]); in wcd939x_set_micbias_data()
2891 regmap_update_bits(wcd939x->regmap, WCD939X_ANA_MICB3, in wcd939x_set_micbias_data()
2892 WCD939X_MICB_VOUT_CTL, wcd939x->common.micb_vout[2]); in wcd939x_set_micbias_data()
2893 regmap_update_bits(wcd939x->regmap, WCD939X_ANA_MICB4, in wcd939x_set_micbias_data()
2894 WCD939X_MICB_VOUT_CTL, wcd939x->common.micb_vout[3]); in wcd939x_set_micbias_data()
2932 * \-handle_nested_irq(0)
2933 * \- regmap_irq_thread()
2934 * \- handle_nested_irq(i)
2956 wcd->virq = irq_domain_create_linear(NULL, 1, &wcd_domain_ops, NULL); in wcd939x_irq_init()
2957 if (!(wcd->virq)) { in wcd939x_irq_init()
2959 return -EINVAL; in wcd939x_irq_init()
2962 return devm_regmap_add_irq_chip(dev, wcd->regmap, in wcd939x_irq_init()
2963 irq_create_mapping(wcd->virq, 0), in wcd939x_irq_init()
2965 &wcd->irq_chip); in wcd939x_irq_init()
2971 struct sdw_slave *tx_sdw_dev = wcd939x->tx_sdw_dev; in wcd939x_soc_codec_probe()
2972 struct device *dev = component->dev; in wcd939x_soc_codec_probe()
2976 time_left = wait_for_completion_timeout(&tx_sdw_dev->initialization_complete, in wcd939x_soc_codec_probe()
2980 return -ETIMEDOUT; in wcd939x_soc_codec_probe()
2983 snd_soc_component_init_regmap(component, wcd939x->regmap); in wcd939x_soc_codec_probe()
2989 wcd939x->variant = snd_soc_component_read_field(component, in wcd939x_soc_codec_probe()
2993 wcd939x->clsh_info = wcd_clsh_ctrl_alloc(component, WCD939X); in wcd939x_soc_codec_probe()
2994 if (IS_ERR(wcd939x->clsh_info)) { in wcd939x_soc_codec_probe()
2996 return PTR_ERR(wcd939x->clsh_info); in wcd939x_soc_codec_probe()
3003 regmap_write(wcd939x->regmap, in wcd939x_soc_codec_probe()
3009 wcd939x->hphr_pdm_wd_int = regmap_irq_get_virq(wcd939x->irq_chip, in wcd939x_soc_codec_probe()
3011 wcd939x->hphl_pdm_wd_int = regmap_irq_get_virq(wcd939x->irq_chip, in wcd939x_soc_codec_probe()
3013 wcd939x->ear_pdm_wd_int = regmap_irq_get_virq(wcd939x->irq_chip, in wcd939x_soc_codec_probe()
3016 ret = request_threaded_irq(wcd939x->hphr_pdm_wd_int, NULL, wcd939x_wd_handle_irq, in wcd939x_soc_codec_probe()
3024 ret = request_threaded_irq(wcd939x->hphl_pdm_wd_int, NULL, wcd939x_wd_handle_irq, in wcd939x_soc_codec_probe()
3032 ret = request_threaded_irq(wcd939x->ear_pdm_wd_int, NULL, wcd939x_wd_handle_irq, in wcd939x_soc_codec_probe()
3041 disable_irq_nosync(wcd939x->hphr_pdm_wd_int); in wcd939x_soc_codec_probe()
3042 disable_irq_nosync(wcd939x->hphl_pdm_wd_int); in wcd939x_soc_codec_probe()
3043 disable_irq_nosync(wcd939x->ear_pdm_wd_int); in wcd939x_soc_codec_probe()
3045 switch (wcd939x->variant) { in wcd939x_soc_codec_probe()
3050 dev_err(component->dev, in wcd939x_soc_codec_probe()
3052 __func__, wcd939x->variant); in wcd939x_soc_codec_probe()
3060 dev_err(component->dev, in wcd939x_soc_codec_probe()
3062 __func__, wcd939x->variant); in wcd939x_soc_codec_probe()
3072 dev_err(component->dev, "mbhc initialization failed\n"); in wcd939x_soc_codec_probe()
3079 free_irq(wcd939x->ear_pdm_wd_int, wcd939x); in wcd939x_soc_codec_probe()
3081 free_irq(wcd939x->hphl_pdm_wd_int, wcd939x); in wcd939x_soc_codec_probe()
3083 free_irq(wcd939x->hphr_pdm_wd_int, wcd939x); in wcd939x_soc_codec_probe()
3085 wcd_clsh_ctrl_free(wcd939x->clsh_info); in wcd939x_soc_codec_probe()
3096 free_irq(wcd939x->ear_pdm_wd_int, wcd939x); in wcd939x_soc_codec_remove()
3097 free_irq(wcd939x->hphl_pdm_wd_int, wcd939x); in wcd939x_soc_codec_remove()
3098 free_irq(wcd939x->hphr_pdm_wd_int, wcd939x); in wcd939x_soc_codec_remove()
3100 wcd_clsh_ctrl_free(wcd939x->clsh_info); in wcd939x_soc_codec_remove()
3106 struct wcd939x_priv *wcd = dev_get_drvdata(comp->dev); in wcd939x_codec_set_jack()
3109 return wcd_mbhc_start(wcd->wcd_mbhc, &wcd->mbhc_cfg, jack); in wcd939x_codec_set_jack()
3111 wcd_mbhc_stop(wcd->wcd_mbhc); in wcd939x_codec_set_jack()
3131 /* Get USB-C plug orientation to provide swap event for MBHC */
3137 wcd939x->typec_orientation = orientation; in wcd939x_typec_switch_set()
3146 unsigned int previous_mode = wcd939x->typec_mode; in wcd939x_typec_mux_set()
3148 if (!wcd939x->wcd_mbhc) in wcd939x_typec_mux_set()
3149 return -EINVAL; in wcd939x_typec_mux_set()
3151 if (wcd939x->typec_mode != state->mode) { in wcd939x_typec_mux_set()
3152 wcd939x->typec_mode = state->mode; in wcd939x_typec_mux_set()
3154 if (wcd939x->typec_mode == TYPEC_MODE_AUDIO) in wcd939x_typec_mux_set()
3155 return wcd_mbhc_typec_report_plug(wcd939x->wcd_mbhc); in wcd939x_typec_mux_set()
3157 return wcd_mbhc_typec_report_unplug(wcd939x->wcd_mbhc); in wcd939x_typec_mux_set()
3169 if (!wcd939x->typec_analog_mux || !wcd939x->typec_switch) in wcd939x_swap_gnd_mic()
3173 typec_switch_set(wcd939x->typec_switch, in wcd939x_swap_gnd_mic()
3174 wcd939x->typec_orientation == TYPEC_ORIENTATION_REVERSE ? in wcd939x_swap_gnd_mic()
3183 struct wcd_mbhc_config *cfg = &wcd939x->mbhc_cfg; in wcd939x_populate_dt_data()
3189 wcd939x->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_LOW); in wcd939x_populate_dt_data()
3190 if (IS_ERR(wcd939x->reset_gpio)) in wcd939x_populate_dt_data()
3191 return dev_err_probe(dev, PTR_ERR(wcd939x->reset_gpio), in wcd939x_populate_dt_data()
3199 ret = wcd_dt_parse_micbias_info(&wcd939x->common); in wcd939x_populate_dt_data()
3203 cfg->mbhc_micbias = MIC_BIAS_2; in wcd939x_populate_dt_data()
3204 cfg->anc_micbias = MIC_BIAS_2; in wcd939x_populate_dt_data()
3205 cfg->v_hs_max = WCD_MBHC_HS_V_MAX; in wcd939x_populate_dt_data()
3206 cfg->num_btn = WCD939X_MBHC_MAX_BUTTONS; in wcd939x_populate_dt_data()
3207 cfg->micb_mv = wcd939x->common.micb_mv[1]; in wcd939x_populate_dt_data()
3208 cfg->linein_th = 5000; in wcd939x_populate_dt_data()
3209 cfg->hs_thr = 1700; in wcd939x_populate_dt_data()
3210 cfg->hph_thr = 50; in wcd939x_populate_dt_data()
3219 np = of_graph_get_remote_node(dev->of_node, 0, 0); in wcd939x_populate_dt_data()
3221 wcd939x->typec_analog_mux = true; in wcd939x_populate_dt_data()
3222 cfg->typec_analog_mux = true; in wcd939x_populate_dt_data()
3223 cfg->swap_gnd_mic = wcd939x_swap_gnd_mic; in wcd939x_populate_dt_data()
3232 gpiod_set_value(wcd939x->reset_gpio, 1); in wcd939x_reset()
3235 gpiod_set_value(wcd939x->reset_gpio, 0); in wcd939x_reset()
3246 struct wcd939x_priv *wcd939x = dev_get_drvdata(dai->dev); in wcd939x_codec_hw_params()
3247 struct wcd939x_sdw_priv *wcd = wcd939x->sdw_priv[dai->id]; in wcd939x_codec_hw_params()
3255 struct wcd939x_priv *wcd939x = dev_get_drvdata(dai->dev); in wcd939x_codec_free()
3256 struct wcd939x_sdw_priv *wcd = wcd939x->sdw_priv[dai->id]; in wcd939x_codec_free()
3264 struct wcd939x_priv *wcd939x = dev_get_drvdata(dai->dev); in wcd939x_codec_set_sdw_stream()
3265 struct wcd939x_sdw_priv *wcd = wcd939x->sdw_priv[dai->id]; in wcd939x_codec_set_sdw_stream()
3278 .name = "wcd939x-sdw-rx",
3291 .name = "wcd939x-sdw-tx",
3313 * Get USBSS type-c switch to send gnd/mic swap events in wcd939x_bind()
3317 if (wcd939x->typec_analog_mux) { in wcd939x_bind()
3318 wcd939x->typec_switch = fwnode_typec_switch_get(dev->fwnode); in wcd939x_bind()
3319 if (IS_ERR(wcd939x->typec_switch)) in wcd939x_bind()
3320 return dev_err_probe(dev, PTR_ERR(wcd939x->typec_switch), in wcd939x_bind()
3321 "failed to acquire orientation-switch\n"); in wcd939x_bind()
3332 wcd939x->rxdev = of_sdw_find_device_by_node(wcd939x->rxnode); in wcd939x_bind()
3333 if (!wcd939x->rxdev) { in wcd939x_bind()
3335 ret = -EINVAL; in wcd939x_bind()
3338 wcd939x->sdw_priv[AIF1_PB] = dev_get_drvdata(wcd939x->rxdev); in wcd939x_bind()
3339 wcd939x->sdw_priv[AIF1_PB]->wcd939x = wcd939x; in wcd939x_bind()
3341 wcd939x->txdev = of_sdw_find_device_by_node(wcd939x->txnode); in wcd939x_bind()
3342 if (!wcd939x->txdev) { in wcd939x_bind()
3344 ret = -EINVAL; in wcd939x_bind()
3347 wcd939x->sdw_priv[AIF1_CAP] = dev_get_drvdata(wcd939x->txdev); in wcd939x_bind()
3348 wcd939x->sdw_priv[AIF1_CAP]->wcd939x = wcd939x; in wcd939x_bind()
3349 wcd939x->tx_sdw_dev = dev_to_sdw_dev(wcd939x->txdev); in wcd939x_bind()
3355 if (!device_link_add(wcd939x->rxdev, wcd939x->txdev, DL_FLAG_STATELESS | in wcd939x_bind()
3358 ret = -EINVAL; in wcd939x_bind()
3362 if (!device_link_add(dev, wcd939x->txdev, DL_FLAG_STATELESS | in wcd939x_bind()
3365 ret = -EINVAL; in wcd939x_bind()
3369 if (!device_link_add(dev, wcd939x->rxdev, DL_FLAG_STATELESS | in wcd939x_bind()
3372 ret = -EINVAL; in wcd939x_bind()
3377 wcd939x->regmap = wcd939x->sdw_priv[AIF1_CAP]->regmap; in wcd939x_bind()
3378 if (!wcd939x->regmap) { in wcd939x_bind()
3380 ret = -ENODEV; in wcd939x_bind()
3390 wcd939x->sdw_priv[AIF1_PB]->slave_irq = wcd939x->virq; in wcd939x_bind()
3391 wcd939x->sdw_priv[AIF1_CAP]->slave_irq = wcd939x->virq; in wcd939x_bind()
3396 regmap_read(wcd939x->regmap, WCD939X_DIGITAL_CHIP_ID1, &id1); in wcd939x_bind()
3397 regmap_read(wcd939x->regmap, WCD939X_EAR_STATUS_REG_1, &status1); in wcd939x_bind()
3417 device_link_remove(dev, wcd939x->rxdev); in wcd939x_bind()
3419 device_link_remove(dev, wcd939x->txdev); in wcd939x_bind()
3421 device_link_remove(wcd939x->rxdev, wcd939x->txdev); in wcd939x_bind()
3423 put_device(wcd939x->txdev); in wcd939x_bind()
3425 put_device(wcd939x->rxdev); in wcd939x_bind()
3430 if (wcd939x->typec_analog_mux) in wcd939x_bind()
3431 typec_switch_put(wcd939x->typec_switch); in wcd939x_bind()
3442 device_link_remove(dev, wcd939x->txdev); in wcd939x_unbind()
3443 device_link_remove(dev, wcd939x->rxdev); in wcd939x_unbind()
3444 device_link_remove(wcd939x->rxdev, wcd939x->txdev); in wcd939x_unbind()
3445 put_device(wcd939x->txdev); in wcd939x_unbind()
3446 put_device(wcd939x->rxdev); in wcd939x_unbind()
3490 if (!wcd939x->typec_analog_mux) in wcd939x_add_typec()
3521 struct device_node *np = dev->of_node; in wcd939x_add_slave_components()
3523 wcd939x->rxnode = of_parse_phandle(np, "qcom,rx-device", 0); in wcd939x_add_slave_components()
3524 if (!wcd939x->rxnode) { in wcd939x_add_slave_components()
3525 dev_err(dev, "%s: Rx-device node not defined\n", __func__); in wcd939x_add_slave_components()
3526 return -ENODEV; in wcd939x_add_slave_components()
3530 component_compare_of, wcd939x->rxnode); in wcd939x_add_slave_components()
3532 wcd939x->txnode = of_parse_phandle(np, "qcom,tx-device", 0); in wcd939x_add_slave_components()
3533 if (!wcd939x->txnode) { in wcd939x_add_slave_components()
3534 dev_err(dev, "%s: Tx-device node not defined\n", __func__); in wcd939x_add_slave_components()
3535 return -ENODEV; in wcd939x_add_slave_components()
3539 component_compare_of, wcd939x->txnode); in wcd939x_add_slave_components()
3547 struct device *dev = &pdev->dev; in wcd939x_probe()
3553 return -ENOMEM; in wcd939x_probe()
3556 mutex_init(&wcd939x->micb_lock); in wcd939x_probe()
3557 wcd939x->common.dev = dev; in wcd939x_probe()
3558 wcd939x->common.max_bias = 4; in wcd939x_probe()
3563 return -EINVAL; in wcd939x_probe()
3592 struct device *dev = &pdev->dev; in wcd939x_remove()
3603 { .compatible = "qcom,wcd9390-codec" },
3604 { .compatible = "qcom,wcd9395-codec" },