Loading Documentation/ABI/testing/sysfs-power +13 −0 Original line number Diff line number Diff line Loading @@ -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. drivers/base/power/main.c +4 −3 Original line number Diff line number Diff line Loading @@ -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); } Loading Loading @@ -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; Loading Loading @@ -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; Loading drivers/base/power/power.h +3 −3 Original line number Diff line number Diff line Loading @@ -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) Loading kernel/power/main.c +30 −1 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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, }; Loading Loading
Documentation/ABI/testing/sysfs-power +13 −0 Original line number Diff line number Diff line Loading @@ -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.
drivers/base/power/main.c +4 −3 Original line number Diff line number Diff line Loading @@ -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); } Loading Loading @@ -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; Loading Loading @@ -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; Loading
drivers/base/power/power.h +3 −3 Original line number Diff line number Diff line Loading @@ -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) Loading
kernel/power/main.c +30 −1 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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, }; Loading