afc8cecccbf9381fe30b940703107e766b50af7a
[linux-2.6.git] / include / linux / pm_qos.h
1 #ifndef _LINUX_PM_QOS_H
2 #define _LINUX_PM_QOS_H
3 /* interface for the pm_qos_power infrastructure of the linux kernel.
4  *
5  * Mark Gross <mgross@linux.intel.com>
6  */
7 #include <linux/plist.h>
8 #include <linux/notifier.h>
9 #include <linux/miscdevice.h>
10 #include <linux/device.h>
11
12 enum {
13         PM_QOS_RESERVED = 0,
14         PM_QOS_CPU_DMA_LATENCY,
15         PM_QOS_NETWORK_LATENCY,
16         PM_QOS_NETWORK_THROUGHPUT,
17         PM_QOS_MIN_ONLINE_CPUS,
18         PM_QOS_MAX_ONLINE_CPUS,
19         PM_QOS_CPU_FREQ_MIN,
20         PM_QOS_CPU_FREQ_MAX,
21
22         /* insert new class ID */
23
24         PM_QOS_NUM_CLASSES,
25 };
26
27 #define PM_QOS_DEFAULT_VALUE -1
28
29 #define PM_QOS_CPU_DMA_LAT_DEFAULT_VALUE        (2000 * USEC_PER_SEC)
30 #define PM_QOS_NETWORK_LAT_DEFAULT_VALUE        (2000 * USEC_PER_SEC)
31 #define PM_QOS_NETWORK_THROUGHPUT_DEFAULT_VALUE 0
32 #define PM_QOS_MIN_ONLINE_CPUS_DEFAULT_VALUE    0
33 #define PM_QOS_MAX_ONLINE_CPUS_DEFAULT_VALUE    LONG_MAX
34 #define PM_QOS_CPU_FREQ_MIN_DEFAULT_VALUE       0
35 #define PM_QOS_CPU_FREQ_MAX_DEFAULT_VALUE       LONG_MAX
36 #define PM_QOS_DEV_LAT_DEFAULT_VALUE            0
37
38 struct pm_qos_request {
39         struct plist_node node;
40         int pm_qos_class;
41 };
42
43 struct dev_pm_qos_request {
44         struct plist_node node;
45         struct device *dev;
46 };
47
48 enum pm_qos_type {
49         PM_QOS_UNITIALIZED,
50         PM_QOS_MAX,             /* return the largest value */
51         PM_QOS_MIN              /* return the smallest value */
52 };
53
54 /*
55  * Note: The lockless read path depends on the CPU accessing
56  * target_value atomically.  Atomic access is only guaranteed on all CPU
57  * types linux supports for 32 bit quantites
58  */
59 struct pm_qos_constraints {
60         struct plist_head list;
61         s32 target_value;       /* Do not change to 64 bit */
62         s32 default_value;
63         enum pm_qos_type type;
64         struct blocking_notifier_head *notifiers;
65 };
66
67 /* Action requested to pm_qos_update_target */
68 enum pm_qos_req_action {
69         PM_QOS_ADD_REQ,         /* Add a new request */
70         PM_QOS_UPDATE_REQ,      /* Update an existing request */
71         PM_QOS_REMOVE_REQ       /* Remove an existing request */
72 };
73
74 static inline int dev_pm_qos_request_active(struct dev_pm_qos_request *req)
75 {
76         return req->dev != 0;
77 }
78
79 int pm_qos_update_target(struct pm_qos_constraints *c, struct plist_node *node,
80                          enum pm_qos_req_action action, int value);
81 void pm_qos_add_request(struct pm_qos_request *req, int pm_qos_class,
82                         s32 value);
83 void pm_qos_update_request(struct pm_qos_request *req,
84                            s32 new_value);
85 void pm_qos_remove_request(struct pm_qos_request *req);
86
87 int pm_qos_request(int pm_qos_class);
88 int pm_qos_add_notifier(int pm_qos_class, struct notifier_block *notifier);
89 int pm_qos_remove_notifier(int pm_qos_class, struct notifier_block *notifier);
90 int pm_qos_request_active(struct pm_qos_request *req);
91 s32 pm_qos_read_value(struct pm_qos_constraints *c);
92
93 #ifdef CONFIG_PM
94 s32 __dev_pm_qos_read_value(struct device *dev);
95 s32 dev_pm_qos_read_value(struct device *dev);
96 int dev_pm_qos_add_request(struct device *dev, struct dev_pm_qos_request *req,
97                            s32 value);
98 int dev_pm_qos_update_request(struct dev_pm_qos_request *req, s32 new_value);
99 int dev_pm_qos_remove_request(struct dev_pm_qos_request *req);
100 int dev_pm_qos_add_notifier(struct device *dev,
101                             struct notifier_block *notifier);
102 int dev_pm_qos_remove_notifier(struct device *dev,
103                                struct notifier_block *notifier);
104 int dev_pm_qos_add_global_notifier(struct notifier_block *notifier);
105 int dev_pm_qos_remove_global_notifier(struct notifier_block *notifier);
106 void dev_pm_qos_constraints_init(struct device *dev);
107 void dev_pm_qos_constraints_destroy(struct device *dev);
108 int dev_pm_qos_add_ancestor_request(struct device *dev,
109                                     struct dev_pm_qos_request *req, s32 value);
110 #else
111 static inline s32 __dev_pm_qos_read_value(struct device *dev)
112                         { return 0; }
113 static inline s32 dev_pm_qos_read_value(struct device *dev)
114                         { return 0; }
115 static inline int dev_pm_qos_add_request(struct device *dev,
116                                          struct dev_pm_qos_request *req,
117                                          s32 value)
118                         { return 0; }
119 static inline int dev_pm_qos_update_request(struct dev_pm_qos_request *req,
120                                             s32 new_value)
121                         { return 0; }
122 static inline int dev_pm_qos_remove_request(struct dev_pm_qos_request *req)
123                         { return 0; }
124 static inline int dev_pm_qos_add_notifier(struct device *dev,
125                                           struct notifier_block *notifier)
126                         { return 0; }
127 static inline int dev_pm_qos_remove_notifier(struct device *dev,
128                                              struct notifier_block *notifier)
129                         { return 0; }
130 static inline int dev_pm_qos_add_global_notifier(
131                                         struct notifier_block *notifier)
132                         { return 0; }
133 static inline int dev_pm_qos_remove_global_notifier(
134                                         struct notifier_block *notifier)
135                         { return 0; }
136 static inline void dev_pm_qos_constraints_init(struct device *dev)
137 {
138         dev->power.power_state = PMSG_ON;
139 }
140 static inline void dev_pm_qos_constraints_destroy(struct device *dev)
141 {
142         dev->power.power_state = PMSG_INVALID;
143 }
144 static inline int dev_pm_qos_add_ancestor_request(struct device *dev,
145                                     struct dev_pm_qos_request *req, s32 value)
146                         { return 0; }
147 #endif
148
149 #ifdef CONFIG_PM_RUNTIME
150 int dev_pm_qos_expose_latency_limit(struct device *dev, s32 value);
151 void dev_pm_qos_hide_latency_limit(struct device *dev);
152 #else
153 static inline int dev_pm_qos_expose_latency_limit(struct device *dev, s32 value)
154                         { return 0; }
155 static inline void dev_pm_qos_hide_latency_limit(struct device *dev) {}
156 #endif
157
158 #endif