Merge power-supply 'fixes' branch
authorSebastian Reichel <sebastian.reichel@collabora.com>
Sun, 22 May 2022 21:03:29 +0000 (23:03 +0200)
committerSebastian Reichel <sebastian.reichel@collabora.com>
Sun, 22 May 2022 21:03:29 +0000 (23:03 +0200)
Merge power-supply fixes, that missed the v5.18 merge window
into power-supply's for-next branch.

Signed-off-by: Sebastian Reichel <sebastian.reichel@collabora.com>
drivers/power/supply/bq24190_charger.c
drivers/power/supply/bq27xxx_battery.c

index aa1a589..27f5c76 100644 (file)
@@ -455,11 +455,9 @@ static ssize_t bq24190_sysfs_show(struct device *dev,
        if (!info)
                return -EINVAL;
 
-       ret = pm_runtime_get_sync(bdi->dev);
-       if (ret < 0) {
-               pm_runtime_put_noidle(bdi->dev);
+       ret = pm_runtime_resume_and_get(bdi->dev);
+       if (ret < 0)
                return ret;
-       }
 
        ret = bq24190_read_mask(bdi, info->reg, info->mask, info->shift, &v);
        if (ret)
@@ -490,11 +488,9 @@ static ssize_t bq24190_sysfs_store(struct device *dev,
        if (ret < 0)
                return ret;
 
-       ret = pm_runtime_get_sync(bdi->dev);
-       if (ret < 0) {
-               pm_runtime_put_noidle(bdi->dev);
+       ret = pm_runtime_resume_and_get(bdi->dev);
+       if (ret < 0)
                return ret;
-       }
 
        ret = bq24190_write_mask(bdi, info->reg, info->mask, info->shift, v);
        if (ret)
@@ -512,10 +508,9 @@ static int bq24190_set_otg_vbus(struct bq24190_dev_info *bdi, bool enable)
        union power_supply_propval val = { .intval = bdi->charge_type };
        int ret;
 
-       ret = pm_runtime_get_sync(bdi->dev);
+       ret = pm_runtime_resume_and_get(bdi->dev);
        if (ret < 0) {
                dev_warn(bdi->dev, "pm_runtime_get failed: %i\n", ret);
-               pm_runtime_put_noidle(bdi->dev);
                return ret;
        }
 
@@ -551,10 +546,9 @@ static int bq24190_vbus_is_enabled(struct regulator_dev *dev)
        int ret;
        u8 val;
 
-       ret = pm_runtime_get_sync(bdi->dev);
+       ret = pm_runtime_resume_and_get(bdi->dev);
        if (ret < 0) {
                dev_warn(bdi->dev, "pm_runtime_get failed: %i\n", ret);
-               pm_runtime_put_noidle(bdi->dev);
                return ret;
        }
 
@@ -1128,11 +1122,9 @@ static int bq24190_charger_get_property(struct power_supply *psy,
 
        dev_dbg(bdi->dev, "prop: %d\n", psp);
 
-       ret = pm_runtime_get_sync(bdi->dev);
-       if (ret < 0) {
-               pm_runtime_put_noidle(bdi->dev);
+       ret = pm_runtime_resume_and_get(bdi->dev);
+       if (ret < 0)
                return ret;
-       }
 
        switch (psp) {
        case POWER_SUPPLY_PROP_CHARGE_TYPE:
@@ -1204,11 +1196,9 @@ static int bq24190_charger_set_property(struct power_supply *psy,
 
        dev_dbg(bdi->dev, "prop: %d\n", psp);
 
-       ret = pm_runtime_get_sync(bdi->dev);
-       if (ret < 0) {
-               pm_runtime_put_noidle(bdi->dev);
+       ret = pm_runtime_resume_and_get(bdi->dev);
+       if (ret < 0)
                return ret;
-       }
 
        switch (psp) {
        case POWER_SUPPLY_PROP_ONLINE:
@@ -1477,11 +1467,9 @@ static int bq24190_battery_get_property(struct power_supply *psy,
        dev_warn(bdi->dev, "warning: /sys/class/power_supply/bq24190-battery is deprecated\n");
        dev_dbg(bdi->dev, "prop: %d\n", psp);
 
-       ret = pm_runtime_get_sync(bdi->dev);
-       if (ret < 0) {
-               pm_runtime_put_noidle(bdi->dev);
+       ret = pm_runtime_resume_and_get(bdi->dev);
+       if (ret < 0)
                return ret;
-       }
 
        switch (psp) {
        case POWER_SUPPLY_PROP_STATUS:
@@ -1525,11 +1513,9 @@ static int bq24190_battery_set_property(struct power_supply *psy,
        dev_warn(bdi->dev, "warning: /sys/class/power_supply/bq24190-battery is deprecated\n");
        dev_dbg(bdi->dev, "prop: %d\n", psp);
 
-       ret = pm_runtime_get_sync(bdi->dev);
-       if (ret < 0) {
-               pm_runtime_put_noidle(bdi->dev);
+       ret = pm_runtime_resume_and_get(bdi->dev);
+       if (ret < 0)
                return ret;
-       }
 
        switch (psp) {
        case POWER_SUPPLY_PROP_ONLINE:
@@ -1683,10 +1669,9 @@ static irqreturn_t bq24190_irq_handler_thread(int irq, void *data)
        int error;
 
        bdi->irq_event = true;
-       error = pm_runtime_get_sync(bdi->dev);
+       error = pm_runtime_resume_and_get(bdi->dev);
        if (error < 0) {
                dev_warn(bdi->dev, "pm_runtime_get failed: %i\n", error);
-               pm_runtime_put_noidle(bdi->dev);
                return IRQ_NONE;
        }
        bq24190_check_status(bdi);
@@ -1921,11 +1906,9 @@ static int bq24190_remove(struct i2c_client *client)
        struct bq24190_dev_info *bdi = i2c_get_clientdata(client);
        int error;
 
-       error = pm_runtime_get_sync(bdi->dev);
-       if (error < 0) {
+       error = pm_runtime_resume_and_get(bdi->dev);
+       if (error < 0)
                dev_warn(bdi->dev, "pm_runtime_get failed: %i\n", error);
-               pm_runtime_put_noidle(bdi->dev);
-       }
 
        bq24190_register_reset(bdi);
        if (bdi->battery)
@@ -1982,11 +1965,9 @@ static __maybe_unused int bq24190_pm_suspend(struct device *dev)
        struct bq24190_dev_info *bdi = i2c_get_clientdata(client);
        int error;
 
-       error = pm_runtime_get_sync(bdi->dev);
-       if (error < 0) {
+       error = pm_runtime_resume_and_get(bdi->dev);
+       if (error < 0)
                dev_warn(bdi->dev, "pm_runtime_get failed: %i\n", error);
-               pm_runtime_put_noidle(bdi->dev);
-       }
 
        bq24190_register_reset(bdi);
 
@@ -2007,11 +1988,9 @@ static __maybe_unused int bq24190_pm_resume(struct device *dev)
        bdi->f_reg = 0;
        bdi->ss_reg = BQ24190_REG_SS_VBUS_STAT_MASK; /* impossible state */
 
-       error = pm_runtime_get_sync(bdi->dev);
-       if (error < 0) {
+       error = pm_runtime_resume_and_get(bdi->dev);
+       if (error < 0)
                dev_warn(bdi->dev, "pm_runtime_get failed: %i\n", error);
-               pm_runtime_put_noidle(bdi->dev);
-       }
 
        bq24190_register_reset(bdi);
        bq24190_set_config(bdi);
index 72e727c..35e6a39 100644 (file)
@@ -1572,14 +1572,6 @@ static int bq27xxx_battery_read_charge(struct bq27xxx_device_info *di, u8 reg)
  */
 static inline int bq27xxx_battery_read_nac(struct bq27xxx_device_info *di)
 {
-       int flags;
-
-       if (di->opts & BQ27XXX_O_ZERO) {
-               flags = bq27xxx_read(di, BQ27XXX_REG_FLAGS, true);
-               if (flags >= 0 && (flags & BQ27000_FLAG_CI))
-                       return -ENODATA;
-       }
-
        return bq27xxx_battery_read_charge(di, BQ27XXX_REG_NAC);
 }
 
@@ -1742,6 +1734,18 @@ static bool bq27xxx_battery_dead(struct bq27xxx_device_info *di, u16 flags)
                return flags & (BQ27XXX_FLAG_SOC1 | BQ27XXX_FLAG_SOCF);
 }
 
+/*
+ * Returns true if reported battery capacity is inaccurate
+ */
+static bool bq27xxx_battery_capacity_inaccurate(struct bq27xxx_device_info *di,
+                                                u16 flags)
+{
+       if (di->opts & BQ27XXX_O_HAS_CI)
+               return (flags & BQ27000_FLAG_CI);
+       else
+               return false;
+}
+
 static int bq27xxx_battery_read_health(struct bq27xxx_device_info *di)
 {
        /* Unlikely but important to return first */
@@ -1751,6 +1755,8 @@ static int bq27xxx_battery_read_health(struct bq27xxx_device_info *di)
                return POWER_SUPPLY_HEALTH_COLD;
        if (unlikely(bq27xxx_battery_dead(di, di->cache.flags)))
                return POWER_SUPPLY_HEALTH_DEAD;
+       if (unlikely(bq27xxx_battery_capacity_inaccurate(di, di->cache.flags)))
+               return POWER_SUPPLY_HEALTH_CALIBRATION_REQUIRED;
 
        return POWER_SUPPLY_HEALTH_GOOD;
 }
@@ -1758,7 +1764,6 @@ static int bq27xxx_battery_read_health(struct bq27xxx_device_info *di)
 void bq27xxx_battery_update(struct bq27xxx_device_info *di)
 {
        struct bq27xxx_reg_cache cache = {0, };
-       bool has_ci_flag = di->opts & BQ27XXX_O_HAS_CI;
        bool has_singe_flag = di->opts & BQ27XXX_O_ZERO;
 
        cache.flags = bq27xxx_read(di, BQ27XXX_REG_FLAGS, has_singe_flag);
@@ -1766,30 +1771,19 @@ void bq27xxx_battery_update(struct bq27xxx_device_info *di)
                cache.flags = -1; /* read error */
        if (cache.flags >= 0) {
                cache.temperature = bq27xxx_battery_read_temperature(di);
-               if (has_ci_flag && (cache.flags & BQ27000_FLAG_CI)) {
-                       dev_info_once(di->dev, "battery is not calibrated! ignoring capacity values\n");
-                       cache.capacity = -ENODATA;
-                       cache.energy = -ENODATA;
-                       cache.time_to_empty = -ENODATA;
-                       cache.time_to_empty_avg = -ENODATA;
-                       cache.time_to_full = -ENODATA;
-                       cache.charge_full = -ENODATA;
-                       cache.health = -ENODATA;
-               } else {
-                       if (di->regs[BQ27XXX_REG_TTE] != INVALID_REG_ADDR)
-                               cache.time_to_empty = bq27xxx_battery_read_time(di, BQ27XXX_REG_TTE);
-                       if (di->regs[BQ27XXX_REG_TTECP] != INVALID_REG_ADDR)
-                               cache.time_to_empty_avg = bq27xxx_battery_read_time(di, BQ27XXX_REG_TTECP);
-                       if (di->regs[BQ27XXX_REG_TTF] != INVALID_REG_ADDR)
-                               cache.time_to_full = bq27xxx_battery_read_time(di, BQ27XXX_REG_TTF);
-
-                       cache.charge_full = bq27xxx_battery_read_fcc(di);
-                       cache.capacity = bq27xxx_battery_read_soc(di);
-                       if (di->regs[BQ27XXX_REG_AE] != INVALID_REG_ADDR)
-                               cache.energy = bq27xxx_battery_read_energy(di);
-                       di->cache.flags = cache.flags;
-                       cache.health = bq27xxx_battery_read_health(di);
-               }
+               if (di->regs[BQ27XXX_REG_TTE] != INVALID_REG_ADDR)
+                       cache.time_to_empty = bq27xxx_battery_read_time(di, BQ27XXX_REG_TTE);
+               if (di->regs[BQ27XXX_REG_TTECP] != INVALID_REG_ADDR)
+                       cache.time_to_empty_avg = bq27xxx_battery_read_time(di, BQ27XXX_REG_TTECP);
+               if (di->regs[BQ27XXX_REG_TTF] != INVALID_REG_ADDR)
+                       cache.time_to_full = bq27xxx_battery_read_time(di, BQ27XXX_REG_TTF);
+
+               cache.charge_full = bq27xxx_battery_read_fcc(di);
+               cache.capacity = bq27xxx_battery_read_soc(di);
+               if (di->regs[BQ27XXX_REG_AE] != INVALID_REG_ADDR)
+                       cache.energy = bq27xxx_battery_read_energy(di);
+               di->cache.flags = cache.flags;
+               cache.health = bq27xxx_battery_read_health(di);
                if (di->regs[BQ27XXX_REG_CYCT] != INVALID_REG_ADDR)
                        cache.cycle_count = bq27xxx_battery_read_cyct(di);