From afaf93e3c7eed5211d08a642bef2c7d1d2311d2f Mon Sep 17 00:00:00 2001 From: Todd Broch Date: Tue, 5 Apr 2016 16:42:23 -0700 Subject: [PATCH] charger: isl9237: Disable learn mode unless explicitly enabled. In some rare instances the learn bit gets inadvertently set in the charger which disables charging. Disable it in charger_set_mode unless its been set intentionally. Signed-off-by: Todd Broch BRANCH=none BUG=chrome-os-partner:51196 BUG=chrome-os-partner:54484 TEST=manual, on Chell w/ charger attached and charging - force learn on manually, see charging stop i2cxfer w16 4 0x12 0x3c 0x1000 - wait a second, see charging restored - check learn has been disabled i2cxfer r16 4 0x12 0x3 0x0000 - set learn on explicitly ectool chargecontrol off - see charging remain disabled - check learn has been enabled i2cxfer r16 4 0x12 0x3 0x1000 ectool chargecontrol normal Change-Id: I26f1e855dcad1aa41530d06555a9be7956fdf435 Reviewed-on: https://chromium-review.googlesource.com/353530 Commit-Ready: Nicolas Boichat Tested-by: Nicolas Boichat Reviewed-by: Shawn N --- driver/charger/isl9237.c | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/driver/charger/isl9237.c b/driver/charger/isl9237.c index f32ca805e9..94b8669ce6 100644 --- a/driver/charger/isl9237.c +++ b/driver/charger/isl9237.c @@ -29,6 +29,8 @@ /* Console output macros */ #define CPRINTF(format, args...) cprintf(CC_CHARGER, format, ## args) +static int learn_mode; + /* Charger parameters */ static const struct charger_info isl9237_charger_info = { .name = CHARGER_NAME, @@ -172,8 +174,17 @@ int charger_get_status(int *status) int charger_set_mode(int mode) { + int rv = EC_SUCCESS; + + /* + * See crosbug.com/p/51196. Always disable learn mode unless it was set + * explicitly. + */ + if (!learn_mode) + rv = charger_discharge_on_ac(0); + /* ISL9237 does not support inhibit mode setting. */ - return EC_SUCCESS; + return rv; } int charger_get_current(int *current) @@ -272,7 +283,10 @@ int charger_discharge_on_ac(int enable) else control1 &= ~ISL9237_C1_LEARN_MODE_ENABLE; - return raw_write16(ISL9237_REG_CONTROL1, control1); + rv = raw_write16(ISL9237_REG_CONTROL1, control1); + + learn_mode = !rv && enable; + return rv; } /*****************************************************************************/