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

1 // SPDX-License-Identifier: GPL-2.0-only
2 // Copyright (c) 2023-2024 Qualcomm Innovation Center, Inc. All rights reserved.
19 #include <sound/soc-dapm.h>
23 #include "wcd-clsh-v2.h"
24 #include "wcd-common.h"
25 #include "wcd-mbhc-v2.h"
36 /* Z floating defined in ohms */
112 "vdd-rxtx", "vdd-px", "vdd-mic-bias", "vdd-buck",
115 static const SNDRV_CTL_TLVD_DECLARE_DB_MINMAX(ear_pa_gain, 600, -1800);
211 regmap_write(wcd937x->regmap, WCD937X_DIGITAL_INTR_CLEAR_0, 0);
212 regmap_write(wcd937x->regmap, WCD937X_DIGITAL_INTR_CLEAR_1, 0);
213 regmap_write(wcd937x->regmap, WCD937X_DIGITAL_INTR_CLEAR_2, 0);
242 gpiod_set_value(wcd937x->reset_gpio, 1);
244 gpiod_set_value(wcd937x->reset_gpio, 0);
302 if (atomic_read(&wcd937x->rx_clk_cnt))
313 atomic_inc(&wcd937x->rx_clk_cnt);
322 if (!atomic_read(&wcd937x->rx_clk_cnt)) {
323 dev_err(component->dev, "clk already disabled\n");
327 atomic_dec(&wcd937x->rx_clk_cnt);
340 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
342 int hph_mode = wcd937x->hph_mode;
356 set_bit(HPH_COMP_DELAY, &wcd937x->status_mask);
368 if (wcd937x->comp1_enable) {
376 if (wcd937x->comp2_enable) {
384 if (test_bit(HPH_COMP_DELAY, &wcd937x->status_mask)) {
386 clear_bit(HPH_COMP_DELAY, &wcd937x->status_mask);
415 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
417 int hph_mode = wcd937x->hph_mode;
428 set_bit(HPH_COMP_DELAY, &wcd937x->status_mask);
439 if (wcd937x->comp2_enable) {
445 if (wcd937x->comp1_enable) {
454 if (test_bit(HPH_COMP_DELAY, &wcd937x->status_mask)) {
456 clear_bit(HPH_COMP_DELAY, &wcd937x->status_mask);
484 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
486 int hph_mode = wcd937x->hph_mode;
506 if (wcd937x->comp1_enable)
513 wcd_clsh_ctrl_set_state(wcd937x->clsh_info,
525 if (wcd937x->comp1_enable)
539 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
541 int hph_mode = wcd937x->hph_mode;
555 wcd_clsh_ctrl_set_state(wcd937x->clsh_info,
575 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
577 int hph_mode = wcd937x->hph_mode;
581 wcd_clsh_ctrl_set_state(wcd937x->clsh_info,
588 set_bit(HPH_PA_DELAY, &wcd937x->status_mask);
594 if (test_bit(HPH_PA_DELAY, &wcd937x->status_mask)) {
595 if (wcd937x->comp2_enable)
599 clear_bit(HPH_PA_DELAY, &wcd937x->status_mask);
609 enable_irq(wcd937x->hphr_pdm_wd_int);
612 disable_irq_nosync(wcd937x->hphr_pdm_wd_int);
613 set_bit(HPH_PA_DELAY, &wcd937x->status_mask);
614 wcd_mbhc_event_notify(wcd937x->wcd_mbhc, WCD_EVENT_PRE_HPHR_PA_OFF);
617 if (test_bit(HPH_PA_DELAY, &wcd937x->status_mask)) {
618 if (wcd937x->comp2_enable)
622 clear_bit(HPH_PA_DELAY, &wcd937x->status_mask);
625 wcd_mbhc_event_notify(wcd937x->wcd_mbhc, WCD_EVENT_POST_HPHR_PA_OFF);
630 wcd_clsh_ctrl_set_state(wcd937x->clsh_info,
644 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
646 int hph_mode = wcd937x->hph_mode;
650 wcd_clsh_ctrl_set_state(wcd937x->clsh_info,
657 set_bit(HPH_PA_DELAY, &wcd937x->status_mask);
662 if (test_bit(HPH_PA_DELAY, &wcd937x->status_mask)) {
663 if (!wcd937x->comp1_enable)
667 clear_bit(HPH_PA_DELAY, &wcd937x->status_mask);
677 enable_irq(wcd937x->hphl_pdm_wd_int);
680 disable_irq_nosync(wcd937x->hphl_pdm_wd_int);
681 set_bit(HPH_PA_DELAY, &wcd937x->status_mask);
682 wcd_mbhc_event_notify(wcd937x->wcd_mbhc, WCD_EVENT_PRE_HPHL_PA_OFF);
685 if (test_bit(HPH_PA_DELAY, &wcd937x->status_mask)) {
686 if (!wcd937x->comp1_enable)
690 clear_bit(HPH_PA_DELAY, &wcd937x->status_mask);
693 wcd_mbhc_event_notify(wcd937x->wcd_mbhc, WCD_EVENT_POST_HPHL_PA_OFF);
698 wcd_clsh_ctrl_set_state(wcd937x->clsh_info,
712 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
714 int hph_mode = wcd937x->hph_mode;
733 enable_irq(wcd937x->aux_pdm_wd_int);
736 disable_irq_nosync(wcd937x->aux_pdm_wd_int);
740 wcd_clsh_ctrl_set_state(wcd937x->clsh_info,
758 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
760 int hph_mode = wcd937x->hph_mode;
765 wcd937x->ear_rx_path = snd_soc_component_read(component,
768 if (wcd937x->ear_rx_path & EAR_RX_PATH_AUX)
776 if (!wcd937x->comp1_enable)
788 if (wcd937x->ear_rx_path & EAR_RX_PATH_AUX)
789 enable_irq(wcd937x->aux_pdm_wd_int);
791 enable_irq(wcd937x->hphl_pdm_wd_int);
794 if (wcd937x->ear_rx_path & EAR_RX_PATH_AUX)
795 disable_irq_nosync(wcd937x->aux_pdm_wd_int);
797 disable_irq_nosync(wcd937x->hphl_pdm_wd_int);
800 if (!wcd937x->comp1_enable)
805 wcd_clsh_ctrl_set_state(wcd937x->clsh_info,
812 if (wcd937x->ear_rx_path & EAR_RX_PATH_AUX)
830 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
845 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
861 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
878 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
883 if (event == SND_SOC_DAPM_PRE_PMU && strnstr(w->name, "ADC", sizeof("ADC")))
884 if (w->shift == 1 && !use_amic3)
885 set_bit(AMIC2_BCS_ENABLE, &wcd937x->status_mask);
893 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
898 atomic_inc(&wcd937x->ana_clk_count);
907 if (w->shift == 1 && test_bit(AMIC2_BCS_ENABLE, &wcd937x->status_mask))
908 clear_bit(AMIC2_BCS_ENABLE, &wcd937x->status_mask);
921 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
955 atomic_dec(&wcd937x->ana_clk_count);
956 if (atomic_read(&wcd937x->ana_clk_count) <= 0) {
960 atomic_set(&wcd937x->ana_clk_count, 0);
976 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
979 switch (w->shift) {
993 dev_err(component->dev, "Invalid DMIC Selection\n");
994 return -EINVAL;
1018 int micb_index = micb_num - 1;
1021 if (micb_index < 0 || (micb_index > WCD937X_MAX_MICBIAS - 1)) {
1022 dev_err(component->dev, "Invalid micbias index, micb_ind:%d\n", micb_index);
1023 return -EINVAL;
1036 dev_err(component->dev, "Invalid micbias number: %d\n", micb_num);
1037 return -EINVAL;
1040 mutex_lock(&wcd937x->micb_lock);
1043 wcd937x->pullup_ref[micb_index]++;
1044 if (wcd937x->pullup_ref[micb_index] == 1 &&
1045 wcd937x->micb_ref[micb_index] == 0)
1050 if (wcd937x->pullup_ref[micb_index] > 0)
1051 wcd937x->pullup_ref[micb_index]++;
1052 if (wcd937x->pullup_ref[micb_index] == 0 &&
1053 wcd937x->micb_ref[micb_index] == 0)
1058 wcd937x->micb_ref[micb_index]++;
1059 atomic_inc(&wcd937x->ana_clk_count);
1060 if (wcd937x->micb_ref[micb_index] == 1) {
1080 wcd_mbhc_event_notify(wcd937x->wcd_mbhc,
1084 wcd_mbhc_event_notify(wcd937x->wcd_mbhc,
1089 atomic_dec(&wcd937x->ana_clk_count);
1090 if (wcd937x->micb_ref[micb_index] > 0)
1091 wcd937x->micb_ref[micb_index]--;
1092 if (wcd937x->micb_ref[micb_index] == 0 &&
1093 wcd937x->pullup_ref[micb_index] > 0)
1096 else if (wcd937x->micb_ref[micb_index] == 0 &&
1097 wcd937x->pullup_ref[micb_index] == 0) {
1099 wcd_mbhc_event_notify(wcd937x->wcd_mbhc,
1105 wcd_mbhc_event_notify(wcd937x->wcd_mbhc,
1110 wcd_mbhc_event_notify(wcd937x->wcd_mbhc,
1112 if (atomic_read(&wcd937x->ana_clk_count) <= 0) {
1116 atomic_set(&wcd937x->ana_clk_count, 0);
1120 mutex_unlock(&wcd937x->micb_lock);
1128 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
1129 int micb_num = w->shift;
1158 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
1159 int micb_num = w->shift;
1185 struct sdw_port_config *port_config = &wcd->port_config[port_idx - 1];
1186 const struct wcd_sdw_ch_info *ch_info = &wcd->ch_info[ch_id];
1187 u8 port_num = ch_info->port_num;
1188 u8 ch_mask = ch_info->ch_mask;
1190 struct sdw_slave *sdev = wcd->sdev;
1192 port_config->num = port_num;
1194 mstr_port_num = sdev->m_port_map[port_num];
1195 mstr_ch_mask = ch_info->master_ch_mask;
1198 port_config->ch_mask |= ch_mask;
1199 wcd->master_channel_map[mstr_port_num] |= mstr_ch_mask;
1201 port_config->ch_mask &= ~ch_mask;
1202 wcd->master_channel_map[mstr_port_num] &= ~mstr_ch_mask;
1214 ucontrol->value.integer.value[0] = wcd937x->hph_mode;
1226 mode_val = ucontrol->value.enumerated.item[0];
1231 if (mode_val == wcd937x->hph_mode)
1243 wcd937x->hph_mode = mode_val;
1247 dev_dbg(component->dev, "%s: Invalid HPH Mode\n", __func__);
1248 return -EINVAL;
1259 mc = (struct soc_mixer_control *)(kcontrol->private_value);
1260 hphr = mc->shift;
1262 ucontrol->value.integer.value[0] = hphr ? wcd937x->comp2_enable :
1263 wcd937x->comp1_enable;
1272 struct wcd937x_sdw_priv *wcd = wcd937x->sdw_priv[AIF1_PB];
1273 int value = ucontrol->value.integer.value[0];
1278 mc = (struct soc_mixer_control *)(kcontrol->private_value);
1279 hphr = mc->shift;
1282 if (value == wcd937x->comp2_enable)
1285 wcd937x->comp2_enable = value;
1287 if (value == wcd937x->comp1_enable)
1290 wcd937x->comp1_enable = value;
1293 portidx = wcd->ch_info[mc->reg].port_num;
1296 wcd937x_connect_port(wcd, portidx, mc->reg, true);
1298 wcd937x_connect_port(wcd, portidx, mc->reg, false);
1306 struct soc_mixer_control *mixer = (struct soc_mixer_control *)kcontrol->private_value;
1310 int dai_id = mixer->shift;
1311 int ch_idx = mixer->reg;
1314 wcd = wcd937x->sdw_priv[dai_id];
1315 portidx = wcd->ch_info[ch_idx].port_num;
1317 ucontrol->value.integer.value[0] = wcd->port_enable[portidx];
1325 struct soc_mixer_control *mixer = (struct soc_mixer_control *)kcontrol->private_value;
1329 int dai_id = mixer->shift;
1330 int ch_idx = mixer->reg;
1334 wcd = wcd937x->sdw_priv[dai_id];
1336 portidx = wcd->ch_info[ch_idx].port_num;
1338 enable = ucontrol->value.integer.value[0];
1340 if (enable == wcd->port_enable[portidx]) {
1345 wcd->port_enable[portidx] = enable;
1381 dev_err(component->dev, "%s: invalid number of buttons: %d\n",
1458 return -EINVAL;
1460 mutex_lock(&wcd937x->micb_lock);
1465 * to avoid slow micbias ramp-up or down enable pull-up
1466 * momentarily, change the micbias value and then re-enable
1474 req_vout_ctl = wcd_get_micb_vout_ctl_val(component->dev, req_volt);
1476 ret = -EINVAL;
1505 mutex_unlock(&wcd937x->micb_lock);
1516 return -EINVAL;
1522 if (wcd937x->common.micb_mv[2] >= WCD_MBHC_THR_HS_MICB_MV)
1525 micb_mv = req_en ? WCD_MBHC_THR_HS_MICB_MV : wcd937x->common.micb_mv[2];
1544 regmap_update_bits(wcd937x->regmap, WCD937X_ANA_MBHC_ZDET, 0x20, 0x20);
1546 regmap_read(wcd937x->regmap, WCD937X_ANA_MBHC_RESULT_2, &val);
1551 regmap_read(wcd937x->regmap, WCD937X_ANA_MBHC_RESULT_1, &val1);
1553 regmap_update_bits(wcd937x->regmap, WCD937X_ANA_MBHC_ZDET, 0x20, 0x00);
1561 dev_err(component->dev, "Impedance detect ramp error, c1=%d, x1=0x%x\n",
1566 denom = (x1 * d1) - (1 << (14 - noff));
1572 dev_err(component->dev, "%s: d1=%d, c1=%d, x1=0x%x, z_val=%d (milliohm)\n",
1577 regmap_read(wcd937x->regmap,
1579 regmap_read(wcd937x->regmap,
1598 WCD937X_ZDET_MAXV_CTL_MASK, zdet_param->ldo_ctl);
1600 WCD937X_VTH_MASK, zdet_param->btn5);
1602 WCD937X_VTH_MASK, zdet_param->btn6);
1604 WCD937X_VTH_MASK, zdet_param->btn7);
1606 WCD937X_ZDET_RANGE_CTL_MASK, zdet_param->noff);
1608 0x0F, zdet_param->nshift);
1612 /* Start impedance measurement for HPH_L */
1613 regmap_update_bits(wcd937x->regmap,
1615 wcd937x_mbhc_get_result_params(component, d1_a, zdet_param->noff, &zdet);
1616 regmap_update_bits(wcd937x->regmap,
1624 /* Start impedance measurement for HPH_R */
1625 regmap_update_bits(wcd937x->regmap,
1627 wcd937x_mbhc_get_result_params(component, d1_a, zdet_param->noff, &zdet);
1628 regmap_update_bits(wcd937x->regmap,
1647 q1_cal = (10000 - ((q1 & 0x7F) * 25));
1685 regmap_update_bits(wcd937x->regmap,
1689 /* For NO-jack, disable L_DET_EN before Z-det measurements */
1690 if (wcd937x->mbhc_cfg.hphl_swh)
1691 regmap_update_bits(wcd937x->regmap,
1695 regmap_update_bits(wcd937x->regmap,
1698 /* Disable surge protection before impedance detection.
1699 * This is done to give correct value for high impedance.
1701 regmap_update_bits(wcd937x->regmap,
1706 /* First get impedance on Left */
1739 /* Start of right impedance ramp and calculation */
1743 zdet_param_ptr->noff == 0x6) ||
1772 dev_err(component->dev,
1781 wcd_mbhc_set_hph_type(wcd937x->wcd_mbhc, WCD_MBHC_HPH_MONO);
1800 z_diff1 = (z1ls > zMono) ? (z1ls - zMono) : (zMono - z1ls);
1801 z_diff2 = ((*zl) > z1ls) ? ((*zl) - z1ls) : (z1ls - (*zl));
1803 wcd_mbhc_set_hph_type(wcd937x->wcd_mbhc, WCD_MBHC_HPH_STEREO);
1805 wcd_mbhc_set_hph_type(wcd937x->wcd_mbhc, WCD_MBHC_HPH_MONO);
1807 /* Enable surge protection again after impedance detection */
1808 regmap_update_bits(wcd937x->regmap,
1815 regmap_update_bits(wcd937x->regmap,
1818 /* For NO-jack, re-enable L_DET_EN after Z-det measurements */
1819 if (wcd937x->mbhc_cfg.hphl_swh)
1820 regmap_update_bits(wcd937x->regmap,
1826 regmap_update_bits(wcd937x->regmap,
1859 if (wcd937x->mbhc_cfg.moist_rref == R_OFF) {
1866 if (!wcd937x->mbhc_cfg.hphl_swh) {
1867 dev_err(component->dev, "%s: disable moisture detection for NC\n",
1875 WCD937X_M_RTH_CTL_MASK, wcd937x->mbhc_cfg.moist_rref);
1884 WCD937X_M_RTH_CTL_MASK, wcd937x->mbhc_cfg.moist_rref);
1895 if (wcd937x->mbhc_cfg.moist_rref == R_OFF) {
1902 if (!wcd937x->mbhc_cfg.hphl_swh) {
1903 dev_err(component->dev, "%s: disable moisture detection for NC\n",
1957 ucontrol->value.integer.value[0] = wcd_mbhc_get_hph_type(wcd937x->wcd_mbhc);
1972 mc = (struct soc_mixer_control *)(kcontrol->private_value);
1973 hphr = mc->shift;
1974 wcd_mbhc_get_impedance(wcd937x->wcd_mbhc, &zl, &zr);
1975 ucontrol->value.integer.value[0] = hphr ? zr : zl;
1986 SOC_SINGLE_EXT("HPHL Impedance", 0, 0, INT_MAX, 0,
1988 SOC_SINGLE_EXT("HPHR Impedance", 0, 1, INT_MAX, 0,
1995 struct wcd_mbhc_intr *intr_ids = &wcd937x->intr_ids;
1997 intr_ids->mbhc_sw_intr = regmap_irq_get_virq(wcd937x->irq_chip,
1999 intr_ids->mbhc_btn_press_intr = regmap_irq_get_virq(wcd937x->irq_chip,
2001 intr_ids->mbhc_btn_release_intr = regmap_irq_get_virq(wcd937x->irq_chip,
2003 intr_ids->mbhc_hs_ins_intr = regmap_irq_get_virq(wcd937x->irq_chip,
2005 intr_ids->mbhc_hs_rem_intr = regmap_irq_get_virq(wcd937x->irq_chip,
2007 intr_ids->hph_left_ocp = regmap_irq_get_virq(wcd937x->irq_chip,
2009 intr_ids->hph_right_ocp = regmap_irq_get_virq(wcd937x->irq_chip,
2012 wcd937x->wcd_mbhc = wcd_mbhc_init(component, &mbhc_cb, intr_ids, wcd_mbhc_fields, true);
2013 if (IS_ERR(wcd937x->wcd_mbhc))
2014 return PTR_ERR(wcd937x->wcd_mbhc);
2028 wcd_mbhc_deinit(wcd937x->wcd_mbhc);
2261 /* TX output widgets */
2267 /* RX output widgets */
2349 /* Output widgets */
2431 regmap_update_bits(wcd937x->regmap, WCD937X_ANA_MICB1, WCD937X_ANA_MICB_VOUT,
2432 wcd937x->common.micb_vout[0]);
2433 regmap_update_bits(wcd937x->regmap, WCD937X_ANA_MICB2, WCD937X_ANA_MICB_VOUT,
2434 wcd937x->common.micb_vout[1]);
2435 regmap_update_bits(wcd937x->regmap, WCD937X_ANA_MICB3, WCD937X_ANA_MICB_VOUT,
2436 wcd937x->common.micb_vout[2]);
2464 wcd->virq = irq_domain_create_linear(NULL, 1, &wcd_domain_ops, NULL);
2465 if (!(wcd->virq)) {
2467 return -EINVAL;
2470 return devm_regmap_add_irq_chip(dev, wcd->regmap,
2471 irq_create_mapping(wcd->virq, 0),
2473 &wcd->irq_chip);
2480 struct sdw_slave *tx_sdw_dev = wcd937x->tx_sdw_dev;
2481 struct device *dev = component->dev;
2486 time_left = wait_for_completion_timeout(&tx_sdw_dev->initialization_complete,
2490 return -ETIMEDOUT;
2493 snd_soc_component_init_regmap(component, wcd937x->regmap);
2503 return -EINVAL;
2506 wcd937x->clsh_info = wcd_clsh_ctrl_alloc(component, WCD937X);
2507 if (IS_ERR(wcd937x->clsh_info)) {
2509 return PTR_ERR(wcd937x->clsh_info);
2512 wcd937x_io_init(wcd937x->regmap);
2515 regmap_write(wcd937x->regmap, (WCD937X_DIGITAL_INTR_LEVEL_0 + i), 0);
2519 wcd937x->hphr_pdm_wd_int = regmap_irq_get_virq(wcd937x->irq_chip,
2521 wcd937x->hphl_pdm_wd_int = regmap_irq_get_virq(wcd937x->irq_chip,
2523 wcd937x->aux_pdm_wd_int = regmap_irq_get_virq(wcd937x->irq_chip,
2527 ret = devm_request_threaded_irq(dev, wcd937x->hphr_pdm_wd_int, NULL, wcd937x_wd_handle_irq,
2533 ret = devm_request_threaded_irq(dev, wcd937x->hphl_pdm_wd_int, NULL, wcd937x_wd_handle_irq,
2539 ret = devm_request_threaded_irq(dev, wcd937x->aux_pdm_wd_int, NULL, wcd937x_wd_handle_irq,
2546 disable_irq_nosync(wcd937x->hphr_pdm_wd_int);
2547 disable_irq_nosync(wcd937x->hphl_pdm_wd_int);
2548 disable_irq_nosync(wcd937x->aux_pdm_wd_int);
2554 dev_err(component->dev, "Failed to add snd_ctls\n");
2555 wcd_clsh_ctrl_free(wcd937x->clsh_info);
2562 dev_err(component->dev, "Failed to add routes\n");
2563 wcd_clsh_ctrl_free(wcd937x->clsh_info);
2570 dev_err(component->dev, "mbhc initialization failed\n");
2580 free_irq(wcd937x->aux_pdm_wd_int, wcd937x);
2581 free_irq(wcd937x->hphl_pdm_wd_int, wcd937x);
2582 free_irq(wcd937x->hphr_pdm_wd_int, wcd937x);
2584 wcd_clsh_ctrl_free(wcd937x->clsh_info);
2590 struct wcd937x_priv *wcd = dev_get_drvdata(comp->dev);
2594 ret = wcd_mbhc_start(wcd->wcd_mbhc, &wcd->mbhc_cfg, jack);
2596 wcd_mbhc_stop(wcd->wcd_mbhc);
2622 value = gpiod_get_value(wcd937x->us_euro_gpio);
2623 gpiod_set_value(wcd937x->us_euro_gpio, !value);
2632 struct wcd937x_priv *wcd937x = dev_get_drvdata(dai->dev);
2633 struct wcd937x_sdw_priv *wcd = wcd937x->sdw_priv[dai->id];
2641 struct wcd937x_priv *wcd937x = dev_get_drvdata(dai->dev);
2642 struct wcd937x_sdw_priv *wcd = wcd937x->sdw_priv[dai->id];
2644 return sdw_stream_remove_slave(wcd->sdev, wcd->sruntime);
2650 struct wcd937x_priv *wcd937x = dev_get_drvdata(dai->dev);
2651 struct wcd937x_sdw_priv *wcd = wcd937x->sdw_priv[dai->id];
2653 wcd->sruntime = stream;
2662 struct wcd937x_priv *wcd937x = dev_get_drvdata(dai->dev);
2663 struct wcd937x_sdw_priv *wcd = wcd937x->sdw_priv[dai->id];
2666 switch (dai->id) {
2669 dev_err(dai->dev, "Invalid rx_slot %p or rx_num %p\n",
2671 return -EINVAL;
2675 rx_slot[i] = wcd->master_channel_map[i];
2681 dev_err(dai->dev, "Invalid tx_slot %p or tx_num %p\n",
2683 return -EINVAL;
2687 tx_slot[i] = wcd->master_channel_map[i];
2707 .name = "wcd937x-sdw-rx",
2720 .name = "wcd937x-sdw-tx",
2748 wcd937x->rxdev = of_sdw_find_device_by_node(wcd937x->rxnode);
2749 if (!wcd937x->rxdev) {
2751 return -EINVAL;
2754 wcd937x->sdw_priv[AIF1_PB] = dev_get_drvdata(wcd937x->rxdev);
2755 wcd937x->sdw_priv[AIF1_PB]->wcd937x = wcd937x;
2757 wcd937x->txdev = of_sdw_find_device_by_node(wcd937x->txnode);
2758 if (!wcd937x->txdev) {
2760 return -EINVAL;
2763 wcd937x->sdw_priv[AIF1_CAP] = dev_get_drvdata(wcd937x->txdev);
2764 wcd937x->sdw_priv[AIF1_CAP]->wcd937x = wcd937x;
2765 wcd937x->tx_sdw_dev = dev_to_sdw_dev(wcd937x->txdev);
2766 if (!wcd937x->tx_sdw_dev) {
2768 return -EINVAL;
2775 if (!device_link_add(wcd937x->rxdev, wcd937x->txdev,
2778 return -EINVAL;
2781 if (!device_link_add(dev, wcd937x->txdev,
2784 return -EINVAL;
2787 if (!device_link_add(dev, wcd937x->rxdev,
2790 return -EINVAL;
2793 wcd937x->regmap = wcd937x->sdw_priv[AIF1_CAP]->regmap;
2794 if (!wcd937x->regmap) {
2796 return -EINVAL;
2805 wcd937x->sdw_priv[AIF1_PB]->slave_irq = wcd937x->virq;
2806 wcd937x->sdw_priv[AIF1_CAP]->slave_irq = wcd937x->virq;
2823 device_link_remove(dev, wcd937x->txdev);
2824 device_link_remove(dev, wcd937x->rxdev);
2825 device_link_remove(wcd937x->rxdev, wcd937x->txdev);
2827 mutex_destroy(&wcd937x->micb_lock);
2839 struct device_node *np = dev->of_node;
2841 wcd937x->rxnode = of_parse_phandle(np, "qcom,rx-device", 0);
2842 if (!wcd937x->rxnode) {
2843 dev_err(dev, "Couldn't parse phandle to qcom,rx-device!\n");
2844 return -ENODEV;
2846 of_node_get(wcd937x->rxnode);
2848 component_compare_of, wcd937x->rxnode);
2850 wcd937x->txnode = of_parse_phandle(np, "qcom,tx-device", 0);
2851 if (!wcd937x->txnode) {
2852 dev_err(dev, "Couldn't parse phandle to qcom,tx-device\n");
2853 return -ENODEV;
2855 of_node_get(wcd937x->txnode);
2857 component_compare_of, wcd937x->txnode);
2865 struct device *dev = &pdev->dev;
2872 return -ENOMEM;
2875 mutex_init(&wcd937x->micb_lock);
2876 wcd937x->common.dev = dev;
2877 wcd937x->common.max_bias = 3;
2879 wcd937x->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_LOW);
2880 if (IS_ERR(wcd937x->reset_gpio))
2881 return dev_err_probe(dev, PTR_ERR(wcd937x->reset_gpio),
2884 wcd937x->us_euro_gpio = devm_gpiod_get_optional(dev, "us-euro", GPIOD_OUT_LOW);
2885 if (IS_ERR(wcd937x->us_euro_gpio))
2886 return dev_err_probe(dev, PTR_ERR(wcd937x->us_euro_gpio),
2887 "us-euro swap Control GPIO not found\n");
2889 cfg = &wcd937x->mbhc_cfg;
2890 cfg->swap_gnd_mic = wcd937x_swap_gnd_mic;
2897 ret = wcd_dt_parse_micbias_info(&wcd937x->common);
2901 cfg->mbhc_micbias = MIC_BIAS_2;
2902 cfg->anc_micbias = MIC_BIAS_2;
2903 cfg->v_hs_max = WCD_MBHC_HS_V_MAX;
2904 cfg->num_btn = WCD937X_MBHC_MAX_BUTTONS;
2905 cfg->micb_mv = wcd937x->common.micb_mv[2];
2906 cfg->linein_th = 5000;
2907 cfg->hs_thr = 1700;
2908 cfg->hph_thr = 50;
2910 wcd_dt_parse_mbhc_data(dev, &wcd937x->mbhc_cfg);
2934 struct device *dev = &pdev->dev;
2936 component_master_del(&pdev->dev, &wcd937x_comp_ops);
2945 { .compatible = "qcom,wcd9370-codec" },
2946 { .compatible = "qcom,wcd9375-codec" },