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",