summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--common/charge_state.c24
-rw-r--r--include/charge_state.h1
2 files changed, 21 insertions, 4 deletions
diff --git a/common/charge_state.c b/common/charge_state.c
index 3a91afd273..8b4c6219f8 100644
--- a/common/charge_state.c
+++ b/common/charge_state.c
@@ -178,14 +178,29 @@ static int state_common(struct power_state_context *ctx)
rv = battery_temperature(&batt->temperature);
if (rv) {
/* Check low battery condition and retry */
- if (curr->ac && !(curr->error & F_CHARGER_MASK) &&
+ if (curr->ac && ctx->battery_present == 1 &&
+ !(curr->error & F_CHARGER_MASK) &&
(curr->charging_voltage == 0 ||
curr->charging_current == 0)) {
- charger_set_voltage(ctx->battery->voltage_min);
+ ctx->battery_present = 0;
+ /*
+ * Try to revive ultra low voltage pack.
+ * Charge battery pack with minimum current
+ * and maximum voltage for 30 seconds.
+ */
+ charger_set_voltage(ctx->battery->voltage_max);
charger_set_current(ctx->charger->current_min);
- usleep(SECOND);
- rv = battery_temperature(&batt->temperature);
+ for (d = 0; d < 30; d++) {
+ usleep(SECOND);
+ rv = battery_temperature(&batt->temperature);
+ if (rv == 0) {
+ ctx->battery_present = 1;
+ break;
+ }
+ }
}
+ } else {
+ ctx->battery_present = 1;
}
if (rv)
@@ -594,6 +609,7 @@ void charge_state_machine_task(void)
ctx->trickle_charging_time.val = 0;
ctx->battery = battery_get_info();
ctx->charger = charger_get_info();
+ ctx->battery_present = 1;
/* Setup LPC direct memmap */
ctx->memmap_batt_volt =
diff --git a/include/charge_state.h b/include/charge_state.h
index d3b310607e..eda78abfd9 100644
--- a/include/charge_state.h
+++ b/include/charge_state.h
@@ -114,6 +114,7 @@ struct power_state_context {
timestamp_t charger_update_time;
timestamp_t trickle_charging_time;
timestamp_t voltage_debounce_time;
+ int battery_present;
};
/* Trickle charging state handler.