diff options
-rw-r--r-- | common/battery_precharge.c | 10 | ||||
-rw-r--r-- | common/charge_state.c | 56 | ||||
-rw-r--r-- | include/charge_state.h | 9 |
3 files changed, 43 insertions, 32 deletions
diff --git a/common/battery_precharge.c b/common/battery_precharge.c index 10cae97269..663002cfc8 100644 --- a/common/battery_precharge.c +++ b/common/battery_precharge.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012 The Chromium OS Authors. All rights reserved. +/* Copyright (c) 2013 The Chromium OS Authors. All rights reserved. * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. * @@ -115,7 +115,7 @@ enum power_state trickle_charge(struct power_state_context *ctx) if (curr->ac != ctx->prev.ac) { ctx->trickle_charging_time.val = 0; if (!curr->ac) - return PWR_STATE_INIT; + return PWR_STATE_REINIT; } /* Start timer */ @@ -127,7 +127,7 @@ enum power_state trickle_charge(struct power_state_context *ctx) /* Check charger reset */ if (curr->charging_voltage == 0 || curr->charging_current == 0) { ctx->trickle_charging_time.val = 0; - return PWR_STATE_INIT; + return PWR_STATE_REINIT; } /* @@ -147,7 +147,7 @@ enum power_state trickle_charge(struct power_state_context *ctx) if (batt->desired_current > cinfo->current_min) { trickle_charging_init(); ctx->trickle_charging_time.val = 0; - return PWR_STATE_INIT; + return PWR_STATE_REINIT; } /* @@ -172,7 +172,7 @@ enum power_state trickle_charge(struct power_state_context *ctx) /* Exit trickle charging state */ trickle_charging_init(); ctx->trickle_charging_time.val = 0; - return PWR_STATE_INIT; + return PWR_STATE_REINIT; } charger_set_voltage(curr->charging_voltage); ctx->charger_update_time = get_time(); diff --git a/common/charge_state.c b/common/charge_state.c index c15fc0e7d1..2ab00a68f2 100644 --- a/common/charge_state.c +++ b/common/charge_state.c @@ -348,7 +348,7 @@ static enum power_state state_idle(struct power_state_context *ctx) return PWR_STATE_UNCHANGE; if (!ctx->curr.ac) - return PWR_STATE_INIT; + return PWR_STATE_REINIT; if (ctx->curr.error) return PWR_STATE_ERROR; @@ -356,7 +356,7 @@ static enum power_state state_idle(struct power_state_context *ctx) /* Prevent charging in idle mode */ if (ctx->curr.charging_voltage || ctx->curr.charging_current) - return PWR_STATE_INIT; + return PWR_STATE_REINIT; if (batt->state_of_charge >= BATTERY_LEVEL_FULL) return PWR_STATE_UNCHANGE; @@ -420,10 +420,10 @@ static enum power_state state_charge(struct power_state_context *ctx) /* Check charger reset */ if (curr->charging_voltage == 0 || curr->charging_current == 0) - return PWR_STATE_INIT; + return PWR_STATE_REINIT; if (!curr->ac) - return PWR_STATE_INIT; + return PWR_STATE_REINIT; if (batt->state_of_charge >= BATTERY_LEVEL_FULL) { if (charger_set_voltage(0) || charger_set_current(0)) @@ -484,7 +484,7 @@ static enum power_state state_discharge(struct power_state_context *ctx) { struct batt_params *batt = &ctx->curr.batt; if (ctx->curr.ac) - return PWR_STATE_INIT; + return PWR_STATE_REINIT; if (ctx->curr.error) return PWR_STATE_ERROR; @@ -510,7 +510,7 @@ static enum power_state state_error(struct power_state_context *ctx) if (!ctx->curr.error) { logged_error = 0; - return PWR_STATE_INIT; + return PWR_STATE_REINIT; } /* Debug output */ @@ -620,27 +620,12 @@ void charge_state_machine_task(void) int rv_setled = 0; uint64_t last_setled_time = 0; - ctx->prev.state = PWR_STATE_INIT; - ctx->curr.state = PWR_STATE_INIT; - ctx->trickle_charging_time.val = 0; - ctx->battery = battery_get_info(); - ctx->charger = charger_get_info(); - ctx->battery_present = 1; - - /* Set up LPC direct memmap */ - ctx->memmap_batt_volt = - (uint32_t *)host_get_memmap(EC_MEMMAP_BATT_VOLT); - ctx->memmap_batt_rate = - (uint32_t *)host_get_memmap(EC_MEMMAP_BATT_RATE); - ctx->memmap_batt_cap = - (uint32_t *)host_get_memmap(EC_MEMMAP_BATT_CAP); - ctx->memmap_batt_flags = host_get_memmap(EC_MEMMAP_BATT_FLAG); - while (1) { state_common(ctx); switch (ctx->prev.state) { case PWR_STATE_INIT: + case PWR_STATE_REINIT: new_state = state_init(ctx); break; case PWR_STATE_IDLE0: @@ -687,8 +672,9 @@ void charge_state_machine_task(void) if (state_machine_force_idle && ctx->prev.state != PWR_STATE_IDLE0 && ctx->prev.state != PWR_STATE_IDLE && - ctx->prev.state != PWR_STATE_INIT) - new_state = PWR_STATE_INIT; + ctx->prev.state != PWR_STATE_INIT && + ctx->prev.state != PWR_STATE_REINIT) + new_state = PWR_STATE_REINIT; if (new_state) { ctx->curr.state = new_state; @@ -821,6 +807,28 @@ static void charge_hook(void) DECLARE_HOOK(HOOK_CHIPSET_RESUME, charge_hook, HOOK_PRIO_DEFAULT); DECLARE_HOOK(HOOK_AC_CHANGE, charge_hook, HOOK_PRIO_DEFAULT); +static void charge_init(void) +{ + struct power_state_context *ctx = &task_ctx; + + ctx->prev.state = PWR_STATE_INIT; + ctx->curr.state = PWR_STATE_INIT; + ctx->trickle_charging_time.val = 0; + ctx->battery = battery_get_info(); + ctx->charger = charger_get_info(); + ctx->battery_present = 1; + + /* Set up LPC direct memmap */ + ctx->memmap_batt_volt = + (uint32_t *)host_get_memmap(EC_MEMMAP_BATT_VOLT); + ctx->memmap_batt_rate = + (uint32_t *)host_get_memmap(EC_MEMMAP_BATT_RATE); + ctx->memmap_batt_cap = + (uint32_t *)host_get_memmap(EC_MEMMAP_BATT_CAP); + ctx->memmap_batt_flags = host_get_memmap(EC_MEMMAP_BATT_FLAG); +} +DECLARE_HOOK(HOOK_INIT, charge_init, HOOK_PRIO_DEFAULT); + /*****************************************************************************/ /* Host commands */ diff --git a/include/charge_state.h b/include/charge_state.h index 182a99f703..5f90de36fd 100644 --- a/include/charge_state.h +++ b/include/charge_state.h @@ -1,9 +1,9 @@ -/* Copyright (c) 2012 The Chromium OS Authors. All rights reserved. +/* Copyright (c) 2013 The Chromium OS Authors. All rights reserved. * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. - * */ +#include "battery_pack.h" #include "timer.h" #ifndef __CROS_EC_CHARGE_STATE_H @@ -44,8 +44,10 @@ enum power_state { /* Meta-state; unchanged from previous time through task loop */ PWR_STATE_UNCHANGE = 0, - /* (Re-)initalizing charge state machine */ + /* Initializing charge state machine at boot */ PWR_STATE_INIT, + /* Re-initializing charge state machine */ + PWR_STATE_REINIT, /* Just transitioned from init to idle */ PWR_STATE_IDLE0, /* Idle; AC present */ @@ -67,6 +69,7 @@ enum power_state { { \ "unchange", \ "init", \ + "reinit", \ "idle0", \ "idle", \ "discharge", \ |