p9221_charger: code improvements for WLC gpios

Bug: 219935074
Signed-off-by: yihsiangpeng <[email protected]>
Change-Id: I7450864c4c0123d5e00dbf2a9d93676fb735287b
diff --git a/p9221_charger.c b/p9221_charger.c
index f1627c5..d34aa65 100644
--- a/p9221_charger.c
+++ b/p9221_charger.c
@@ -2124,8 +2124,7 @@
 	dev_warn(&charger->client->dev, "Set enable %d, wlc_dc_enabled:%d->%d\n",
 		charger->enabled, wlc_dc_enabled, charger->wlc_dc_enabled);
 
-	if (charger->pdata->qien_gpio >= 0)
-		vote(charger->wlc_disable_votable, P9221_WLC_VOTER, !charger->enabled, 0);
+	vote(charger->wlc_disable_votable, P9221_WLC_VOTER, !charger->enabled, 0);
 
 	return 1;
 }
@@ -5417,7 +5416,7 @@
 		pdata->chip_id = P9222_CHIP_ID;
 	}
 
-	/* Enable */
+	/* QI_EN_L: enable/disable WLC chip */
 	ret = of_get_named_gpio(node, "idt,gpio_qien", 0);
 	pdata->qien_gpio = ret;
 	if (ret < 0)
@@ -5429,7 +5428,11 @@
 	/* support p9412 GPIO */
 	pdata->has_p9412_gpio = of_property_read_bool(node,
                                                       "idt,has_p9412_gpio");
-	/* QI_USB_VBUS_EN */
+
+	/*
+	 * QI_USB_VBUS_EN: control the priority of USB and WLC,
+	 *                 set to high after boot
+	 */
 	ret = of_get_named_gpio_flags(node, "idt,gpio_qi_vbus_en", 0, &flags);
 	pdata->qi_vbus_en = ret;
 	if (ret < 0) {
@@ -5441,6 +5444,17 @@
 			 pdata->qi_vbus_en, pdata->qi_vbus_en_act_low);
 	}
 
+	/* Enable/Disable WLC chip(for P9XXX_GPIO_VBUS_EN) */
+	ret = of_get_named_gpio_flags(node, "idt,gpio_wlc_en", 0, &flags);
+	pdata->wlc_en = ret;
+	if (ret < 0) {
+		dev_warn(dev, "unable to read idt,gpio_wlc_en from dt: %d\n",
+			 ret);
+	} else {
+		pdata->wlc_en_act_low = (flags & OF_GPIO_ACTIVE_LOW) != 0;
+		dev_info(dev, "WLC enable/disable pin:%d", pdata->wlc_en);
+	}
+
 	/* WLC_BPP_EPP_SLCT */
 	ret = of_get_named_gpio(node, "idt,gpio_slct", 0);
 	pdata->slct_gpio = ret;
@@ -5871,6 +5885,13 @@
 	struct p9221_charger_data *charger = data;
 	u8 val = P9221_EOP_UNKNOWN;
 
+	if (charger->pdata->wlc_en == charger->pdata->qien_gpio) {
+		int value;
+		value = (!disable) ^ charger->pdata->wlc_en_act_low;
+		gpio_direction_output(charger->pdata->wlc_en, value);
+		return 0;
+	}
+
 	charger->send_eop = get_client_vote(charger->dc_icl_votable, THERMAL_DAEMON_VOTER) == 0;
 	if (!get_client_vote(votable, P9221_WLC_VOTER) && !charger->send_eop)
 		val = P9221_EOP_RESTART_POWER; /* auto restart */
diff --git a/p9221_charger.h b/p9221_charger.h
index 2690222..c5e2f4c 100644
--- a/p9221_charger.h
+++ b/p9221_charger.h
@@ -566,6 +566,8 @@
 	int				dc_switch_gpio;
 	int				qi_vbus_en;
 	int				qi_vbus_en_act_low;
+	int				wlc_en;
+	int				wlc_en_act_low;
 	int				max_vout_mv;
 	int				epp_vout_mv;
 	u8				fod[P9221R5_NUM_FOD];
diff --git a/p9221_chip.c b/p9221_chip.c
index 233e7a3..f273dc4 100644
--- a/p9221_chip.c
+++ b/p9221_chip.c
@@ -1828,10 +1828,10 @@
 			ret = charger->chip_set_vout_max(charger, P9412_BPP_VOUT_DFLT);
 		break;
 	case P9XXX_GPIO_VBUS_EN:
-		if (charger->pdata->qi_vbus_en < 0)
+		if (charger->pdata->wlc_en < 0)
 			break;
-		value = (!!value) ^ charger->pdata->qi_vbus_en_act_low;
-		gpio_direction_output(charger->pdata->qi_vbus_en, value);
+		value = (!!value) ^ charger->pdata->wlc_en_act_low;
+		gpio_direction_output(charger->pdata->wlc_en, value);
 		break;
 	case P9XXX_GPIO_BST_SEL:
 		logbuffer_log(charger->rtx_log, "Set p9412 gpio: %02x(%d)\n",