summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVic Yang <victoryang@chromium.org>2013-04-27 01:17:10 +0800
committerChromeBot <chrome-bot@google.com>2013-04-28 18:15:52 -0700
commit30353d0ae74f59dc407c297f507af80d35de0b10 (patch)
tree29780a443a61d15a0f8aeec45ed38a0e1c8a80a0
parent0e52e9228302252b1cf3a2eadfdca75b900ee4ae (diff)
downloadchrome-ec-30353d0ae74f59dc407c297f507af80d35de0b10.tar.gz
Add new TPS65090 charge state REINIT and BAD_COND
Currently INIT state can mean different things. This change introduces two new states to demultiplex INIT. Now, REINIT means charge state machine is deciding the next state. BAD_COND means it's waiting for acceptable charging condition. Note that the three states are doing the same thing so there is no functional change. BUG=chrome-os-partner:18914 TEST=none BRANCH=spring CQ-DEPEND=CL:49430 Original-Change-Id: Ia783e76cf27e28103ef44fe7b8a43674dadccc54 Signed-off-by: Vic Yang <victoryang@chromium.org> Reviewed-on: https://gerrit.chromium.org/gerrit/49326 Reviewed-by: Vincent Palatin <vpalatin@chromium.org> (cherry picked from commit 92bd863d8dcd1d006d39b9f95547af5c7347c254) Change-Id: I51a25fcf6350eb4d00bb93241545a58b0f821722 Signed-off-by: Vic Yang <victoryang@chromium.org> Reviewed-on: https://gerrit.chromium.org/gerrit/49429
-rw-r--r--common/pmu_tps65090_charger.c45
-rw-r--r--include/pmu_tpschrome.h2
2 files changed, 27 insertions, 20 deletions
diff --git a/common/pmu_tps65090_charger.c b/common/pmu_tps65090_charger.c
index e961fed066..db23c77dcf 100644
--- a/common/pmu_tps65090_charger.c
+++ b/common/pmu_tps65090_charger.c
@@ -48,6 +48,8 @@
static const char * const state_list[] = {
"idle",
+ "reinit",
+ "bad cond",
"pre-charging",
"charging",
"charging error",
@@ -58,7 +60,7 @@ static const char * const state_list[] = {
static timestamp_t last_waken; /* Initialized to 0 */
static int has_pending_event;
-static enum charging_state current_state = ST_IDLE;
+static enum charging_state current_state = ST_REINIT;
static void enable_charging(int enable)
{
@@ -110,7 +112,7 @@ static int system_off(void)
gpio_set_level(GPIO_EN_PP5000, 0);
}
- return ST_IDLE;
+ return ST_REINIT;
}
/*
@@ -195,6 +197,8 @@ static int calc_next_state(int state)
int batt_temp, alarm, capacity, charge;
switch (state) {
+ case ST_REINIT:
+ case ST_BAD_COND:
case ST_IDLE:
/* Check AC and chiset state */
if (!board_get_ac()) {
@@ -205,12 +209,12 @@ static int calc_next_state(int state)
/* Stay in idle mode if charger overtemp */
if (pmu_is_charger_alarm())
- return ST_IDLE;
+ return ST_BAD_COND;
/* Enable charging when battery doesn't respond */
if (battery_temperature(&batt_temp)) {
if (config_low_current_charging(0))
- return ST_IDLE;
+ return ST_BAD_COND;
return ST_PRE_CHARGING;
}
@@ -218,11 +222,11 @@ static int calc_next_state(int state)
* of the start charging range.
*/
if (!battery_start_charging_range(batt_temp))
- return ST_IDLE;
+ return ST_BAD_COND;
/* Turn off charger on battery charging alarm */
if (battery_status(&alarm) || (alarm & ALARM_CHARGING))
- return ST_IDLE;
+ return ST_BAD_COND;
/* Start charging only when battery charge lower than 100% */
if (!battery_state_of_charge(&charge)) {
@@ -235,18 +239,18 @@ static int calc_next_state(int state)
case ST_PRE_CHARGING:
if (!board_get_ac())
- return ST_IDLE;
+ return ST_REINIT;
/* If the battery goes online after enable the charger,
* go into charging state.
*/
if (battery_temperature(&batt_temp) == EC_SUCCESS) {
if (!battery_start_charging_range(batt_temp))
- return ST_IDLE;
+ return ST_REINIT;
if (!battery_state_of_charge(&charge)) {
config_low_current_charging(charge);
if (charge >= 100)
- return ST_IDLE;
+ return ST_REINIT;
}
return ST_CHARGING;
}
@@ -256,7 +260,7 @@ static int calc_next_state(int state)
case ST_CHARGING:
/* Go back to idle state when AC is unplugged */
if (!board_get_ac())
- return ST_IDLE;
+ return ST_REINIT;
/*
* Disable charging on battery access error, or charging
@@ -265,7 +269,7 @@ static int calc_next_state(int state)
if (battery_temperature(&batt_temp)) {
CPUTS("[pmu] charging: unable to get battery "
"temperature\n");
- return ST_IDLE;
+ return ST_REINIT;
} else if (!battery_charging_range(batt_temp)) {
CPRINTF("[pmu] charging: temperature out of range "
"%dC\n",
@@ -279,13 +283,13 @@ static int calc_next_state(int state)
* - over current
*/
if (battery_status(&alarm))
- return ST_IDLE;
+ return ST_REINIT;
if (alarm & ALARM_CHARGING) {
CPUTS("[pmu] charging: battery alarm\n");
if (alarm & ALARM_OVER_TEMP)
return ST_CHARGING_ERROR;
- return ST_IDLE;
+ return ST_REINIT;
}
/*
@@ -295,7 +299,7 @@ static int calc_next_state(int state)
*/
if (pmu_is_charger_alarm()) {
CPUTS("[pmu] charging: charger alarm\n");
- return ST_IDLE;
+ return ST_REINIT;
}
return ST_CHARGING;
@@ -324,17 +328,17 @@ static int calc_next_state(int state)
return ST_CHARGING;
}
- return ST_IDLE;
+ return ST_REINIT;
case ST_DISCHARGING:
/* Go back to idle state when AC is plugged */
if (board_get_ac())
- return ST_IDLE;
+ return ST_REINIT;
/* Prepare EC sleep after system stopped discharging */
if (chipset_in_state(CHIPSET_STATE_ANY_OFF))
- return ST_IDLE;
+ return ST_REINIT;
/* Check battery discharging temperature range */
if (battery_temperature(&batt_temp) == 0) {
@@ -358,8 +362,7 @@ static int calc_next_state(int state)
* Moving average is rounded to integer.
*/
if (rsoc_moving_average(capacity) < 3) {
- system_off();
- return ST_IDLE;
+ return system_off();
} else if (capacity < 10) {
notify_battery_low();
}
@@ -368,7 +371,7 @@ static int calc_next_state(int state)
return ST_DISCHARGING;
}
- return ST_IDLE;
+ return ST_REINIT;
}
/* TODO: Merge charge_state.h and unify charge interface */
@@ -473,6 +476,8 @@ void pmu_charger_task(void)
enable_charging(1);
break;
case ST_IDLE:
+ case ST_REINIT:
+ case ST_BAD_COND:
case ST_DISCHARGING:
enable_charging(0);
/* Ignore charger error when discharging */
diff --git a/include/pmu_tpschrome.h b/include/pmu_tpschrome.h
index 57ba4c0a7e..71c78e0355 100644
--- a/include/pmu_tpschrome.h
+++ b/include/pmu_tpschrome.h
@@ -13,6 +13,8 @@
/* Non-SBS charging states */
enum charging_state {
ST_IDLE,
+ ST_REINIT,
+ ST_BAD_COND,
ST_PRE_CHARGING,
ST_CHARGING,
ST_CHARGING_ERROR,