summaryrefslogtreecommitdiff
path: root/driver/battery/bq27541.c
diff options
context:
space:
mode:
Diffstat (limited to 'driver/battery/bq27541.c')
-rw-r--r--driver/battery/bq27541.c89
1 files changed, 50 insertions, 39 deletions
diff --git a/driver/battery/bq27541.c b/driver/battery/bq27541.c
index 1060a6ba13..72ec30b6fd 100644
--- a/driver/battery/bq27541.c
+++ b/driver/battery/bq27541.c
@@ -87,24 +87,9 @@ int battery_device_name(char *device_name, int buf_size)
return rv;
}
-int battery_temperature(int *deci_kelvin)
-{
- return bq27541_read(REG_TEMPERATURE, deci_kelvin);
-}
-
-int battery_voltage(int *voltage)
-{
- return bq27541_read(REG_VOLTAGE, voltage);
-}
-
-int battery_state_of_charge(int *percent)
-{
- return bq27541_read(REG_STATE_OF_CHARGE, percent);
-}
-
int battery_state_of_charge_abs(int *percent)
{
- return battery_state_of_charge(percent);
+ return EC_ERROR_UNIMPLEMENTED;
}
int battery_remaining_capacity(int *capacity)
@@ -137,18 +122,6 @@ int battery_design_capacity(int *capacity)
return bq27541_read(REG_DESIGN_CAPACITY, capacity);
}
-int battery_average_current(int *current)
-{
- int rv = bq27541_read(REG_AVERAGE_CURRENT, current);
- *current = (int)((int16_t)*current);
- return rv;
-}
-
-int battery_current(int *current)
-{
- return battery_average_current(current);
-}
-
int battery_time_at_rate(int rate, int *minutes)
{
int rv;
@@ -174,17 +147,18 @@ int battery_serial_number(int *serial)
return EC_ERROR_UNIMPLEMENTED;
}
-int battery_desired_voltage(int *voltage)
-{
- return EC_ERROR_UNIMPLEMENTED;
-}
-
int battery_design_voltage(int *voltage)
{
return EC_ERROR_UNIMPLEMENTED;
}
-int battery_charging_allowed(int *allowed)
+/**
+ * Check if battery allows charging.
+ *
+ * @param allowed Non-zero if charging allowed; zero if not allowed.
+ * @return non-zero if error.
+ */
+static int battery_charging_allowed(int *allowed)
{
int rv, val;
@@ -195,11 +169,6 @@ int battery_charging_allowed(int *allowed)
return EC_SUCCESS;
}
-int battery_desired_current(int *current)
-{
- return EC_ERROR_UNIMPLEMENTED;
-}
-
int battery_get_mode(int *mode)
{
return EC_ERROR_UNIMPLEMENTED;
@@ -222,3 +191,45 @@ 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;
+
+ /* Reset flags */
+ batt->flags = 0;
+
+ if (bq27541_read(REG_TEMPERATURE, &batt->temperature))
+ batt->flags |= BATT_FLAG_BAD_ANY;
+ else
+ batt->flags |= BATT_FLAG_RESPONSIVE; /* Battery is responding */
+
+ if (bq27541_read(REG_STATE_OF_CHARGE, &batt->state_of_charge))
+ batt->flags |= BATT_FLAG_BAD_ANY | BATT_FLAG_BAD_CHARGE_PERCENT;
+
+ if (bq27541_read(REG_VOLTAGE, &batt->voltage))
+ batt->flags |= BATT_FLAG_BAD_ANY | BATT_FLAG_BAD_VOLTAGE;
+
+ v = 0;
+ if (bq27541_read(REG_AVERAGE_CURRENT, &v))
+ batt->flags |= BATT_FLAG_BAD_ANY;
+ batt->current = (int16_t)v;
+
+ /* Default to not desiring voltage and current */
+ batt->desired_voltage = batt->desired_current = 0;
+
+ v = 0;
+ if (battery_charging_allowed(&v)) {
+ batt->flags |= BATT_FLAG_BAD_ANY;
+ } else if (v) {
+ batt->flags |= BATT_FLAG_WANT_CHARGE;
+
+ /*
+ * Desired voltage and current are not provided by the battery.
+ * So ask for battery's max voltage and an arbitrarily large
+ * current.
+ */
+ batt->desired_voltage = battery_get_info()->voltage_max;
+ batt->desired_current = 99999;
+ }
+}