power: supply: ab8500_fg: Init battery data in bind()
authorLinus Walleij <linus.walleij@linaro.org>
Sat, 20 Nov 2021 15:53:19 +0000 (16:53 +0100)
committerSebastian Reichel <sebastian.reichel@collabora.com>
Mon, 22 Nov 2021 16:16:25 +0000 (17:16 +0100)
We were assigning some battery data state in probe() but
this is insecure as it depends on the proper probe order
between the components: the charger must probe first so
that the battery data is populated. Move the init to
the bind() call which is certain to happen after the
probe of the master and all components has happened.

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 ab6141faa798bfc84cac3aacdf202ec1f90cb861..daa008138b059f89e7511a4e3daa0215d27b732c 100644 (file)
@@ -3023,6 +3023,10 @@ static int ab8500_fg_bind(struct device *dev, struct device *master,
                return -ENOMEM;
        }
 
+       di->bat_cap.max_mah_design = di->bm->bi.charge_full_design_uah;
+       di->bat_cap.max_mah = di->bat_cap.max_mah_design;
+       di->vbat_nom_uv = di->bm->bi.voltage_max_design_uv;
+
        /* Start the coulomb counter */
        ab8500_fg_coulomb_counter(di, true);
        /* Run the FG algorithm */
@@ -3082,10 +3086,6 @@ static int ab8500_fg_probe(struct platform_device *pdev)
        psy_cfg.num_supplicants = ARRAY_SIZE(supply_interface);
        psy_cfg.drv_data = di;
 
-       di->bat_cap.max_mah_design = di->bm->bi.charge_full_design_uah;
-       di->bat_cap.max_mah = di->bat_cap.max_mah_design;
-       di->vbat_nom_uv = di->bm->bi.voltage_max_design_uv;
-
        di->init_capacity = true;
 
        ab8500_fg_charge_state_to(di, AB8500_FG_CHARGE_INIT);