diff options
| -rw-r--r-- | drivers/base/power/sysfs.c | 24 | 
1 files changed, 16 insertions, 8 deletions
diff --git a/drivers/base/power/sysfs.c b/drivers/base/power/sysfs.c index f3a0c562bcb..40d7242a07c 100644 --- a/drivers/base/power/sysfs.c +++ b/drivers/base/power/sysfs.c @@ -27,22 +27,30 @@  static ssize_t state_show(struct device * dev, struct device_attribute *attr, char * buf)  { -	return sprintf(buf, "%u\n", dev->power.power_state.event); +	if (dev->power.power_state.event) +		return sprintf(buf, "2\n"); +	else +		return sprintf(buf, "0\n");  }  static ssize_t state_store(struct device * dev, struct device_attribute *attr, const char * buf, size_t n)  {  	pm_message_t state; -	char * rest; -	int error = 0; +	int error = -EINVAL; -	state.event = simple_strtoul(buf, &rest, 10); -	if (*rest) -		return -EINVAL; -	if (state.event) +	state.event = PM_EVENT_SUSPEND; +	/* Older apps expected to write "3" here - confused with PCI D3 */ +	if ((n == 1) && !strcmp(buf, "3"))  		error = dpm_runtime_suspend(dev, state); -	else + +	if ((n == 1) && !strcmp(buf, "2")) +		error = dpm_runtime_suspend(dev, state); + +	if ((n == 1) && !strcmp(buf, "0")) {  		dpm_runtime_resume(dev); +		error = 0; +	} +  	return error ? error : n;  }  |