|
@@ -54,12 +54,16 @@
|
|
|
|
|
|
#define BQ27000_REG_RSOC 0x0B /* Relative State-of-Charge */
|
|
|
#define BQ27000_REG_ILMD 0x76 /* Initial last measured discharge */
|
|
|
-#define BQ27000_FLAG_CHGS BIT(7)
|
|
|
+#define BQ27000_FLAG_EDVF BIT(0) /* Final End-of-Discharge-Voltage flag */
|
|
|
+#define BQ27000_FLAG_EDV1 BIT(1) /* First End-of-Discharge-Voltage flag */
|
|
|
#define BQ27000_FLAG_FC BIT(5)
|
|
|
+#define BQ27000_FLAG_CHGS BIT(7) /* Charge state flag */
|
|
|
|
|
|
#define BQ27500_REG_SOC 0x2C
|
|
|
#define BQ27500_REG_DCAP 0x3C /* Design capacity */
|
|
|
#define BQ27500_FLAG_DSC BIT(0)
|
|
|
+#define BQ27500_FLAG_SOCF BIT(1) /* State-of-Charge threshold final */
|
|
|
+#define BQ27500_FLAG_SOC1 BIT(2) /* State-of-Charge threshold 1 */
|
|
|
#define BQ27500_FLAG_FC BIT(9)
|
|
|
|
|
|
#define BQ27000_RS 20 /* Resistor sense */
|
|
@@ -106,6 +110,7 @@ static enum power_supply_property bq27x00_battery_props[] = {
|
|
|
POWER_SUPPLY_PROP_VOLTAGE_NOW,
|
|
|
POWER_SUPPLY_PROP_CURRENT_NOW,
|
|
|
POWER_SUPPLY_PROP_CAPACITY,
|
|
|
+ POWER_SUPPLY_PROP_CAPACITY_LEVEL,
|
|
|
POWER_SUPPLY_PROP_TEMP,
|
|
|
POWER_SUPPLY_PROP_TIME_TO_EMPTY_NOW,
|
|
|
POWER_SUPPLY_PROP_TIME_TO_EMPTY_AVG,
|
|
@@ -373,6 +378,36 @@ static int bq27x00_battery_status(struct bq27x00_device_info *di,
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+static int bq27x00_battery_capacity_level(struct bq27x00_device_info *di,
|
|
|
+ union power_supply_propval *val)
|
|
|
+{
|
|
|
+ int level;
|
|
|
+
|
|
|
+ if (di->chip == BQ27500) {
|
|
|
+ if (di->cache.flags & BQ27500_FLAG_FC)
|
|
|
+ level = POWER_SUPPLY_CAPACITY_LEVEL_FULL;
|
|
|
+ else if (di->cache.flags & BQ27500_FLAG_SOC1)
|
|
|
+ level = POWER_SUPPLY_CAPACITY_LEVEL_LOW;
|
|
|
+ else if (di->cache.flags & BQ27500_FLAG_SOCF)
|
|
|
+ level = POWER_SUPPLY_CAPACITY_LEVEL_CRITICAL;
|
|
|
+ else
|
|
|
+ level = POWER_SUPPLY_CAPACITY_LEVEL_NORMAL;
|
|
|
+ } else {
|
|
|
+ if (di->cache.flags & BQ27000_FLAG_FC)
|
|
|
+ level = POWER_SUPPLY_CAPACITY_LEVEL_FULL;
|
|
|
+ else if (di->cache.flags & BQ27000_FLAG_EDV1)
|
|
|
+ level = POWER_SUPPLY_CAPACITY_LEVEL_LOW;
|
|
|
+ else if (di->cache.flags & BQ27000_FLAG_EDVF)
|
|
|
+ level = POWER_SUPPLY_CAPACITY_LEVEL_CRITICAL;
|
|
|
+ else
|
|
|
+ level = POWER_SUPPLY_CAPACITY_LEVEL_NORMAL;
|
|
|
+ }
|
|
|
+
|
|
|
+ val->intval = level;
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
/*
|
|
|
* Return the battery Voltage in milivolts
|
|
|
* Or < 0 if something fails.
|
|
@@ -464,6 +499,9 @@ static int bq27x00_battery_get_property(struct power_supply *psy,
|
|
|
case POWER_SUPPLY_PROP_CAPACITY:
|
|
|
ret = bq27x00_simple_value(di->cache.capacity, val);
|
|
|
break;
|
|
|
+ case POWER_SUPPLY_PROP_CAPACITY_LEVEL:
|
|
|
+ ret = bq27x00_battery_capacity_level(di, val);
|
|
|
+ break;
|
|
|
case POWER_SUPPLY_PROP_TEMP:
|
|
|
ret = bq27x00_battery_temperature(di, val);
|
|
|
break;
|