[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: David Brownell <dbrownell@users.sourceforge.net>
Acked-by: Pavel Machek <pavel@ucw.cz>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>

authored by

David Brownell and committed by
Greg KH
82428b62 ff0d2f90

+35 -12
+10 -1
drivers/base/power/resume.c
··· 22 22 23 23 int resume_device(struct device * dev) 24 24 { 25 - if (dev->bus && dev->bus->resume) 25 + if (dev->power.pm_parent 26 + && dev->power.pm_parent->power.power_state) { 27 + dev_err(dev, "PM: resume from %d, parent %s still %d\n", 28 + dev->power.power_state, 29 + dev->power.pm_parent->bus_id, 30 + dev->power.pm_parent->power.power_state); 31 + } 32 + if (dev->bus && dev->bus->resume) { 33 + dev_dbg(dev,"resuming\n"); 26 34 return dev->bus->resume(dev); 35 + } 27 36 return 0; 28 37 } 29 38
+7 -6
drivers/base/power/shutdown.c
··· 25 25 return 0; 26 26 27 27 if (dev->detach_state == DEVICE_PM_OFF) { 28 - if (dev->driver && dev->driver->shutdown) 28 + if (dev->driver && dev->driver->shutdown) { 29 + dev_dbg(dev, "shutdown\n"); 29 30 dev->driver->shutdown(dev); 31 + } 30 32 return 0; 31 33 } 32 34 return dpm_runtime_suspend(dev, dev->detach_state); ··· 54 52 struct device * dev; 55 53 56 54 down_write(&devices_subsys.rwsem); 57 - list_for_each_entry_reverse(dev, &devices_subsys.kset.list, kobj.entry) { 58 - pr_debug("shutting down %s: ", dev->bus_id); 55 + list_for_each_entry_reverse(dev, &devices_subsys.kset.list, 56 + kobj.entry) { 59 57 if (dev->driver && dev->driver->shutdown) { 60 - pr_debug("Ok\n"); 58 + dev_dbg(dev, "shutdown\n"); 61 59 dev->driver->shutdown(dev); 62 - } else 63 - pr_debug("Ignored.\n"); 60 + } 64 61 } 65 62 up_write(&devices_subsys.rwsem); 66 63
+15 -2
drivers/base/power/suspend.c
··· 39 39 { 40 40 int error = 0; 41 41 42 - dev_dbg(dev, "suspending\n"); 42 + if (dev->power.power_state) { 43 + dev_dbg(dev, "PM: suspend %d-->%d\n", 44 + dev->power.power_state, state); 45 + } 46 + if (dev->power.pm_parent 47 + && dev->power.pm_parent->power.power_state) { 48 + dev_err(dev, 49 + "PM: suspend %d->%d, parent %s already %d\n", 50 + dev->power.power_state, state, 51 + dev->power.pm_parent->bus_id, 52 + dev->power.pm_parent->power.power_state); 53 + } 43 54 44 55 dev->power.prev_state = dev->power.power_state; 45 56 46 - if (dev->bus && dev->bus->suspend && !dev->power.power_state) 57 + if (dev->bus && dev->bus->suspend && !dev->power.power_state) { 58 + dev_dbg(dev, "suspending\n"); 47 59 error = dev->bus->suspend(dev, state); 60 + } 48 61 49 62 return error; 50 63 }
+3 -3
kernel/power/main.c
··· 156 156 goto Unlock; 157 157 } 158 158 159 - pr_debug("PM: Preparing system for suspend\n"); 159 + pr_debug("PM: Preparing system for %s sleep\n", pm_states[state]); 160 160 if ((error = suspend_prepare(state))) 161 161 goto Unlock; 162 162 163 - pr_debug("PM: Entering state.\n"); 163 + pr_debug("PM: Entering %s sleep\n", pm_states[state]); 164 164 error = suspend_enter(state); 165 165 166 - pr_debug("PM: Finishing up.\n"); 166 + pr_debug("PM: Finishing wakeup.\n"); 167 167 suspend_finish(state); 168 168 Unlock: 169 169 up(&pm_sem);