From 393c3c20dfd15d666c84b88a23cadac1c6dadb3f Mon Sep 17 00:00:00 2001 From: Devin Lu Date: Mon, 29 Mar 2021 13:58:11 +0800 Subject: isl9241: Toggle learning mode when fully charged In low-power states, the ISL9241 may become stuck in CCM, consuming excess power. Toggle learning mode to enter DCM and save power. This is a workaround recommended by Renasas. BUG=b:183771327 BRANCH=firmware-volteer-13672.B-main TEST=Verifed charger doesn't stuck in CCM mode. Signed-off-by: Devin Lu Change-Id: I70bf088b9214fd4b3cee137da561ba84e854106a Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2789811 Reviewed-by: Abe Levkoy Commit-Queue: Abe Levkoy --- driver/charger/isl9241.c | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/driver/charger/isl9241.c b/driver/charger/isl9241.c index ab92ef70ad..4a53c2440a 100644 --- a/driver/charger/isl9241.c +++ b/driver/charger/isl9241.c @@ -12,6 +12,7 @@ #include "battery.h" #include "battery_smart.h" #include "charger.h" +#include "charge_state.h" #include "console.h" #include "common.h" #include "hooks.h" @@ -498,6 +499,30 @@ static int isl9241_ramp_get_current_limit(int chgnum) } #endif /* CONFIG_CHARGE_RAMP_HW */ +/* + * When fully charged in a low-power state, the ISL9241 may get stuck + * in CCM. Toggle learning mode for 50 ms to enter DCM and save power. + * This is a workaround provided by Renesas. See b/183771327. + */ +static void isl9241_restart_charge_voltage_when_full(void) +{ + if (!chipset_in_or_transitioning_to_state(CHIPSET_STATE_ON) + && charge_get_state() == PWR_STATE_CHARGE_NEAR_FULL) { + charger_discharge_on_ac(1); + msleep(50); + charger_discharge_on_ac(0); + } +} +DECLARE_HOOK(HOOK_BATTERY_SOC_CHANGE, + isl9241_restart_charge_voltage_when_full, + HOOK_PRIO_DEFAULT); +DECLARE_HOOK(HOOK_CHIPSET_SUSPEND, + isl9241_restart_charge_voltage_when_full, + HOOK_PRIO_DEFAULT); +DECLARE_HOOK(HOOK_CHIPSET_SHUTDOWN, + isl9241_restart_charge_voltage_when_full, + HOOK_PRIO_DEFAULT); + /*****************************************************************************/ #ifdef CONFIG_CMD_CHARGER_DUMP static void dump_reg_range(int chgnum, int low, int high) -- cgit v1.2.1