power: supply: ab8500_fg: Account for line impedance
authorLinus Walleij <linus.walleij@linaro.org>
Tue, 1 Mar 2022 12:42:54 +0000 (13:42 +0100)
committerSebastian Reichel <sre@kernel.org>
Fri, 4 Mar 2022 21:20:32 +0000 (22:20 +0100)
We add the line impedance to the inner resistance determined
from the battery voltage or other means to improve the
capacity estimations.

Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Signed-off-by: Sebastian Reichel <sebastian.reichel@collabora.com>
drivers/power/supply/ab8500_fg.c

index 1abe10c..3ae8086 100644 (file)
@@ -213,6 +213,7 @@ struct ab8500_fg {
        int init_cnt;
        int low_bat_cnt;
        int nbr_cceoc_irq_cnt;
+       u32 line_impedance_uohm;
        bool recovery_needed;
        bool high_curr_mode;
        bool init_capacity;
@@ -910,6 +911,9 @@ static int ab8500_fg_battery_resistance(struct ab8500_fg *di, int vbat_uncomp_uv
                resistance = bi->factory_internal_resistance_uohm / 1000;
        }
 
+       /* Compensate for line impedance */
+       resistance += (di->line_impedance_uohm / 1000);
+
        dev_dbg(di->dev, "%s Temp: %d battery internal resistance: %d"
            " fg resistance %d, total: %d (mOhm)\n",
                __func__, di->bat_temp, resistance, di->bm->fg_res / 10,
@@ -3098,6 +3102,11 @@ static int ab8500_fg_probe(struct platform_device *pdev)
                return ret;
        }
 
+       if (!of_property_read_u32(dev->of_node, "line-impedance-micro-ohms",
+                                 &di->line_impedance_uohm))
+               dev_info(dev, "line impedance: %u uOhm\n",
+                        di->line_impedance_uohm);
+
        psy_cfg.supplied_to = supply_interface;
        psy_cfg.num_supplicants = ARRAY_SIZE(supply_interface);
        psy_cfg.drv_data = di;