bq27x00_battery: Cache energy property
Signed-off-by: Pali Rohár <pali.rohar@gmail.com> Signed-off-by: Anton Vorontsov <cbouatmailru@gmail.com>
This commit is contained in:
parent
4b226c2cf0
commit
a8f6bd23cc
@ -84,6 +84,7 @@ struct bq27x00_reg_cache {
|
|||||||
int charge_full;
|
int charge_full;
|
||||||
int cycle_count;
|
int cycle_count;
|
||||||
int capacity;
|
int capacity;
|
||||||
|
int energy;
|
||||||
int flags;
|
int flags;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -224,6 +225,28 @@ static int bq27x00_battery_read_ilmd(struct bq27x00_device_info *di)
|
|||||||
return ilmd;
|
return ilmd;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Return the battery Available energy in µWh
|
||||||
|
* Or < 0 if something fails.
|
||||||
|
*/
|
||||||
|
static int bq27x00_battery_read_energy(struct bq27x00_device_info *di)
|
||||||
|
{
|
||||||
|
int ae;
|
||||||
|
|
||||||
|
ae = bq27x00_read(di, BQ27x00_REG_AE, false);
|
||||||
|
if (ae < 0) {
|
||||||
|
dev_err(di->dev, "error reading available energy\n");
|
||||||
|
return ae;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (di->chip == BQ27500)
|
||||||
|
ae *= 1000;
|
||||||
|
else
|
||||||
|
ae = ae * 29200 / BQ27000_RS;
|
||||||
|
|
||||||
|
return ae;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Return the battery Cycle count total
|
* Return the battery Cycle count total
|
||||||
* Or < 0 if something fails.
|
* Or < 0 if something fails.
|
||||||
@ -268,12 +291,14 @@ static void bq27x00_update(struct bq27x00_device_info *di)
|
|||||||
if (cache.flags >= 0) {
|
if (cache.flags >= 0) {
|
||||||
if (!is_bq27500 && (cache.flags & BQ27000_FLAG_CI)) {
|
if (!is_bq27500 && (cache.flags & BQ27000_FLAG_CI)) {
|
||||||
cache.capacity = -ENODATA;
|
cache.capacity = -ENODATA;
|
||||||
|
cache.energy = -ENODATA;
|
||||||
cache.time_to_empty = -ENODATA;
|
cache.time_to_empty = -ENODATA;
|
||||||
cache.time_to_empty_avg = -ENODATA;
|
cache.time_to_empty_avg = -ENODATA;
|
||||||
cache.time_to_full = -ENODATA;
|
cache.time_to_full = -ENODATA;
|
||||||
cache.charge_full = -ENODATA;
|
cache.charge_full = -ENODATA;
|
||||||
} else {
|
} else {
|
||||||
cache.capacity = bq27x00_battery_read_rsoc(di);
|
cache.capacity = bq27x00_battery_read_rsoc(di);
|
||||||
|
cache.energy = bq27x00_battery_read_energy(di);
|
||||||
cache.time_to_empty = bq27x00_battery_read_time(di, BQ27x00_REG_TTE);
|
cache.time_to_empty = bq27x00_battery_read_time(di, BQ27x00_REG_TTE);
|
||||||
cache.time_to_empty_avg = bq27x00_battery_read_time(di, BQ27x00_REG_TTECP);
|
cache.time_to_empty_avg = bq27x00_battery_read_time(di, BQ27x00_REG_TTECP);
|
||||||
cache.time_to_full = bq27x00_battery_read_time(di, BQ27x00_REG_TTF);
|
cache.time_to_full = bq27x00_battery_read_time(di, BQ27x00_REG_TTF);
|
||||||
@ -435,32 +460,6 @@ static int bq27x00_battery_voltage(struct bq27x00_device_info *di,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Return the battery Available energy in µWh
|
|
||||||
* Or < 0 if something fails.
|
|
||||||
*/
|
|
||||||
static int bq27x00_battery_energy(struct bq27x00_device_info *di,
|
|
||||||
union power_supply_propval *val)
|
|
||||||
{
|
|
||||||
int ae;
|
|
||||||
|
|
||||||
ae = bq27x00_read(di, BQ27x00_REG_AE, false);
|
|
||||||
if (ae < 0) {
|
|
||||||
dev_err(di->dev, "error reading available energy\n");
|
|
||||||
return ae;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (di->chip == BQ27500)
|
|
||||||
ae *= 1000;
|
|
||||||
else
|
|
||||||
ae = ae * 29200 / BQ27000_RS;
|
|
||||||
|
|
||||||
val->intval = ae;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static int bq27x00_simple_value(int value,
|
static int bq27x00_simple_value(int value,
|
||||||
union power_supply_propval *val)
|
union power_supply_propval *val)
|
||||||
{
|
{
|
||||||
@ -539,7 +538,7 @@ static int bq27x00_battery_get_property(struct power_supply *psy,
|
|||||||
ret = bq27x00_simple_value(di->cache.cycle_count, val);
|
ret = bq27x00_simple_value(di->cache.cycle_count, val);
|
||||||
break;
|
break;
|
||||||
case POWER_SUPPLY_PROP_ENERGY_NOW:
|
case POWER_SUPPLY_PROP_ENERGY_NOW:
|
||||||
ret = bq27x00_battery_energy(di, val);
|
ret = bq27x00_simple_value(di->cache.energy, val);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
Loading…
Reference in New Issue
Block a user