Commit a8f6bd23 authored by Pali Rohár's avatar Pali Rohár Committed by Anton Vorontsov

bq27x00_battery: Cache energy property

Signed-off-by: default avatarPali Rohár <pali.rohar@gmail.com>
Signed-off-by: default avatarAnton Vorontsov <cbouatmailru@gmail.com>
parent 4b226c2c
...@@ -84,6 +84,7 @@ struct bq27x00_reg_cache { ...@@ -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) ...@@ -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) ...@@ -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, ...@@ -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, ...@@ -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;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment