aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/base/power/domain.c16
1 files changed, 9 insertions, 7 deletions
diff --git a/drivers/base/power/domain.c b/drivers/base/power/domain.c
index c298de8a8308..9e8484189034 100644
--- a/drivers/base/power/domain.c
+++ b/drivers/base/power/domain.c
@@ -2235,7 +2235,7 @@ static void genpd_dev_pm_sync(struct device *dev)
2235} 2235}
2236 2236
2237static int __genpd_dev_pm_attach(struct device *dev, struct device_node *np, 2237static int __genpd_dev_pm_attach(struct device *dev, struct device_node *np,
2238 unsigned int index) 2238 unsigned int index, bool power_on)
2239{ 2239{
2240 struct of_phandle_args pd_args; 2240 struct of_phandle_args pd_args;
2241 struct generic_pm_domain *pd; 2241 struct generic_pm_domain *pd;
@@ -2271,9 +2271,11 @@ static int __genpd_dev_pm_attach(struct device *dev, struct device_node *np,
2271 dev->pm_domain->detach = genpd_dev_pm_detach; 2271 dev->pm_domain->detach = genpd_dev_pm_detach;
2272 dev->pm_domain->sync = genpd_dev_pm_sync; 2272 dev->pm_domain->sync = genpd_dev_pm_sync;
2273 2273
2274 genpd_lock(pd); 2274 if (power_on) {
2275 ret = genpd_power_on(pd, 0); 2275 genpd_lock(pd);
2276 genpd_unlock(pd); 2276 ret = genpd_power_on(pd, 0);
2277 genpd_unlock(pd);
2278 }
2277 2279
2278 if (ret) 2280 if (ret)
2279 genpd_remove_device(pd, dev); 2281 genpd_remove_device(pd, dev);
@@ -2307,7 +2309,7 @@ int genpd_dev_pm_attach(struct device *dev)
2307 "#power-domain-cells") != 1) 2309 "#power-domain-cells") != 1)
2308 return 0; 2310 return 0;
2309 2311
2310 return __genpd_dev_pm_attach(dev, dev->of_node, 0); 2312 return __genpd_dev_pm_attach(dev, dev->of_node, 0, true);
2311} 2313}
2312EXPORT_SYMBOL_GPL(genpd_dev_pm_attach); 2314EXPORT_SYMBOL_GPL(genpd_dev_pm_attach);
2313 2315
@@ -2359,14 +2361,14 @@ struct device *genpd_dev_pm_attach_by_id(struct device *dev,
2359 } 2361 }
2360 2362
2361 /* Try to attach the device to the PM domain at the specified index. */ 2363 /* Try to attach the device to the PM domain at the specified index. */
2362 ret = __genpd_dev_pm_attach(genpd_dev, dev->of_node, index); 2364 ret = __genpd_dev_pm_attach(genpd_dev, dev->of_node, index, false);
2363 if (ret < 1) { 2365 if (ret < 1) {
2364 device_unregister(genpd_dev); 2366 device_unregister(genpd_dev);
2365 return ret ? ERR_PTR(ret) : NULL; 2367 return ret ? ERR_PTR(ret) : NULL;
2366 } 2368 }
2367 2369
2368 pm_runtime_set_active(genpd_dev);
2369 pm_runtime_enable(genpd_dev); 2370 pm_runtime_enable(genpd_dev);
2371 genpd_queue_power_off_work(dev_to_genpd(genpd_dev));
2370 2372
2371 return genpd_dev; 2373 return genpd_dev;
2372} 2374}