Commit 82428b62 authored by David Brownell's avatar David Brownell Committed by Greg KH

[PATCH] Driver Core: pm diagnostics update, check for errors

This patch includes various tweaks in the messaging that appears during
system pm state transitions:

  * Warn about certain illegal calls in the device tree, like resuming
    child before parent or suspending parent before child.  This could
    happen easily enough through sysfs, or in some cases when drivers
    use device_pm_set_parent().

  * Be more consistent about dev_dbg() tracing ... do it for resume() and
    shutdown() too, and never if the driver doesn't have that method.

  * Say which type of system sleep state is being entered.

Except for the warnings, these only affect debug messaging.
Signed-off-by: default avatarDavid Brownell <dbrownell@users.sourceforge.net>
Acked-by: default avatarPavel Machek <pavel@ucw.cz>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent ff0d2f90
...@@ -22,8 +22,17 @@ extern int sysdev_resume(void); ...@@ -22,8 +22,17 @@ extern int sysdev_resume(void);
int resume_device(struct device * dev) int resume_device(struct device * dev)
{ {
if (dev->bus && dev->bus->resume) if (dev->power.pm_parent
&& dev->power.pm_parent->power.power_state) {
dev_err(dev, "PM: resume from %d, parent %s still %d\n",
dev->power.power_state,
dev->power.pm_parent->bus_id,
dev->power.pm_parent->power.power_state);
}
if (dev->bus && dev->bus->resume) {
dev_dbg(dev,"resuming\n");
return dev->bus->resume(dev); return dev->bus->resume(dev);
}
return 0; return 0;
} }
......
...@@ -25,8 +25,10 @@ int device_detach_shutdown(struct device * dev) ...@@ -25,8 +25,10 @@ int device_detach_shutdown(struct device * dev)
return 0; return 0;
if (dev->detach_state == DEVICE_PM_OFF) { if (dev->detach_state == DEVICE_PM_OFF) {
if (dev->driver && dev->driver->shutdown) if (dev->driver && dev->driver->shutdown) {
dev_dbg(dev, "shutdown\n");
dev->driver->shutdown(dev); dev->driver->shutdown(dev);
}
return 0; return 0;
} }
return dpm_runtime_suspend(dev, dev->detach_state); return dpm_runtime_suspend(dev, dev->detach_state);
...@@ -52,13 +54,12 @@ void device_shutdown(void) ...@@ -52,13 +54,12 @@ void device_shutdown(void)
struct device * dev; struct device * dev;
down_write(&devices_subsys.rwsem); down_write(&devices_subsys.rwsem);
list_for_each_entry_reverse(dev, &devices_subsys.kset.list, kobj.entry) { list_for_each_entry_reverse(dev, &devices_subsys.kset.list,
pr_debug("shutting down %s: ", dev->bus_id); kobj.entry) {
if (dev->driver && dev->driver->shutdown) { if (dev->driver && dev->driver->shutdown) {
pr_debug("Ok\n"); dev_dbg(dev, "shutdown\n");
dev->driver->shutdown(dev); dev->driver->shutdown(dev);
} else }
pr_debug("Ignored.\n");
} }
up_write(&devices_subsys.rwsem); up_write(&devices_subsys.rwsem);
......
...@@ -39,12 +39,25 @@ int suspend_device(struct device * dev, pm_message_t state) ...@@ -39,12 +39,25 @@ int suspend_device(struct device * dev, pm_message_t state)
{ {
int error = 0; int error = 0;
dev_dbg(dev, "suspending\n"); if (dev->power.power_state) {
dev_dbg(dev, "PM: suspend %d-->%d\n",
dev->power.power_state, state);
}
if (dev->power.pm_parent
&& dev->power.pm_parent->power.power_state) {
dev_err(dev,
"PM: suspend %d->%d, parent %s already %d\n",
dev->power.power_state, state,
dev->power.pm_parent->bus_id,
dev->power.pm_parent->power.power_state);
}
dev->power.prev_state = dev->power.power_state; dev->power.prev_state = dev->power.power_state;
if (dev->bus && dev->bus->suspend && !dev->power.power_state) if (dev->bus && dev->bus->suspend && !dev->power.power_state) {
dev_dbg(dev, "suspending\n");
error = dev->bus->suspend(dev, state); error = dev->bus->suspend(dev, state);
}
return error; return error;
} }
......
...@@ -156,14 +156,14 @@ static int enter_state(suspend_state_t state) ...@@ -156,14 +156,14 @@ static int enter_state(suspend_state_t state)
goto Unlock; goto Unlock;
} }
pr_debug("PM: Preparing system for suspend\n"); pr_debug("PM: Preparing system for %s sleep\n", pm_states[state]);
if ((error = suspend_prepare(state))) if ((error = suspend_prepare(state)))
goto Unlock; goto Unlock;
pr_debug("PM: Entering state.\n"); pr_debug("PM: Entering %s sleep\n", pm_states[state]);
error = suspend_enter(state); error = suspend_enter(state);
pr_debug("PM: Finishing up.\n"); pr_debug("PM: Finishing wakeup.\n");
suspend_finish(state); suspend_finish(state);
Unlock: Unlock:
up(&pm_sem); up(&pm_sem);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment