diff options
author | Vic Yang <victoryang@chromium.org> | 2013-03-19 10:56:49 +0800 |
---|---|---|
committer | ChromeBot <chrome-bot@google.com> | 2013-03-20 23:47:40 -0700 |
commit | db20e7afde7981945b3076015a57443fc2694899 (patch) | |
tree | 51efcd502de7d394ef0fceb5c837c2aff9035d4d | |
parent | 447b05b8280d2dba9ec4c227e6cd0928e6065c26 (diff) | |
download | chrome-ec-db20e7afde7981945b3076015a57443fc2694899.tar.gz |
spring: keep AP off when battery level is too low
When battery level is too low, we want to keep the AP off even when a
power on event is received. Current threshold is set to 1 mAh.
Note that after this change, a board without a battery will need to wait
for 15 seconds before it can boot up.
BUG=chrome-os-partner:18318
TEST=Press power button and see power on event ignored. Charge battery
to over AP off threshold and check we can power on the system.
BRANCH=spring
Change-Id: If32a1935a69be102778bde7ad8976eea0921f87e
Signed-off-by: Vic Yang <victoryang@chromium.org>
Reviewed-on: https://gerrit.chromium.org/gerrit/45825
Reviewed-by: Vincent Palatin <vpalatin@chromium.org>
-rw-r--r-- | board/spring/board.h | 3 | ||||
-rw-r--r-- | common/gaia_power.c | 26 | ||||
-rw-r--r-- | common/pmu_tps65090_charger.c | 17 | ||||
-rw-r--r-- | include/pmu_tpschrome.h | 5 |
4 files changed, 48 insertions, 3 deletions
diff --git a/board/spring/board.h b/board/spring/board.h index 67f16e9b44..ea4ce7db89 100644 --- a/board/spring/board.h +++ b/board/spring/board.h @@ -59,6 +59,9 @@ /* Battery */ #define CONFIG_BATTERY_BQ20Z453 +/* Low battery threshold. In mAh. */ +#define BATTERY_AP_OFF_LEVEL 1 + /* Charger/accessories detection */ #define CONFIG_TSU6721 diff --git a/common/gaia_power.c b/common/gaia_power.c index f197890f88..7f53dd800e 100644 --- a/common/gaia_power.c +++ b/common/gaia_power.c @@ -506,6 +506,28 @@ static int next_pwr_event(void) /*****************************************************************************/ +static int wait_for_power_on(void) +{ + int value; + while (1) { + value = check_for_power_on_event(); + if (!value) { + task_wait_event(-1); + continue; + } + + if (charge_keep_power_off()) { + CPRINTF("%T battery low. ignoring power on event.\n"); + if (value == 1) /* System already on */ + power_off(); + continue; + } + + CPRINTF("%T power on %d\n", value); + return value; + } +} + void chipset_task(void) { int value; @@ -515,9 +537,7 @@ void chipset_task(void) while (1) { /* Wait until we need to power on, then power on */ - while (value = check_for_power_on_event(), !value) - task_wait_event(-1); - CPRINTF("%T power on %d\n", value); + wait_for_power_on(); if (!power_on()) { int continue_power = 0; diff --git a/common/pmu_tps65090_charger.c b/common/pmu_tps65090_charger.c index 732a5b6d98..c07d643e97 100644 --- a/common/pmu_tps65090_charger.c +++ b/common/pmu_tps65090_charger.c @@ -42,6 +42,10 @@ #define T2_USEC (10 * SECOND) #define T3_USEC (10 * SECOND) +#ifndef BATTERY_AP_OFF_LEVEL +#define BATTERY_AP_OFF_LEVEL 0 +#endif + static const char * const state_list[] = { "idle", "pre-charging", @@ -373,6 +377,19 @@ enum charging_state charge_get_state(void) return current_state; } +int charge_keep_power_off(void) +{ + int charge; + + if (BATTERY_AP_OFF_LEVEL == 0) + return 0; + + if (battery_remaining_capacity(&charge)) + return current_state != ST_CHARGING_ERROR; + + return charge <= BATTERY_AP_OFF_LEVEL; +} + void pmu_charger_task(void) { int next_state; diff --git a/include/pmu_tpschrome.h b/include/pmu_tpschrome.h index 0af241682f..57ba4c0a7e 100644 --- a/include/pmu_tpschrome.h +++ b/include/pmu_tpschrome.h @@ -269,5 +269,10 @@ void pmu_task_throttled_wake(void); */ enum charging_state charge_get_state(void); +/** + * Return non-zero if battery is so low we want to keep AP off. + */ +int charge_keep_power_off(void); + #endif /* __CROS_EC_TPSCHROME_H */ |