diff options
Diffstat (limited to 'common/charge_state_v2.c')
-rw-r--r-- | common/charge_state_v2.c | 19 |
1 files changed, 16 insertions, 3 deletions
diff --git a/common/charge_state_v2.c b/common/charge_state_v2.c index 8c6fdab03b..441d85977d 100644 --- a/common/charge_state_v2.c +++ b/common/charge_state_v2.c @@ -515,7 +515,7 @@ static inline int battery_too_low(void) * Send host event to the AP if the battery is temperature or charge level * is critical. Force-shutdown if the problem isn't corrected after timeout. */ -static void shutdown_on_critical_battery(void) +static int shutdown_on_critical_battery(void) { int batt_temp_c; int battery_critical = 0; @@ -539,7 +539,7 @@ static void shutdown_on_critical_battery(void) if (!battery_critical) { /* Reset shutdown warning time */ shutdown_warning_time.val = 0; - return; + return battery_critical; } if (!shutdown_warning_time.val) { @@ -569,6 +569,8 @@ static void shutdown_on_critical_battery(void) chipset_force_shutdown(); } } + + return battery_critical; } /* @@ -632,6 +634,7 @@ static int get_desired_input_current(enum battery_present batt_present, void charger_task(void *u) { int sleep_usec; + int battery_critical; int need_static = 1; const struct charger_info * const info = charger_get_info(); @@ -658,6 +661,7 @@ void charger_task(void *u) curr.ts = get_time(); sleep_usec = 0; problems_exist = 0; + battery_critical = 0; curr.ac = extpower_is_present(); if (curr.ac != prev_ac) { if (curr.ac) { @@ -763,7 +767,7 @@ void charger_task(void *u) curr.batt_is_charging = curr.ac && (curr.batt.current >= 0); /* Don't let the battery hurt itself. */ - shutdown_on_critical_battery(); + battery_critical = shutdown_on_critical_battery(); if (!curr.ac) { curr.state = ST_DISCHARGE; @@ -970,6 +974,15 @@ wait_for_it: else if (sleep_usec > CHARGE_MAX_SLEEP_USEC) sleep_usec = CHARGE_MAX_SLEEP_USEC; + /* + * If battery is critical, ensure that the sleep time is not + * very long since we might want to hibernate or cut-off + * battery sooner. + */ + if (battery_critical && + (sleep_usec > CRITICAL_BATTERY_SHUTDOWN_TIMEOUT_US)) + sleep_usec = CRITICAL_BATTERY_SHUTDOWN_TIMEOUT_US; + task_wait_event(sleep_usec); } } |