Lines Matching full:wcd938x
27 #include "wcd938x.h"
275 .name = "wcd938x",
342 static int wcd938x_io_init(struct wcd938x_priv *wcd938x)
344 struct regmap *rm = wcd938x->regmap;
467 struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component);
485 if (wcd938x->comp1_enable) {
490 if (!wcd938x->comp2_enable || (snd_soc_component_read(component,
521 struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component);
539 if (wcd938x->comp2_enable) {
544 if (!wcd938x->comp1_enable ||
575 struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component);
579 wcd938x->ear_rx_path =
582 if (wcd938x->ear_rx_path & EAR_RX_PATH_AUX) {
602 if (wcd938x->comp1_enable)
609 if (wcd938x->flyback_cur_det_disable == 0)
612 wcd938x->flyback_cur_det_disable++;
613 wcd_clsh_ctrl_set_state(wcd938x->clsh_info,
616 wcd938x->hph_mode);
619 if (wcd938x->ear_rx_path & EAR_RX_PATH_AUX) {
633 if (wcd938x->comp1_enable)
654 struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component);
667 if (wcd938x->flyback_cur_det_disable == 0)
670 wcd938x->flyback_cur_det_disable++;
671 wcd_clsh_ctrl_set_state(wcd938x->clsh_info,
674 wcd938x->hph_mode);
690 struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component);
691 int hph_mode = wcd938x->hph_mode;
695 if (wcd938x->ldoh)
698 wcd_clsh_ctrl_set_state(wcd938x->clsh_info, WCD_CLSH_EVENT_PRE_DAC,
700 wcd_clsh_set_hph_mode(wcd938x->clsh_info, CLS_H_HIFI);
710 wcd_clsh_set_hph_mode(wcd938x->clsh_info, hph_mode);
713 set_bit(HPH_PA_DELAY, &wcd938x->status_mask);
724 if (test_bit(HPH_PA_DELAY, &wcd938x->status_mask)) {
725 if (!wcd938x->comp2_enable)
735 clear_bit(HPH_PA_DELAY, &wcd938x->status_mask);
744 enable_irq(wcd938x->hphr_pdm_wd_int);
747 disable_irq_nosync(wcd938x->hphr_pdm_wd_int);
753 if (!wcd938x->comp2_enable)
759 wcd_mbhc_event_notify(wcd938x->wcd_mbhc,
761 set_bit(HPH_PA_DELAY, &wcd938x->status_mask);
769 if (test_bit(HPH_PA_DELAY, &wcd938x->status_mask)) {
770 if (!wcd938x->comp2_enable)
774 clear_bit(HPH_PA_DELAY, &wcd938x->status_mask);
776 wcd_mbhc_event_notify(wcd938x->wcd_mbhc,
782 wcd_clsh_ctrl_set_state(wcd938x->clsh_info, WCD_CLSH_EVENT_POST_PA,
784 if (wcd938x->ldoh)
797 struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component);
798 int hph_mode = wcd938x->hph_mode;
802 if (wcd938x->ldoh)
805 wcd_clsh_ctrl_set_state(wcd938x->clsh_info, WCD_CLSH_EVENT_PRE_DAC,
807 wcd_clsh_set_hph_mode(wcd938x->clsh_info, CLS_H_HIFI);
816 wcd_clsh_set_hph_mode(wcd938x->clsh_info, hph_mode);
819 set_bit(HPH_PA_DELAY, &wcd938x->status_mask);
830 if (test_bit(HPH_PA_DELAY, &wcd938x->status_mask)) {
831 if (!wcd938x->comp1_enable)
840 clear_bit(HPH_PA_DELAY, &wcd938x->status_mask);
850 enable_irq(wcd938x->hphl_pdm_wd_int);
853 disable_irq_nosync(wcd938x->hphl_pdm_wd_int);
859 if (!wcd938x->comp1_enable)
865 wcd_mbhc_event_notify(wcd938x->wcd_mbhc, WCD_EVENT_PRE_HPHL_PA_OFF);
866 set_bit(HPH_PA_DELAY, &wcd938x->status_mask);
874 if (test_bit(HPH_PA_DELAY, &wcd938x->status_mask)) {
875 if (!wcd938x->comp1_enable)
879 clear_bit(HPH_PA_DELAY, &wcd938x->status_mask);
881 wcd_mbhc_event_notify(wcd938x->wcd_mbhc,
887 wcd_clsh_ctrl_set_state(wcd938x->clsh_info, WCD_CLSH_EVENT_POST_PA,
889 if (wcd938x->ldoh)
902 struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component);
903 int hph_mode = wcd938x->hph_mode;
918 enable_irq(wcd938x->aux_pdm_wd_int);
921 disable_irq_nosync(wcd938x->aux_pdm_wd_int);
928 wcd_clsh_ctrl_set_state(wcd938x->clsh_info,
933 wcd938x->flyback_cur_det_disable--;
934 if (wcd938x->flyback_cur_det_disable == 0)
946 struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component);
947 int hph_mode = wcd938x->hph_mode;
955 wcd938x->ear_rx_path = snd_soc_component_read(component,
957 if (wcd938x->ear_rx_path & EAR_RX_PATH_AUX)
964 if (!wcd938x->comp1_enable)
978 if (wcd938x->ear_rx_path & EAR_RX_PATH_AUX)
979 enable_irq(wcd938x->aux_pdm_wd_int);
981 enable_irq(wcd938x->hphl_pdm_wd_int);
984 if (wcd938x->ear_rx_path & EAR_RX_PATH_AUX)
985 disable_irq_nosync(wcd938x->aux_pdm_wd_int);
987 disable_irq_nosync(wcd938x->hphl_pdm_wd_int);
990 if (!wcd938x->comp1_enable)
995 if (wcd938x->ear_rx_path & EAR_RX_PATH_AUX)
1002 wcd_clsh_ctrl_set_state(wcd938x->clsh_info, WCD_CLSH_EVENT_POST_PA,
1005 wcd938x->flyback_cur_det_disable--;
1006 if (wcd938x->flyback_cur_det_disable == 0)
1091 struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component);
1095 bank = sdw_slave_get_current_bank(wcd938x->sdw_priv[AIF1_CAP]->sdev);
1102 if (test_bit(WCD_ADC1, &wcd938x->status_mask))
1103 mode |= tx_mode_bit[wcd938x->tx_mode[WCD_ADC1]];
1104 if (test_bit(WCD_ADC2, &wcd938x->status_mask))
1105 mode |= tx_mode_bit[wcd938x->tx_mode[WCD_ADC2]];
1106 if (test_bit(WCD_ADC3, &wcd938x->status_mask))
1107 mode |= tx_mode_bit[wcd938x->tx_mode[WCD_ADC3]];
1108 if (test_bit(WCD_ADC4, &wcd938x->status_mask))
1109 mode |= tx_mode_bit[wcd938x->tx_mode[WCD_ADC4]];
1174 struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component);
1184 set_bit(w->shift, &wcd938x->status_mask);
1189 clear_bit(w->shift, &wcd938x->status_mask);
1229 struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component);
1241 mode = wcd938x_get_adc_mode(wcd938x->tx_mode[w->shift]);
1334 struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component);
1359 wcd938x->pullup_ref[micb_index]++;
1360 if ((wcd938x->pullup_ref[micb_index] == 1) &&
1361 (wcd938x->micb_ref[micb_index] == 0))
1367 if (wcd938x->pullup_ref[micb_index] > 0)
1368 wcd938x->pullup_ref[micb_index]--;
1370 if ((wcd938x->pullup_ref[micb_index] == 0) &&
1371 (wcd938x->micb_ref[micb_index] == 0))
1376 wcd938x->micb_ref[micb_index]++;
1377 if (wcd938x->micb_ref[micb_index] == 1) {
1392 wcd_mbhc_event_notify(wcd938x->wcd_mbhc,
1396 wcd_mbhc_event_notify(wcd938x->wcd_mbhc,
1402 if (wcd938x->micb_ref[micb_index] > 0)
1403 wcd938x->micb_ref[micb_index]--;
1405 if ((wcd938x->micb_ref[micb_index] == 0) &&
1406 (wcd938x->pullup_ref[micb_index] > 0))
1410 else if ((wcd938x->micb_ref[micb_index] == 0) &&
1411 (wcd938x->pullup_ref[micb_index] == 0)) {
1413 wcd_mbhc_event_notify(wcd938x->wcd_mbhc,
1419 wcd_mbhc_event_notify(wcd938x->wcd_mbhc,
1423 wcd_mbhc_event_notify(wcd938x->wcd_mbhc,
1483 struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component);
1487 ucontrol->value.enumerated.item[0] = wcd938x->tx_mode[path];
1496 struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component);
1500 if (wcd938x->tx_mode[path] == ucontrol->value.enumerated.item[0])
1503 wcd938x->tx_mode[path] = ucontrol->value.enumerated.item[0];
1512 struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component);
1514 ucontrol->value.enumerated.item[0] = wcd938x->hph_mode;
1523 struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component);
1525 if (wcd938x->hph_mode == ucontrol->value.enumerated.item[0])
1528 wcd938x->hph_mode = ucontrol->value.enumerated.item[0];
1537 struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component);
1539 if (wcd938x->comp1_enable) {
1556 struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component);
1564 ucontrol->value.integer.value[0] = wcd938x->comp2_enable;
1566 ucontrol->value.integer.value[0] = wcd938x->comp1_enable;
1575 struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component);
1585 wcd = wcd938x->sdw_priv[AIF1_PB];
1588 wcd938x->comp2_enable = value;
1590 wcd938x->comp1_enable = value;
1606 struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component);
1608 ucontrol->value.integer.value[0] = wcd938x->ldoh;
1617 struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component);
1619 if (wcd938x->ldoh == ucontrol->value.integer.value[0])
1622 wcd938x->ldoh = ucontrol->value.integer.value[0];
1847 struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(comp);
1854 wcd = wcd938x->sdw_priv[dai_id];
1866 struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(comp);
1875 wcd = wcd938x->sdw_priv[dai_id];
1978 struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component);
1997 mutex_lock(&wcd938x->micb_lock);
2042 mutex_unlock(&wcd938x->micb_lock);
2049 struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component);
2059 if (wcd938x->common.micb_mv[2] >= WCD_MBHC_THR_HS_MICB_MV)
2062 micb_mv = req_en ? WCD_MBHC_THR_HS_MICB_MV : wcd938x->common.micb_mv[2];
2071 struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component);
2081 regmap_update_bits(wcd938x->regmap, WCD938X_ANA_MBHC_ZDET, 0x20, 0x20);
2083 regmap_read(wcd938x->regmap, WCD938X_ANA_MBHC_RESULT_2, &val);
2088 regmap_read(wcd938x->regmap, WCD938X_ANA_MBHC_RESULT_1, &val1);
2090 regmap_update_bits(wcd938x->regmap, WCD938X_ANA_MBHC_ZDET, 0x20, 0x00);
2114 regmap_read(wcd938x->regmap,
2116 regmap_read(wcd938x->regmap,
2131 struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component);
2150 regmap_update_bits(wcd938x->regmap,
2155 regmap_update_bits(wcd938x->regmap,
2164 regmap_update_bits(wcd938x->regmap,
2169 regmap_update_bits(wcd938x->regmap,
2198 struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component);
2226 regmap_update_bits(wcd938x->regmap,
2231 if (wcd938x->mbhc_cfg.hphl_swh)
2232 regmap_update_bits(wcd938x->regmap,
2236 regmap_update_bits(wcd938x->regmap,
2242 regmap_update_bits(wcd938x->regmap,
2329 wcd_mbhc_set_hph_type(wcd938x->wcd_mbhc, WCD_MBHC_HPH_MONO);
2353 wcd_mbhc_set_hph_type(wcd938x->wcd_mbhc, WCD_MBHC_HPH_STEREO);
2357 wcd_mbhc_set_hph_type(wcd938x->wcd_mbhc, WCD_MBHC_HPH_MONO);
2361 regmap_update_bits(wcd938x->regmap,
2368 regmap_update_bits(wcd938x->regmap,
2372 if (wcd938x->mbhc_cfg.hphl_swh)
2373 regmap_update_bits(wcd938x->regmap,
2379 regmap_update_bits(wcd938x->regmap,
2410 struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component);
2412 if (wcd938x->mbhc_cfg.moist_rref == R_OFF) {
2419 if (!wcd938x->mbhc_cfg.hphl_swh) {
2428 WCD938X_M_RTH_CTL_MASK, wcd938x->mbhc_cfg.moist_rref);
2433 struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component);
2437 WCD938X_M_RTH_CTL_MASK, wcd938x->mbhc_cfg.moist_rref);
2445 struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component);
2448 if (wcd938x->mbhc_cfg.moist_rref == R_OFF) {
2455 if (!wcd938x->mbhc_cfg.hphl_swh) {
2510 struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component);
2512 ucontrol->value.integer.value[0] = wcd_mbhc_get_hph_type(wcd938x->wcd_mbhc);
2525 struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component);
2529 wcd_mbhc_get_impedance(wcd938x->wcd_mbhc, &zl, &zr);
2550 struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component);
2551 struct wcd_mbhc_intr *intr_ids = &wcd938x->intr_ids;
2553 intr_ids->mbhc_sw_intr = regmap_irq_get_virq(wcd938x->irq_chip,
2555 intr_ids->mbhc_btn_press_intr = regmap_irq_get_virq(wcd938x->irq_chip,
2557 intr_ids->mbhc_btn_release_intr = regmap_irq_get_virq(wcd938x->irq_chip,
2559 intr_ids->mbhc_hs_ins_intr = regmap_irq_get_virq(wcd938x->irq_chip,
2561 intr_ids->mbhc_hs_rem_intr = regmap_irq_get_virq(wcd938x->irq_chip,
2563 intr_ids->hph_left_ocp = regmap_irq_get_virq(wcd938x->irq_chip,
2565 intr_ids->hph_right_ocp = regmap_irq_get_virq(wcd938x->irq_chip,
2568 wcd938x->wcd_mbhc = wcd_mbhc_init(component, &mbhc_cb, intr_ids, wcd_mbhc_fields, true);
2569 if (IS_ERR(wcd938x->wcd_mbhc))
2570 return PTR_ERR(wcd938x->wcd_mbhc);
2582 struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component);
2584 wcd_mbhc_deinit(wcd938x->wcd_mbhc);
2967 static void wcd938x_set_micbias_data(struct device *dev, struct wcd938x_priv *wcd938x)
2969 regmap_update_bits(wcd938x->regmap, WCD938X_ANA_MICB1,
2970 WCD938X_MICB_VOUT_MASK, wcd938x->common.micb_vout[0]);
2971 regmap_update_bits(wcd938x->regmap, WCD938X_ANA_MICB2,
2972 WCD938X_MICB_VOUT_MASK, wcd938x->common.micb_vout[1]);
2973 regmap_update_bits(wcd938x->regmap, WCD938X_ANA_MICB3,
2974 WCD938X_MICB_VOUT_MASK, wcd938x->common.micb_vout[2]);
2975 regmap_update_bits(wcd938x->regmap, WCD938X_ANA_MICB4,
2976 WCD938X_MICB_VOUT_MASK, wcd938x->common.micb_vout[3]);
2985 .name = "WCD938x",
3019 struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component);
3020 struct sdw_slave *tx_sdw_dev = wcd938x->tx_sdw_dev;
3033 snd_soc_component_init_regmap(component, wcd938x->regmap);
3043 wcd938x->clsh_info = wcd_clsh_ctrl_alloc(component, WCD938X);
3044 if (IS_ERR(wcd938x->clsh_info)) {
3046 return PTR_ERR(wcd938x->clsh_info);
3049 wcd938x_io_init(wcd938x);
3052 regmap_write(wcd938x->regmap,
3058 wcd938x->hphr_pdm_wd_int = regmap_irq_get_virq(wcd938x->irq_chip,
3060 wcd938x->hphl_pdm_wd_int = regmap_irq_get_virq(wcd938x->irq_chip,
3062 wcd938x->aux_pdm_wd_int = regmap_irq_get_virq(wcd938x->irq_chip,
3066 ret = request_threaded_irq(wcd938x->hphr_pdm_wd_int, NULL, wcd938x_wd_handle_irq,
3068 "HPHR PDM WD INT", wcd938x);
3074 ret = request_threaded_irq(wcd938x->hphl_pdm_wd_int, NULL, wcd938x_wd_handle_irq,
3076 "HPHL PDM WD INT", wcd938x);
3082 ret = request_threaded_irq(wcd938x->aux_pdm_wd_int, NULL, wcd938x_wd_handle_irq,
3084 "AUX PDM WD INT", wcd938x);
3091 disable_irq_nosync(wcd938x->hphr_pdm_wd_int);
3092 disable_irq_nosync(wcd938x->hphl_pdm_wd_int);
3093 disable_irq_nosync(wcd938x->aux_pdm_wd_int);
3129 free_irq(wcd938x->aux_pdm_wd_int, wcd938x);
3131 free_irq(wcd938x->hphl_pdm_wd_int, wcd938x);
3133 free_irq(wcd938x->hphr_pdm_wd_int, wcd938x);
3135 wcd_clsh_ctrl_free(wcd938x->clsh_info);
3142 struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component);
3146 free_irq(wcd938x->aux_pdm_wd_int, wcd938x);
3147 free_irq(wcd938x->hphl_pdm_wd_int, wcd938x);
3148 free_irq(wcd938x->hphr_pdm_wd_int, wcd938x);
3150 wcd_clsh_ctrl_free(wcd938x->clsh_info);
3182 struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component);
3186 if (wcd938x->us_euro_mux) {
3187 if (wcd938x->mux_setup_done)
3188 mux_control_deselect(wcd938x->us_euro_mux);
3190 ret = mux_control_try_select(wcd938x->us_euro_mux, !wcd938x->mux_state);
3193 wcd938x->mux_setup_done = false;
3196 wcd938x->mux_setup_done = true;
3198 gpiod_set_value(wcd938x->us_euro_gpio, !wcd938x->mux_state);
3201 wcd938x->mux_state = !wcd938x->mux_state;
3207 static int wcd938x_populate_dt_data(struct wcd938x_priv *wcd938x, struct device *dev)
3209 struct wcd_mbhc_config *cfg = &wcd938x->mbhc_cfg;
3212 wcd938x->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_LOW);
3213 if (IS_ERR(wcd938x->reset_gpio))
3214 return dev_err_probe(dev, PTR_ERR(wcd938x->reset_gpio),
3218 wcd938x->us_euro_mux = devm_mux_control_get(dev, NULL);
3219 if (IS_ERR(wcd938x->us_euro_mux)) {
3220 ret = PTR_ERR(wcd938x->us_euro_mux);
3224 ret = mux_control_try_select(wcd938x->us_euro_mux, wcd938x->mux_state);
3229 wcd938x->mux_setup_done = true;
3231 wcd938x->us_euro_gpio = devm_gpiod_get_optional(dev, "us-euro", GPIOD_OUT_LOW);
3232 if (IS_ERR(wcd938x->us_euro_gpio))
3233 return dev_err_probe(dev, PTR_ERR(wcd938x->us_euro_gpio),
3244 ret = wcd_dt_parse_micbias_info(&wcd938x->common);
3252 cfg->micb_mv = wcd938x->common.micb_mv[2];
3262 static int wcd938x_reset(struct wcd938x_priv *wcd938x)
3264 gpiod_set_value(wcd938x->reset_gpio, 1);
3267 gpiod_set_value(wcd938x->reset_gpio, 0);
3278 struct wcd938x_priv *wcd938x = dev_get_drvdata(dai->dev);
3279 struct wcd938x_sdw_priv *wcd = wcd938x->sdw_priv[dai->id];
3287 struct wcd938x_priv *wcd938x = dev_get_drvdata(dai->dev);
3288 struct wcd938x_sdw_priv *wcd = wcd938x->sdw_priv[dai->id];
3296 struct wcd938x_priv *wcd938x = dev_get_drvdata(dai->dev);
3297 struct wcd938x_sdw_priv *wcd = wcd938x->sdw_priv[dai->id];
3311 .name = "wcd938x-sdw-rx",
3324 .name = "wcd938x-sdw-tx",
3340 struct wcd938x_priv *wcd938x = dev_get_drvdata(dev);
3343 ret = component_bind_all(dev, wcd938x);
3350 wcd938x->rxdev = of_sdw_find_device_by_node(wcd938x->rxnode);
3351 if (!wcd938x->rxdev) {
3356 wcd938x->sdw_priv[AIF1_PB] = dev_get_drvdata(wcd938x->rxdev);
3357 wcd938x->sdw_priv[AIF1_PB]->wcd938x = wcd938x;
3359 wcd938x->txdev = of_sdw_find_device_by_node(wcd938x->txnode);
3360 if (!wcd938x->txdev) {
3365 wcd938x->sdw_priv[AIF1_CAP] = dev_get_drvdata(wcd938x->txdev);
3366 wcd938x->sdw_priv[AIF1_CAP]->wcd938x = wcd938x;
3367 wcd938x->tx_sdw_dev = dev_to_sdw_dev(wcd938x->txdev);
3371 if (!device_link_add(wcd938x->rxdev, wcd938x->txdev, DL_FLAG_STATELESS |
3378 if (!device_link_add(dev, wcd938x->txdev, DL_FLAG_STATELESS |
3385 if (!device_link_add(dev, wcd938x->rxdev, DL_FLAG_STATELESS |
3392 wcd938x->regmap = wcd938x->sdw_priv[AIF1_CAP]->regmap;
3393 if (!wcd938x->regmap) {
3399 ret = wcd938x_irq_init(wcd938x, dev);
3405 wcd938x->sdw_priv[AIF1_PB]->slave_irq = wcd938x->virq;
3406 wcd938x->sdw_priv[AIF1_CAP]->slave_irq = wcd938x->virq;
3408 wcd938x_set_micbias_data(dev, wcd938x);
3421 device_link_remove(dev, wcd938x->rxdev);
3423 device_link_remove(dev, wcd938x->txdev);
3425 device_link_remove(wcd938x->rxdev, wcd938x->txdev);
3427 put_device(wcd938x->txdev);
3429 put_device(wcd938x->rxdev);
3431 component_unbind_all(dev, wcd938x);
3438 struct wcd938x_priv *wcd938x = dev_get_drvdata(dev);
3441 device_link_remove(dev, wcd938x->txdev);
3442 device_link_remove(dev, wcd938x->rxdev);
3443 device_link_remove(wcd938x->rxdev, wcd938x->txdev);
3444 put_device(wcd938x->txdev);
3445 put_device(wcd938x->rxdev);
3446 component_unbind_all(dev, wcd938x);
3454 static int wcd938x_add_slave_components(struct wcd938x_priv *wcd938x,
3462 wcd938x->rxnode = of_parse_phandle(np, "qcom,rx-device", 0);
3463 if (!wcd938x->rxnode) {
3468 of_node_get(wcd938x->rxnode);
3470 component_compare_of, wcd938x->rxnode);
3472 wcd938x->txnode = of_parse_phandle(np, "qcom,tx-device", 0);
3473 if (!wcd938x->txnode) {
3477 of_node_get(wcd938x->txnode);
3479 component_compare_of, wcd938x->txnode);
3486 struct wcd938x_priv *wcd938x = NULL;
3490 wcd938x = devm_kzalloc(dev, sizeof(struct wcd938x_priv),
3492 if (!wcd938x)
3495 dev_set_drvdata(dev, wcd938x);
3496 mutex_init(&wcd938x->micb_lock);
3497 wcd938x->common.dev = dev;
3498 wcd938x->common.max_bias = 4;
3500 ret = wcd938x_populate_dt_data(wcd938x, dev);
3504 ret = wcd938x_add_slave_components(wcd938x, dev, &match);
3508 wcd938x_reset(wcd938x);
3527 struct wcd938x_priv *wcd938x = dev_get_drvdata(dev);
3535 if (wcd938x->us_euro_mux && wcd938x->mux_setup_done)
3536 mux_control_deselect(wcd938x->us_euro_mux);
3559 MODULE_DESCRIPTION("WCD938X Codec driver");