Lines Matching defs:wcd939x

33 #include "wcd939x.h"
294 .name = "wcd939x",
507 struct wcd939x_priv *wcd939x = snd_soc_component_get_drvdata(component);
521 if (wcd939x->comp1_enable) {
527 if (!wcd939x->comp2_enable ||
561 struct wcd939x_priv *wcd939x = snd_soc_component_get_drvdata(component);
578 if (wcd939x->comp2_enable) {
584 if (!wcd939x->comp1_enable ||
617 struct wcd939x_priv *wcd939x = snd_soc_component_get_drvdata(component);
629 wcd_clsh_ctrl_set_state(wcd939x->clsh_info, WCD_CLSH_EVENT_PRE_DAC,
649 struct wcd939x_priv *wcd939x = snd_soc_component_get_drvdata(component);
650 int hph_mode = wcd939x->hph_mode;
654 if (wcd939x->ldoh)
658 wcd_clsh_ctrl_set_state(wcd939x->clsh_info, WCD_CLSH_EVENT_PRE_DAC,
660 wcd_clsh_set_hph_mode(wcd939x->clsh_info, CLS_H_HIFI);
679 set_bit(HPH_PA_DELAY, &wcd939x->status_mask);
689 if (test_bit(HPH_PA_DELAY, &wcd939x->status_mask)) {
690 if (!wcd939x->comp2_enable)
701 clear_bit(HPH_PA_DELAY, &wcd939x->status_mask);
711 enable_irq(wcd939x->hphr_pdm_wd_int);
714 disable_irq_nosync(wcd939x->hphr_pdm_wd_int);
720 if (!wcd939x->comp2_enable)
728 wcd_mbhc_event_notify(wcd939x->wcd_mbhc,
730 set_bit(HPH_PA_DELAY, &wcd939x->status_mask);
738 if (test_bit(HPH_PA_DELAY, &wcd939x->status_mask)) {
739 if (!wcd939x->comp2_enable)
743 clear_bit(HPH_PA_DELAY, &wcd939x->status_mask);
745 wcd_mbhc_event_notify(wcd939x->wcd_mbhc,
753 wcd_clsh_ctrl_set_state(wcd939x->clsh_info, WCD_CLSH_EVENT_POST_PA,
755 if (wcd939x->ldoh)
769 struct wcd939x_priv *wcd939x = snd_soc_component_get_drvdata(component);
770 int hph_mode = wcd939x->hph_mode;
777 if (wcd939x->ldoh)
780 wcd_clsh_ctrl_set_state(wcd939x->clsh_info, WCD_CLSH_EVENT_PRE_DAC,
782 wcd_clsh_set_hph_mode(wcd939x->clsh_info, CLS_H_HIFI);
802 set_bit(HPH_PA_DELAY, &wcd939x->status_mask);
812 if (test_bit(HPH_PA_DELAY, &wcd939x->status_mask)) {
813 if (!wcd939x->comp1_enable)
823 clear_bit(HPH_PA_DELAY, &wcd939x->status_mask);
832 enable_irq(wcd939x->hphl_pdm_wd_int);
835 disable_irq_nosync(wcd939x->hphl_pdm_wd_int);
841 if (!wcd939x->comp1_enable)
849 wcd_mbhc_event_notify(wcd939x->wcd_mbhc, WCD_EVENT_PRE_HPHL_PA_OFF);
850 set_bit(HPH_PA_DELAY, &wcd939x->status_mask);
858 if (test_bit(HPH_PA_DELAY, &wcd939x->status_mask)) {
859 if (!wcd939x->comp1_enable)
863 clear_bit(HPH_PA_DELAY, &wcd939x->status_mask);
865 wcd_mbhc_event_notify(wcd939x->wcd_mbhc,
871 wcd_clsh_ctrl_set_state(wcd939x->clsh_info, WCD_CLSH_EVENT_POST_PA,
873 if (wcd939x->ldoh)
886 struct wcd939x_priv *wcd939x = snd_soc_component_get_drvdata(component);
902 enable_irq(wcd939x->ear_pdm_wd_int);
905 disable_irq_nosync(wcd939x->ear_pdm_wd_int);
915 wcd_clsh_ctrl_set_state(wcd939x->clsh_info, WCD_CLSH_EVENT_POST_PA,
1014 struct wcd939x_priv *wcd939x = snd_soc_component_get_drvdata(component);
1018 bank = sdw_slave_get_current_bank(wcd939x->sdw_priv[AIF1_CAP]->sdev);
1025 if (test_bit(WCD_ADC1, &wcd939x->status_mask))
1026 mode |= tx_mode_bit[wcd939x->tx_mode[WCD_ADC1]];
1027 if (test_bit(WCD_ADC2, &wcd939x->status_mask))
1028 mode |= tx_mode_bit[wcd939x->tx_mode[WCD_ADC2]];
1029 if (test_bit(WCD_ADC3, &wcd939x->status_mask))
1030 mode |= tx_mode_bit[wcd939x->tx_mode[WCD_ADC3]];
1031 if (test_bit(WCD_ADC4, &wcd939x->status_mask))
1032 mode |= tx_mode_bit[wcd939x->tx_mode[WCD_ADC4]];
1091 struct wcd939x_priv *wcd939x = snd_soc_component_get_drvdata(component);
1100 set_bit(w->shift, &wcd939x->status_mask);
1109 clear_bit(w->shift, &wcd939x->status_mask);
1149 struct wcd939x_priv *wcd939x = snd_soc_component_get_drvdata(component);
1160 mode = wcd939x_get_adc_mode(wcd939x->tx_mode[w->shift]);
1267 struct wcd939x_priv *wcd939x = snd_soc_component_get_drvdata(component);
1292 wcd939x->pullup_ref[micb_index]++;
1293 if (wcd939x->pullup_ref[micb_index] == 1 &&
1294 wcd939x->micb_ref[micb_index] == 0)
1300 if (wcd939x->pullup_ref[micb_index] > 0)
1301 wcd939x->pullup_ref[micb_index]--;
1302 if (wcd939x->pullup_ref[micb_index] == 0 &&
1303 wcd939x->micb_ref[micb_index] == 0)
1309 wcd939x->micb_ref[micb_index]++;
1310 if (wcd939x->micb_ref[micb_index] == 1) {
1347 wcd_mbhc_event_notify(wcd939x->wcd_mbhc,
1351 wcd_mbhc_event_notify(wcd939x->wcd_mbhc,
1355 if (wcd939x->micb_ref[micb_index] > 0)
1356 wcd939x->micb_ref[micb_index]--;
1358 if (wcd939x->micb_ref[micb_index] == 0 &&
1359 wcd939x->pullup_ref[micb_index] > 0)
1363 else if (wcd939x->micb_ref[micb_index] == 0 &&
1364 wcd939x->pullup_ref[micb_index] == 0) {
1366 wcd_mbhc_event_notify(wcd939x->wcd_mbhc,
1373 wcd_mbhc_event_notify(wcd939x->wcd_mbhc,
1377 wcd_mbhc_event_notify(wcd939x->wcd_mbhc,
1437 struct wcd939x_priv *wcd939x = snd_soc_component_get_drvdata(component);
1441 ucontrol->value.enumerated.item[0] = wcd939x->tx_mode[path];
1450 struct wcd939x_priv *wcd939x = snd_soc_component_get_drvdata(component);
1454 if (wcd939x->tx_mode[path] == ucontrol->value.enumerated.item[0])
1457 wcd939x->tx_mode[path] = ucontrol->value.enumerated.item[0];
1468 struct wcd939x_priv *wcd939x = snd_soc_component_get_drvdata(component);
1470 ucontrol->value.integer.value[0] = wcd939x->hph_mode;
1479 struct wcd939x_priv *wcd939x = snd_soc_component_get_drvdata(component);
1484 if (mode_val == wcd939x->hph_mode)
1487 if (wcd939x->variant == CHIPID_WCD9390) {
1496 wcd939x->hph_mode = mode_val;
1510 wcd939x->hph_mode = mode_val;
1524 struct wcd939x_priv *wcd939x = snd_soc_component_get_drvdata(component);
1527 ucontrol->value.integer.value[0] = wcd939x->comp2_enable ? 1 : 0;
1529 ucontrol->value.integer.value[0] = wcd939x->comp1_enable ? 1 : 0;
1539 struct wcd939x_priv *wcd939x = snd_soc_component_get_drvdata(component);
1540 struct wcd939x_sdw_priv *wcd = wcd939x->sdw_priv[AIF1_PB];
1545 wcd939x->comp2_enable = value;
1547 wcd939x->comp1_enable = value;
1561 struct wcd939x_priv *wcd939x = snd_soc_component_get_drvdata(component);
1563 ucontrol->value.integer.value[0] = wcd939x->ldoh ? 1 : 0;
1572 struct wcd939x_priv *wcd939x = snd_soc_component_get_drvdata(component);
1574 if (wcd939x->ldoh == !!ucontrol->value.integer.value[0])
1577 wcd939x->ldoh = !!ucontrol->value.integer.value[0];
1793 struct wcd939x_priv *wcd939x = snd_soc_component_get_drvdata(comp);
1794 struct wcd939x_sdw_priv *wcd = wcd939x->sdw_priv[mixer->shift];
1820 struct wcd939x_priv *wcd939x = snd_soc_component_get_drvdata(comp);
1821 struct wcd939x_sdw_priv *wcd = wcd939x->sdw_priv[mixer->shift];
1923 struct wcd939x_priv *wcd939x = snd_soc_component_get_drvdata(component);
1944 mutex_lock(&wcd939x->micb_lock);
1994 mutex_unlock(&wcd939x->micb_lock);
2001 struct wcd939x_priv *wcd939x = snd_soc_component_get_drvdata(component);
2011 if (wcd939x->common.micb_mv[1] >= WCD_MBHC_THR_HS_MICB_MV)
2014 micb_mv = req_en ? WCD_MBHC_THR_HS_MICB_MV : wcd939x->common.micb_mv[1];
2167 struct wcd939x_priv *wcd939x = dev_get_drvdata(component->dev);
2187 if (wcd939x->mbhc_cfg.hphl_swh)
2246 wcd_mbhc_set_hph_type(wcd939x->wcd_mbhc, WCD_MBHC_HPH_MONO);
2270 wcd_mbhc_set_hph_type(wcd939x->wcd_mbhc, WCD_MBHC_HPH_STEREO);
2274 wcd_mbhc_set_hph_type(wcd939x->wcd_mbhc, WCD_MBHC_HPH_MONO);
2293 if (wcd939x->mbhc_cfg.hphl_swh)
2334 struct wcd939x_priv *wcd939x = snd_soc_component_get_drvdata(component);
2336 if (wcd939x->mbhc_cfg.moist_rref == R_OFF || wcd939x->typec_analog_mux) {
2343 if (!wcd939x->mbhc_cfg.hphl_swh) {
2352 WCD939X_CTL_2_M_RTH_CTL, wcd939x->mbhc_cfg.moist_rref);
2357 struct wcd939x_priv *wcd939x = snd_soc_component_get_drvdata(component);
2362 wcd939x->mbhc_cfg.moist_rref);
2370 struct wcd939x_priv *wcd939x = snd_soc_component_get_drvdata(component);
2373 if (wcd939x->mbhc_cfg.moist_rref == R_OFF || wcd939x->typec_analog_mux) {
2380 if (!wcd939x->mbhc_cfg.hphl_swh) {
2436 struct wcd939x_priv *wcd939x = snd_soc_component_get_drvdata(component);
2438 ucontrol->value.integer.value[0] = wcd_mbhc_get_hph_type(wcd939x->wcd_mbhc);
2448 struct wcd939x_priv *wcd939x = snd_soc_component_get_drvdata(component);
2452 wcd_mbhc_get_impedance(wcd939x->wcd_mbhc, &zl, &zr);
2473 struct wcd939x_priv *wcd939x = snd_soc_component_get_drvdata(component);
2474 struct wcd_mbhc_intr *intr_ids = &wcd939x->intr_ids;
2476 intr_ids->mbhc_sw_intr = regmap_irq_get_virq(wcd939x->irq_chip,
2478 intr_ids->mbhc_btn_press_intr = regmap_irq_get_virq(wcd939x->irq_chip,
2480 intr_ids->mbhc_btn_release_intr = regmap_irq_get_virq(wcd939x->irq_chip,
2482 intr_ids->mbhc_hs_ins_intr = regmap_irq_get_virq(wcd939x->irq_chip,
2484 intr_ids->mbhc_hs_rem_intr = regmap_irq_get_virq(wcd939x->irq_chip,
2486 intr_ids->hph_left_ocp = regmap_irq_get_virq(wcd939x->irq_chip,
2488 intr_ids->hph_right_ocp = regmap_irq_get_virq(wcd939x->irq_chip,
2491 wcd939x->wcd_mbhc = wcd_mbhc_init(component, &mbhc_cb, intr_ids, wcd_mbhc_fields, true);
2492 if (IS_ERR(wcd939x->wcd_mbhc))
2493 return PTR_ERR(wcd939x->wcd_mbhc);
2505 struct wcd939x_priv *wcd939x = snd_soc_component_get_drvdata(component);
2507 wcd_mbhc_deinit(wcd939x->wcd_mbhc);
2885 static void wcd939x_set_micbias_data(struct device *dev, struct wcd939x_priv *wcd939x)
2887 regmap_update_bits(wcd939x->regmap, WCD939X_ANA_MICB1,
2888 WCD939X_MICB_VOUT_CTL, wcd939x->common.micb_vout[0]);
2889 regmap_update_bits(wcd939x->regmap, WCD939X_ANA_MICB2,
2890 WCD939X_MICB_VOUT_CTL, wcd939x->common.micb_vout[1]);
2891 regmap_update_bits(wcd939x->regmap, WCD939X_ANA_MICB3,
2892 WCD939X_MICB_VOUT_CTL, wcd939x->common.micb_vout[2]);
2893 regmap_update_bits(wcd939x->regmap, WCD939X_ANA_MICB4,
2894 WCD939X_MICB_VOUT_CTL, wcd939x->common.micb_vout[3]);
2970 struct wcd939x_priv *wcd939x = snd_soc_component_get_drvdata(component);
2971 struct sdw_slave *tx_sdw_dev = wcd939x->tx_sdw_dev;
2983 snd_soc_component_init_regmap(component, wcd939x->regmap);
2989 wcd939x->variant = snd_soc_component_read_field(component,
2993 wcd939x->clsh_info = wcd_clsh_ctrl_alloc(component, WCD939X);
2994 if (IS_ERR(wcd939x->clsh_info)) {
2996 return PTR_ERR(wcd939x->clsh_info);
3003 regmap_write(wcd939x->regmap,
3009 wcd939x->hphr_pdm_wd_int = regmap_irq_get_virq(wcd939x->irq_chip,
3011 wcd939x->hphl_pdm_wd_int = regmap_irq_get_virq(wcd939x->irq_chip,
3013 wcd939x->ear_pdm_wd_int = regmap_irq_get_virq(wcd939x->irq_chip,
3016 ret = request_threaded_irq(wcd939x->hphr_pdm_wd_int, NULL, wcd939x_wd_handle_irq,
3018 "HPHR PDM WD INT", wcd939x);
3024 ret = request_threaded_irq(wcd939x->hphl_pdm_wd_int, NULL, wcd939x_wd_handle_irq,
3026 "HPHL PDM WD INT", wcd939x);
3032 ret = request_threaded_irq(wcd939x->ear_pdm_wd_int, NULL, wcd939x_wd_handle_irq,
3034 "AUX PDM WD INT", wcd939x);
3041 disable_irq_nosync(wcd939x->hphr_pdm_wd_int);
3042 disable_irq_nosync(wcd939x->hphl_pdm_wd_int);
3043 disable_irq_nosync(wcd939x->ear_pdm_wd_int);
3045 switch (wcd939x->variant) {
3052 __func__, wcd939x->variant);
3062 __func__, wcd939x->variant);
3079 free_irq(wcd939x->ear_pdm_wd_int, wcd939x);
3081 free_irq(wcd939x->hphl_pdm_wd_int, wcd939x);
3083 free_irq(wcd939x->hphr_pdm_wd_int, wcd939x);
3085 wcd_clsh_ctrl_free(wcd939x->clsh_info);
3092 struct wcd939x_priv *wcd939x = snd_soc_component_get_drvdata(component);
3096 free_irq(wcd939x->ear_pdm_wd_int, wcd939x);
3097 free_irq(wcd939x->hphl_pdm_wd_int, wcd939x);
3098 free_irq(wcd939x->hphr_pdm_wd_int, wcd939x);
3100 wcd_clsh_ctrl_free(wcd939x->clsh_info);
3135 struct wcd939x_priv *wcd939x = typec_switch_get_drvdata(sw);
3137 wcd939x->typec_orientation = orientation;
3145 struct wcd939x_priv *wcd939x = typec_mux_get_drvdata(mux);
3146 unsigned int previous_mode = wcd939x->typec_mode;
3148 if (!wcd939x->wcd_mbhc)
3151 if (wcd939x->typec_mode != state->mode) {
3152 wcd939x->typec_mode = state->mode;
3154 if (wcd939x->typec_mode == TYPEC_MODE_AUDIO)
3155 return wcd_mbhc_typec_report_plug(wcd939x->wcd_mbhc);
3157 return wcd_mbhc_typec_report_unplug(wcd939x->wcd_mbhc);
3167 struct wcd939x_priv *wcd939x = snd_soc_component_get_drvdata(component);
3169 if (!wcd939x->typec_analog_mux || !wcd939x->typec_switch)
3173 typec_switch_set(wcd939x->typec_switch,
3174 wcd939x->typec_orientation == TYPEC_ORIENTATION_REVERSE ?
3181 static int wcd939x_populate_dt_data(struct wcd939x_priv *wcd939x, struct device *dev)
3183 struct wcd_mbhc_config *cfg = &wcd939x->mbhc_cfg;
3189 wcd939x->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_LOW);
3190 if (IS_ERR(wcd939x->reset_gpio))
3191 return dev_err_probe(dev, PTR_ERR(wcd939x->reset_gpio),
3199 ret = wcd_dt_parse_micbias_info(&wcd939x->common);
3207 cfg->micb_mv = wcd939x->common.micb_mv[1];
3221 wcd939x->typec_analog_mux = true;
3230 static int wcd939x_reset(struct wcd939x_priv *wcd939x)
3232 gpiod_set_value(wcd939x->reset_gpio, 1);
3235 gpiod_set_value(wcd939x->reset_gpio, 0);
3246 struct wcd939x_priv *wcd939x = dev_get_drvdata(dai->dev);
3247 struct wcd939x_sdw_priv *wcd = wcd939x->sdw_priv[dai->id];
3255 struct wcd939x_priv *wcd939x = dev_get_drvdata(dai->dev);
3256 struct wcd939x_sdw_priv *wcd = wcd939x->sdw_priv[dai->id];
3264 struct wcd939x_priv *wcd939x = dev_get_drvdata(dai->dev);
3265 struct wcd939x_sdw_priv *wcd = wcd939x->sdw_priv[dai->id];
3278 .name = "wcd939x-sdw-rx",
3291 .name = "wcd939x-sdw-tx",
3307 struct wcd939x_priv *wcd939x = dev_get_drvdata(dev);
3317 if (wcd939x->typec_analog_mux) {
3318 wcd939x->typec_switch = fwnode_typec_switch_get(dev->fwnode);
3319 if (IS_ERR(wcd939x->typec_switch))
3320 return dev_err_probe(dev, PTR_ERR(wcd939x->typec_switch),
3325 ret = component_bind_all(dev, wcd939x);
3332 wcd939x->rxdev = of_sdw_find_device_by_node(wcd939x->rxnode);
3333 if (!wcd939x->rxdev) {
3338 wcd939x->sdw_priv[AIF1_PB] = dev_get_drvdata(wcd939x->rxdev);
3339 wcd939x->sdw_priv[AIF1_PB]->wcd939x = wcd939x;
3341 wcd939x->txdev = of_sdw_find_device_by_node(wcd939x->txnode);
3342 if (!wcd939x->txdev) {
3347 wcd939x->sdw_priv[AIF1_CAP] = dev_get_drvdata(wcd939x->txdev);
3348 wcd939x->sdw_priv[AIF1_CAP]->wcd939x = wcd939x;
3349 wcd939x->tx_sdw_dev = dev_to_sdw_dev(wcd939x->txdev);
3355 if (!device_link_add(wcd939x->rxdev, wcd939x->txdev, DL_FLAG_STATELESS |
3362 if (!device_link_add(dev, wcd939x->txdev, DL_FLAG_STATELESS |
3369 if (!device_link_add(dev, wcd939x->rxdev, DL_FLAG_STATELESS |
3377 wcd939x->regmap = wcd939x->sdw_priv[AIF1_CAP]->regmap;
3378 if (!wcd939x->regmap) {
3384 ret = wcd939x_irq_init(wcd939x, dev);
3390 wcd939x->sdw_priv[AIF1_PB]->slave_irq = wcd939x->virq;
3391 wcd939x->sdw_priv[AIF1_CAP]->slave_irq = wcd939x->virq;
3393 wcd939x_set_micbias_data(dev, wcd939x);
3396 regmap_read(wcd939x->regmap, WCD939X_DIGITAL_CHIP_ID1, &id1);
3397 regmap_read(wcd939x->regmap, WCD939X_EAR_STATUS_REG_1, &status1);
3404 dev_dbg(dev, "wcd939x version: %s\n", version_to_str(version));
3417 device_link_remove(dev, wcd939x->rxdev);
3419 device_link_remove(dev, wcd939x->txdev);
3421 device_link_remove(wcd939x->rxdev, wcd939x->txdev);
3423 put_device(wcd939x->txdev);
3425 put_device(wcd939x->rxdev);
3427 component_unbind_all(dev, wcd939x);
3430 if (wcd939x->typec_analog_mux)
3431 typec_switch_put(wcd939x->typec_switch);
3439 struct wcd939x_priv *wcd939x = dev_get_drvdata(dev);
3442 device_link_remove(dev, wcd939x->txdev);
3443 device_link_remove(dev, wcd939x->rxdev);
3444 device_link_remove(wcd939x->rxdev, wcd939x->txdev);
3445 put_device(wcd939x->txdev);
3446 put_device(wcd939x->rxdev);
3447 component_unbind_all(dev, wcd939x);
3469 static int wcd939x_add_typec(struct wcd939x_priv *wcd939x, struct device *dev)
3476 .drvdata = wcd939x,
3481 .drvdata = wcd939x,
3490 if (!wcd939x->typec_analog_mux)
3517 static int wcd939x_add_slave_components(struct wcd939x_priv *wcd939x,
3523 wcd939x->rxnode = of_parse_phandle(np, "qcom,rx-device", 0);
3524 if (!wcd939x->rxnode) {
3529 of_node_get(wcd939x->rxnode);
3531 component_compare_of, wcd939x->rxnode);
3533 wcd939x->txnode = of_parse_phandle(np, "qcom,tx-device", 0);
3534 if (!wcd939x->txnode) {
3538 of_node_get(wcd939x->txnode);
3540 component_compare_of, wcd939x->txnode);
3547 struct wcd939x_priv *wcd939x = NULL;
3551 wcd939x = devm_kzalloc(dev, sizeof(struct wcd939x_priv),
3553 if (!wcd939x)
3556 dev_set_drvdata(dev, wcd939x);
3557 mutex_init(&wcd939x->micb_lock);
3558 wcd939x->common.dev = dev;
3559 wcd939x->common.max_bias = 4;
3561 ret = wcd939x_populate_dt_data(wcd939x, dev);
3567 ret = wcd939x_add_typec(wcd939x, dev);
3571 ret = wcd939x_add_slave_components(wcd939x, dev, &match);
3575 wcd939x_reset(wcd939x);