summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTodd Broch <tbroch@chromium.org>2016-04-05 16:42:23 -0700
committerchrome-bot <chrome-bot@chromium.org>2016-07-05 04:09:42 -0700
commitafaf93e3c7eed5211d08a642bef2c7d1d2311d2f (patch)
treeeff32a4cdfbd133fd280a1b365e29941aba92417
parent7b98fdc0b896697f30e1b069791934fedb977de4 (diff)
downloadchrome-ec-afaf93e3c7eed5211d08a642bef2c7d1d2311d2f.tar.gz
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 <tbroch@chromium.org> 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 <drinkcat@chromium.org> Tested-by: Nicolas Boichat <drinkcat@chromium.org> Reviewed-by: Shawn N <shawnn@chromium.org>
-rw-r--r--driver/charger/isl9237.c18
1 files 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;
}
/*****************************************************************************/