diff options
author | Linus Walleij <linus.walleij@linaro.org> | 2016-06-20 11:14:26 +0200 |
---|---|---|
committer | Rafael J. Wysocki <rafael.j.wysocki@intel.com> | 2016-06-28 00:40:30 +0200 |
commit | 71723f95463d284004bd0afe1825e6790a0c90d0 (patch) | |
tree | 6543dea066773786c85fed006c42cb2baa20a35c /drivers/base | |
parent | 4c2e07c6a29e0129e975727b9f57eede813eea85 (diff) | |
download | blackbird-obmc-linux-71723f95463d284004bd0afe1825e6790a0c90d0.tar.gz blackbird-obmc-linux-71723f95463d284004bd0afe1825e6790a0c90d0.zip |
PM / runtime: print error when activating a child to unactive parent
The code currently silently bails out with -EBUSY if you try to
activate a child to an inactive parent.
This typically happens when you have a runtime suspended parent
and runtime resume your child, but forgot to set .ignore_children
on the parent to true with pm_suspend_ignore_children(dev).
Silently ignoring this error is not good as it gives rise to
other strange behaviour like double-resume of devices after
silently bailing out of the .runtime_resume() callback.
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Diffstat (limited to 'drivers/base')
-rw-r--r-- | drivers/base/power/runtime.c | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/drivers/base/power/runtime.c b/drivers/base/power/runtime.c index b74690418504..e7ee8293055b 100644 --- a/drivers/base/power/runtime.c +++ b/drivers/base/power/runtime.c @@ -1045,10 +1045,14 @@ int __pm_runtime_set_status(struct device *dev, unsigned int status) */ if (!parent->power.disable_depth && !parent->power.ignore_children - && parent->power.runtime_status != RPM_ACTIVE) + && parent->power.runtime_status != RPM_ACTIVE) { + dev_err(dev, "runtime PM trying to activate child device %s but parent (%s) is not active\n", + dev_name(dev), + dev_name(parent)); error = -EBUSY; - else if (dev->power.runtime_status == RPM_SUSPENDED) + } else if (dev->power.runtime_status == RPM_SUSPENDED) { atomic_inc(&parent->power.child_count); + } spin_unlock(&parent->power.lock); |