power: supply: bq27xxx: fix reporting critical level
authorSicelo A. Mhlongo <absicsz@gmail.com>
Mon, 2 Jan 2023 09:13:26 +0000 (11:13 +0200)
committerSebastian Reichel <sebastian.reichel@collabora.com>
Fri, 3 Feb 2023 12:35:04 +0000 (13:35 +0100)
The EDV1/SOC1 flag is set when the battery voltage drops below the
threshold set in EEPROM. From observing the capacity_level reported by
the driver, and reading the datasheet, EDV1 remains set even when
EDVF/SOCF gets set. Thus, bq27xxx_battery_capacity_level() never reaches
the CAPACITY_LEVEL_CRITICAL code path, since CAPACITY_LEVEL_LOW takes
precedence.

This commit fixes the issue by swapping the order in which the flags are
tested. It was tested with bq27200 in the Nokia N900.

Signed-off-by: Sicelo A. Mhlongo <absicsz@gmail.com>
Signed-off-by: Sebastian Reichel <sebastian.reichel@collabora.com>
drivers/power/supply/bq27xxx_battery.c

index 8bf048fbd36a2f873e02ba430581b5d4795eac24..5ff6f44fd47b22e709813fbfdb3eedd7a4320aa5 100644 (file)
@@ -1917,10 +1917,10 @@ static int bq27xxx_battery_capacity_level(struct bq27xxx_device_info *di,
        if (di->opts & BQ27XXX_O_ZERO) {
                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 if (di->cache.flags & BQ27000_FLAG_EDV1)
+                       level = POWER_SUPPLY_CAPACITY_LEVEL_LOW;
                else
                        level = POWER_SUPPLY_CAPACITY_LEVEL_NORMAL;
        } else if (di->opts & BQ27Z561_O_BITS) {
@@ -1933,10 +1933,10 @@ static int bq27xxx_battery_capacity_level(struct bq27xxx_device_info *di,
        } else {
                if (di->cache.flags & BQ27XXX_FLAG_FC)
                        level = POWER_SUPPLY_CAPACITY_LEVEL_FULL;
-               else if (di->cache.flags & BQ27XXX_FLAG_SOC1)
-                       level = POWER_SUPPLY_CAPACITY_LEVEL_LOW;
                else if (di->cache.flags & BQ27XXX_FLAG_SOCF)
                        level = POWER_SUPPLY_CAPACITY_LEVEL_CRITICAL;
+               else if (di->cache.flags & BQ27XXX_FLAG_SOC1)
+                       level = POWER_SUPPLY_CAPACITY_LEVEL_LOW;
                else
                        level = POWER_SUPPLY_CAPACITY_LEVEL_NORMAL;
        }