[PATCH] Driver Core: pm diagnostics update, check for errors
authorDavid Brownell <david-b@pacbell.net>
Mon, 9 May 2005 15:07:00 +0000 (08:07 -0700)
committerGreg KH <gregkh@suse.de>
Tue, 17 May 2005 21:54:54 +0000 (14:54 -0700)
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>
drivers/base/power/resume.c
drivers/base/power/shutdown.c
drivers/base/power/suspend.c
kernel/power/main.c

index f8f5055754d65b3fd1c41348dade1e1092b9bc5e..26468971ef5a7711179e87f0d500cdc680888157 100644 (file)
@@ -22,8 +22,17 @@ extern int sysdev_resume(void);
 
 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 0;
 }
 
index d1e023fbe16939051739c8424dc7515d9f965f42..97979901c1496f077b6a3a355293086bc9b346c0 100644 (file)
@@ -25,8 +25,10 @@ int device_detach_shutdown(struct device * dev)
                return 0;
 
        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);
+               }
                return 0;
        }
        return dpm_runtime_suspend(dev, dev->detach_state);
@@ -52,13 +54,12 @@ void device_shutdown(void)
        struct device * dev;
 
        down_write(&devices_subsys.rwsem);
-       list_for_each_entry_reverse(dev, &devices_subsys.kset.list, kobj.entry) {
-               pr_debug("shutting down %s: ", dev->bus_id);
+       list_for_each_entry_reverse(dev, &devices_subsys.kset.list,
+                               kobj.entry) {
                if (dev->driver && dev->driver->shutdown) {
-                       pr_debug("Ok\n");
+                       dev_dbg(dev, "shutdown\n");
                        dev->driver->shutdown(dev);
-               } else
-                       pr_debug("Ignored.\n");
+               }
        }
        up_write(&devices_subsys.rwsem);
 
index a0b5cf689e6398422be2db4c1e37119d97856be1..0ec44ef840beaf42c89d2fdb897be5f60685a369 100644 (file)
@@ -39,12 +39,25 @@ int suspend_device(struct device * dev, pm_message_t state)
 {
        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;
 
-       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);
+       }
 
        return error;
 }
index 7960ddf04a57fca65ce7562ed565a1e1f5f872cd..4cdebc972ff2a55c7fdac702dca0c36f81905558 100644 (file)
@@ -156,14 +156,14 @@ static int enter_state(suspend_state_t state)
                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)))
                goto Unlock;
 
-       pr_debug("PM: Entering state.\n");
+       pr_debug("PM: Entering %s sleep\n", pm_states[state]);
        error = suspend_enter(state);
 
-       pr_debug("PM: Finishing up.\n");
+       pr_debug("PM: Finishing wakeup.\n");
        suspend_finish(state);
  Unlock:
        up(&pm_sem);