summaryrefslogtreecommitdiff
path: root/common/charge_state_v2.c
diff options
context:
space:
mode:
Diffstat (limited to 'common/charge_state_v2.c')
-rw-r--r--common/charge_state_v2.c19
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);
}
}