From 27110b4fb5d0035faee4f1ecaba71854533933a1 Mon Sep 17 00:00:00 2001 From: Prasad Kumpatla Date: Wed, 27 Dec 2023 16:04:36 +0530 Subject: [PATCH] asoc: add support for both fsa and wcd usb AATC add support for both fsa and wcd usb AATC. Change-Id: I0253faad734a433f5da93c34adfc4f9c2e37fa14 Signed-off-by: Prasad Kumpatla --- asoc/codecs/wcd-mbhc-v2.c | 122 +++++++++++++++++++++---------------- include/asoc/wcd-mbhc-v2.h | 3 +- 2 files changed, 72 insertions(+), 53 deletions(-) diff --git a/asoc/codecs/wcd-mbhc-v2.c b/asoc/codecs/wcd-mbhc-v2.c index 50db72fe52..3e5e95d966 100644 --- a/asoc/codecs/wcd-mbhc-v2.c +++ b/asoc/codecs/wcd-mbhc-v2.c @@ -968,20 +968,28 @@ static void wcd_mbhc_set_hsj_connect(struct wcd_mbhc *mbhc, bool connect) #if IS_ENABLED(CONFIG_QCOM_WCD_USBSS_I2C) struct snd_soc_component *component = mbhc->component; - if (connect) { - if (mbhc->mbhc_cb && mbhc->mbhc_cb->zdet_leakage_resistance) - mbhc->mbhc_cb->zdet_leakage_resistance(mbhc, false); /* enable 1M pull-up */ + if (mbhc->wcd_usbss_aatc_dev_np) { + if (connect) { + if (mbhc->mbhc_cb && mbhc->mbhc_cb->zdet_leakage_resistance) { + /* enable 1M pull-up */ + mbhc->mbhc_cb->zdet_leakage_resistance(mbhc, false); + } - if (of_find_property(component->card->dev->of_node, - "qcom,usbss-hsj-connect-enabled", NULL)) - wcd_usbss_switch_update(WCD_USBSS_HSJ_CONNECT, WCD_USBSS_CABLE_CONNECT); - } else { - if (of_find_property(component->card->dev->of_node, - "qcom,usbss-hsj-connect-enabled", NULL)) - wcd_usbss_switch_update(WCD_USBSS_HSJ_CONNECT, WCD_USBSS_CABLE_DISCONNECT); + if (of_find_property(component->card->dev->of_node, + "qcom,usbss-hsj-connect-enabled", NULL)) + wcd_usbss_switch_update(WCD_USBSS_HSJ_CONNECT, + WCD_USBSS_CABLE_CONNECT); + } else { + if (of_find_property(component->card->dev->of_node, + "qcom,usbss-hsj-connect-enabled", NULL)) + wcd_usbss_switch_update(WCD_USBSS_HSJ_CONNECT, + WCD_USBSS_CABLE_DISCONNECT); - if (mbhc->mbhc_cb && mbhc->mbhc_cb->zdet_leakage_resistance) - mbhc->mbhc_cb->zdet_leakage_resistance(mbhc, true); /* disable 1M pull-up */ + if (mbhc->mbhc_cb && mbhc->mbhc_cb->zdet_leakage_resistance) { + /* disable 1M pull-up */ + mbhc->mbhc_cb->zdet_leakage_resistance(mbhc, true); + } + } } #endif } @@ -1172,15 +1180,13 @@ static irqreturn_t wcd_mbhc_mech_plug_detect_irq(int irq, void *data) pr_err("%s: NULL irq data\n", __func__); return IRQ_NONE; } - /* WCD USB AATC did not required mech plug detection, will receive + /* WCD939x USB AATC did not required mech plug detection, will receive * insertion/removal events from UCSI layer */ -#if IS_ENABLED(CONFIG_QCOM_WCD_USBSS_I2C) - if (mbhc->mbhc_cfg->enable_usbc_analog) { - pr_debug("%s: leave, (irq_none)", __func__); + if (mbhc->mbhc_cfg->enable_usbc_analog && mbhc->wcd_usbss_aatc_dev_np) { + pr_debug("%s: leave, (irq_none)\n", __func__); return IRQ_NONE; } -#endif if (unlikely((mbhc->mbhc_cb->lock_sleep(mbhc, true)) == false)) { pr_warn("%s: failed to hold suspend\n", __func__); @@ -1718,14 +1724,18 @@ static int wcd_mbhc_usbc_ana_event_handler(struct notifier_block *nb, if (mode == TYPEC_ACCESSORY_AUDIO) { dev_dbg(mbhc->component->dev, "enter, %s: mode = %lu\n", __func__, mode); #if IS_ENABLED(CONFIG_QCOM_WCD_USBSS_I2C) - if (cable_status == NULL) - wcd_usbss_switch_update(WCD_USBSS_AATC, WCD_USBSS_CABLE_CONNECT); - else { - if (*cable_status == false) + if (mbhc->wcd_usbss_aatc_dev_np) { + if (cable_status == NULL) wcd_usbss_switch_update(WCD_USBSS_AATC, WCD_USBSS_CABLE_CONNECT); - else - dev_dbg(mbhc->component->dev, "skip AATC switch settings, cable_status= %d", + else { + if (!*cable_status) + wcd_usbss_switch_update(WCD_USBSS_AATC, + WCD_USBSS_CABLE_CONNECT); + else + dev_dbg(mbhc->component->dev, + "skip AATC switch settings, cable_status= %d", *cable_status); + } } #endif if (mbhc->mbhc_cb->clk_setup) @@ -1733,27 +1743,32 @@ static int wcd_mbhc_usbc_ana_event_handler(struct notifier_block *nb, WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_L_DET_EN, 1); #if IS_ENABLED(CONFIG_QCOM_WCD_USBSS_I2C) - if (unlikely((mbhc->mbhc_cb->lock_sleep(mbhc, true)) == false)) - pr_warn("%s: failed to hold suspend\n", __func__); - else { - if (mbhc->current_plug == MBHC_PLUG_TYPE_NONE) - wcd_mbhc_swch_irq_handler(mbhc); - mbhc->mbhc_cb->lock_sleep(mbhc, false); + if (mbhc->wcd_usbss_aatc_dev_np) { + if (unlikely((mbhc->mbhc_cb->lock_sleep(mbhc, true)) == false)) + pr_warn("%s: failed to hold suspend\n", __func__); + else { + if (mbhc->current_plug == MBHC_PLUG_TYPE_NONE) + wcd_mbhc_swch_irq_handler(mbhc); + mbhc->mbhc_cb->lock_sleep(mbhc, false); + } } #endif } else if (mode < TYPEC_MAX_ACCESSORY) { #if IS_ENABLED(CONFIG_QCOM_WCD_USBSS_I2C) - WCD_MBHC_REG_READ(WCD_MBHC_L_DET_EN, l_det_en); - WCD_MBHC_REG_READ(WCD_MBHC_MECH_DETECTION_TYPE, detection_type); - if ((mode == TYPEC_ACCESSORY_NONE) && !detection_type) { - if (unlikely((mbhc->mbhc_cb->lock_sleep(mbhc, true)) == false)) - pr_warn("%s: failed to hold suspend\n", __func__); - else { - wcd_mbhc_swch_irq_handler(mbhc); - mbhc->mbhc_cb->lock_sleep(mbhc, false); + if (mbhc->wcd_usbss_aatc_dev_np) { + WCD_MBHC_REG_READ(WCD_MBHC_L_DET_EN, l_det_en); + WCD_MBHC_REG_READ(WCD_MBHC_MECH_DETECTION_TYPE, detection_type); + if ((mode == TYPEC_ACCESSORY_NONE) && !detection_type) { + if (unlikely((mbhc->mbhc_cb->lock_sleep(mbhc, true)) == false)) + pr_warn("%s: failed to hold suspend\n", __func__); + else { + wcd_mbhc_swch_irq_handler(mbhc); + mbhc->mbhc_cb->lock_sleep(mbhc, false); + } + wcd_usbss_switch_update(WCD_USBSS_AATC, WCD_USBSS_CABLE_DISCONNECT); + dev_dbg(mbhc->component->dev, "leave, %s: mode = %lu\n", + __func__, mode); } - wcd_usbss_switch_update(WCD_USBSS_AATC, WCD_USBSS_CABLE_DISCONNECT); - dev_dbg(mbhc->component->dev, "leave, %s: mode = %lu\n", __func__, mode); } #endif } else if (mode == TYPEC_MAX_ACCESSORY) { @@ -1808,13 +1823,7 @@ int wcd_mbhc_start(struct wcd_mbhc *mbhc, struct wcd_mbhc_config *mbhc_cfg) dev_dbg(mbhc->component->dev, "%s: usbc analog enabled\n", __func__); mbhc->swap_thr = GND_MIC_USBC_SWAP_THRESHOLD; - if (IS_ENABLED(CONFIG_QCOM_WCD_USBSS_I2C)) - mbhc->aatc_dev_np = of_parse_phandle(card->dev->of_node, - "wcd939x-i2c-handle", 0); - else if (IS_ENABLED(CONFIG_QCOM_FSA4480_I2C)) - mbhc->aatc_dev_np = of_parse_phandle(card->dev->of_node, - "fsa4480-i2c-handle", 0); - if (!mbhc->aatc_dev_np) { + if (!mbhc->wcd_usbss_aatc_dev_np && !mbhc->fsa_aatc_dev_np) { dev_err(card->dev, "%s: wcd939x or fsa i2c node not found\n", __func__); rc = -EINVAL; @@ -1856,10 +1865,13 @@ int wcd_mbhc_start(struct wcd_mbhc *mbhc, struct wcd_mbhc_config *mbhc_cfg) mbhc->aatc_dev_nb.notifier_call = wcd_mbhc_usbc_ana_event_handler; mbhc->aatc_dev_nb.priority = 0; #if IS_ENABLED(CONFIG_QCOM_WCD_USBSS_I2C) - rc = wcd_usbss_reg_notifier(&mbhc->aatc_dev_nb, mbhc->aatc_dev_np); + if (mbhc->wcd_usbss_aatc_dev_np) + rc = wcd_usbss_reg_notifier(&mbhc->aatc_dev_nb, + mbhc->wcd_usbss_aatc_dev_np); #endif #if IS_ENABLED(CONFIG_QCOM_FSA4480_I2C) - rc = fsa4480_reg_notifier(&mbhc->aatc_dev_nb, mbhc->aatc_dev_np); + if (mbhc->fsa_aatc_dev_np) + rc = fsa4480_reg_notifier(&mbhc->aatc_dev_nb, mbhc->fsa_aatc_dev_np); #endif } @@ -1897,12 +1909,13 @@ void wcd_mbhc_stop(struct wcd_mbhc *mbhc) } #if IS_ENABLED(CONFIG_QCOM_WCD_USBSS_I2C) - if (mbhc->mbhc_cfg->enable_usbc_analog) - wcd_usbss_unreg_notifier(&mbhc->aatc_dev_nb, mbhc->aatc_dev_np); + if (mbhc->mbhc_cfg->enable_usbc_analog && mbhc->wcd_usbss_aatc_dev_np) + wcd_usbss_unreg_notifier(&mbhc->aatc_dev_nb, mbhc->wcd_usbss_aatc_dev_np); #endif + #if IS_ENABLED(CONFIG_QCOM_FSA4480_I2C) - if (mbhc->mbhc_cfg->enable_usbc_analog) - fsa4480_unreg_notifier(&mbhc->aatc_dev_nb, mbhc->aatc_dev_np); + if (mbhc->mbhc_cfg->enable_usbc_analog && mbhc->fsa_aatc_dev_np) + fsa4480_unreg_notifier(&mbhc->aatc_dev_nb, mbhc->fsa_aatc_dev_np); #endif pr_debug("%s: leave\n", __func__); @@ -1973,6 +1986,11 @@ int wcd_mbhc_init(struct wcd_mbhc *mbhc, struct snd_soc_component *component, mbhc->moist_rref = hph_moist_config[2]; } + mbhc->wcd_usbss_aatc_dev_np = of_parse_phandle(card->dev->of_node, + "wcd939x-i2c-handle", 0); + mbhc->fsa_aatc_dev_np = of_parse_phandle(card->dev->of_node, + "fsa4480-i2c-handle", 0); + mbhc->in_swch_irq_handler = false; mbhc->current_plug = MBHC_PLUG_TYPE_NONE; mbhc->is_btn_press = false; diff --git a/include/asoc/wcd-mbhc-v2.h b/include/asoc/wcd-mbhc-v2.h index 345cf103a6..b980d45400 100644 --- a/include/asoc/wcd-mbhc-v2.h +++ b/include/asoc/wcd-mbhc-v2.h @@ -623,7 +623,8 @@ struct wcd_mbhc { struct wcd_mbhc_fn *mbhc_fn; bool force_linein; - struct device_node *aatc_dev_np; + struct device_node *wcd_usbss_aatc_dev_np; + struct device_node *fsa_aatc_dev_np; struct notifier_block aatc_dev_nb; struct extcon_dev *extdev;