diff options
-rw-r--r-- | drivers/power/supply/bq27xxx_battery.c | 17 |
1 files changed, 15 insertions, 2 deletions
diff --git a/drivers/power/supply/bq27xxx_battery.c b/drivers/power/supply/bq27xxx_battery.c index abc6d9329776..a1d01791df01 100644 --- a/drivers/power/supply/bq27xxx_battery.c +++ b/drivers/power/supply/bq27xxx_battery.c @@ -2149,6 +2149,10 @@ static int bq27xxx_battery_get_property(struct power_supply *psy, break; case POWER_SUPPLY_PROP_CAPACITY: ret = bq27xxx_simple_value(di->cache.capacity, val); + /* If 0 is reported, it is expected that EDVF is also set */ + if (!ret && di->opts & BQ27XXX_O_ZERO && + !(di->cache.flags & BQ27000_FLAG_EDVF)) + return -EINVAL; break; case POWER_SUPPLY_PROP_CAPACITY_LEVEL: ret = bq27xxx_battery_capacity_level(di, val); @@ -2172,10 +2176,15 @@ static int bq27xxx_battery_get_property(struct power_supply *psy, val->intval = POWER_SUPPLY_TECHNOLOGY_LION; break; case POWER_SUPPLY_PROP_CHARGE_NOW: - if (di->regs[BQ27XXX_REG_NAC] != INVALID_REG_ADDR) + if (di->regs[BQ27XXX_REG_NAC] != INVALID_REG_ADDR) { ret = bq27xxx_battery_read_nac(di, val); - else + /* If 0 is reported, it is expected that EDVF is also set */ + if (!ret && di->opts & BQ27XXX_O_ZERO && + !(di->cache.flags & BQ27000_FLAG_EDVF)) + return -EINVAL; + } else { ret = bq27xxx_battery_read_rc(di, val); + } break; case POWER_SUPPLY_PROP_CHARGE_FULL: ret = bq27xxx_battery_read_fcc(di, val); @@ -2200,6 +2209,10 @@ static int bq27xxx_battery_get_property(struct power_supply *psy, break; case POWER_SUPPLY_PROP_ENERGY_NOW: ret = bq27xxx_battery_read_energy(di, val); + /* If 0 is reported, it is expected that EDVF is also set */ + if (!ret && di->opts & BQ27XXX_O_ZERO && + !(di->cache.flags & BQ27000_FLAG_EDVF)) + return -EINVAL; break; case POWER_SUPPLY_PROP_POWER_AVG: ret = bq27xxx_battery_pwr_avg(di, val); |