power_supply: Fix NULL pointer dereference during bq27x00_battery probe
[firefly-linux-kernel-4.4.55.git] / drivers / power / power_supply_core.c
index 2ed4a4a6b3c5cb32037904d33ecf1b16adfa41c9..15da277e0e8d9934ac0fb20076411f8c776c5af5 100644 (file)
@@ -659,7 +659,6 @@ __power_supply_register(struct device *parent,
        dev->release = power_supply_dev_release;
        dev_set_drvdata(dev, psy);
        psy->desc = desc;
-       atomic_inc(&psy->use_cnt);
        if (cfg) {
                psy->drv_data = cfg->drv_data;
                psy->of_node = cfg->of_node;
@@ -700,6 +699,16 @@ __power_supply_register(struct device *parent,
        if (rc)
                goto create_triggers_failed;
 
+       /*
+        * Update use_cnt after any uevents (most notably from device_add()).
+        * We are here still during driver's probe but
+        * the power_supply_uevent() calls back driver's get_property
+        * method so:
+        * 1. Driver did not assigned the returned struct power_supply,
+        * 2. Driver could not finish initialization (anything in its probe
+        *    after calling power_supply_register()).
+        */
+       atomic_inc(&psy->use_cnt);
        power_supply_changed(psy);
 
        return psy;