summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDave Parker <dparker@chromium.org>2014-04-05 00:12:29 -0700
committerchrome-internal-fetch <chrome-internal-fetch@google.com>2014-04-07 17:38:21 +0000
commit3e4114921efb380074a575cf243f9fb173a9c283 (patch)
tree2e8f10c1d0556d84e731877b13e3d2c7ee2ebe52
parentc19d5b53c761ab12e59ab3d4f3644d9ba41103c9 (diff)
downloadchrome-ec-3e4114921efb380074a575cf243f9fb173a9c283.tar.gz
Smart Battery: Buffer battery parameters while they are updated
BUG=chrome-os-partner:27736 BRANCH=ToT TEST=Charge battery. Check that charging LED doesn't occasionally blink amber. Change-Id: I57d9d432bce4ed28678dddc43fa5166905525557 Signed-off-by: Dave Parker <dparker@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/193338 Reviewed-by: Bill Richardson <wfrichar@chromium.org>
-rw-r--r--driver/battery/smart.c44
1 files changed, 24 insertions, 20 deletions
diff --git a/driver/battery/smart.c b/driver/battery/smart.c
index 8b2bd2f8e2..2d314e5e6f 100644
--- a/driver/battery/smart.c
+++ b/driver/battery/smart.c
@@ -212,45 +212,49 @@ test_mockable int battery_device_chemistry(char *dest, int size)
void battery_get_params(struct batt_params *batt)
{
+ struct batt_params batt_new = {0};
int v;
- /* Reset battery parameters */
- memset(batt, 0, sizeof(*batt));
-
- if (sb_read(SB_TEMPERATURE, &batt->temperature))
- batt->flags |= BATT_FLAG_BAD_ANY;
- else
- batt->flags |= BATT_FLAG_RESPONSIVE; /* Battery is responding */
+ if (sb_read(SB_TEMPERATURE, &batt_new.temperature)) {
+ batt_new.flags |= BATT_FLAG_BAD_ANY;
+ } else {
+ /* Battery is responding */
+ batt_new.flags |= BATT_FLAG_RESPONSIVE;
+ }
- if (sb_read(SB_RELATIVE_STATE_OF_CHARGE, &batt->state_of_charge))
- batt->flags |= BATT_FLAG_BAD_ANY | BATT_FLAG_BAD_CHARGE_PERCENT;
+ if (sb_read(SB_RELATIVE_STATE_OF_CHARGE, &batt_new.state_of_charge))
+ batt_new.flags |= BATT_FLAG_BAD_ANY |
+ BATT_FLAG_BAD_CHARGE_PERCENT;
- if (sb_read(SB_VOLTAGE, &batt->voltage))
- batt->flags |= BATT_FLAG_BAD_ANY | BATT_FLAG_BAD_VOLTAGE;
+ if (sb_read(SB_VOLTAGE, &batt_new.voltage))
+ batt_new.flags |= BATT_FLAG_BAD_ANY | BATT_FLAG_BAD_VOLTAGE;
/* Ensure battery current is set to 0 if unable to read it */
v = 0;
if (sb_read(SB_CURRENT, &v))
- batt->flags |= BATT_FLAG_BAD_ANY;
+ batt_new.flags |= BATT_FLAG_BAD_ANY;
- batt->current = (int16_t)v;
+ batt_new.current = (int16_t)v;
- if (sb_read(SB_CHARGING_VOLTAGE, &batt->desired_voltage) ||
- sb_read(SB_CHARGING_CURRENT, &batt->desired_current))
- batt->flags |= BATT_FLAG_BAD_ANY;
+ if (sb_read(SB_CHARGING_VOLTAGE, &batt_new.desired_voltage) ||
+ sb_read(SB_CHARGING_CURRENT, &batt_new.desired_current))
+ batt_new.flags |= BATT_FLAG_BAD_ANY;
/*
* Charging allowed if both desired voltage and current are nonzero
* and battery isn't full.
*/
- if (batt->desired_voltage && batt->desired_current &&
- batt->state_of_charge < BATTERY_LEVEL_FULL) {
- batt->flags |= BATT_FLAG_WANT_CHARGE;
+ if (batt_new.desired_voltage && batt_new.desired_current &&
+ batt_new.state_of_charge < BATTERY_LEVEL_FULL) {
+ batt_new.flags |= BATT_FLAG_WANT_CHARGE;
} else {
/* Force both to zero */
- batt->desired_voltage = batt->desired_current = 0;
+ batt_new.desired_voltage = batt_new.desired_current = 0;
}
+
+ /* Update visible battery parameters */
+ memcpy(batt, &batt_new, sizeof(*batt));
}
/*****************************************************************************/