Skip to content

Commit

Permalink
Merge branch 'pm-core'
Browse files Browse the repository at this point in the history
* pm-core:
  PM / runtime: Drop children check from __pm_runtime_set_status()
  • Loading branch information
Rafael J. Wysocki committed Nov 17, 2017
2 parents 7d5905d + f8817f6 commit 3e4c9e6
Show file tree
Hide file tree
Showing 2 changed files with 12 additions and 22 deletions.
3 changes: 1 addition & 2 deletions Documentation/power/runtime_pm.txt
Original file line number Diff line number Diff line change
Expand Up @@ -435,8 +435,7 @@ drivers/base/power/runtime.c and include/linux/pm_runtime.h:
PM status to 'suspended' and update its parent's counter of 'active'
children as appropriate (it is only valid to use this function if
'power.runtime_error' is set or 'power.disable_depth' is greater than
zero); it will fail and return an error code if the device has a child
which is active and the 'power.ignore_children' flag is unset
zero)

bool pm_runtime_active(struct device *dev);
- return true if the device's runtime PM status is 'active' or its
Expand Down
31 changes: 11 additions & 20 deletions drivers/base/power/runtime.c
Original file line number Diff line number Diff line change
Expand Up @@ -1101,29 +1101,13 @@ int __pm_runtime_set_status(struct device *dev, unsigned int status)
goto out;
}

if (dev->power.runtime_status == status)
if (dev->power.runtime_status == status || !parent)
goto out_set;

if (status == RPM_SUSPENDED) {
/*
* It is invalid to suspend a device with an active child,
* unless it has been set to ignore its children.
*/
if (!dev->power.ignore_children &&
atomic_read(&dev->power.child_count)) {
dev_err(dev, "runtime PM trying to suspend device but active child\n");
error = -EBUSY;
goto out;
}

if (parent) {
atomic_add_unless(&parent->power.child_count, -1, 0);
notify_parent = !parent->power.ignore_children;
}
goto out_set;
}

if (parent) {
atomic_add_unless(&parent->power.child_count, -1, 0);
notify_parent = !parent->power.ignore_children;
} else {
spin_lock_nested(&parent->power.lock, SINGLE_DEPTH_NESTING);

/*
Expand Down Expand Up @@ -1307,6 +1291,13 @@ void pm_runtime_enable(struct device *dev)
else
dev_warn(dev, "Unbalanced %s!\n", __func__);

WARN(!dev->power.disable_depth &&
dev->power.runtime_status == RPM_SUSPENDED &&
!dev->power.ignore_children &&
atomic_read(&dev->power.child_count) > 0,
"Enabling runtime PM for inactive device (%s) with active children\n",
dev_name(dev));

spin_unlock_irqrestore(&dev->power.lock, flags);
}
EXPORT_SYMBOL_GPL(pm_runtime_enable);
Expand Down

0 comments on commit 3e4c9e6

Please sign in to comment.