[patch] pm: fix runtime powermanagement's /sys interface

Pavel Machek
2005-12-27T21:34:39Z

[-- Attachment #1: Type: text/plain, Size: 1317 bytes --]

/sys/devices/..../power interface is currently very broken. It takes
integer from user, and passes it to drivers as pm_message_t.event
... without even checking it. This changes the interface to pass
strings, and introduces checks.

Signed-off-by: Pavel Machek <pavel@suse.cz>

diff --git a/drivers/base/power/sysfs.c b/drivers/base/power/sysfs.c
--- a/drivers/base/power/sysfs.c
+++ b/drivers/base/power/sysfs.c
@@ -27,22 +27,25 @@

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, "suspend\n");
+ else
+ return sprintf(buf, "on\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)
- error = dpm_runtime_suspend(dev, state);
- else
+ state.event = PM_EVENT_SUSPEND;
+ if ((n == 2) && !strncmp(buf, "on", 2)) {
dpm_runtime_resume(dev);
+ error = 0;
+ }
+ if ((n == 7) && !strncmp(buf, "suspend", 7))
+ error = dpm_runtime_suspend(dev, state);
+
return error ? error : n;
}

--
Thanks, Sharp!

[-- Attachment #2: Type: text/plain, Size: 0 bytes --]