diff options
-rw-r--r-- | drivers/base/power/domain.c | 16 |
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 | ||
2237 | static int __genpd_dev_pm_attach(struct device *dev, struct device_node *np, | 2237 | static 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 | } |
2312 | EXPORT_SYMBOL_GPL(genpd_dev_pm_attach); | 2314 | EXPORT_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 | } |