Merge master.kernel.org:/pub/scm/linux/kernel/git/davej/agpgart
[linux-2.6] / drivers / base / power / sysfs.c
1 /*
2  * drivers/base/power/sysfs.c - sysfs entries for device PM
3  */
4
5 #include <linux/device.h>
6 #include "power.h"
7
8
9 /**
10  *      state - Control current power state of device
11  *
12  *      show() returns the current power state of the device. '0' indicates
13  *      the device is on. Other values (1-3) indicate the device is in a low
14  *      power state.
15  *
16  *      store() sets the current power state, which is an integer value
17  *      between 0-3. If the device is on ('0'), and the value written is
18  *      greater than 0, then the device is placed directly into the low-power
19  *      state (via its driver's ->suspend() method).
20  *      If the device is currently in a low-power state, and the value is 0,
21  *      the device is powered back on (via the ->resume() method).
22  *      If the device is in a low-power state, and a different low-power state
23  *      is requested, the device is first resumed, then suspended into the new
24  *      low-power state.
25  */
26
27 static ssize_t state_show(struct device * dev, struct device_attribute *attr, char * buf)
28 {
29         return sprintf(buf, "%u\n", dev->power.power_state.event);
30 }
31
32 static ssize_t state_store(struct device * dev, struct device_attribute *attr, const char * buf, size_t n)
33 {
34         pm_message_t state;
35         char * rest;
36         int error = 0;
37
38         state.event = simple_strtoul(buf, &rest, 10);
39         if (*rest)
40                 return -EINVAL;
41         if (state.event)
42                 error = dpm_runtime_suspend(dev, state);
43         else
44                 dpm_runtime_resume(dev);
45         return error ? error : n;
46 }
47
48 static DEVICE_ATTR(state, 0644, state_show, state_store);
49
50
51 static struct attribute * power_attrs[] = {
52         &dev_attr_state.attr,
53         NULL,
54 };
55 static struct attribute_group pm_attr_group = {
56         .name   = "power",
57         .attrs  = power_attrs,
58 };
59
60 int dpm_sysfs_add(struct device * dev)
61 {
62         return sysfs_create_group(&dev->kobj, &pm_attr_group);
63 }
64
65 void dpm_sysfs_remove(struct device * dev)
66 {
67         sysfs_remove_group(&dev->kobj, &pm_attr_group);
68 }