bq27x00_battery: Add support for property POWER_SUPPLY_PROP_CAPACITY_LEVEL
Signed-off-by: Pali Rohár <pali.rohar@gmail.com> Signed-off-by: Anton Vorontsov <cbouatmailru@gmail.com>
This commit is contained in:
Родитель
b68f6216c5
Коммит
d66bab3f3a
|
@ -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;
|
||||
|
|
Загрузка…
Ссылка в новой задаче