|
@@ -2235,7 +2235,7 @@ static void genpd_dev_pm_sync(struct device *dev)
|
|
|
}
|
|
|
|
|
|
static int __genpd_dev_pm_attach(struct device *dev, struct device_node *np,
|
|
|
- unsigned int index)
|
|
|
+ unsigned int index, bool power_on)
|
|
|
{
|
|
|
struct of_phandle_args pd_args;
|
|
|
struct generic_pm_domain *pd;
|
|
@@ -2271,9 +2271,11 @@ static int __genpd_dev_pm_attach(struct device *dev, struct device_node *np,
|
|
|
dev->pm_domain->detach = genpd_dev_pm_detach;
|
|
|
dev->pm_domain->sync = genpd_dev_pm_sync;
|
|
|
|
|
|
- genpd_lock(pd);
|
|
|
- ret = genpd_power_on(pd, 0);
|
|
|
- genpd_unlock(pd);
|
|
|
+ if (power_on) {
|
|
|
+ genpd_lock(pd);
|
|
|
+ ret = genpd_power_on(pd, 0);
|
|
|
+ genpd_unlock(pd);
|
|
|
+ }
|
|
|
|
|
|
if (ret)
|
|
|
genpd_remove_device(pd, dev);
|
|
@@ -2307,7 +2309,7 @@ int genpd_dev_pm_attach(struct device *dev)
|
|
|
"#power-domain-cells") != 1)
|
|
|
return 0;
|
|
|
|
|
|
- return __genpd_dev_pm_attach(dev, dev->of_node, 0);
|
|
|
+ return __genpd_dev_pm_attach(dev, dev->of_node, 0, true);
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(genpd_dev_pm_attach);
|
|
|
|
|
@@ -2359,14 +2361,14 @@ struct device *genpd_dev_pm_attach_by_id(struct device *dev,
|
|
|
}
|
|
|
|
|
|
/* Try to attach the device to the PM domain at the specified index. */
|
|
|
- ret = __genpd_dev_pm_attach(genpd_dev, dev->of_node, index);
|
|
|
+ ret = __genpd_dev_pm_attach(genpd_dev, dev->of_node, index, false);
|
|
|
if (ret < 1) {
|
|
|
device_unregister(genpd_dev);
|
|
|
return ret ? ERR_PTR(ret) : NULL;
|
|
|
}
|
|
|
|
|
|
- pm_runtime_set_active(genpd_dev);
|
|
|
pm_runtime_enable(genpd_dev);
|
|
|
+ genpd_queue_power_off_work(dev_to_genpd(genpd_dev));
|
|
|
|
|
|
return genpd_dev;
|
|
|
}
|