
From: Todd Poynor <tpoynor@mvista.com>

Currently all devices are resumed at system resume time, including any that
were individually powered off ("at runtime") prior to the system suspend. 
In certain cases it can be nice to force back on individually suspended
devices, such as the display, but hopefully this policy can be left up to
userspace power managers; the kernel should probably honor the settings
previously made by userspace/drivers.  This seems preferable to requiring a
power-conscious system to re-suspend devices after a system resume;
furthermore, for certain platforms (such as XScale PXA27X) there can be
disastrous consequences of powering up devices when the system is in a
state incompatible with operation of the device.

Suggested patch does this:

(1) At system resume, checks power_state to see if the device was
    suspended prior to system suspend, and skips powering on the device if
    so.

(2) Does not re-suspend an already-suspended device at system suspend
    (using a different method than is currently employed, which reorders
    the list, see #3).

(3) Preserves the active/off device list order despite the above
    changes to suspend/resume behavior, to avoid dependency problems that
    tend to occur when the list is reordered.

Signed-off-by:  Andrew Morton <akpm@osdl.org>
---

 25-akpm/drivers/base/power/resume.c  |    5 ++++-
 25-akpm/drivers/base/power/suspend.c |    2 +-
 2 files changed, 5 insertions(+), 2 deletions(-)

diff -puN drivers/base/power/resume.c~leave-runtime-suspended-devices-off-at-system-resume drivers/base/power/resume.c
--- 25/drivers/base/power/resume.c~leave-runtime-suspended-devices-off-at-system-resume	2004-05-26 20:56:09.315676672 -0700
+++ 25-akpm/drivers/base/power/resume.c	2004-05-26 20:56:09.320675912 -0700
@@ -35,7 +35,10 @@ void dpm_resume(void)
 		struct list_head * entry = dpm_off.next;
 		struct device * dev = to_device(entry);
 		list_del_init(entry);
-		resume_device(dev);
+
+		if (!dev->power.power_state)
+			resume_device(dev);
+
 		list_add_tail(entry,&dpm_active);
 	}
 }
diff -puN drivers/base/power/suspend.c~leave-runtime-suspended-devices-off-at-system-resume drivers/base/power/suspend.c
--- 25/drivers/base/power/suspend.c~leave-runtime-suspended-devices-off-at-system-resume	2004-05-26 20:56:09.316676520 -0700
+++ 25-akpm/drivers/base/power/suspend.c	2004-05-26 20:56:09.319676064 -0700
@@ -39,7 +39,7 @@ int suspend_device(struct device * dev, 
 {
 	int error = 0;
 
-	if (dev->bus && dev->bus->suspend)
+	if (dev->bus && dev->bus->suspend && !dev->power.power_state)
 		error = dev->bus->suspend(dev,state);
 
 	return error;
_
