瀏覽代碼

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 <[email protected]>
Prasad Kumpatla 1 年之前
父節點
當前提交
27110b4fb5
共有 2 個文件被更改,包括 73 次插入54 次删除
  1. 71 53
      asoc/codecs/wcd-mbhc-v2.c
  2. 2 1
      include/asoc/wcd-mbhc-v2.h

+ 71 - 53
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 (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->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 (mbhc->mbhc_cb && mbhc->mbhc_cb->zdet_leakage_resistance)
-			mbhc->mbhc_cb->zdet_leakage_resistance(mbhc, true); /* disable 1M pull-up */
+			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) {
+				/* 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);
-		}
-#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 (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 {
-				wcd_mbhc_swch_irq_handler(mbhc);
+				if (mbhc->current_plug == MBHC_PLUG_TYPE_NONE)
+					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);
+		}
+#endif
+	} else if (mode < TYPEC_MAX_ACCESSORY) {
+#if IS_ENABLED(CONFIG_QCOM_WCD_USBSS_I2C)
+		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);
+			}
 		}
 #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;

+ 2 - 1
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;