@@ -1189,18 +1189,31 @@
return PMSG_ON;
}
+static void dpm_cond_set_active(struct device *dev, bool cond)
+{
+ if (cond && !pm_runtime_no_support(dev))
+ dev->power.set_active = true;
+}
+
static void dpm_superior_set_must_resume(struct device *dev)
{
+ bool set_active = dev->power.set_active;
struct device_link *link;
int idx;
- if (dev->parent)
+ if (dev->parent) {
dev->parent->power.must_resume = true;
+ dpm_cond_set_active(dev->parent, set_active &&
+ !dev->parent->power.ignore_children);
+ }
idx = device_links_read_lock();
- list_for_each_entry_rcu_locked(link, &dev->links.suppliers, c_node)
+ list_for_each_entry_rcu_locked(link, &dev->links.suppliers, c_node) {
link->supplier->power.must_resume = true;
+ dpm_cond_set_active(link->supplier, set_active &&
+ (link->flags & DL_FLAG_PM_RUNTIME));
+ }
device_links_read_unlock(idx);
}
@@ -1277,13 +1290,7 @@
dev->power.must_resume = true;
if (dev->power.must_resume) {
- if (dev_pm_test_driver_flags(dev, DPM_FLAG_SMART_SUSPEND) &&
- !pm_runtime_no_support(dev)) {
- dev->power.set_active = true;
- if (dev->parent && !dev->parent->power.ignore_children &&
- !pm_runtime_no_support(dev->parent))
- dev->parent->power.set_active = true;
- }
+ dpm_cond_set_active(dev, dev_pm_test_driver_flags(dev, DPM_FLAG_SMART_SUSPEND));
dpm_superior_set_must_resume(dev);
}