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 <quic_pkumpatl@quicinc.com>
This commit is contained in:
@@ -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)
|
#if IS_ENABLED(CONFIG_QCOM_WCD_USBSS_I2C)
|
||||||
struct snd_soc_component *component = mbhc->component;
|
struct snd_soc_component *component = mbhc->component;
|
||||||
if (connect) {
|
if (mbhc->wcd_usbss_aatc_dev_np) {
|
||||||
if (mbhc->mbhc_cb && mbhc->mbhc_cb->zdet_leakage_resistance)
|
if (connect) {
|
||||||
mbhc->mbhc_cb->zdet_leakage_resistance(mbhc, false); /* enable 1M pull-up */
|
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,
|
if (of_find_property(component->card->dev->of_node,
|
||||||
"qcom,usbss-hsj-connect-enabled", NULL))
|
"qcom,usbss-hsj-connect-enabled", NULL))
|
||||||
wcd_usbss_switch_update(WCD_USBSS_HSJ_CONNECT, WCD_USBSS_CABLE_CONNECT);
|
wcd_usbss_switch_update(WCD_USBSS_HSJ_CONNECT,
|
||||||
} else {
|
WCD_USBSS_CABLE_CONNECT);
|
||||||
if (of_find_property(component->card->dev->of_node,
|
} else {
|
||||||
"qcom,usbss-hsj-connect-enabled", NULL))
|
if (of_find_property(component->card->dev->of_node,
|
||||||
wcd_usbss_switch_update(WCD_USBSS_HSJ_CONNECT, WCD_USBSS_CABLE_DISCONNECT);
|
"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)
|
if (mbhc->mbhc_cb && mbhc->mbhc_cb->zdet_leakage_resistance) {
|
||||||
mbhc->mbhc_cb->zdet_leakage_resistance(mbhc, true); /* disable 1M pull-up */
|
/* disable 1M pull-up */
|
||||||
|
mbhc->mbhc_cb->zdet_leakage_resistance(mbhc, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#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__);
|
pr_err("%s: NULL irq data\n", __func__);
|
||||||
return IRQ_NONE;
|
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
|
* insertion/removal events from UCSI layer
|
||||||
*/
|
*/
|
||||||
#if IS_ENABLED(CONFIG_QCOM_WCD_USBSS_I2C)
|
if (mbhc->mbhc_cfg->enable_usbc_analog && mbhc->wcd_usbss_aatc_dev_np) {
|
||||||
if (mbhc->mbhc_cfg->enable_usbc_analog) {
|
pr_debug("%s: leave, (irq_none)\n", __func__);
|
||||||
pr_debug("%s: leave, (irq_none)", __func__);
|
|
||||||
return IRQ_NONE;
|
return IRQ_NONE;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
if (unlikely((mbhc->mbhc_cb->lock_sleep(mbhc, true)) == false)) {
|
if (unlikely((mbhc->mbhc_cb->lock_sleep(mbhc, true)) == false)) {
|
||||||
pr_warn("%s: failed to hold suspend\n", __func__);
|
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) {
|
if (mode == TYPEC_ACCESSORY_AUDIO) {
|
||||||
dev_dbg(mbhc->component->dev, "enter, %s: mode = %lu\n", __func__, mode);
|
dev_dbg(mbhc->component->dev, "enter, %s: mode = %lu\n", __func__, mode);
|
||||||
#if IS_ENABLED(CONFIG_QCOM_WCD_USBSS_I2C)
|
#if IS_ENABLED(CONFIG_QCOM_WCD_USBSS_I2C)
|
||||||
if (cable_status == NULL)
|
if (mbhc->wcd_usbss_aatc_dev_np) {
|
||||||
wcd_usbss_switch_update(WCD_USBSS_AATC, WCD_USBSS_CABLE_CONNECT);
|
if (cable_status == NULL)
|
||||||
else {
|
|
||||||
if (*cable_status == false)
|
|
||||||
wcd_usbss_switch_update(WCD_USBSS_AATC, WCD_USBSS_CABLE_CONNECT);
|
wcd_usbss_switch_update(WCD_USBSS_AATC, WCD_USBSS_CABLE_CONNECT);
|
||||||
else
|
else {
|
||||||
dev_dbg(mbhc->component->dev, "skip AATC switch settings, cable_status= %d",
|
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);
|
*cable_status);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
if (mbhc->mbhc_cb->clk_setup)
|
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);
|
WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_L_DET_EN, 1);
|
||||||
|
|
||||||
#if IS_ENABLED(CONFIG_QCOM_WCD_USBSS_I2C)
|
#if IS_ENABLED(CONFIG_QCOM_WCD_USBSS_I2C)
|
||||||
if (unlikely((mbhc->mbhc_cb->lock_sleep(mbhc, true)) == false))
|
if (mbhc->wcd_usbss_aatc_dev_np) {
|
||||||
pr_warn("%s: failed to hold suspend\n", __func__);
|
if (unlikely((mbhc->mbhc_cb->lock_sleep(mbhc, true)) == false))
|
||||||
else {
|
pr_warn("%s: failed to hold suspend\n", __func__);
|
||||||
if (mbhc->current_plug == MBHC_PLUG_TYPE_NONE)
|
else {
|
||||||
wcd_mbhc_swch_irq_handler(mbhc);
|
if (mbhc->current_plug == MBHC_PLUG_TYPE_NONE)
|
||||||
mbhc->mbhc_cb->lock_sleep(mbhc, false);
|
wcd_mbhc_swch_irq_handler(mbhc);
|
||||||
|
mbhc->mbhc_cb->lock_sleep(mbhc, false);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
} else if (mode < TYPEC_MAX_ACCESSORY) {
|
} else if (mode < TYPEC_MAX_ACCESSORY) {
|
||||||
#if IS_ENABLED(CONFIG_QCOM_WCD_USBSS_I2C)
|
#if IS_ENABLED(CONFIG_QCOM_WCD_USBSS_I2C)
|
||||||
WCD_MBHC_REG_READ(WCD_MBHC_L_DET_EN, l_det_en);
|
if (mbhc->wcd_usbss_aatc_dev_np) {
|
||||||
WCD_MBHC_REG_READ(WCD_MBHC_MECH_DETECTION_TYPE, detection_type);
|
WCD_MBHC_REG_READ(WCD_MBHC_L_DET_EN, l_det_en);
|
||||||
if ((mode == TYPEC_ACCESSORY_NONE) && !detection_type) {
|
WCD_MBHC_REG_READ(WCD_MBHC_MECH_DETECTION_TYPE, detection_type);
|
||||||
if (unlikely((mbhc->mbhc_cb->lock_sleep(mbhc, true)) == false))
|
if ((mode == TYPEC_ACCESSORY_NONE) && !detection_type) {
|
||||||
pr_warn("%s: failed to hold suspend\n", __func__);
|
if (unlikely((mbhc->mbhc_cb->lock_sleep(mbhc, true)) == false))
|
||||||
else {
|
pr_warn("%s: failed to hold suspend\n", __func__);
|
||||||
wcd_mbhc_swch_irq_handler(mbhc);
|
else {
|
||||||
mbhc->mbhc_cb->lock_sleep(mbhc, false);
|
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
|
#endif
|
||||||
} else if (mode == TYPEC_MAX_ACCESSORY) {
|
} 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",
|
dev_dbg(mbhc->component->dev, "%s: usbc analog enabled\n",
|
||||||
__func__);
|
__func__);
|
||||||
mbhc->swap_thr = GND_MIC_USBC_SWAP_THRESHOLD;
|
mbhc->swap_thr = GND_MIC_USBC_SWAP_THRESHOLD;
|
||||||
if (IS_ENABLED(CONFIG_QCOM_WCD_USBSS_I2C))
|
if (!mbhc->wcd_usbss_aatc_dev_np && !mbhc->fsa_aatc_dev_np) {
|
||||||
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) {
|
|
||||||
dev_err(card->dev, "%s: wcd939x or fsa i2c node not found\n",
|
dev_err(card->dev, "%s: wcd939x or fsa i2c node not found\n",
|
||||||
__func__);
|
__func__);
|
||||||
rc = -EINVAL;
|
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.notifier_call = wcd_mbhc_usbc_ana_event_handler;
|
||||||
mbhc->aatc_dev_nb.priority = 0;
|
mbhc->aatc_dev_nb.priority = 0;
|
||||||
#if IS_ENABLED(CONFIG_QCOM_WCD_USBSS_I2C)
|
#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
|
#endif
|
||||||
#if IS_ENABLED(CONFIG_QCOM_FSA4480_I2C)
|
#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
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1897,12 +1909,13 @@ void wcd_mbhc_stop(struct wcd_mbhc *mbhc)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#if IS_ENABLED(CONFIG_QCOM_WCD_USBSS_I2C)
|
#if IS_ENABLED(CONFIG_QCOM_WCD_USBSS_I2C)
|
||||||
if (mbhc->mbhc_cfg->enable_usbc_analog)
|
if (mbhc->mbhc_cfg->enable_usbc_analog && mbhc->wcd_usbss_aatc_dev_np)
|
||||||
wcd_usbss_unreg_notifier(&mbhc->aatc_dev_nb, mbhc->aatc_dev_np);
|
wcd_usbss_unreg_notifier(&mbhc->aatc_dev_nb, mbhc->wcd_usbss_aatc_dev_np);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if IS_ENABLED(CONFIG_QCOM_FSA4480_I2C)
|
#if IS_ENABLED(CONFIG_QCOM_FSA4480_I2C)
|
||||||
if (mbhc->mbhc_cfg->enable_usbc_analog)
|
if (mbhc->mbhc_cfg->enable_usbc_analog && mbhc->fsa_aatc_dev_np)
|
||||||
fsa4480_unreg_notifier(&mbhc->aatc_dev_nb, mbhc->aatc_dev_np);
|
fsa4480_unreg_notifier(&mbhc->aatc_dev_nb, mbhc->fsa_aatc_dev_np);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
pr_debug("%s: leave\n", __func__);
|
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->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->in_swch_irq_handler = false;
|
||||||
mbhc->current_plug = MBHC_PLUG_TYPE_NONE;
|
mbhc->current_plug = MBHC_PLUG_TYPE_NONE;
|
||||||
mbhc->is_btn_press = false;
|
mbhc->is_btn_press = false;
|
||||||
|
@@ -623,7 +623,8 @@ struct wcd_mbhc {
|
|||||||
|
|
||||||
struct wcd_mbhc_fn *mbhc_fn;
|
struct wcd_mbhc_fn *mbhc_fn;
|
||||||
bool force_linein;
|
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 notifier_block aatc_dev_nb;
|
||||||
|
|
||||||
struct extcon_dev *extdev;
|
struct extcon_dev *extdev;
|
||||||
|
Reference in New Issue
Block a user