diff options
Diffstat (limited to 'kernel/power/main.c')
| -rw-r--r-- | kernel/power/main.c | 45 | 
1 files changed, 45 insertions, 0 deletions
diff --git a/kernel/power/main.c b/kernel/power/main.c index 428f8a034e9..f458238109c 100644 --- a/kernel/power/main.c +++ b/kernel/power/main.c @@ -235,6 +235,47 @@ late_initcall(pm_debugfs_init);  #endif /* CONFIG_PM_SLEEP */ +#ifdef CONFIG_PM_SLEEP_DEBUG +/* + * pm_print_times: print time taken by devices to suspend and resume. + * + * show() returns whether printing of suspend and resume times is enabled. + * store() accepts 0 or 1.  0 disables printing and 1 enables it. + */ +bool pm_print_times_enabled; + +static ssize_t pm_print_times_show(struct kobject *kobj, +				   struct kobj_attribute *attr, char *buf) +{ +	return sprintf(buf, "%d\n", pm_print_times_enabled); +} + +static ssize_t pm_print_times_store(struct kobject *kobj, +				    struct kobj_attribute *attr, +				    const char *buf, size_t n) +{ +	unsigned long val; + +	if (kstrtoul(buf, 10, &val)) +		return -EINVAL; + +	if (val > 1) +		return -EINVAL; + +	pm_print_times_enabled = !!val; +	return n; +} + +power_attr(pm_print_times); + +static inline void pm_print_times_init(void) +{ +	pm_print_times_enabled = !!initcall_debug; +} +#else /* !CONFIG_PP_SLEEP_DEBUG */ +static inline void pm_print_times_init(void) {} +#endif /* CONFIG_PM_SLEEP_DEBUG */ +  struct kobject *power_kobj;  /** @@ -531,6 +572,9 @@ static struct attribute * g[] = {  #ifdef CONFIG_PM_DEBUG  	&pm_test_attr.attr,  #endif +#ifdef CONFIG_PM_SLEEP_DEBUG +	&pm_print_times_attr.attr, +#endif  #endif  	NULL,  }; @@ -566,6 +610,7 @@ static int __init pm_init(void)  	error = sysfs_create_group(power_kobj, &attr_group);  	if (error)  		return error; +	pm_print_times_init();  	return pm_autosleep_init();  }  |