Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 181854
b: refs/heads/master
c: 0e06b4a
h: refs/heads/master
v: v3
  • Loading branch information
Rafael J. Wysocki committed Feb 26, 2010
1 parent 2bf3a5f commit 1919010
Show file tree
Hide file tree
Showing 5 changed files with 51 additions and 8 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 5af84b82701a96be4b033aaa51d86c72e2ded061
refs/heads/master: 0e06b4a891c6a108412fe24b4500f499da2cf8a1
13 changes: 13 additions & 0 deletions trunk/Documentation/ABI/testing/sysfs-power
Original file line number Diff line number Diff line change
Expand Up @@ -101,3 +101,16 @@ Description:

CAUTION: Using it will cause your machine's real-time (CMOS)
clock to be set to a random invalid time after a resume.

What: /sys/power/pm_async
Date: January 2009
Contact: Rafael J. Wysocki <rjw@sisk.pl>
Description:
The /sys/power/pm_async file controls the switch allowing the
user space to enable or disable asynchronous suspend and resume
of devices. If enabled, this feature will cause some device
drivers' suspend and resume callbacks to be executed in parallel
with each other and with the main suspend thread. It is enabled
if this file contains "1", which is the default. It may be
disabled by writing "0" to this file, in which case all devices
will be suspended and resumed synchronously.
7 changes: 4 additions & 3 deletions trunk/drivers/base/power/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -201,7 +201,7 @@ static void dpm_wait(struct device *dev, bool async)
if (!dev)
return;

if (async || dev->power.async_suspend)
if (async || (pm_async_enabled && dev->power.async_suspend))
wait_for_completion(&dev->power.completion);
}

Expand Down Expand Up @@ -563,7 +563,8 @@ static int device_resume(struct device *dev)
{
INIT_COMPLETION(dev->power.completion);

if (dev->power.async_suspend && !pm_trace_is_enabled()) {
if (pm_async_enabled && dev->power.async_suspend
&& !pm_trace_is_enabled()) {
get_device(dev);
async_schedule(async_resume, dev);
return 0;
Expand Down Expand Up @@ -867,7 +868,7 @@ static int device_suspend(struct device *dev)
{
INIT_COMPLETION(dev->power.completion);

if (dev->power.async_suspend) {
if (pm_async_enabled && dev->power.async_suspend) {
get_device(dev);
async_schedule(async_suspend, dev);
return 0;
Expand Down
6 changes: 3 additions & 3 deletions trunk/drivers/base/power/power.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,10 @@ static inline void pm_runtime_remove(struct device *dev) {}

#ifdef CONFIG_PM_SLEEP

/*
* main.c
*/
/* kernel/power/main.c */
extern int pm_async_enabled;

/* drivers/base/power/main.c */
extern struct list_head dpm_list; /* The active device list */

static inline struct device *to_device(struct list_head *entry)
Expand Down
31 changes: 30 additions & 1 deletion trunk/kernel/power/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,32 @@ int pm_notifier_call_chain(unsigned long val)
== NOTIFY_BAD) ? -EINVAL : 0;
}

/* If set, devices may be suspended and resumed asynchronously. */
int pm_async_enabled = 1;

static ssize_t pm_async_show(struct kobject *kobj, struct kobj_attribute *attr,
char *buf)
{
return sprintf(buf, "%d\n", pm_async_enabled);
}

static ssize_t pm_async_store(struct kobject *kobj, struct kobj_attribute *attr,
const char *buf, size_t n)
{
unsigned long val;

if (strict_strtoul(buf, 10, &val))
return -EINVAL;

if (val > 1)
return -EINVAL;

pm_async_enabled = val;
return n;
}

power_attr(pm_async);

#ifdef CONFIG_PM_DEBUG
int pm_test_level = TEST_NONE;

Expand Down Expand Up @@ -208,8 +234,11 @@ static struct attribute * g[] = {
#ifdef CONFIG_PM_TRACE
&pm_trace_attr.attr,
#endif
#if defined(CONFIG_PM_SLEEP) && defined(CONFIG_PM_DEBUG)
#ifdef CONFIG_PM_SLEEP
&pm_async_attr.attr,
#ifdef CONFIG_PM_DEBUG
&pm_test_attr.attr,
#endif
#endif
NULL,
};
Expand Down

0 comments on commit 1919010

Please sign in to comment.