summaryrefslogtreecommitdiff
path: root/driver/battery/smart.c
diff options
context:
space:
mode:
authorBill Richardson <wfrichar@chromium.org>2014-03-27 11:10:46 -0700
committerBill Richardson <wfrichar@chromium.org>2014-03-28 15:23:01 +0000
commit91a5fa01940764832c1b974d2022bee4e744f09c (patch)
tree3a772b75245da7c02cc4ddfa01752168577eee82 /driver/battery/smart.c
parentb2d87dc18ad0c6049a48959f4c2d7dfddaf301f1 (diff)
downloadchrome-ec-91a5fa01940764832c1b974d2022bee4e744f09c.tar.gz
Add more fields and error flags to struct batt_params
This adds two battery parameters that need to be monitored constantly: remaining_capacity and full_capacity (that one only changes occasionally, but we have to notify the AP when it does). It also adds the is_present field to indicate whether the battery is physically present or not (when we can tell), so we know whether to try to wake up a deep-discharged battery. Along with that, we clean up the error flags to provide indication of which fields were unable to be read, and replace the manual logical-or of all errors as they were set with a bitmask (BATT_FLAG_BAD_ANY). No functionality is changed, only new & better information is provided for use in the upcoming cleanup of the charge state machine. BUG=chrome-os-partner:20881 BRANCH=ToT TEST=make buildall -j All targets build; all tests pass. Change-Id: I4312c2fdd3cf2dd9570718e90571eff796b269db Signed-off-by: Bill Richardson <wfrichar@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/191917 Reviewed-by: Randall Spangler <rspangler@chromium.org>
Diffstat (limited to 'driver/battery/smart.c')
-rw-r--r--driver/battery/smart.c59
1 files changed, 41 insertions, 18 deletions
diff --git a/driver/battery/smart.c b/driver/battery/smart.c
index 8b2bd2f8e2..90b566009b 100644
--- a/driver/battery/smart.c
+++ b/driver/battery/smart.c
@@ -218,39 +218,62 @@ void battery_get_params(struct batt_params *batt)
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 */
+ batt->flags |= BATT_FLAG_BAD_TEMPERATURE;
if (sb_read(SB_RELATIVE_STATE_OF_CHARGE, &batt->state_of_charge))
- batt->flags |= BATT_FLAG_BAD_ANY | BATT_FLAG_BAD_CHARGE_PERCENT;
+ batt->flags |= BATT_FLAG_BAD_STATE_OF_CHARGE;
if (sb_read(SB_VOLTAGE, &batt->voltage))
- batt->flags |= BATT_FLAG_BAD_ANY | BATT_FLAG_BAD_VOLTAGE;
-
- /* Ensure battery current is set to 0 if unable to read it */
- v = 0;
+ batt->flags |= BATT_FLAG_BAD_VOLTAGE;
+ /* This is a signed 16-bit value. */
if (sb_read(SB_CURRENT, &v))
- batt->flags |= BATT_FLAG_BAD_ANY;
+ batt->flags |= BATT_FLAG_BAD_CURRENT;
+ else
+ batt->current = (int16_t)v;
+
+ if (sb_read(SB_CHARGING_VOLTAGE, &batt->desired_voltage))
+ batt->flags |= BATT_FLAG_BAD_DESIRED_VOLTAGE;
+
+ if (sb_read(SB_CHARGING_CURRENT, &batt->desired_current))
+ batt->flags |= BATT_FLAG_BAD_DESIRED_CURRENT;
+
+ if (battery_remaining_capacity(&batt->remaining_capacity))
+ batt->flags |= BATT_FLAG_BAD_REMAINING_CAPACITY;
- batt->current = (int16_t)v;
+ if (battery_full_charge_capacity(&batt->full_capacity))
+ batt->flags |= BATT_FLAG_BAD_FULL_CAPACITY;
- if (sb_read(SB_CHARGING_VOLTAGE, &batt->desired_voltage) ||
- sb_read(SB_CHARGING_CURRENT, &batt->desired_current))
- batt->flags |= BATT_FLAG_BAD_ANY;
+ /* If any of those reads worked, the battery is responsive */
+ if ((batt->flags & BATT_FLAG_BAD_ANY) != BATT_FLAG_BAD_ANY)
+ batt->flags |= BATT_FLAG_RESPONSIVE;
+
+#if defined(CONFIG_BATTERY_PRESENT_CUSTOM) || \
+ defined(CONFIG_BATTERY_PRESENT_GPIO)
+ /* Hardware can tell us for certain */
+ batt->is_present = battery_is_present();
+#else
+ /* No hardware test, so we only know it's there if it responds */
+ if (batt->flags & BATT_FLAG_RESPONSIVE)
+ batt->is_present = BP_YES;
+ else
+ batt->is_present = BP_NOT_SURE;
+#endif
/*
* Charging allowed if both desired voltage and current are nonzero
- * and battery isn't full.
+ * and battery isn't full (and we read them all correctly).
*/
- if (batt->desired_voltage && batt->desired_current &&
- batt->state_of_charge < BATTERY_LEVEL_FULL) {
+ if (!(batt->flags & (BATT_FLAG_BAD_DESIRED_VOLTAGE |
+ BATT_FLAG_BAD_DESIRED_CURRENT |
+ BATT_FLAG_BAD_STATE_OF_CHARGE)) &&
+ batt->desired_voltage &&
+ batt->desired_current &&
+ batt->state_of_charge < BATTERY_LEVEL_FULL)
batt->flags |= BATT_FLAG_WANT_CHARGE;
- } else {
+ else
/* Force both to zero */
batt->desired_voltage = batt->desired_current = 0;
- }
}
/*****************************************************************************/