From 90210ee80a286c4878652cce69c205af44cd84ed Mon Sep 17 00:00:00 2001 From: Wonjoon Lee Date: Mon, 26 Dec 2016 20:55:47 +0900 Subject: bd9995x: more delay time between chg_en and vsys_set The nvdc voltage has a kind of deep, so that rarely observed NVDC down at this point because of back-boosting. Our sequence to enable charger bit and setting vsysreg is correct but rohm introduce charger may need some more time to be stable when between chg_en and vsys_set to start charge BUG=chrome-os-partner:60380 BRANCH=gru TEST=Manual on kevin, trigger battery disconnect, re-attach AC, verify system boots cleanly. and see voltage probing on c54@60380 Change-Id: Ic05091379322ffaac16fe827a47345c76c85f3e5 Signed-off-by: Wonjoon Lee Reviewed-on: https://chromium-review.googlesource.com/424214 Reviewed-by: Shawn N (cherry picked from commit a62a6254f5578a06893efc28b4c0d2b549129338) Reviewed-on: https://chromium-review.googlesource.com/424985 Commit-Queue: Shawn N --- driver/charger/bd99955.c | 36 ++++++++++++++++++++++++------------ 1 file 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(); -- cgit v1.2.1