Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

power: supply: bq27xxx: fix reporting critical level

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>

authored by

Sicelo A. Mhlongo and committed by
Sebastian Reichel
e2b018cb 4651b6b7

+4 -4
+4 -4
drivers/power/supply/bq27xxx_battery.c
··· 1917 1917 if (di->opts & BQ27XXX_O_ZERO) { 1918 1918 if (di->cache.flags & BQ27000_FLAG_FC) 1919 1919 level = POWER_SUPPLY_CAPACITY_LEVEL_FULL; 1920 - else if (di->cache.flags & BQ27000_FLAG_EDV1) 1921 - level = POWER_SUPPLY_CAPACITY_LEVEL_LOW; 1922 1920 else if (di->cache.flags & BQ27000_FLAG_EDVF) 1923 1921 level = POWER_SUPPLY_CAPACITY_LEVEL_CRITICAL; 1922 + else if (di->cache.flags & BQ27000_FLAG_EDV1) 1923 + level = POWER_SUPPLY_CAPACITY_LEVEL_LOW; 1924 1924 else 1925 1925 level = POWER_SUPPLY_CAPACITY_LEVEL_NORMAL; 1926 1926 } else if (di->opts & BQ27Z561_O_BITS) { ··· 1933 1933 } else { 1934 1934 if (di->cache.flags & BQ27XXX_FLAG_FC) 1935 1935 level = POWER_SUPPLY_CAPACITY_LEVEL_FULL; 1936 - else if (di->cache.flags & BQ27XXX_FLAG_SOC1) 1937 - level = POWER_SUPPLY_CAPACITY_LEVEL_LOW; 1938 1936 else if (di->cache.flags & BQ27XXX_FLAG_SOCF) 1939 1937 level = POWER_SUPPLY_CAPACITY_LEVEL_CRITICAL; 1938 + else if (di->cache.flags & BQ27XXX_FLAG_SOC1) 1939 + level = POWER_SUPPLY_CAPACITY_LEVEL_LOW; 1940 1940 else 1941 1941 level = POWER_SUPPLY_CAPACITY_LEVEL_NORMAL; 1942 1942 }