From b2bad6da88e1bf9b658d4ae2f43fe3895d7dbe6d Mon Sep 17 00:00:00 2001 From: Ram Chandrasekar Date: Thu, 11 May 2017 15:09:38 -0600 Subject: [PATCH] power_supply: Register cooling device outside of probe Registering the cooling device from the probe, can result in the execution of get_property() function, before the probe is complete. To avoid this, register the cooling device from a workqueue, instead of registering in the probe. Change-Id: Ic9279fd5ca5476df66baa6e0f302a7f3bd6b899b Signed-off-by: Ram Chandrasekar --- drivers/power/supply/power_supply_core.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/drivers/power/supply/power_supply_core.c b/drivers/power/supply/power_supply_core.c index dc660df5d736..d079f82a6b64 100644 --- a/drivers/power/supply/power_supply_core.c +++ b/drivers/power/supply/power_supply_core.c @@ -125,6 +125,7 @@ void power_supply_changed(struct power_supply *psy) } EXPORT_SYMBOL_GPL(power_supply_changed); +static int psy_register_cooler(struct device *dev, struct power_supply *psy); /* * Notify that power supply was registered after parent finished the probing. * @@ -132,6 +133,8 @@ EXPORT_SYMBOL_GPL(power_supply_changed); * calling power_supply_changed() directly from power_supply_register() * would lead to execution of get_property() function provided by the driver * too early - before the probe ends. + * Also, registering cooling device from the probe will execute the + * get_property() function. So register the cooling device after the probe. * * Avoid that by waiting on parent's mutex. */ @@ -148,6 +151,7 @@ static void power_supply_deferred_register_work(struct work_struct *work) } } + psy_register_cooler(psy->dev.parent, psy); power_supply_changed(psy); if (psy->dev.parent) @@ -1069,10 +1073,6 @@ __power_supply_register(struct device *parent, if (rc) goto register_thermal_failed; - rc = psy_register_cooler(parent, psy); - if (rc) - goto register_cooler_failed; - rc = power_supply_create_triggers(psy); if (rc) goto create_triggers_failed; @@ -1102,8 +1102,6 @@ __power_supply_register(struct device *parent, add_hwmon_sysfs_failed: power_supply_remove_triggers(psy); create_triggers_failed: - psy_unregister_cooler(psy); -register_cooler_failed: psy_unregister_thermal(psy); register_thermal_failed: device_del(dev);