PM / sleep: Simplify sleep states sysfs interface code
Simplify the sleep states sysfs interface /sys/power/state code by redefining pm_states[] as an array of pointers to constant strings such that only the entries corresponding to valid states are set. Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
This commit is contained in:
		
					parent
					
						
							
								9a3c4145af
							
						
					
				
			
			
				commit
				
					
						d431cbc53c
					
				
			
		
					 4 changed files with 31 additions and 41 deletions
				
			
		|  | @ -296,8 +296,8 @@ static ssize_t state_show(struct kobject *kobj, struct kobj_attribute *attr, | ||||||
| 	suspend_state_t i; | 	suspend_state_t i; | ||||||
| 
 | 
 | ||||||
| 	for (i = PM_SUSPEND_MIN; i < PM_SUSPEND_MAX; i++) | 	for (i = PM_SUSPEND_MIN; i < PM_SUSPEND_MAX; i++) | ||||||
| 		if (pm_states[i].state) | 		if (pm_states[i]) | ||||||
| 			s += sprintf(s,"%s ", pm_states[i].label); | 			s += sprintf(s,"%s ", pm_states[i]); | ||||||
| 
 | 
 | ||||||
| #endif | #endif | ||||||
| 	if (hibernation_available()) | 	if (hibernation_available()) | ||||||
|  | @ -311,8 +311,7 @@ static ssize_t state_show(struct kobject *kobj, struct kobj_attribute *attr, | ||||||
| static suspend_state_t decode_state(const char *buf, size_t n) | static suspend_state_t decode_state(const char *buf, size_t n) | ||||||
| { | { | ||||||
| #ifdef CONFIG_SUSPEND | #ifdef CONFIG_SUSPEND | ||||||
| 	suspend_state_t state = PM_SUSPEND_MIN; | 	suspend_state_t state; | ||||||
| 	struct pm_sleep_state *s; |  | ||||||
| #endif | #endif | ||||||
| 	char *p; | 	char *p; | ||||||
| 	int len; | 	int len; | ||||||
|  | @ -325,10 +324,12 @@ static suspend_state_t decode_state(const char *buf, size_t n) | ||||||
| 		return PM_SUSPEND_MAX; | 		return PM_SUSPEND_MAX; | ||||||
| 
 | 
 | ||||||
| #ifdef CONFIG_SUSPEND | #ifdef CONFIG_SUSPEND | ||||||
| 	for (s = &pm_states[state]; state < PM_SUSPEND_MAX; s++, state++) | 	for (state = PM_SUSPEND_MIN; state < PM_SUSPEND_MAX; state++) { | ||||||
| 		if (s->state && len == strlen(s->label) | 		const char *label = pm_states[state]; | ||||||
| 		    && !strncmp(buf, s->label, len)) | 
 | ||||||
| 			return s->state; | 		if (label && len == strlen(label) && !strncmp(buf, label, len)) | ||||||
|  | 			return state; | ||||||
|  | 	} | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| 	return PM_SUSPEND_ON; | 	return PM_SUSPEND_ON; | ||||||
|  | @ -446,8 +447,8 @@ static ssize_t autosleep_show(struct kobject *kobj, | ||||||
| 
 | 
 | ||||||
| #ifdef CONFIG_SUSPEND | #ifdef CONFIG_SUSPEND | ||||||
| 	if (state < PM_SUSPEND_MAX) | 	if (state < PM_SUSPEND_MAX) | ||||||
| 		return sprintf(buf, "%s\n", pm_states[state].state ? | 		return sprintf(buf, "%s\n", pm_states[state] ? | ||||||
| 					pm_states[state].label : "error"); | 					pm_states[state] : "error"); | ||||||
| #endif | #endif | ||||||
| #ifdef CONFIG_HIBERNATION | #ifdef CONFIG_HIBERNATION | ||||||
| 	return sprintf(buf, "disk\n"); | 	return sprintf(buf, "disk\n"); | ||||||
|  |  | ||||||
|  | @ -178,13 +178,8 @@ extern void swsusp_show_speed(struct timeval *, struct timeval *, | ||||||
| 				unsigned int, char *); | 				unsigned int, char *); | ||||||
| 
 | 
 | ||||||
| #ifdef CONFIG_SUSPEND | #ifdef CONFIG_SUSPEND | ||||||
| struct pm_sleep_state { |  | ||||||
| 	const char *label; |  | ||||||
| 	suspend_state_t state; |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| /* kernel/power/suspend.c */ | /* kernel/power/suspend.c */ | ||||||
| extern struct pm_sleep_state pm_states[]; | extern const char *pm_states[]; | ||||||
| 
 | 
 | ||||||
| extern int suspend_devices_and_enter(suspend_state_t state); | extern int suspend_devices_and_enter(suspend_state_t state); | ||||||
| #else /* !CONFIG_SUSPEND */ | #else /* !CONFIG_SUSPEND */ | ||||||
|  |  | ||||||
|  | @ -31,11 +31,8 @@ | ||||||
| 
 | 
 | ||||||
| #include "power.h" | #include "power.h" | ||||||
| 
 | 
 | ||||||
| struct pm_sleep_state pm_states[PM_SUSPEND_MAX] = { | static const char *pm_labels[] = { "mem", "standby", "freeze", }; | ||||||
| 	[PM_SUSPEND_FREEZE] = { .label = "freeze", .state = PM_SUSPEND_FREEZE }, | const char *pm_states[PM_SUSPEND_MAX]; | ||||||
| 	[PM_SUSPEND_STANDBY] = { .label = "standby", }, |  | ||||||
| 	[PM_SUSPEND_MEM] = { .label = "mem", }, |  | ||||||
| }; |  | ||||||
| 
 | 
 | ||||||
| static const struct platform_suspend_ops *suspend_ops; | static const struct platform_suspend_ops *suspend_ops; | ||||||
| static const struct platform_freeze_ops *freeze_ops; | static const struct platform_freeze_ops *freeze_ops; | ||||||
|  | @ -97,10 +94,7 @@ static bool relative_states; | ||||||
| static int __init sleep_states_setup(char *str) | static int __init sleep_states_setup(char *str) | ||||||
| { | { | ||||||
| 	relative_states = !strncmp(str, "1", 1); | 	relative_states = !strncmp(str, "1", 1); | ||||||
| 	if (relative_states) { | 	pm_states[PM_SUSPEND_FREEZE] = pm_labels[relative_states ? 0 : 2]; | ||||||
| 		pm_states[PM_SUSPEND_MEM].state = PM_SUSPEND_FREEZE; |  | ||||||
| 		pm_states[PM_SUSPEND_FREEZE].state = 0; |  | ||||||
| 	} |  | ||||||
| 	return 1; | 	return 1; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -113,20 +107,20 @@ __setup("relative_sleep_states=", sleep_states_setup); | ||||||
| void suspend_set_ops(const struct platform_suspend_ops *ops) | void suspend_set_ops(const struct platform_suspend_ops *ops) | ||||||
| { | { | ||||||
| 	suspend_state_t i; | 	suspend_state_t i; | ||||||
| 	int j = PM_SUSPEND_MAX - 1; | 	int j = 0; | ||||||
| 
 | 
 | ||||||
| 	lock_system_sleep(); | 	lock_system_sleep(); | ||||||
| 
 | 
 | ||||||
| 	suspend_ops = ops; | 	suspend_ops = ops; | ||||||
| 	for (i = PM_SUSPEND_MEM; i >= PM_SUSPEND_STANDBY; i--) | 	for (i = PM_SUSPEND_MEM; i >= PM_SUSPEND_STANDBY; i--) | ||||||
| 		if (valid_state(i)) | 		if (valid_state(i)) { | ||||||
| 			pm_states[j--].state = i; | 			pm_states[i] = pm_labels[j++]; | ||||||
| 		else if (!relative_states) | 		} else if (!relative_states) { | ||||||
| 			pm_states[j--].state = 0; | 			pm_states[i] = NULL; | ||||||
|  | 			j++; | ||||||
|  | 		} | ||||||
| 
 | 
 | ||||||
| 	pm_states[j--].state = PM_SUSPEND_FREEZE; | 	pm_states[PM_SUSPEND_FREEZE] = pm_labels[j]; | ||||||
| 	while (j >= PM_SUSPEND_MIN) |  | ||||||
| 		pm_states[j--].state = 0; |  | ||||||
| 
 | 
 | ||||||
| 	unlock_system_sleep(); | 	unlock_system_sleep(); | ||||||
| } | } | ||||||
|  | @ -395,7 +389,7 @@ static int enter_state(suspend_state_t state) | ||||||
| 	printk("done.\n"); | 	printk("done.\n"); | ||||||
| 	trace_suspend_resume(TPS("sync_filesystems"), 0, false); | 	trace_suspend_resume(TPS("sync_filesystems"), 0, false); | ||||||
| 
 | 
 | ||||||
| 	pr_debug("PM: Preparing system for %s sleep\n", pm_states[state].label); | 	pr_debug("PM: Preparing system for %s sleep\n", pm_states[state]); | ||||||
| 	error = suspend_prepare(state); | 	error = suspend_prepare(state); | ||||||
| 	if (error) | 	if (error) | ||||||
| 		goto Unlock; | 		goto Unlock; | ||||||
|  | @ -404,7 +398,7 @@ static int enter_state(suspend_state_t state) | ||||||
| 		goto Finish; | 		goto Finish; | ||||||
| 
 | 
 | ||||||
| 	trace_suspend_resume(TPS("suspend_enter"), state, false); | 	trace_suspend_resume(TPS("suspend_enter"), state, false); | ||||||
| 	pr_debug("PM: Entering %s sleep\n", pm_states[state].label); | 	pr_debug("PM: Entering %s sleep\n", pm_states[state]); | ||||||
| 	pm_restrict_gfp_mask(); | 	pm_restrict_gfp_mask(); | ||||||
| 	error = suspend_devices_and_enter(state); | 	error = suspend_devices_and_enter(state); | ||||||
| 	pm_restore_gfp_mask(); | 	pm_restore_gfp_mask(); | ||||||
|  |  | ||||||
|  | @ -92,13 +92,13 @@ static void __init test_wakealarm(struct rtc_device *rtc, suspend_state_t state) | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	if (state == PM_SUSPEND_MEM) { | 	if (state == PM_SUSPEND_MEM) { | ||||||
| 		printk(info_test, pm_states[state].label); | 		printk(info_test, pm_states[state]); | ||||||
| 		status = pm_suspend(state); | 		status = pm_suspend(state); | ||||||
| 		if (status == -ENODEV) | 		if (status == -ENODEV) | ||||||
| 			state = PM_SUSPEND_STANDBY; | 			state = PM_SUSPEND_STANDBY; | ||||||
| 	} | 	} | ||||||
| 	if (state == PM_SUSPEND_STANDBY) { | 	if (state == PM_SUSPEND_STANDBY) { | ||||||
| 		printk(info_test, pm_states[state].label); | 		printk(info_test, pm_states[state]); | ||||||
| 		status = pm_suspend(state); | 		status = pm_suspend(state); | ||||||
| 	} | 	} | ||||||
| 	if (status < 0) | 	if (status < 0) | ||||||
|  | @ -141,8 +141,8 @@ static int __init setup_test_suspend(char *value) | ||||||
| 	/* "=mem" ==> "mem" */ | 	/* "=mem" ==> "mem" */ | ||||||
| 	value++; | 	value++; | ||||||
| 	for (i = PM_SUSPEND_MIN; i < PM_SUSPEND_MAX; i++) | 	for (i = PM_SUSPEND_MIN; i < PM_SUSPEND_MAX; i++) | ||||||
| 		if (!strcmp(pm_states[i].label, value)) { | 		if (!strcmp(pm_states[i], value)) { | ||||||
| 			test_state = pm_states[i].state; | 			test_state = i; | ||||||
| 			return 0; | 			return 0; | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
|  | @ -162,8 +162,8 @@ static int __init test_suspend(void) | ||||||
| 	/* PM is initialized by now; is that state testable? */ | 	/* PM is initialized by now; is that state testable? */ | ||||||
| 	if (test_state == PM_SUSPEND_ON) | 	if (test_state == PM_SUSPEND_ON) | ||||||
| 		goto done; | 		goto done; | ||||||
| 	if (!pm_states[test_state].state) { | 	if (!pm_states[test_state]) { | ||||||
| 		printk(warn_bad_state, pm_states[test_state].label); | 		printk(warn_bad_state, pm_states[test_state]); | ||||||
| 		goto done; | 		goto done; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Rafael J. Wysocki
				Rafael J. Wysocki