summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--driver/charger/bd99955.c36
1 files changed, 24 insertions, 12 deletions
diff --git a/driver/charger/bd99955.c b/driver/charger/bd99955.c
index 4a2a3e877c..28c2606bc5 100644
--- a/driver/charger/bd99955.c
+++ b/driver/charger/bd99955.c
@@ -534,19 +534,31 @@ int charger_get_status(int *status)
int charger_set_mode(int mode)
{
- int rv;
-
- if (mode & CHARGE_FLAG_INHIBIT_CHARGE) {
- rv = bd99955_set_vsysreg(BD99955_DISCHARGE_VSYSREG);
- msleep(50);
- rv |= bd99955_charger_enable(0);
- } else {
- rv = bd99955_charger_enable(1);
- msleep(1);
- rv |= bd99955_set_vsysreg(BD99955_CHARGE_VSYSREG);
+ int rv, inhibit_chg;
+ static int inhibit_chg_prev = -1;
+
+ inhibit_chg = mode & CHARGE_FLAG_INHIBIT_CHARGE;
+
+ if (inhibit_chg != inhibit_chg_prev) {
+ if (inhibit_chg) {
+ rv = bd99955_set_vsysreg(BD99955_DISCHARGE_VSYSREG);
+ msleep(50);
+ rv |= bd99955_charger_enable(0);
+ } else {
+ rv = bd99955_charger_enable(1);
+ /*
+ * BGATE capacitor max : 0.1uF + 20%
+ * Charge MOSFET threshold max : 2.8V
+ * BGATE charge pump current min : 3uA
+ * T = C * V / I so, Tmax = 112ms
+ */
+ msleep(115);
+ rv |= bd99955_set_vsysreg(BD99955_CHARGE_VSYSREG);
+ }
+ inhibit_chg_prev = inhibit_chg;
+ if (rv)
+ return rv;
}
- if (rv)
- return rv;
if (mode & CHARGE_FLAG_POR_RESET) {
rv = bd99955_por_reset();