Lines Matching +full:main +full:- +full:micbias +full:- +full:supply
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-mbhc-v2.h"
113 "vdd-rxtx", "vdd-px", "vdd-mic-bias", "vdd-buck",
116 static const SNDRV_CTL_TLVD_DECLARE_DB_MINMAX(ear_pa_gain, 600, -1800);
212 regmap_write(wcd937x->regmap, WCD937X_DIGITAL_INTR_CLEAR_0, 0);
213 regmap_write(wcd937x->regmap, WCD937X_DIGITAL_INTR_CLEAR_1, 0);
214 regmap_write(wcd937x->regmap, WCD937X_DIGITAL_INTR_CLEAR_2, 0);
243 gpiod_set_value(wcd937x->reset_gpio, 1);
245 gpiod_set_value(wcd937x->reset_gpio, 0);
303 if (atomic_read(&wcd937x->rx_clk_cnt))
314 atomic_inc(&wcd937x->rx_clk_cnt);
323 if (!atomic_read(&wcd937x->rx_clk_cnt)) {
324 dev_err(component->dev, "clk already disabled\n");
328 atomic_dec(&wcd937x->rx_clk_cnt);
341 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
343 int hph_mode = wcd937x->hph_mode;
357 set_bit(HPH_COMP_DELAY, &wcd937x->status_mask);
369 if (wcd937x->comp1_enable) {
377 if (wcd937x->comp2_enable) {
385 if (test_bit(HPH_COMP_DELAY, &wcd937x->status_mask)) {
387 clear_bit(HPH_COMP_DELAY, &wcd937x->status_mask);
416 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
418 int hph_mode = wcd937x->hph_mode;
429 set_bit(HPH_COMP_DELAY, &wcd937x->status_mask);
440 if (wcd937x->comp2_enable) {
446 if (wcd937x->comp1_enable) {
455 if (test_bit(HPH_COMP_DELAY, &wcd937x->status_mask)) {
457 clear_bit(HPH_COMP_DELAY, &wcd937x->status_mask);
485 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
487 int hph_mode = wcd937x->hph_mode;
507 if (wcd937x->comp1_enable)
514 wcd_clsh_ctrl_set_state(wcd937x->clsh_info,
526 if (wcd937x->comp1_enable)
540 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
542 int hph_mode = wcd937x->hph_mode;
556 wcd_clsh_ctrl_set_state(wcd937x->clsh_info,
576 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
578 int hph_mode = wcd937x->hph_mode;
582 wcd_clsh_ctrl_set_state(wcd937x->clsh_info,
589 set_bit(HPH_PA_DELAY, &wcd937x->status_mask);
595 if (test_bit(HPH_PA_DELAY, &wcd937x->status_mask)) {
596 if (wcd937x->comp2_enable)
600 clear_bit(HPH_PA_DELAY, &wcd937x->status_mask);
610 enable_irq(wcd937x->hphr_pdm_wd_int);
613 disable_irq_nosync(wcd937x->hphr_pdm_wd_int);
614 set_bit(HPH_PA_DELAY, &wcd937x->status_mask);
615 wcd_mbhc_event_notify(wcd937x->wcd_mbhc, WCD_EVENT_PRE_HPHR_PA_OFF);
618 if (test_bit(HPH_PA_DELAY, &wcd937x->status_mask)) {
619 if (wcd937x->comp2_enable)
623 clear_bit(HPH_PA_DELAY, &wcd937x->status_mask);
626 wcd_mbhc_event_notify(wcd937x->wcd_mbhc, WCD_EVENT_POST_HPHR_PA_OFF);
631 wcd_clsh_ctrl_set_state(wcd937x->clsh_info,
645 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
647 int hph_mode = wcd937x->hph_mode;
651 wcd_clsh_ctrl_set_state(wcd937x->clsh_info,
658 set_bit(HPH_PA_DELAY, &wcd937x->status_mask);
663 if (test_bit(HPH_PA_DELAY, &wcd937x->status_mask)) {
664 if (!wcd937x->comp1_enable)
668 clear_bit(HPH_PA_DELAY, &wcd937x->status_mask);
678 enable_irq(wcd937x->hphl_pdm_wd_int);
681 disable_irq_nosync(wcd937x->hphl_pdm_wd_int);
682 set_bit(HPH_PA_DELAY, &wcd937x->status_mask);
683 wcd_mbhc_event_notify(wcd937x->wcd_mbhc, WCD_EVENT_PRE_HPHL_PA_OFF);
686 if (test_bit(HPH_PA_DELAY, &wcd937x->status_mask)) {
687 if (!wcd937x->comp1_enable)
691 clear_bit(HPH_PA_DELAY, &wcd937x->status_mask);
694 wcd_mbhc_event_notify(wcd937x->wcd_mbhc, WCD_EVENT_POST_HPHL_PA_OFF);
699 wcd_clsh_ctrl_set_state(wcd937x->clsh_info,
713 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
715 int hph_mode = wcd937x->hph_mode;
734 enable_irq(wcd937x->aux_pdm_wd_int);
737 disable_irq_nosync(wcd937x->aux_pdm_wd_int);
741 wcd_clsh_ctrl_set_state(wcd937x->clsh_info,
759 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
761 int hph_mode = wcd937x->hph_mode;
766 wcd937x->ear_rx_path = snd_soc_component_read(component,
769 if (wcd937x->ear_rx_path & EAR_RX_PATH_AUX)
777 if (!wcd937x->comp1_enable)
789 if (wcd937x->ear_rx_path & EAR_RX_PATH_AUX)
790 enable_irq(wcd937x->aux_pdm_wd_int);
792 enable_irq(wcd937x->hphl_pdm_wd_int);
795 if (wcd937x->ear_rx_path & EAR_RX_PATH_AUX)
796 disable_irq_nosync(wcd937x->aux_pdm_wd_int);
798 disable_irq_nosync(wcd937x->hphl_pdm_wd_int);
801 if (!wcd937x->comp1_enable)
806 wcd_clsh_ctrl_set_state(wcd937x->clsh_info,
813 if (wcd937x->ear_rx_path & EAR_RX_PATH_AUX)
831 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
846 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
862 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
878 pr_err("Unsupported micbias voltage (%u mV)\n", micb_mv);
879 return -EINVAL;
882 return (micb_mv - 1000) / 50;
888 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
893 if (event == SND_SOC_DAPM_PRE_PMU && strnstr(w->name, "ADC", sizeof("ADC")))
894 if (w->shift == 1 && !use_amic3)
895 set_bit(AMIC2_BCS_ENABLE, &wcd937x->status_mask);
903 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
908 atomic_inc(&wcd937x->ana_clk_count);
917 if (w->shift == 1 && test_bit(AMIC2_BCS_ENABLE, &wcd937x->status_mask))
918 clear_bit(AMIC2_BCS_ENABLE, &wcd937x->status_mask);
931 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
965 atomic_dec(&wcd937x->ana_clk_count);
966 if (atomic_read(&wcd937x->ana_clk_count) <= 0) {
970 atomic_set(&wcd937x->ana_clk_count, 0);
986 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
989 switch (w->shift) {
1003 dev_err(component->dev, "Invalid DMIC Selection\n");
1004 return -EINVAL;
1028 int micb_index = micb_num - 1;
1031 if (micb_index < 0 || (micb_index > WCD937X_MAX_MICBIAS - 1)) {
1032 dev_err(component->dev, "Invalid micbias index, micb_ind:%d\n", micb_index);
1033 return -EINVAL;
1046 dev_err(component->dev, "Invalid micbias number: %d\n", micb_num);
1047 return -EINVAL;
1050 mutex_lock(&wcd937x->micb_lock);
1053 wcd937x->pullup_ref[micb_index]++;
1054 if (wcd937x->pullup_ref[micb_index] == 1 &&
1055 wcd937x->micb_ref[micb_index] == 0)
1060 if (wcd937x->pullup_ref[micb_index] > 0)
1061 wcd937x->pullup_ref[micb_index]++;
1062 if (wcd937x->pullup_ref[micb_index] == 0 &&
1063 wcd937x->micb_ref[micb_index] == 0)
1068 wcd937x->micb_ref[micb_index]++;
1069 atomic_inc(&wcd937x->ana_clk_count);
1070 if (wcd937x->micb_ref[micb_index] == 1) {
1090 wcd_mbhc_event_notify(wcd937x->wcd_mbhc,
1094 wcd_mbhc_event_notify(wcd937x->wcd_mbhc,
1099 atomic_dec(&wcd937x->ana_clk_count);
1100 if (wcd937x->micb_ref[micb_index] > 0)
1101 wcd937x->micb_ref[micb_index]--;
1102 if (wcd937x->micb_ref[micb_index] == 0 &&
1103 wcd937x->pullup_ref[micb_index] > 0)
1106 else if (wcd937x->micb_ref[micb_index] == 0 &&
1107 wcd937x->pullup_ref[micb_index] == 0) {
1109 wcd_mbhc_event_notify(wcd937x->wcd_mbhc,
1115 wcd_mbhc_event_notify(wcd937x->wcd_mbhc,
1120 wcd_mbhc_event_notify(wcd937x->wcd_mbhc,
1122 if (atomic_read(&wcd937x->ana_clk_count) <= 0) {
1126 atomic_set(&wcd937x->ana_clk_count, 0);
1130 mutex_unlock(&wcd937x->micb_lock);
1138 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
1139 int micb_num = w->shift;
1168 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
1169 int micb_num = w->shift;
1195 struct sdw_port_config *port_config = &wcd->port_config[port_idx - 1];
1196 const struct wcd937x_sdw_ch_info *ch_info = &wcd->ch_info[ch_id];
1197 u8 port_num = ch_info->port_num;
1198 u8 ch_mask = ch_info->ch_mask;
1200 struct sdw_slave *sdev = wcd->sdev;
1202 port_config->num = port_num;
1204 mstr_port_num = sdev->m_port_map[port_num];
1205 mstr_ch_mask = ch_info->master_ch_mask;
1208 port_config->ch_mask |= ch_mask;
1209 wcd->master_channel_map[mstr_port_num] |= mstr_ch_mask;
1211 port_config->ch_mask &= ~ch_mask;
1212 wcd->master_channel_map[mstr_port_num] &= ~mstr_ch_mask;
1224 ucontrol->value.integer.value[0] = wcd937x->hph_mode;
1236 mode_val = ucontrol->value.enumerated.item[0];
1241 if (mode_val == wcd937x->hph_mode)
1253 wcd937x->hph_mode = mode_val;
1257 dev_dbg(component->dev, "%s: Invalid HPH Mode\n", __func__);
1258 return -EINVAL;
1269 mc = (struct soc_mixer_control *)(kcontrol->private_value);
1270 hphr = mc->shift;
1272 ucontrol->value.integer.value[0] = hphr ? wcd937x->comp2_enable :
1273 wcd937x->comp1_enable;
1282 struct wcd937x_sdw_priv *wcd = wcd937x->sdw_priv[AIF1_PB];
1283 int value = ucontrol->value.integer.value[0];
1288 mc = (struct soc_mixer_control *)(kcontrol->private_value);
1289 hphr = mc->shift;
1292 if (value == wcd937x->comp2_enable)
1295 wcd937x->comp2_enable = value;
1297 if (value == wcd937x->comp1_enable)
1300 wcd937x->comp1_enable = value;
1303 portidx = wcd->ch_info[mc->reg].port_num;
1306 wcd937x_connect_port(wcd, portidx, mc->reg, true);
1308 wcd937x_connect_port(wcd, portidx, mc->reg, false);
1316 struct soc_mixer_control *mixer = (struct soc_mixer_control *)kcontrol->private_value;
1320 int dai_id = mixer->shift;
1321 int ch_idx = mixer->reg;
1324 wcd = wcd937x->sdw_priv[dai_id];
1325 portidx = wcd->ch_info[ch_idx].port_num;
1327 ucontrol->value.integer.value[0] = wcd->port_enable[portidx];
1335 struct soc_mixer_control *mixer = (struct soc_mixer_control *)kcontrol->private_value;
1339 int dai_id = mixer->shift;
1340 int ch_idx = mixer->reg;
1344 wcd = wcd937x->sdw_priv[dai_id];
1346 portidx = wcd->ch_info[ch_idx].port_num;
1348 enable = ucontrol->value.integer.value[0];
1350 if (enable == wcd->port_enable[portidx]) {
1355 wcd->port_enable[portidx] = enable;
1391 dev_err(component->dev, "%s: invalid number of buttons: %d\n",
1468 return -EINVAL;
1470 mutex_lock(&wcd937x->micb_lock);
1472 * If requested micbias voltage is same as current micbias
1474 * per requested value. If micbias is already enabled, then
1475 * to avoid slow micbias ramp-up or down enable pull-up
1476 * momentarily, change the micbias value and then re-enable
1477 * micbias.
1486 ret = -EINVAL;
1510 * micbias
1515 mutex_unlock(&wcd937x->micb_lock);
1526 return -EINVAL;
1528 * If device tree micbias level is already above the minimum
1530 * not change the micbias, just return.
1532 if (wcd937x->micb2_mv >= WCD_MBHC_THR_HS_MICB_MV)
1535 micb_mv = req_en ? WCD_MBHC_THR_HS_MICB_MV : wcd937x->micb2_mv;
1554 regmap_update_bits(wcd937x->regmap, WCD937X_ANA_MBHC_ZDET, 0x20, 0x20);
1556 regmap_read(wcd937x->regmap, WCD937X_ANA_MBHC_RESULT_2, &val);
1561 regmap_read(wcd937x->regmap, WCD937X_ANA_MBHC_RESULT_1, &val1);
1563 regmap_update_bits(wcd937x->regmap, WCD937X_ANA_MBHC_ZDET, 0x20, 0x00);
1571 dev_err(component->dev, "Impedance detect ramp error, c1=%d, x1=0x%x\n",
1576 denom = (x1 * d1) - (1 << (14 - noff));
1582 dev_err(component->dev, "%s: d1=%d, c1=%d, x1=0x%x, z_val=%d (milliohm)\n",
1587 regmap_read(wcd937x->regmap,
1589 regmap_read(wcd937x->regmap,
1608 WCD937X_ZDET_MAXV_CTL_MASK, zdet_param->ldo_ctl);
1610 WCD937X_VTH_MASK, zdet_param->btn5);
1612 WCD937X_VTH_MASK, zdet_param->btn6);
1614 WCD937X_VTH_MASK, zdet_param->btn7);
1616 WCD937X_ZDET_RANGE_CTL_MASK, zdet_param->noff);
1618 0x0F, zdet_param->nshift);
1623 regmap_update_bits(wcd937x->regmap,
1625 wcd937x_mbhc_get_result_params(component, d1_a, zdet_param->noff, &zdet);
1626 regmap_update_bits(wcd937x->regmap,
1635 regmap_update_bits(wcd937x->regmap,
1637 wcd937x_mbhc_get_result_params(component, d1_a, zdet_param->noff, &zdet);
1638 regmap_update_bits(wcd937x->regmap,
1657 q1_cal = (10000 - ((q1 & 0x7F) * 25));
1695 regmap_update_bits(wcd937x->regmap,
1699 /* For NO-jack, disable L_DET_EN before Z-det measurements */
1700 if (wcd937x->mbhc_cfg.hphl_swh)
1701 regmap_update_bits(wcd937x->regmap,
1705 regmap_update_bits(wcd937x->regmap,
1711 regmap_update_bits(wcd937x->regmap,
1753 zdet_param_ptr->noff == 0x6) ||
1782 dev_err(component->dev,
1791 wcd_mbhc_set_hph_type(wcd937x->wcd_mbhc, WCD_MBHC_HPH_MONO);
1810 z_diff1 = (z1ls > zMono) ? (z1ls - zMono) : (zMono - z1ls);
1811 z_diff2 = ((*zl) > z1ls) ? ((*zl) - z1ls) : (z1ls - (*zl));
1813 wcd_mbhc_set_hph_type(wcd937x->wcd_mbhc, WCD_MBHC_HPH_STEREO);
1815 wcd_mbhc_set_hph_type(wcd937x->wcd_mbhc, WCD_MBHC_HPH_MONO);
1818 regmap_update_bits(wcd937x->regmap,
1825 regmap_update_bits(wcd937x->regmap,
1828 /* For NO-jack, re-enable L_DET_EN after Z-det measurements */
1829 if (wcd937x->mbhc_cfg.hphl_swh)
1830 regmap_update_bits(wcd937x->regmap,
1836 regmap_update_bits(wcd937x->regmap,
1869 if (wcd937x->mbhc_cfg.moist_rref == R_OFF) {
1876 if (!wcd937x->mbhc_cfg.hphl_swh) {
1877 dev_err(component->dev, "%s: disable moisture detection for NC\n",
1885 WCD937X_M_RTH_CTL_MASK, wcd937x->mbhc_cfg.moist_rref);
1894 WCD937X_M_RTH_CTL_MASK, wcd937x->mbhc_cfg.moist_rref);
1905 if (wcd937x->mbhc_cfg.moist_rref == R_OFF) {
1912 if (!wcd937x->mbhc_cfg.hphl_swh) {
1913 dev_err(component->dev, "%s: disable moisture detection for NC\n",
1967 ucontrol->value.integer.value[0] = wcd_mbhc_get_hph_type(wcd937x->wcd_mbhc);
1982 mc = (struct soc_mixer_control *)(kcontrol->private_value);
1983 hphr = mc->shift;
1984 wcd_mbhc_get_impedance(wcd937x->wcd_mbhc, &zl, &zr);
1985 ucontrol->value.integer.value[0] = hphr ? zr : zl;
2005 struct wcd_mbhc_intr *intr_ids = &wcd937x->intr_ids;
2007 intr_ids->mbhc_sw_intr = regmap_irq_get_virq(wcd937x->irq_chip,
2009 intr_ids->mbhc_btn_press_intr = regmap_irq_get_virq(wcd937x->irq_chip,
2011 intr_ids->mbhc_btn_release_intr = regmap_irq_get_virq(wcd937x->irq_chip,
2013 intr_ids->mbhc_hs_ins_intr = regmap_irq_get_virq(wcd937x->irq_chip,
2015 intr_ids->mbhc_hs_rem_intr = regmap_irq_get_virq(wcd937x->irq_chip,
2017 intr_ids->hph_left_ocp = regmap_irq_get_virq(wcd937x->irq_chip,
2019 intr_ids->hph_right_ocp = regmap_irq_get_virq(wcd937x->irq_chip,
2022 wcd937x->wcd_mbhc = wcd_mbhc_init(component, &mbhc_cb, intr_ids, wcd_mbhc_fields, true);
2023 if (IS_ERR(wcd937x->wcd_mbhc))
2024 return PTR_ERR(wcd937x->wcd_mbhc);
2038 wcd_mbhc_deinit(wcd937x->wcd_mbhc);
2443 /* Set micbias voltage */
2444 vout_ctl[0] = wcd937x_get_micb_vout_ctl_val(wcd937x->micb1_mv);
2445 vout_ctl[1] = wcd937x_get_micb_vout_ctl_val(wcd937x->micb2_mv);
2446 vout_ctl[2] = wcd937x_get_micb_vout_ctl_val(wcd937x->micb3_mv);
2448 return -EINVAL;
2450 regmap_update_bits(wcd937x->regmap, WCD937X_ANA_MICB1, WCD937X_ANA_MICB_VOUT, vout_ctl[0]);
2451 regmap_update_bits(wcd937x->regmap, WCD937X_ANA_MICB2, WCD937X_ANA_MICB_VOUT, vout_ctl[1]);
2452 regmap_update_bits(wcd937x->regmap, WCD937X_ANA_MICB3, WCD937X_ANA_MICB_VOUT, vout_ctl[2]);
2482 wcd->virq = irq_domain_create_linear(NULL, 1, &wcd_domain_ops, NULL);
2483 if (!(wcd->virq)) {
2485 return -EINVAL;
2488 return devm_regmap_add_irq_chip(dev, wcd->regmap,
2489 irq_create_mapping(wcd->virq, 0),
2491 &wcd->irq_chip);
2498 struct sdw_slave *tx_sdw_dev = wcd937x->tx_sdw_dev;
2499 struct device *dev = component->dev;
2504 time_left = wait_for_completion_timeout(&tx_sdw_dev->initialization_complete,
2508 return -ETIMEDOUT;
2511 snd_soc_component_init_regmap(component, wcd937x->regmap);
2521 return -EINVAL;
2524 wcd937x->clsh_info = wcd_clsh_ctrl_alloc(component, WCD937X);
2525 if (IS_ERR(wcd937x->clsh_info)) {
2527 return PTR_ERR(wcd937x->clsh_info);
2530 wcd937x_io_init(wcd937x->regmap);
2533 regmap_write(wcd937x->regmap, (WCD937X_DIGITAL_INTR_LEVEL_0 + i), 0);
2537 wcd937x->hphr_pdm_wd_int = regmap_irq_get_virq(wcd937x->irq_chip,
2539 wcd937x->hphl_pdm_wd_int = regmap_irq_get_virq(wcd937x->irq_chip,
2541 wcd937x->aux_pdm_wd_int = regmap_irq_get_virq(wcd937x->irq_chip,
2545 ret = devm_request_threaded_irq(dev, wcd937x->hphr_pdm_wd_int, NULL, wcd937x_wd_handle_irq,
2551 ret = devm_request_threaded_irq(dev, wcd937x->hphl_pdm_wd_int, NULL, wcd937x_wd_handle_irq,
2557 ret = devm_request_threaded_irq(dev, wcd937x->aux_pdm_wd_int, NULL, wcd937x_wd_handle_irq,
2564 disable_irq_nosync(wcd937x->hphr_pdm_wd_int);
2565 disable_irq_nosync(wcd937x->hphl_pdm_wd_int);
2566 disable_irq_nosync(wcd937x->aux_pdm_wd_int);
2572 dev_err(component->dev, "Failed to add snd_ctls\n");
2573 wcd_clsh_ctrl_free(wcd937x->clsh_info);
2580 dev_err(component->dev, "Failed to add routes\n");
2581 wcd_clsh_ctrl_free(wcd937x->clsh_info);
2588 dev_err(component->dev, "mbhc initialization failed\n");
2598 free_irq(wcd937x->aux_pdm_wd_int, wcd937x);
2599 free_irq(wcd937x->hphl_pdm_wd_int, wcd937x);
2600 free_irq(wcd937x->hphr_pdm_wd_int, wcd937x);
2602 wcd_clsh_ctrl_free(wcd937x->clsh_info);
2608 struct wcd937x_priv *wcd = dev_get_drvdata(comp->dev);
2612 ret = wcd_mbhc_start(wcd->wcd_mbhc, &wcd->mbhc_cfg, jack);
2614 wcd_mbhc_stop(wcd->wcd_mbhc);
2635 struct device_node *np = dev->of_node;
2639 ret = of_property_read_u32(np, "qcom,micbias1-microvolt", &prop_val);
2641 wcd->micb1_mv = prop_val / 1000;
2645 ret = of_property_read_u32(np, "qcom,micbias2-microvolt", &prop_val);
2647 wcd->micb2_mv = prop_val / 1000;
2651 ret = of_property_read_u32(np, "qcom,micbias3-microvolt", &prop_val);
2653 wcd->micb3_mv = prop_val / 1000;
2665 value = gpiod_get_value(wcd937x->us_euro_gpio);
2666 gpiod_set_value(wcd937x->us_euro_gpio, !value);
2675 struct wcd937x_priv *wcd937x = dev_get_drvdata(dai->dev);
2676 struct wcd937x_sdw_priv *wcd = wcd937x->sdw_priv[dai->id];
2684 struct wcd937x_priv *wcd937x = dev_get_drvdata(dai->dev);
2685 struct wcd937x_sdw_priv *wcd = wcd937x->sdw_priv[dai->id];
2687 return sdw_stream_remove_slave(wcd->sdev, wcd->sruntime);
2693 struct wcd937x_priv *wcd937x = dev_get_drvdata(dai->dev);
2694 struct wcd937x_sdw_priv *wcd = wcd937x->sdw_priv[dai->id];
2696 wcd->sruntime = stream;
2705 struct wcd937x_priv *wcd937x = dev_get_drvdata(dai->dev);
2706 struct wcd937x_sdw_priv *wcd = wcd937x->sdw_priv[dai->id];
2709 switch (dai->id) {
2712 dev_err(dai->dev, "Invalid rx_slot %p or rx_num %p\n",
2714 return -EINVAL;
2718 rx_slot[i] = wcd->master_channel_map[i];
2724 dev_err(dai->dev, "Invalid tx_slot %p or tx_num %p\n",
2726 return -EINVAL;
2730 tx_slot[i] = wcd->master_channel_map[i];
2750 .name = "wcd937x-sdw-rx",
2763 .name = "wcd937x-sdw-tx",
2791 wcd937x->rxdev = wcd937x_sdw_device_get(wcd937x->rxnode);
2792 if (!wcd937x->rxdev) {
2794 return -EINVAL;
2797 wcd937x->sdw_priv[AIF1_PB] = dev_get_drvdata(wcd937x->rxdev);
2798 wcd937x->sdw_priv[AIF1_PB]->wcd937x = wcd937x;
2800 wcd937x->txdev = wcd937x_sdw_device_get(wcd937x->txnode);
2801 if (!wcd937x->txdev) {
2803 return -EINVAL;
2806 wcd937x->sdw_priv[AIF1_CAP] = dev_get_drvdata(wcd937x->txdev);
2807 wcd937x->sdw_priv[AIF1_CAP]->wcd937x = wcd937x;
2808 wcd937x->tx_sdw_dev = dev_to_sdw_dev(wcd937x->txdev);
2809 if (!wcd937x->tx_sdw_dev) {
2811 return -EINVAL;
2815 * As TX is the main CSR reg interface, which should not be suspended first.
2818 if (!device_link_add(wcd937x->rxdev, wcd937x->txdev,
2821 return -EINVAL;
2824 if (!device_link_add(dev, wcd937x->txdev,
2827 return -EINVAL;
2830 if (!device_link_add(dev, wcd937x->rxdev,
2833 return -EINVAL;
2836 wcd937x->regmap = dev_get_regmap(&wcd937x->tx_sdw_dev->dev, NULL);
2837 if (!wcd937x->regmap) {
2839 return -EINVAL;
2848 wcd937x->sdw_priv[AIF1_PB]->slave_irq = wcd937x->virq;
2849 wcd937x->sdw_priv[AIF1_CAP]->slave_irq = wcd937x->virq;
2853 dev_err(dev, "Bad micbias pdata\n");
2870 device_link_remove(dev, wcd937x->txdev);
2871 device_link_remove(dev, wcd937x->rxdev);
2872 device_link_remove(wcd937x->rxdev, wcd937x->txdev);
2874 mutex_destroy(&wcd937x->micb_lock);
2886 struct device_node *np = dev->of_node;
2888 wcd937x->rxnode = of_parse_phandle(np, "qcom,rx-device", 0);
2889 if (!wcd937x->rxnode) {
2890 dev_err(dev, "Couldn't parse phandle to qcom,rx-device!\n");
2891 return -ENODEV;
2893 of_node_get(wcd937x->rxnode);
2895 component_compare_of, wcd937x->rxnode);
2897 wcd937x->txnode = of_parse_phandle(np, "qcom,tx-device", 0);
2898 if (!wcd937x->txnode) {
2899 dev_err(dev, "Couldn't parse phandle to qcom,tx-device\n");
2900 return -ENODEV;
2902 of_node_get(wcd937x->txnode);
2904 component_compare_of, wcd937x->txnode);
2912 struct device *dev = &pdev->dev;
2919 return -ENOMEM;
2922 mutex_init(&wcd937x->micb_lock);
2924 wcd937x->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_LOW);
2925 if (IS_ERR(wcd937x->reset_gpio))
2926 return dev_err_probe(dev, PTR_ERR(wcd937x->reset_gpio),
2929 wcd937x->us_euro_gpio = devm_gpiod_get_optional(dev, "us-euro", GPIOD_OUT_LOW);
2930 if (IS_ERR(wcd937x->us_euro_gpio))
2931 return dev_err_probe(dev, PTR_ERR(wcd937x->us_euro_gpio),
2932 "us-euro swap Control GPIO not found\n");
2934 cfg = &wcd937x->mbhc_cfg;
2935 cfg->swap_gnd_mic = wcd937x_swap_gnd_mic;
2944 cfg->mbhc_micbias = MIC_BIAS_2;
2945 cfg->anc_micbias = MIC_BIAS_2;
2946 cfg->v_hs_max = WCD_MBHC_HS_V_MAX;
2947 cfg->num_btn = WCD937X_MBHC_MAX_BUTTONS;
2948 cfg->micb_mv = wcd937x->micb2_mv;
2949 cfg->linein_th = 5000;
2950 cfg->hs_thr = 1700;
2951 cfg->hph_thr = 50;
2953 wcd_dt_parse_mbhc_data(dev, &wcd937x->mbhc_cfg);
2977 struct device *dev = &pdev->dev;
2979 component_master_del(&pdev->dev, &wcd937x_comp_ops);
2988 { .compatible = "qcom,wcd9370-codec" },
2989 { .compatible = "qcom,wcd9375-codec" },