summaryrefslogtreecommitdiff
path: root/driver
diff options
context:
space:
mode:
authorRandall Spangler <rspangler@chromium.org>2013-11-07 14:36:02 -0800
committerchrome-internal-fetch <chrome-internal-fetch@google.com>2013-12-02 22:03:54 +0000
commit40a1e7fa75b9fd51cf62ee8d725a5b35d846dbd5 (patch)
tree0d403622ef503e01417e050ca6457ebf65e44643 /driver
parentc0ec787ba10dd3ef5fc089cf1449468ec45ff668 (diff)
downloadchrome-ec-40a1e7fa75b9fd51cf62ee8d725a5b35d846dbd5.tar.gz
Cleanly force battery to mAh mode when reading capacity
Smart batteries can report capacity in mAh or 10mW units. We forced the units to mAh in charge_state.c's main loop, but that doesn't guarantee that they're actually set before the capacity is read. It's cleaner to check the capacity reporting mode when actually reading the capacity. BUG=chrome-os-partner:20881 BRANCH=none TEST=battery command reports the same capacity data before/after change (on rambi, design=2940 mAh) Change-Id: I4a4c80eaade72bb09627d5d65693c097e264a992 Signed-off-by: Randall Spangler <rspangler@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/176154
Diffstat (limited to 'driver')
-rw-r--r--driver/battery/bq27541.c13
-rw-r--r--driver/battery/smart.c52
2 files changed, 27 insertions, 38 deletions
diff --git a/driver/battery/bq27541.c b/driver/battery/bq27541.c
index 72ec30b6fd..43b669476b 100644
--- a/driver/battery/bq27541.c
+++ b/driver/battery/bq27541.c
@@ -179,19 +179,6 @@ int battery_status(int *status)
return EC_ERROR_UNIMPLEMENTED;
}
-int battery_is_in_10mw_mode(int *val)
-{
- /* Always using mAh unit */
- *val = 0;
- return EC_SUCCESS;
-}
-
-int battery_set_10mw_mode(int enabled)
-{
- /* Not supported by this battery chip */
- return EC_ERROR_INVAL;
-}
-
void battery_get_params(struct batt_params *batt)
{
int v;
diff --git a/driver/battery/smart.c b/driver/battery/smart.c
index 7feca24bda..8b2bd2f8e2 100644
--- a/driver/battery/smart.c
+++ b/driver/battery/smart.c
@@ -37,32 +37,23 @@ int battery_get_mode(int *mode)
return sb_read(SB_BATTERY_MODE, mode);
}
-int battery_set_mode(int mode)
-{
- return sb_write(SB_BATTERY_MODE, mode);
-}
-
-int battery_is_in_10mw_mode(int *ret)
-{
- int val;
- int rv = battery_get_mode(&val);
- if (rv)
- return rv;
- *ret = val & MODE_CAPACITY;
- return EC_SUCCESS;
-}
+/**
+ * Force battery to mAh mode (instead of 10mW mode) for reporting capacity.
+ *
+ * @return non-zero if error.
+ */
-int battery_set_10mw_mode(int enabled)
+static int battery_force_mah_mode(void)
{
int val, rv;
rv = battery_get_mode(&val);
if (rv)
return rv;
- if (enabled)
- val |= MODE_CAPACITY;
- else
- val &= ~MODE_CAPACITY;
- return battery_set_mode(val);
+
+ if (val & MODE_CAPACITY)
+ rv = sb_write(SB_BATTERY_MODE, val & ~MODE_CAPACITY);
+
+ return rv;
}
int battery_state_of_charge_abs(int *percent)
@@ -72,11 +63,19 @@ int battery_state_of_charge_abs(int *percent)
int battery_remaining_capacity(int *capacity)
{
+ int rv = battery_force_mah_mode();
+ if (rv)
+ return rv;
+
return sb_read(SB_REMAINING_CAPACITY, capacity);
}
int battery_full_charge_capacity(int *capacity)
{
+ int rv = battery_force_mah_mode();
+ if (rv)
+ return rv;
+
return sb_read(SB_FULL_CHARGE_CAPACITY, capacity);
}
@@ -107,11 +106,12 @@ int battery_cycle_count(int *count)
return sb_read(SB_CYCLE_COUNT, count);
}
-/* Designed battery capacity
- * unit: mAh or 10mW depends on battery mode
- */
int battery_design_capacity(int *capacity)
{
+ int rv = battery_force_mah_mode();
+ if (rv)
+ return rv;
+
return sb_read(SB_DESIGN_CAPACITY, capacity);
}
@@ -228,11 +228,13 @@ void battery_get_params(struct batt_params *batt)
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;
+
if (sb_read(SB_CURRENT, &v))
batt->flags |= BATT_FLAG_BAD_ANY;
- else
- batt->current = (int16_t)v;
+
+ batt->current = (int16_t)v;
if (sb_read(SB_CHARGING_VOLTAGE, &batt->desired_voltage) ||
sb_read(SB_CHARGING_CURRENT, &batt->desired_current))