Commit b8ff3f6b authored by Todd Poynor's avatar Todd Poynor Committed by Greg Kroah-Hartman

[PATCH] Leave runtime suspended devices off at system resume

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: default avatarGreg Kroah-Hartman <greg@kroah.com>
parent 98e1a74e
...@@ -35,7 +35,10 @@ void dpm_resume(void) ...@@ -35,7 +35,10 @@ void dpm_resume(void)
struct list_head * entry = dpm_off.next; struct list_head * entry = dpm_off.next;
struct device * dev = to_device(entry); struct device * dev = to_device(entry);
list_del_init(entry); list_del_init(entry);
if (!dev->power.power_state)
resume_device(dev); resume_device(dev);
list_add_tail(entry,&dpm_active); list_add_tail(entry,&dpm_active);
} }
} }
......
...@@ -39,7 +39,7 @@ int suspend_device(struct device * dev, u32 state) ...@@ -39,7 +39,7 @@ int suspend_device(struct device * dev, u32 state)
{ {
int error = 0; 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); error = dev->bus->suspend(dev,state);
return error; return error;
......
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