diff options
author | Rafael J. Wysocki <rjw@sisk.pl> | 2010-01-23 16:25:15 -0500 |
---|---|---|
committer | Rafael J. Wysocki <rjw@sisk.pl> | 2010-02-26 14:39:10 -0500 |
commit | 0e06b4a891c6a108412fe24b4500f499da2cf8a1 (patch) | |
tree | ed254631bdc24e676b95b633d310b284a2df9c45 /drivers/base | |
parent | 5af84b82701a96be4b033aaa51d86c72e2ded061 (diff) |
PM: Add a switch for disabling/enabling asynchronous suspend/resume
Add sysfs attribute /sys/power/pm_async allowing the user space to
disable/enable asynchronous suspend/resume of devices.
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
Diffstat (limited to 'drivers/base')
-rw-r--r-- | drivers/base/power/main.c | 7 | ||||
-rw-r--r-- | drivers/base/power/power.h | 6 |
2 files changed, 7 insertions, 6 deletions
diff --git a/drivers/base/power/main.c b/drivers/base/power/main.c index 3b44c201ddad..7e79201b09bb 100644 --- a/drivers/base/power/main.c +++ b/drivers/base/power/main.c | |||
@@ -201,7 +201,7 @@ static void dpm_wait(struct device *dev, bool async) | |||
201 | if (!dev) | 201 | if (!dev) |
202 | return; | 202 | return; |
203 | 203 | ||
204 | if (async || dev->power.async_suspend) | 204 | if (async || (pm_async_enabled && dev->power.async_suspend)) |
205 | wait_for_completion(&dev->power.completion); | 205 | wait_for_completion(&dev->power.completion); |
206 | } | 206 | } |
207 | 207 | ||
@@ -563,7 +563,8 @@ static int device_resume(struct device *dev) | |||
563 | { | 563 | { |
564 | INIT_COMPLETION(dev->power.completion); | 564 | INIT_COMPLETION(dev->power.completion); |
565 | 565 | ||
566 | if (dev->power.async_suspend && !pm_trace_is_enabled()) { | 566 | if (pm_async_enabled && dev->power.async_suspend |
567 | && !pm_trace_is_enabled()) { | ||
567 | get_device(dev); | 568 | get_device(dev); |
568 | async_schedule(async_resume, dev); | 569 | async_schedule(async_resume, dev); |
569 | return 0; | 570 | return 0; |
@@ -867,7 +868,7 @@ static int device_suspend(struct device *dev) | |||
867 | { | 868 | { |
868 | INIT_COMPLETION(dev->power.completion); | 869 | INIT_COMPLETION(dev->power.completion); |
869 | 870 | ||
870 | if (dev->power.async_suspend) { | 871 | if (pm_async_enabled && dev->power.async_suspend) { |
871 | get_device(dev); | 872 | get_device(dev); |
872 | async_schedule(async_suspend, dev); | 873 | async_schedule(async_suspend, dev); |
873 | return 0; | 874 | return 0; |
diff --git a/drivers/base/power/power.h b/drivers/base/power/power.h index b8fa1aa5225a..c0bd03c83b9c 100644 --- a/drivers/base/power/power.h +++ b/drivers/base/power/power.h | |||
@@ -12,10 +12,10 @@ static inline void pm_runtime_remove(struct device *dev) {} | |||
12 | 12 | ||
13 | #ifdef CONFIG_PM_SLEEP | 13 | #ifdef CONFIG_PM_SLEEP |
14 | 14 | ||
15 | /* | 15 | /* kernel/power/main.c */ |
16 | * main.c | 16 | extern int pm_async_enabled; |
17 | */ | ||
18 | 17 | ||
18 | /* drivers/base/power/main.c */ | ||
19 | extern struct list_head dpm_list; /* The active device list */ | 19 | extern struct list_head dpm_list; /* The active device list */ |
20 | 20 | ||
21 | static inline struct device *to_device(struct list_head *entry) | 21 | static inline struct device *to_device(struct list_head *entry) |