Loading Documentation/power/runtime_pm.txt +1 −2 Original line number Original line Diff line number Diff line Loading @@ -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' PM status to 'suspended' and update its parent's counter of 'active' children as appropriate (it is only valid to use this function if children as appropriate (it is only valid to use this function if 'power.runtime_error' is set or 'power.disable_depth' is greater than '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 zero) which is active and the 'power.ignore_children' flag is unset bool pm_runtime_active(struct device *dev); bool pm_runtime_active(struct device *dev); - return true if the device's runtime PM status is 'active' or its - return true if the device's runtime PM status is 'active' or its Loading drivers/base/power/runtime.c +11 −20 Original line number Original line Diff line number Diff line Loading @@ -1101,29 +1101,13 @@ int __pm_runtime_set_status(struct device *dev, unsigned int status) goto out; goto out; } } if (dev->power.runtime_status == status) if (dev->power.runtime_status == status || !parent) goto out_set; goto out_set; if (status == RPM_SUSPENDED) { 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); atomic_add_unless(&parent->power.child_count, -1, 0); notify_parent = !parent->power.ignore_children; notify_parent = !parent->power.ignore_children; } } else { goto out_set; } if (parent) { spin_lock_nested(&parent->power.lock, SINGLE_DEPTH_NESTING); spin_lock_nested(&parent->power.lock, SINGLE_DEPTH_NESTING); /* /* Loading Loading @@ -1307,6 +1291,13 @@ void pm_runtime_enable(struct device *dev) else else dev_warn(dev, "Unbalanced %s!\n", __func__); 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); spin_unlock_irqrestore(&dev->power.lock, flags); } } EXPORT_SYMBOL_GPL(pm_runtime_enable); EXPORT_SYMBOL_GPL(pm_runtime_enable); Loading Loading
Documentation/power/runtime_pm.txt +1 −2 Original line number Original line Diff line number Diff line Loading @@ -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' PM status to 'suspended' and update its parent's counter of 'active' children as appropriate (it is only valid to use this function if children as appropriate (it is only valid to use this function if 'power.runtime_error' is set or 'power.disable_depth' is greater than '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 zero) which is active and the 'power.ignore_children' flag is unset bool pm_runtime_active(struct device *dev); bool pm_runtime_active(struct device *dev); - return true if the device's runtime PM status is 'active' or its - return true if the device's runtime PM status is 'active' or its Loading
drivers/base/power/runtime.c +11 −20 Original line number Original line Diff line number Diff line Loading @@ -1101,29 +1101,13 @@ int __pm_runtime_set_status(struct device *dev, unsigned int status) goto out; goto out; } } if (dev->power.runtime_status == status) if (dev->power.runtime_status == status || !parent) goto out_set; goto out_set; if (status == RPM_SUSPENDED) { 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); atomic_add_unless(&parent->power.child_count, -1, 0); notify_parent = !parent->power.ignore_children; notify_parent = !parent->power.ignore_children; } } else { goto out_set; } if (parent) { spin_lock_nested(&parent->power.lock, SINGLE_DEPTH_NESTING); spin_lock_nested(&parent->power.lock, SINGLE_DEPTH_NESTING); /* /* Loading Loading @@ -1307,6 +1291,13 @@ void pm_runtime_enable(struct device *dev) else else dev_warn(dev, "Unbalanced %s!\n", __func__); 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); spin_unlock_irqrestore(&dev->power.lock, flags); } } EXPORT_SYMBOL_GPL(pm_runtime_enable); EXPORT_SYMBOL_GPL(pm_runtime_enable); Loading