Lines Matching +full:adc2 +full:-
1 // SPDX-License-Identifier: GPL-2.0-only
2 // Copyright (c) 2018-2020, The Linux Foundation. All rights reserved.
20 #include <sound/soc-dapm.h>
24 #include "wcd-clsh-v2.h"
25 #include "wcd-common.h"
26 #include "wcd-mbhc-v2.h"
184 "vdd-rxtx", "vdd-io", "vdd-buck", "vdd-mic-bias",
187 static const SNDRV_CTL_TLVD_DECLARE_DB_MINMAX(ear_pa_gain, 600, -1800);
188 static const DECLARE_TLV_DB_SCALE(line_gain, -3000, 150, 0);
344 struct regmap *rm = wcd938x->regmap; in wcd938x_io_init()
403 port_num = ch_info->port_num; in wcd938x_sdw_connect_port()
404 ch_mask = ch_info->ch_mask; in wcd938x_sdw_connect_port()
406 port_config->num = port_num; in wcd938x_sdw_connect_port()
409 port_config->ch_mask |= ch_mask; in wcd938x_sdw_connect_port()
411 port_config->ch_mask &= ~ch_mask; in wcd938x_sdw_connect_port()
418 return wcd938x_sdw_connect_port(&wcd->ch_info[ch_id], in wcd938x_connect_port()
419 &wcd->port_config[port_num - 1], in wcd938x_connect_port()
427 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in wcd938x_codec_enable_rxclk()
466 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in wcd938x_codec_hphl_dac_event()
485 if (wcd938x->comp1_enable) { in wcd938x_codec_hphl_dac_event()
490 if (!wcd938x->comp2_enable || (snd_soc_component_read(component, in wcd938x_codec_hphl_dac_event()
520 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in wcd938x_codec_hphr_dac_event()
539 if (wcd938x->comp2_enable) { in wcd938x_codec_hphr_dac_event()
544 if (!wcd938x->comp1_enable || in wcd938x_codec_hphr_dac_event()
574 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in wcd938x_codec_ear_dac_event()
579 wcd938x->ear_rx_path = in wcd938x_codec_ear_dac_event()
582 if (wcd938x->ear_rx_path & EAR_RX_PATH_AUX) { in wcd938x_codec_ear_dac_event()
602 if (wcd938x->comp1_enable) in wcd938x_codec_ear_dac_event()
609 if (wcd938x->flyback_cur_det_disable == 0) in wcd938x_codec_ear_dac_event()
612 wcd938x->flyback_cur_det_disable++; in wcd938x_codec_ear_dac_event()
613 wcd_clsh_ctrl_set_state(wcd938x->clsh_info, in wcd938x_codec_ear_dac_event()
616 wcd938x->hph_mode); in wcd938x_codec_ear_dac_event()
619 if (wcd938x->ear_rx_path & EAR_RX_PATH_AUX) { in wcd938x_codec_ear_dac_event()
633 if (wcd938x->comp1_enable) in wcd938x_codec_ear_dac_event()
653 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in wcd938x_codec_aux_dac_event()
667 if (wcd938x->flyback_cur_det_disable == 0) in wcd938x_codec_aux_dac_event()
670 wcd938x->flyback_cur_det_disable++; in wcd938x_codec_aux_dac_event()
671 wcd_clsh_ctrl_set_state(wcd938x->clsh_info, in wcd938x_codec_aux_dac_event()
674 wcd938x->hph_mode); in wcd938x_codec_aux_dac_event()
689 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in wcd938x_codec_enable_hphr_pa()
691 int hph_mode = wcd938x->hph_mode; in wcd938x_codec_enable_hphr_pa()
695 if (wcd938x->ldoh) in wcd938x_codec_enable_hphr_pa()
698 wcd_clsh_ctrl_set_state(wcd938x->clsh_info, WCD_CLSH_EVENT_PRE_DAC, in wcd938x_codec_enable_hphr_pa()
700 wcd_clsh_set_hph_mode(wcd938x->clsh_info, CLS_H_HIFI); in wcd938x_codec_enable_hphr_pa()
710 wcd_clsh_set_hph_mode(wcd938x->clsh_info, hph_mode); in wcd938x_codec_enable_hphr_pa()
713 set_bit(HPH_PA_DELAY, &wcd938x->status_mask); in wcd938x_codec_enable_hphr_pa()
724 if (test_bit(HPH_PA_DELAY, &wcd938x->status_mask)) { in wcd938x_codec_enable_hphr_pa()
725 if (!wcd938x->comp2_enable) in wcd938x_codec_enable_hphr_pa()
735 clear_bit(HPH_PA_DELAY, &wcd938x->status_mask); in wcd938x_codec_enable_hphr_pa()
744 enable_irq(wcd938x->hphr_pdm_wd_int); in wcd938x_codec_enable_hphr_pa()
747 disable_irq_nosync(wcd938x->hphr_pdm_wd_int); in wcd938x_codec_enable_hphr_pa()
753 if (!wcd938x->comp2_enable) in wcd938x_codec_enable_hphr_pa()
759 wcd_mbhc_event_notify(wcd938x->wcd_mbhc, in wcd938x_codec_enable_hphr_pa()
761 set_bit(HPH_PA_DELAY, &wcd938x->status_mask); in wcd938x_codec_enable_hphr_pa()
769 if (test_bit(HPH_PA_DELAY, &wcd938x->status_mask)) { in wcd938x_codec_enable_hphr_pa()
770 if (!wcd938x->comp2_enable) in wcd938x_codec_enable_hphr_pa()
774 clear_bit(HPH_PA_DELAY, &wcd938x->status_mask); in wcd938x_codec_enable_hphr_pa()
776 wcd_mbhc_event_notify(wcd938x->wcd_mbhc, in wcd938x_codec_enable_hphr_pa()
782 wcd_clsh_ctrl_set_state(wcd938x->clsh_info, WCD_CLSH_EVENT_POST_PA, in wcd938x_codec_enable_hphr_pa()
784 if (wcd938x->ldoh) in wcd938x_codec_enable_hphr_pa()
796 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in wcd938x_codec_enable_hphl_pa()
798 int hph_mode = wcd938x->hph_mode; in wcd938x_codec_enable_hphl_pa()
802 if (wcd938x->ldoh) in wcd938x_codec_enable_hphl_pa()
805 wcd_clsh_ctrl_set_state(wcd938x->clsh_info, WCD_CLSH_EVENT_PRE_DAC, in wcd938x_codec_enable_hphl_pa()
807 wcd_clsh_set_hph_mode(wcd938x->clsh_info, CLS_H_HIFI); in wcd938x_codec_enable_hphl_pa()
816 wcd_clsh_set_hph_mode(wcd938x->clsh_info, hph_mode); in wcd938x_codec_enable_hphl_pa()
819 set_bit(HPH_PA_DELAY, &wcd938x->status_mask); in wcd938x_codec_enable_hphl_pa()
830 if (test_bit(HPH_PA_DELAY, &wcd938x->status_mask)) { in wcd938x_codec_enable_hphl_pa()
831 if (!wcd938x->comp1_enable) in wcd938x_codec_enable_hphl_pa()
840 clear_bit(HPH_PA_DELAY, &wcd938x->status_mask); in wcd938x_codec_enable_hphl_pa()
850 enable_irq(wcd938x->hphl_pdm_wd_int); in wcd938x_codec_enable_hphl_pa()
853 disable_irq_nosync(wcd938x->hphl_pdm_wd_int); in wcd938x_codec_enable_hphl_pa()
859 if (!wcd938x->comp1_enable) in wcd938x_codec_enable_hphl_pa()
865 wcd_mbhc_event_notify(wcd938x->wcd_mbhc, WCD_EVENT_PRE_HPHL_PA_OFF); in wcd938x_codec_enable_hphl_pa()
866 set_bit(HPH_PA_DELAY, &wcd938x->status_mask); in wcd938x_codec_enable_hphl_pa()
874 if (test_bit(HPH_PA_DELAY, &wcd938x->status_mask)) { in wcd938x_codec_enable_hphl_pa()
875 if (!wcd938x->comp1_enable) in wcd938x_codec_enable_hphl_pa()
879 clear_bit(HPH_PA_DELAY, &wcd938x->status_mask); in wcd938x_codec_enable_hphl_pa()
881 wcd_mbhc_event_notify(wcd938x->wcd_mbhc, in wcd938x_codec_enable_hphl_pa()
887 wcd_clsh_ctrl_set_state(wcd938x->clsh_info, WCD_CLSH_EVENT_POST_PA, in wcd938x_codec_enable_hphl_pa()
889 if (wcd938x->ldoh) in wcd938x_codec_enable_hphl_pa()
901 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in wcd938x_codec_enable_aux_pa()
903 int hph_mode = wcd938x->hph_mode; in wcd938x_codec_enable_aux_pa()
918 enable_irq(wcd938x->aux_pdm_wd_int); in wcd938x_codec_enable_aux_pa()
921 disable_irq_nosync(wcd938x->aux_pdm_wd_int); in wcd938x_codec_enable_aux_pa()
928 wcd_clsh_ctrl_set_state(wcd938x->clsh_info, in wcd938x_codec_enable_aux_pa()
933 wcd938x->flyback_cur_det_disable--; in wcd938x_codec_enable_aux_pa()
934 if (wcd938x->flyback_cur_det_disable == 0) in wcd938x_codec_enable_aux_pa()
945 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in wcd938x_codec_enable_ear_pa()
947 int hph_mode = wcd938x->hph_mode; in wcd938x_codec_enable_ear_pa()
955 wcd938x->ear_rx_path = snd_soc_component_read(component, in wcd938x_codec_enable_ear_pa()
957 if (wcd938x->ear_rx_path & EAR_RX_PATH_AUX) in wcd938x_codec_enable_ear_pa()
964 if (!wcd938x->comp1_enable) in wcd938x_codec_enable_ear_pa()
978 if (wcd938x->ear_rx_path & EAR_RX_PATH_AUX) in wcd938x_codec_enable_ear_pa()
979 enable_irq(wcd938x->aux_pdm_wd_int); in wcd938x_codec_enable_ear_pa()
981 enable_irq(wcd938x->hphl_pdm_wd_int); in wcd938x_codec_enable_ear_pa()
984 if (wcd938x->ear_rx_path & EAR_RX_PATH_AUX) in wcd938x_codec_enable_ear_pa()
985 disable_irq_nosync(wcd938x->aux_pdm_wd_int); in wcd938x_codec_enable_ear_pa()
987 disable_irq_nosync(wcd938x->hphl_pdm_wd_int); in wcd938x_codec_enable_ear_pa()
990 if (!wcd938x->comp1_enable) in wcd938x_codec_enable_ear_pa()
995 if (wcd938x->ear_rx_path & EAR_RX_PATH_AUX) in wcd938x_codec_enable_ear_pa()
1002 wcd_clsh_ctrl_set_state(wcd938x->clsh_info, WCD_CLSH_EVENT_POST_PA, in wcd938x_codec_enable_ear_pa()
1005 wcd938x->flyback_cur_det_disable--; in wcd938x_codec_enable_ear_pa()
1006 if (wcd938x->flyback_cur_det_disable == 0) in wcd938x_codec_enable_ear_pa()
1019 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in wcd938x_codec_enable_dmic()
1023 switch (w->shift) { in wcd938x_codec_enable_dmic()
1053 dev_err(component->dev, "%s: Invalid DMIC Selection\n", in wcd938x_codec_enable_dmic()
1055 return -EINVAL; in wcd938x_codec_enable_dmic()
1090 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in wcd938x_tx_swr_ctrl()
1095 bank = sdw_slave_get_current_bank(wcd938x->sdw_priv[AIF1_CAP]->sdev); in wcd938x_tx_swr_ctrl()
1099 if (strnstr(w->name, "ADC", sizeof("ADC"))) { in wcd938x_tx_swr_ctrl()
1102 if (test_bit(WCD_ADC1, &wcd938x->status_mask)) in wcd938x_tx_swr_ctrl()
1103 mode |= tx_mode_bit[wcd938x->tx_mode[WCD_ADC1]]; in wcd938x_tx_swr_ctrl()
1104 if (test_bit(WCD_ADC2, &wcd938x->status_mask)) in wcd938x_tx_swr_ctrl()
1105 mode |= tx_mode_bit[wcd938x->tx_mode[WCD_ADC2]]; in wcd938x_tx_swr_ctrl()
1106 if (test_bit(WCD_ADC3, &wcd938x->status_mask)) in wcd938x_tx_swr_ctrl()
1107 mode |= tx_mode_bit[wcd938x->tx_mode[WCD_ADC3]]; in wcd938x_tx_swr_ctrl()
1108 if (test_bit(WCD_ADC4, &wcd938x->status_mask)) in wcd938x_tx_swr_ctrl()
1109 mode |= tx_mode_bit[wcd938x->tx_mode[WCD_ADC4]]; in wcd938x_tx_swr_ctrl()
1126 if (strnstr(w->name, "ADC", sizeof("ADC"))) { in wcd938x_tx_swr_ctrl()
1164 ret = -EINVAL; in wcd938x_get_adc_mode()
1173 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in wcd938x_codec_enable_adc()
1184 set_bit(w->shift, &wcd938x->status_mask); in wcd938x_codec_enable_adc()
1189 clear_bit(w->shift, &wcd938x->status_mask); in wcd938x_codec_enable_adc()
1228 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in wcd938x_adc_enable_req()
1240 wcd938x_tx_channel_config(component, w->shift, 1); in wcd938x_adc_enable_req()
1241 mode = wcd938x_get_adc_mode(wcd938x->tx_mode[w->shift]); in wcd938x_adc_enable_req()
1243 dev_info(component->dev, "Invalid ADC mode\n"); in wcd938x_adc_enable_req()
1244 return -EINVAL; in wcd938x_adc_enable_req()
1246 switch (w->shift) { in wcd938x_adc_enable_req()
1283 wcd938x_tx_channel_config(component, w->shift, 0); in wcd938x_adc_enable_req()
1286 switch (w->shift) { in wcd938x_adc_enable_req()
1335 int micb_index = micb_num - 1; in wcd938x_micbias_control()
1352 dev_err(component->dev, "%s: Invalid micbias number: %d\n", in wcd938x_micbias_control()
1354 return -EINVAL; in wcd938x_micbias_control()
1359 wcd938x->pullup_ref[micb_index]++; in wcd938x_micbias_control()
1360 if ((wcd938x->pullup_ref[micb_index] == 1) && in wcd938x_micbias_control()
1361 (wcd938x->micb_ref[micb_index] == 0)) in wcd938x_micbias_control()
1367 if (wcd938x->pullup_ref[micb_index] > 0) in wcd938x_micbias_control()
1368 wcd938x->pullup_ref[micb_index]--; in wcd938x_micbias_control()
1370 if ((wcd938x->pullup_ref[micb_index] == 0) && in wcd938x_micbias_control()
1371 (wcd938x->micb_ref[micb_index] == 0)) in wcd938x_micbias_control()
1376 wcd938x->micb_ref[micb_index]++; in wcd938x_micbias_control()
1377 if (wcd938x->micb_ref[micb_index] == 1) { in wcd938x_micbias_control()
1392 wcd_mbhc_event_notify(wcd938x->wcd_mbhc, in wcd938x_micbias_control()
1396 wcd_mbhc_event_notify(wcd938x->wcd_mbhc, in wcd938x_micbias_control()
1402 if (wcd938x->micb_ref[micb_index] > 0) in wcd938x_micbias_control()
1403 wcd938x->micb_ref[micb_index]--; in wcd938x_micbias_control()
1405 if ((wcd938x->micb_ref[micb_index] == 0) && in wcd938x_micbias_control()
1406 (wcd938x->pullup_ref[micb_index] > 0)) in wcd938x_micbias_control()
1410 else if ((wcd938x->micb_ref[micb_index] == 0) && in wcd938x_micbias_control()
1411 (wcd938x->pullup_ref[micb_index] == 0)) { in wcd938x_micbias_control()
1413 wcd_mbhc_event_notify(wcd938x->wcd_mbhc, in wcd938x_micbias_control()
1419 wcd_mbhc_event_notify(wcd938x->wcd_mbhc, in wcd938x_micbias_control()
1423 wcd_mbhc_event_notify(wcd938x->wcd_mbhc, in wcd938x_micbias_control()
1435 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in wcd938x_codec_enable_micbias()
1436 int micb_num = w->shift; in wcd938x_codec_enable_micbias()
1458 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in wcd938x_codec_enable_micbias_pullup()
1459 int micb_num = w->shift; in wcd938x_codec_enable_micbias_pullup()
1484 struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; in wcd938x_tx_mode_get()
1485 int path = e->shift_l; in wcd938x_tx_mode_get()
1487 ucontrol->value.enumerated.item[0] = wcd938x->tx_mode[path]; in wcd938x_tx_mode_get()
1497 struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; in wcd938x_tx_mode_put()
1498 int path = e->shift_l; in wcd938x_tx_mode_put()
1500 if (wcd938x->tx_mode[path] == ucontrol->value.enumerated.item[0]) in wcd938x_tx_mode_put()
1503 wcd938x->tx_mode[path] = ucontrol->value.enumerated.item[0]; in wcd938x_tx_mode_put()
1514 ucontrol->value.enumerated.item[0] = wcd938x->hph_mode; in wcd938x_rx_hph_mode_get()
1525 if (wcd938x->hph_mode == ucontrol->value.enumerated.item[0]) in wcd938x_rx_hph_mode_put()
1528 wcd938x->hph_mode = ucontrol->value.enumerated.item[0]; in wcd938x_rx_hph_mode_put()
1539 if (wcd938x->comp1_enable) { in wcd938x_ear_pa_put_gain()
1540 dev_err(component->dev, "Can not set EAR PA Gain, compander1 is enabled\n"); in wcd938x_ear_pa_put_gain()
1541 return -EINVAL; in wcd938x_ear_pa_put_gain()
1546 ucontrol->value.integer.value[0]); in wcd938x_ear_pa_put_gain()
1560 mc = (struct soc_mixer_control *)(kcontrol->private_value); in wcd938x_get_compander()
1561 hphr = mc->shift; in wcd938x_get_compander()
1564 ucontrol->value.integer.value[0] = wcd938x->comp2_enable; in wcd938x_get_compander()
1566 ucontrol->value.integer.value[0] = wcd938x->comp1_enable; in wcd938x_get_compander()
1577 int value = ucontrol->value.integer.value[0]; in wcd938x_set_compander()
1582 mc = (struct soc_mixer_control *)(kcontrol->private_value); in wcd938x_set_compander()
1583 hphr = mc->shift; in wcd938x_set_compander()
1585 wcd = wcd938x->sdw_priv[AIF1_PB]; in wcd938x_set_compander()
1588 wcd938x->comp2_enable = value; in wcd938x_set_compander()
1590 wcd938x->comp1_enable = value; in wcd938x_set_compander()
1592 portidx = wcd->ch_info[mc->reg].port_num; in wcd938x_set_compander()
1595 wcd938x_connect_port(wcd, portidx, mc->reg, true); in wcd938x_set_compander()
1597 wcd938x_connect_port(wcd, portidx, mc->reg, false); in wcd938x_set_compander()
1608 ucontrol->value.integer.value[0] = wcd938x->ldoh; in wcd938x_ldoh_get()
1619 if (wcd938x->ldoh == ucontrol->value.integer.value[0]) in wcd938x_ldoh_put()
1622 wcd938x->ldoh = ucontrol->value.integer.value[0]; in wcd938x_ldoh_put()
1800 SOC_DAPM_ENUM("ADC2 MUX Mux", adc2_enum);
1849 struct soc_mixer_control *mixer = (struct soc_mixer_control *)kcontrol->private_value; in wcd938x_get_swr_port()
1850 int dai_id = mixer->shift; in wcd938x_get_swr_port()
1851 int portidx, ch_idx = mixer->reg; in wcd938x_get_swr_port()
1854 wcd = wcd938x->sdw_priv[dai_id]; in wcd938x_get_swr_port()
1855 portidx = wcd->ch_info[ch_idx].port_num; in wcd938x_get_swr_port()
1857 ucontrol->value.integer.value[0] = wcd->port_enable[portidx]; in wcd938x_get_swr_port()
1869 (struct soc_mixer_control *)kcontrol->private_value; in wcd938x_set_swr_port()
1870 int ch_idx = mixer->reg; in wcd938x_set_swr_port()
1872 int dai_id = mixer->shift; in wcd938x_set_swr_port()
1875 wcd = wcd938x->sdw_priv[dai_id]; in wcd938x_set_swr_port()
1877 portidx = wcd->ch_info[ch_idx].port_num; in wcd938x_set_swr_port()
1878 if (ucontrol->value.integer.value[0]) in wcd938x_set_swr_port()
1883 wcd->port_enable[portidx] = enable; in wcd938x_set_swr_port()
1913 dev_err(component->dev, "%s: invalid number of buttons: %d\n", in wcd938x_mbhc_program_btn_thr()
1922 dev_dbg(component->dev, "%s: btn_high[%d]: %d, vth: %d\n", in wcd938x_mbhc_program_btn_thr()
1995 return -EINVAL; in wcd938x_mbhc_micb_adjust_voltage()
1997 mutex_lock(&wcd938x->micb_lock); in wcd938x_mbhc_micb_adjust_voltage()
2002 * to avoid slow micbias ramp-up or down enable pull-up in wcd938x_mbhc_micb_adjust_voltage()
2003 * momentarily, change the micbias value and then re-enable in wcd938x_mbhc_micb_adjust_voltage()
2011 req_vout_ctl = wcd_get_micb_vout_ctl_val(component->dev, req_volt); in wcd938x_mbhc_micb_adjust_voltage()
2013 ret = -EINVAL; in wcd938x_mbhc_micb_adjust_voltage()
2042 mutex_unlock(&wcd938x->micb_lock); in wcd938x_mbhc_micb_adjust_voltage()
2053 return -EINVAL; in wcd938x_mbhc_micb_ctrl_threshold_mic()
2059 if (wcd938x->common.micb_mv[2] >= WCD_MBHC_THR_HS_MICB_MV) in wcd938x_mbhc_micb_ctrl_threshold_mic()
2062 micb_mv = req_en ? WCD_MBHC_THR_HS_MICB_MV : wcd938x->common.micb_mv[2]; in wcd938x_mbhc_micb_ctrl_threshold_mic()
2081 regmap_update_bits(wcd938x->regmap, WCD938X_ANA_MBHC_ZDET, 0x20, 0x20); in wcd938x_mbhc_get_result_params()
2083 regmap_read(wcd938x->regmap, WCD938X_ANA_MBHC_RESULT_2, &val); in wcd938x_mbhc_get_result_params()
2088 regmap_read(wcd938x->regmap, WCD938X_ANA_MBHC_RESULT_1, &val1); in wcd938x_mbhc_get_result_params()
2090 regmap_update_bits(wcd938x->regmap, WCD938X_ANA_MBHC_ZDET, 0x20, 0x00); in wcd938x_mbhc_get_result_params()
2098 dev_err(component->dev, "Impedance detect ramp error, c1=%d, x1=0x%x\n", in wcd938x_mbhc_get_result_params()
2103 denom = (x1 * d1) - (1 << (14 - noff)); in wcd938x_mbhc_get_result_params()
2109 dev_dbg(component->dev, "%s: d1=%d, c1=%d, x1=0x%x, z_val=%d (milliohm)\n", in wcd938x_mbhc_get_result_params()
2114 regmap_read(wcd938x->regmap, in wcd938x_mbhc_get_result_params()
2116 regmap_read(wcd938x->regmap, in wcd938x_mbhc_get_result_params()
2135 WCD938X_ZDET_MAXV_CTL_MASK, zdet_param->ldo_ctl); in wcd938x_mbhc_zdet_ramp()
2137 WCD938X_VTH_MASK, zdet_param->btn5); in wcd938x_mbhc_zdet_ramp()
2139 WCD938X_VTH_MASK, zdet_param->btn6); in wcd938x_mbhc_zdet_ramp()
2141 WCD938X_VTH_MASK, zdet_param->btn7); in wcd938x_mbhc_zdet_ramp()
2143 WCD938X_ZDET_RANGE_CTL_MASK, zdet_param->noff); in wcd938x_mbhc_zdet_ramp()
2145 0x0F, zdet_param->nshift); in wcd938x_mbhc_zdet_ramp()
2150 regmap_update_bits(wcd938x->regmap, in wcd938x_mbhc_zdet_ramp()
2152 dev_dbg(component->dev, "%s: ramp for HPH_L, noff = %d\n", in wcd938x_mbhc_zdet_ramp()
2153 __func__, zdet_param->noff); in wcd938x_mbhc_zdet_ramp()
2154 wcd938x_mbhc_get_result_params(component, d1_a, zdet_param->noff, &zdet); in wcd938x_mbhc_zdet_ramp()
2155 regmap_update_bits(wcd938x->regmap, in wcd938x_mbhc_zdet_ramp()
2164 regmap_update_bits(wcd938x->regmap, in wcd938x_mbhc_zdet_ramp()
2166 dev_dbg(component->dev, "%s: ramp for HPH_R, noff = %d\n", in wcd938x_mbhc_zdet_ramp()
2167 __func__, zdet_param->noff); in wcd938x_mbhc_zdet_ramp()
2168 wcd938x_mbhc_get_result_params(component, d1_a, zdet_param->noff, &zdet); in wcd938x_mbhc_zdet_ramp()
2169 regmap_update_bits(wcd938x->regmap, in wcd938x_mbhc_zdet_ramp()
2188 q1_cal = (10000 - ((q1 & 0x7F) * 25)); in wcd938x_wcd_mbhc_qfuse_cal()
2226 regmap_update_bits(wcd938x->regmap, in wcd938x_wcd_mbhc_calc_impedance()
2230 /* For NO-jack, disable L_DET_EN before Z-det measurements */ in wcd938x_wcd_mbhc_calc_impedance()
2231 if (wcd938x->mbhc_cfg.hphl_swh) in wcd938x_wcd_mbhc_calc_impedance()
2232 regmap_update_bits(wcd938x->regmap, in wcd938x_wcd_mbhc_calc_impedance()
2236 regmap_update_bits(wcd938x->regmap, in wcd938x_wcd_mbhc_calc_impedance()
2242 regmap_update_bits(wcd938x->regmap, in wcd938x_wcd_mbhc_calc_impedance()
2279 dev_dbg(component->dev, "%s: impedance on HPH_L = %d(ohms)\n", in wcd938x_wcd_mbhc_calc_impedance()
2286 (zdet_param_ptr->noff == 0x6)) || in wcd938x_wcd_mbhc_calc_impedance()
2311 dev_dbg(component->dev, "%s: impedance on HPH_R = %d(ohms)\n", in wcd938x_wcd_mbhc_calc_impedance()
2317 dev_dbg(component->dev, in wcd938x_wcd_mbhc_calc_impedance()
2326 dev_dbg(component->dev, in wcd938x_wcd_mbhc_calc_impedance()
2329 wcd_mbhc_set_hph_type(wcd938x->wcd_mbhc, WCD_MBHC_HPH_MONO); in wcd938x_wcd_mbhc_calc_impedance()
2348 z_diff1 = (z1Ls > zMono) ? (z1Ls - zMono) : (zMono - z1Ls); in wcd938x_wcd_mbhc_calc_impedance()
2349 z_diff2 = ((*zl) > z1Ls) ? ((*zl) - z1Ls) : (z1Ls - (*zl)); in wcd938x_wcd_mbhc_calc_impedance()
2351 dev_dbg(component->dev, "%s: stereo plug type detected\n", in wcd938x_wcd_mbhc_calc_impedance()
2353 wcd_mbhc_set_hph_type(wcd938x->wcd_mbhc, WCD_MBHC_HPH_STEREO); in wcd938x_wcd_mbhc_calc_impedance()
2355 dev_dbg(component->dev, "%s: MONO plug type detected\n", in wcd938x_wcd_mbhc_calc_impedance()
2357 wcd_mbhc_set_hph_type(wcd938x->wcd_mbhc, WCD_MBHC_HPH_MONO); in wcd938x_wcd_mbhc_calc_impedance()
2361 regmap_update_bits(wcd938x->regmap, in wcd938x_wcd_mbhc_calc_impedance()
2368 regmap_update_bits(wcd938x->regmap, in wcd938x_wcd_mbhc_calc_impedance()
2371 /* For NO-jack, re-enable L_DET_EN after Z-det measurements */ in wcd938x_wcd_mbhc_calc_impedance()
2372 if (wcd938x->mbhc_cfg.hphl_swh) in wcd938x_wcd_mbhc_calc_impedance()
2373 regmap_update_bits(wcd938x->regmap, in wcd938x_wcd_mbhc_calc_impedance()
2379 regmap_update_bits(wcd938x->regmap, in wcd938x_wcd_mbhc_calc_impedance()
2412 if (wcd938x->mbhc_cfg.moist_rref == R_OFF) { in wcd938x_mbhc_moisture_config()
2419 if (!wcd938x->mbhc_cfg.hphl_swh) { in wcd938x_mbhc_moisture_config()
2420 dev_dbg(component->dev, "%s: disable moisture detection for NC\n", in wcd938x_mbhc_moisture_config()
2428 WCD938X_M_RTH_CTL_MASK, wcd938x->mbhc_cfg.moist_rref); in wcd938x_mbhc_moisture_config()
2437 WCD938X_M_RTH_CTL_MASK, wcd938x->mbhc_cfg.moist_rref); in wcd938x_mbhc_moisture_detect_en()
2448 if (wcd938x->mbhc_cfg.moist_rref == R_OFF) { in wcd938x_mbhc_get_moisture_status()
2455 if (!wcd938x->mbhc_cfg.hphl_swh) { in wcd938x_mbhc_get_moisture_status()
2456 dev_dbg(component->dev, "%s: disable moisture detection for NC\n", in wcd938x_mbhc_get_moisture_status()
2512 ucontrol->value.integer.value[0] = wcd_mbhc_get_hph_type(wcd938x->wcd_mbhc); in wcd938x_get_hph_type()
2526 mc = (struct soc_mixer_control *)(kcontrol->private_value); in wcd938x_hph_impedance_get()
2527 hphr = mc->shift; in wcd938x_hph_impedance_get()
2528 wcd_mbhc_get_impedance(wcd938x->wcd_mbhc, &zl, &zr); in wcd938x_hph_impedance_get()
2529 dev_dbg(component->dev, "%s: zl=%u(ohms), zr=%u(ohms)\n", __func__, zl, zr); in wcd938x_hph_impedance_get()
2530 ucontrol->value.integer.value[0] = hphr ? zr : zl; in wcd938x_hph_impedance_get()
2550 struct wcd_mbhc_intr *intr_ids = &wcd938x->intr_ids; in wcd938x_mbhc_init()
2552 intr_ids->mbhc_sw_intr = regmap_irq_get_virq(wcd938x->irq_chip, in wcd938x_mbhc_init()
2554 intr_ids->mbhc_btn_press_intr = regmap_irq_get_virq(wcd938x->irq_chip, in wcd938x_mbhc_init()
2556 intr_ids->mbhc_btn_release_intr = regmap_irq_get_virq(wcd938x->irq_chip, in wcd938x_mbhc_init()
2558 intr_ids->mbhc_hs_ins_intr = regmap_irq_get_virq(wcd938x->irq_chip, in wcd938x_mbhc_init()
2560 intr_ids->mbhc_hs_rem_intr = regmap_irq_get_virq(wcd938x->irq_chip, in wcd938x_mbhc_init()
2562 intr_ids->hph_left_ocp = regmap_irq_get_virq(wcd938x->irq_chip, in wcd938x_mbhc_init()
2564 intr_ids->hph_right_ocp = regmap_irq_get_virq(wcd938x->irq_chip, in wcd938x_mbhc_init()
2567 wcd938x->wcd_mbhc = wcd_mbhc_init(component, &mbhc_cb, intr_ids, wcd_mbhc_fields, true); in wcd938x_mbhc_init()
2568 if (IS_ERR(wcd938x->wcd_mbhc)) in wcd938x_mbhc_init()
2569 return PTR_ERR(wcd938x->wcd_mbhc); in wcd938x_mbhc_init()
2583 wcd_mbhc_deinit(wcd938x->wcd_mbhc); in wcd938x_mbhc_deinit()
2611 SOC_SINGLE_EXT("ADC2 Switch", WCD938X_ADC2, 1, 1, 0,
2639 SOC_SINGLE_TLV("ADC2 Volume", WCD938X_ANA_TX_CH2, 0, 20, 0, analog_gain),
2664 SND_SOC_DAPM_ADC_E("ADC2", NULL, SND_SOC_NOPM, 1, 0,
2701 SND_SOC_DAPM_MIXER_E("ADC2 REQ", SND_SOC_NOPM, 1, 0,
2711 SND_SOC_DAPM_MUX("ADC2 MUX", SND_SOC_NOPM, 0, 0, &tx_adc2_mux),
2882 {"ADC2_MIXER", "Switch", "ADC2 REQ"},
2883 {"ADC2 REQ", NULL, "ADC2"},
2884 {"ADC2", NULL, "HDR12 MUX"},
2885 {"HDR12 MUX", "NO_HDR12", "ADC2 MUX"},
2887 {"ADC2 MUX", "INP3", "AMIC3"},
2888 {"ADC2 MUX", "INP2", "AMIC2"},
2968 regmap_update_bits(wcd938x->regmap, WCD938X_ANA_MICB1, in wcd938x_set_micbias_data()
2969 WCD938X_MICB_VOUT_MASK, wcd938x->common.micb_vout[0]); in wcd938x_set_micbias_data()
2970 regmap_update_bits(wcd938x->regmap, WCD938X_ANA_MICB2, in wcd938x_set_micbias_data()
2971 WCD938X_MICB_VOUT_MASK, wcd938x->common.micb_vout[1]); in wcd938x_set_micbias_data()
2972 regmap_update_bits(wcd938x->regmap, WCD938X_ANA_MICB3, in wcd938x_set_micbias_data()
2973 WCD938X_MICB_VOUT_MASK, wcd938x->common.micb_vout[2]); in wcd938x_set_micbias_data()
2974 regmap_update_bits(wcd938x->regmap, WCD938X_ANA_MICB4, in wcd938x_set_micbias_data()
2975 WCD938X_MICB_VOUT_MASK, wcd938x->common.micb_vout[3]); in wcd938x_set_micbias_data()
3004 wcd->virq = irq_domain_create_linear(NULL, 1, &wcd_domain_ops, NULL); in wcd938x_irq_init()
3005 if (!(wcd->virq)) { in wcd938x_irq_init()
3007 return -EINVAL; in wcd938x_irq_init()
3010 return devm_regmap_add_irq_chip(dev, wcd->regmap, in wcd938x_irq_init()
3011 irq_create_mapping(wcd->virq, 0), in wcd938x_irq_init()
3013 &wcd->irq_chip); in wcd938x_irq_init()
3019 struct sdw_slave *tx_sdw_dev = wcd938x->tx_sdw_dev; in wcd938x_soc_codec_probe()
3020 struct device *dev = component->dev; in wcd938x_soc_codec_probe()
3025 time_left = wait_for_completion_timeout(&tx_sdw_dev->initialization_complete, in wcd938x_soc_codec_probe()
3029 return -ETIMEDOUT; in wcd938x_soc_codec_probe()
3032 snd_soc_component_init_regmap(component, wcd938x->regmap); in wcd938x_soc_codec_probe()
3042 wcd938x->clsh_info = wcd_clsh_ctrl_alloc(component, WCD938X); in wcd938x_soc_codec_probe()
3043 if (IS_ERR(wcd938x->clsh_info)) { in wcd938x_soc_codec_probe()
3045 return PTR_ERR(wcd938x->clsh_info); in wcd938x_soc_codec_probe()
3051 regmap_write(wcd938x->regmap, in wcd938x_soc_codec_probe()
3057 wcd938x->hphr_pdm_wd_int = regmap_irq_get_virq(wcd938x->irq_chip, in wcd938x_soc_codec_probe()
3059 wcd938x->hphl_pdm_wd_int = regmap_irq_get_virq(wcd938x->irq_chip, in wcd938x_soc_codec_probe()
3061 wcd938x->aux_pdm_wd_int = regmap_irq_get_virq(wcd938x->irq_chip, in wcd938x_soc_codec_probe()
3065 ret = request_threaded_irq(wcd938x->hphr_pdm_wd_int, NULL, wcd938x_wd_handle_irq, in wcd938x_soc_codec_probe()
3073 ret = request_threaded_irq(wcd938x->hphl_pdm_wd_int, NULL, wcd938x_wd_handle_irq, in wcd938x_soc_codec_probe()
3081 ret = request_threaded_irq(wcd938x->aux_pdm_wd_int, NULL, wcd938x_wd_handle_irq, in wcd938x_soc_codec_probe()
3090 disable_irq_nosync(wcd938x->hphr_pdm_wd_int); in wcd938x_soc_codec_probe()
3091 disable_irq_nosync(wcd938x->hphl_pdm_wd_int); in wcd938x_soc_codec_probe()
3092 disable_irq_nosync(wcd938x->aux_pdm_wd_int); in wcd938x_soc_codec_probe()
3099 dev_err(component->dev, in wcd938x_soc_codec_probe()
3109 dev_err(component->dev, in wcd938x_soc_codec_probe()
3121 dev_err(component->dev, "mbhc initialization failed\n"); in wcd938x_soc_codec_probe()
3128 free_irq(wcd938x->aux_pdm_wd_int, wcd938x); in wcd938x_soc_codec_probe()
3130 free_irq(wcd938x->hphl_pdm_wd_int, wcd938x); in wcd938x_soc_codec_probe()
3132 free_irq(wcd938x->hphr_pdm_wd_int, wcd938x); in wcd938x_soc_codec_probe()
3134 wcd_clsh_ctrl_free(wcd938x->clsh_info); in wcd938x_soc_codec_probe()
3145 free_irq(wcd938x->aux_pdm_wd_int, wcd938x); in wcd938x_soc_codec_remove()
3146 free_irq(wcd938x->hphl_pdm_wd_int, wcd938x); in wcd938x_soc_codec_remove()
3147 free_irq(wcd938x->hphr_pdm_wd_int, wcd938x); in wcd938x_soc_codec_remove()
3149 wcd_clsh_ctrl_free(wcd938x->clsh_info); in wcd938x_soc_codec_remove()
3155 struct wcd938x_priv *wcd = dev_get_drvdata(comp->dev); in wcd938x_codec_set_jack()
3158 return wcd_mbhc_start(wcd->wcd_mbhc, &wcd->mbhc_cfg, jack); in wcd938x_codec_set_jack()
3160 wcd_mbhc_stop(wcd->wcd_mbhc); in wcd938x_codec_set_jack()
3182 struct device *dev = component->dev; in wcd938x_swap_gnd_mic()
3185 if (wcd938x->us_euro_mux) { in wcd938x_swap_gnd_mic()
3186 if (wcd938x->mux_setup_done) in wcd938x_swap_gnd_mic()
3187 mux_control_deselect(wcd938x->us_euro_mux); in wcd938x_swap_gnd_mic()
3189 ret = mux_control_try_select(wcd938x->us_euro_mux, !wcd938x->mux_state); in wcd938x_swap_gnd_mic()
3192 wcd938x->mux_setup_done = false; in wcd938x_swap_gnd_mic()
3195 wcd938x->mux_setup_done = true; in wcd938x_swap_gnd_mic()
3197 gpiod_set_value(wcd938x->us_euro_gpio, !wcd938x->mux_state); in wcd938x_swap_gnd_mic()
3200 wcd938x->mux_state = !wcd938x->mux_state; in wcd938x_swap_gnd_mic()
3208 struct wcd_mbhc_config *cfg = &wcd938x->mbhc_cfg; in wcd938x_populate_dt_data()
3211 wcd938x->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_LOW); in wcd938x_populate_dt_data()
3212 if (IS_ERR(wcd938x->reset_gpio)) in wcd938x_populate_dt_data()
3213 return dev_err_probe(dev, PTR_ERR(wcd938x->reset_gpio), in wcd938x_populate_dt_data()
3216 if (of_property_present(dev->of_node, "mux-controls")) { in wcd938x_populate_dt_data()
3217 wcd938x->us_euro_mux = devm_mux_control_get(dev, NULL); in wcd938x_populate_dt_data()
3218 if (IS_ERR(wcd938x->us_euro_mux)) { in wcd938x_populate_dt_data()
3219 ret = PTR_ERR(wcd938x->us_euro_mux); in wcd938x_populate_dt_data()
3223 ret = mux_control_try_select(wcd938x->us_euro_mux, wcd938x->mux_state); in wcd938x_populate_dt_data()
3228 wcd938x->mux_setup_done = true; in wcd938x_populate_dt_data()
3230 wcd938x->us_euro_gpio = devm_gpiod_get_optional(dev, "us-euro", GPIOD_OUT_LOW); in wcd938x_populate_dt_data()
3231 if (IS_ERR(wcd938x->us_euro_gpio)) in wcd938x_populate_dt_data()
3232 return dev_err_probe(dev, PTR_ERR(wcd938x->us_euro_gpio), in wcd938x_populate_dt_data()
3233 "us-euro swap Control GPIO not found\n"); in wcd938x_populate_dt_data()
3236 cfg->swap_gnd_mic = wcd938x_swap_gnd_mic; in wcd938x_populate_dt_data()
3243 ret = wcd_dt_parse_micbias_info(&wcd938x->common); in wcd938x_populate_dt_data()
3247 cfg->mbhc_micbias = MIC_BIAS_2; in wcd938x_populate_dt_data()
3248 cfg->anc_micbias = MIC_BIAS_2; in wcd938x_populate_dt_data()
3249 cfg->v_hs_max = WCD_MBHC_HS_V_MAX; in wcd938x_populate_dt_data()
3250 cfg->num_btn = WCD938X_MBHC_MAX_BUTTONS; in wcd938x_populate_dt_data()
3251 cfg->micb_mv = wcd938x->common.micb_mv[2]; in wcd938x_populate_dt_data()
3252 cfg->linein_th = 5000; in wcd938x_populate_dt_data()
3253 cfg->hs_thr = 1700; in wcd938x_populate_dt_data()
3254 cfg->hph_thr = 50; in wcd938x_populate_dt_data()
3263 gpiod_set_value(wcd938x->reset_gpio, 1); in wcd938x_reset()
3266 gpiod_set_value(wcd938x->reset_gpio, 0); in wcd938x_reset()
3277 struct wcd938x_priv *wcd938x = dev_get_drvdata(dai->dev); in wcd938x_codec_hw_params()
3278 struct wcd938x_sdw_priv *wcd = wcd938x->sdw_priv[dai->id]; in wcd938x_codec_hw_params()
3286 struct wcd938x_priv *wcd938x = dev_get_drvdata(dai->dev); in wcd938x_codec_free()
3287 struct wcd938x_sdw_priv *wcd = wcd938x->sdw_priv[dai->id]; in wcd938x_codec_free()
3295 struct wcd938x_priv *wcd938x = dev_get_drvdata(dai->dev); in wcd938x_codec_set_sdw_stream()
3296 struct wcd938x_sdw_priv *wcd = wcd938x->sdw_priv[dai->id]; in wcd938x_codec_set_sdw_stream()
3310 .name = "wcd938x-sdw-rx",
3323 .name = "wcd938x-sdw-tx",
3349 wcd938x->rxdev = of_sdw_find_device_by_node(wcd938x->rxnode); in wcd938x_bind()
3350 if (!wcd938x->rxdev) { in wcd938x_bind()
3352 ret = -EINVAL; in wcd938x_bind()
3355 wcd938x->sdw_priv[AIF1_PB] = dev_get_drvdata(wcd938x->rxdev); in wcd938x_bind()
3356 wcd938x->sdw_priv[AIF1_PB]->wcd938x = wcd938x; in wcd938x_bind()
3358 wcd938x->txdev = of_sdw_find_device_by_node(wcd938x->txnode); in wcd938x_bind()
3359 if (!wcd938x->txdev) { in wcd938x_bind()
3361 ret = -EINVAL; in wcd938x_bind()
3364 wcd938x->sdw_priv[AIF1_CAP] = dev_get_drvdata(wcd938x->txdev); in wcd938x_bind()
3365 wcd938x->sdw_priv[AIF1_CAP]->wcd938x = wcd938x; in wcd938x_bind()
3366 wcd938x->tx_sdw_dev = dev_to_sdw_dev(wcd938x->txdev); in wcd938x_bind()
3370 if (!device_link_add(wcd938x->rxdev, wcd938x->txdev, DL_FLAG_STATELESS | in wcd938x_bind()
3373 ret = -EINVAL; in wcd938x_bind()
3377 if (!device_link_add(dev, wcd938x->txdev, DL_FLAG_STATELESS | in wcd938x_bind()
3380 ret = -EINVAL; in wcd938x_bind()
3384 if (!device_link_add(dev, wcd938x->rxdev, DL_FLAG_STATELESS | in wcd938x_bind()
3387 ret = -EINVAL; in wcd938x_bind()
3391 wcd938x->regmap = wcd938x->sdw_priv[AIF1_CAP]->regmap; in wcd938x_bind()
3392 if (!wcd938x->regmap) { in wcd938x_bind()
3394 ret = -EINVAL; in wcd938x_bind()
3404 wcd938x->sdw_priv[AIF1_PB]->slave_irq = wcd938x->virq; in wcd938x_bind()
3405 wcd938x->sdw_priv[AIF1_CAP]->slave_irq = wcd938x->virq; in wcd938x_bind()
3420 device_link_remove(dev, wcd938x->rxdev); in wcd938x_bind()
3422 device_link_remove(dev, wcd938x->txdev); in wcd938x_bind()
3424 device_link_remove(wcd938x->rxdev, wcd938x->txdev); in wcd938x_bind()
3426 put_device(wcd938x->txdev); in wcd938x_bind()
3428 put_device(wcd938x->rxdev); in wcd938x_bind()
3440 device_link_remove(dev, wcd938x->txdev); in wcd938x_unbind()
3441 device_link_remove(dev, wcd938x->rxdev); in wcd938x_unbind()
3442 device_link_remove(wcd938x->rxdev, wcd938x->txdev); in wcd938x_unbind()
3443 put_device(wcd938x->txdev); in wcd938x_unbind()
3444 put_device(wcd938x->rxdev); in wcd938x_unbind()
3459 np = dev->of_node; in wcd938x_add_slave_components()
3461 wcd938x->rxnode = of_parse_phandle(np, "qcom,rx-device", 0); in wcd938x_add_slave_components()
3462 if (!wcd938x->rxnode) { in wcd938x_add_slave_components()
3463 dev_err(dev, "%s: Rx-device node not defined\n", __func__); in wcd938x_add_slave_components()
3464 return -ENODEV; in wcd938x_add_slave_components()
3468 component_compare_of, wcd938x->rxnode); in wcd938x_add_slave_components()
3470 wcd938x->txnode = of_parse_phandle(np, "qcom,tx-device", 0); in wcd938x_add_slave_components()
3471 if (!wcd938x->txnode) { in wcd938x_add_slave_components()
3472 dev_err(dev, "%s: Tx-device node not defined\n", __func__); in wcd938x_add_slave_components()
3473 return -ENODEV; in wcd938x_add_slave_components()
3477 component_compare_of, wcd938x->txnode); in wcd938x_add_slave_components()
3485 struct device *dev = &pdev->dev; in wcd938x_probe()
3491 return -ENOMEM; in wcd938x_probe()
3494 mutex_init(&wcd938x->micb_lock); in wcd938x_probe()
3495 wcd938x->common.dev = dev; in wcd938x_probe()
3496 wcd938x->common.max_bias = 4; in wcd938x_probe()
3524 struct device *dev = &pdev->dev; in wcd938x_remove()
3533 if (wcd938x->us_euro_mux && wcd938x->mux_setup_done) in wcd938x_remove()
3534 mux_control_deselect(wcd938x->us_euro_mux); in wcd938x_remove()
3539 { .compatible = "qcom,wcd9380-codec" },
3540 { .compatible = "qcom,wcd9385-codec" },