PM / runtime: print error when activating a child to unactive parent
authorLinus Walleij <linus.walleij@linaro.org>
Mon, 20 Jun 2016 09:14:26 +0000 (11:14 +0200)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Mon, 27 Jun 2016 22:40:30 +0000 (00:40 +0200)
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>
drivers/base/power/runtime.c

index b746904..e7ee829 100644 (file)
@@ -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);