]> www.infradead.org Git - users/willy/pagecache.git/commitdiff
power: supply: axp20x_battery: Fix fault handling for AXP717
authorChris Morgan <macromorgan@hotmail.com>
Fri, 31 Jan 2025 23:14:51 +0000 (17:14 -0600)
committerSebastian Reichel <sebastian.reichel@collabora.com>
Mon, 3 Feb 2025 11:41:18 +0000 (12:41 +0100)
Correct the fault handling for the AXP717 by changing the i2c write
from regmap_update_bits() to regmap_write_bits(). The update bits
function does not work properly on a RW1C register where we must
write a 1 back to an existing register to clear it.

Additionally, as part of this testing I confirmed the behavior of
errors reappearing, so remove comment about assumptions.

Fixes: 6625767049c2 ("power: supply: axp20x_battery: add support for AXP717")
Signed-off-by: Chris Morgan <macromorgan@hotmail.com>
Reviewed-by: Chen-Yu Tsai <wens@csie.org>
Link: https://lore.kernel.org/r/20250131231455.153447-2-macroalpha82@gmail.com
Signed-off-by: Sebastian Reichel <sebastian.reichel@collabora.com>
drivers/power/supply/axp20x_battery.c

index fa27195f074e7d553a7d0bb095a62d6628ef5f8e..3c3158f31a484d4e0a8361aa7012a93c292ce1ae 100644 (file)
@@ -466,10 +466,9 @@ static int axp717_battery_get_prop(struct power_supply *psy,
 
        /*
         * If a fault is detected it must also be cleared; if the
-        * condition persists it should reappear (This is an
-        * assumption, it's actually not documented). A restart was
-        * not sufficient to clear the bit in testing despite the
-        * register listed as POR.
+        * condition persists it should reappear. A restart was not
+        * sufficient to clear the bit in testing despite the register
+        * listed as POR.
         */
        case POWER_SUPPLY_PROP_HEALTH:
                ret = regmap_read(axp20x_batt->regmap, AXP717_PMU_FAULT,
@@ -480,26 +479,26 @@ static int axp717_battery_get_prop(struct power_supply *psy,
                switch (reg & AXP717_BATT_PMU_FAULT_MASK) {
                case AXP717_BATT_UVLO_2_5V:
                        val->intval = POWER_SUPPLY_HEALTH_DEAD;
-                       regmap_update_bits(axp20x_batt->regmap,
-                                          AXP717_PMU_FAULT,
-                                          AXP717_BATT_UVLO_2_5V,
-                                          AXP717_BATT_UVLO_2_5V);
+                       regmap_write_bits(axp20x_batt->regmap,
+                                         AXP717_PMU_FAULT,
+                                         AXP717_BATT_UVLO_2_5V,
+                                         AXP717_BATT_UVLO_2_5V);
                        return 0;
 
                case AXP717_BATT_OVER_TEMP:
                        val->intval = POWER_SUPPLY_HEALTH_HOT;
-                       regmap_update_bits(axp20x_batt->regmap,
-                                          AXP717_PMU_FAULT,
-                                          AXP717_BATT_OVER_TEMP,
-                                          AXP717_BATT_OVER_TEMP);
+                       regmap_write_bits(axp20x_batt->regmap,
+                                         AXP717_PMU_FAULT,
+                                         AXP717_BATT_OVER_TEMP,
+                                         AXP717_BATT_OVER_TEMP);
                        return 0;
 
                case AXP717_BATT_UNDER_TEMP:
                        val->intval = POWER_SUPPLY_HEALTH_COLD;
-                       regmap_update_bits(axp20x_batt->regmap,
-                                          AXP717_PMU_FAULT,
-                                          AXP717_BATT_UNDER_TEMP,
-                                          AXP717_BATT_UNDER_TEMP);
+                       regmap_write_bits(axp20x_batt->regmap,
+                                         AXP717_PMU_FAULT,
+                                         AXP717_BATT_UNDER_TEMP,
+                                         AXP717_BATT_UNDER_TEMP);
                        return 0;
 
                default: