Root/
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 | #include <linux/workqueue.h> |
12 | |
13 | enum { |
14 | PM_QOS_RESERVED = 0, |
15 | PM_QOS_CPU_DMA_LATENCY, |
16 | PM_QOS_NETWORK_LATENCY, |
17 | PM_QOS_NETWORK_THROUGHPUT, |
18 | |
19 | /* insert new class ID */ |
20 | PM_QOS_NUM_CLASSES, |
21 | }; |
22 | |
23 | enum pm_qos_flags_status { |
24 | PM_QOS_FLAGS_UNDEFINED = -1, |
25 | PM_QOS_FLAGS_NONE, |
26 | PM_QOS_FLAGS_SOME, |
27 | PM_QOS_FLAGS_ALL, |
28 | }; |
29 | |
30 | #define PM_QOS_DEFAULT_VALUE -1 |
31 | |
32 | #define PM_QOS_CPU_DMA_LAT_DEFAULT_VALUE (2000 * USEC_PER_SEC) |
33 | #define PM_QOS_NETWORK_LAT_DEFAULT_VALUE (2000 * USEC_PER_SEC) |
34 | #define PM_QOS_NETWORK_THROUGHPUT_DEFAULT_VALUE 0 |
35 | #define PM_QOS_DEV_LAT_DEFAULT_VALUE 0 |
36 | |
37 | #define PM_QOS_FLAG_NO_POWER_OFF (1 << 0) |
38 | #define PM_QOS_FLAG_REMOTE_WAKEUP (1 << 1) |
39 | |
40 | struct pm_qos_request { |
41 | struct plist_node node; |
42 | int pm_qos_class; |
43 | struct delayed_work work; /* for pm_qos_update_request_timeout */ |
44 | }; |
45 | |
46 | struct pm_qos_flags_request { |
47 | struct list_head node; |
48 | s32 flags; /* Do not change to 64 bit */ |
49 | }; |
50 | |
51 | enum dev_pm_qos_req_type { |
52 | DEV_PM_QOS_LATENCY = 1, |
53 | DEV_PM_QOS_FLAGS, |
54 | }; |
55 | |
56 | struct dev_pm_qos_request { |
57 | enum dev_pm_qos_req_type type; |
58 | union { |
59 | struct plist_node pnode; |
60 | struct pm_qos_flags_request flr; |
61 | } data; |
62 | struct device *dev; |
63 | }; |
64 | |
65 | enum pm_qos_type { |
66 | PM_QOS_UNITIALIZED, |
67 | PM_QOS_MAX, /* return the largest value */ |
68 | PM_QOS_MIN /* return the smallest value */ |
69 | }; |
70 | |
71 | /* |
72 | * Note: The lockless read path depends on the CPU accessing target_value |
73 | * or effective_flags atomically. Atomic access is only guaranteed on all CPU |
74 | * types linux supports for 32 bit quantites |
75 | */ |
76 | struct pm_qos_constraints { |
77 | struct plist_head list; |
78 | s32 target_value; /* Do not change to 64 bit */ |
79 | s32 default_value; |
80 | enum pm_qos_type type; |
81 | struct blocking_notifier_head *notifiers; |
82 | }; |
83 | |
84 | struct pm_qos_flags { |
85 | struct list_head list; |
86 | s32 effective_flags; /* Do not change to 64 bit */ |
87 | }; |
88 | |
89 | struct dev_pm_qos { |
90 | struct pm_qos_constraints latency; |
91 | struct pm_qos_flags flags; |
92 | struct dev_pm_qos_request *latency_req; |
93 | struct dev_pm_qos_request *flags_req; |
94 | }; |
95 | |
96 | /* Action requested to pm_qos_update_target */ |
97 | enum pm_qos_req_action { |
98 | PM_QOS_ADD_REQ, /* Add a new request */ |
99 | PM_QOS_UPDATE_REQ, /* Update an existing request */ |
100 | PM_QOS_REMOVE_REQ /* Remove an existing request */ |
101 | }; |
102 | |
103 | static inline int dev_pm_qos_request_active(struct dev_pm_qos_request *req) |
104 | { |
105 | return req->dev != NULL; |
106 | } |
107 | |
108 | int pm_qos_update_target(struct pm_qos_constraints *c, struct plist_node *node, |
109 | enum pm_qos_req_action action, int value); |
110 | bool pm_qos_update_flags(struct pm_qos_flags *pqf, |
111 | struct pm_qos_flags_request *req, |
112 | enum pm_qos_req_action action, s32 val); |
113 | void pm_qos_add_request(struct pm_qos_request *req, int pm_qos_class, |
114 | s32 value); |
115 | void pm_qos_update_request(struct pm_qos_request *req, |
116 | s32 new_value); |
117 | void pm_qos_update_request_timeout(struct pm_qos_request *req, |
118 | s32 new_value, unsigned long timeout_us); |
119 | void pm_qos_remove_request(struct pm_qos_request *req); |
120 | |
121 | int pm_qos_request(int pm_qos_class); |
122 | int pm_qos_add_notifier(int pm_qos_class, struct notifier_block *notifier); |
123 | int pm_qos_remove_notifier(int pm_qos_class, struct notifier_block *notifier); |
124 | int pm_qos_request_active(struct pm_qos_request *req); |
125 | s32 pm_qos_read_value(struct pm_qos_constraints *c); |
126 | |
127 | #ifdef CONFIG_PM |
128 | enum pm_qos_flags_status __dev_pm_qos_flags(struct device *dev, s32 mask); |
129 | enum pm_qos_flags_status dev_pm_qos_flags(struct device *dev, s32 mask); |
130 | s32 __dev_pm_qos_read_value(struct device *dev); |
131 | s32 dev_pm_qos_read_value(struct device *dev); |
132 | int dev_pm_qos_add_request(struct device *dev, struct dev_pm_qos_request *req, |
133 | enum dev_pm_qos_req_type type, s32 value); |
134 | int dev_pm_qos_update_request(struct dev_pm_qos_request *req, s32 new_value); |
135 | int dev_pm_qos_remove_request(struct dev_pm_qos_request *req); |
136 | int dev_pm_qos_add_notifier(struct device *dev, |
137 | struct notifier_block *notifier); |
138 | int dev_pm_qos_remove_notifier(struct device *dev, |
139 | struct notifier_block *notifier); |
140 | int dev_pm_qos_add_global_notifier(struct notifier_block *notifier); |
141 | int dev_pm_qos_remove_global_notifier(struct notifier_block *notifier); |
142 | void dev_pm_qos_constraints_init(struct device *dev); |
143 | void dev_pm_qos_constraints_destroy(struct device *dev); |
144 | int dev_pm_qos_add_ancestor_request(struct device *dev, |
145 | struct dev_pm_qos_request *req, s32 value); |
146 | #else |
147 | static inline enum pm_qos_flags_status __dev_pm_qos_flags(struct device *dev, |
148 | s32 mask) |
149 | { return PM_QOS_FLAGS_UNDEFINED; } |
150 | static inline enum pm_qos_flags_status dev_pm_qos_flags(struct device *dev, |
151 | s32 mask) |
152 | { return PM_QOS_FLAGS_UNDEFINED; } |
153 | static inline s32 __dev_pm_qos_read_value(struct device *dev) |
154 | { return 0; } |
155 | static inline s32 dev_pm_qos_read_value(struct device *dev) |
156 | { return 0; } |
157 | static inline int dev_pm_qos_add_request(struct device *dev, |
158 | struct dev_pm_qos_request *req, |
159 | enum dev_pm_qos_req_type type, |
160 | s32 value) |
161 | { return 0; } |
162 | static inline int dev_pm_qos_update_request(struct dev_pm_qos_request *req, |
163 | s32 new_value) |
164 | { return 0; } |
165 | static inline int dev_pm_qos_remove_request(struct dev_pm_qos_request *req) |
166 | { return 0; } |
167 | static inline int dev_pm_qos_add_notifier(struct device *dev, |
168 | struct notifier_block *notifier) |
169 | { return 0; } |
170 | static inline int dev_pm_qos_remove_notifier(struct device *dev, |
171 | struct notifier_block *notifier) |
172 | { return 0; } |
173 | static inline int dev_pm_qos_add_global_notifier( |
174 | struct notifier_block *notifier) |
175 | { return 0; } |
176 | static inline int dev_pm_qos_remove_global_notifier( |
177 | struct notifier_block *notifier) |
178 | { return 0; } |
179 | static inline void dev_pm_qos_constraints_init(struct device *dev) |
180 | { |
181 | dev->power.power_state = PMSG_ON; |
182 | } |
183 | static inline void dev_pm_qos_constraints_destroy(struct device *dev) |
184 | { |
185 | dev->power.power_state = PMSG_INVALID; |
186 | } |
187 | static inline int dev_pm_qos_add_ancestor_request(struct device *dev, |
188 | struct dev_pm_qos_request *req, s32 value) |
189 | { return 0; } |
190 | #endif |
191 | |
192 | #ifdef CONFIG_PM_RUNTIME |
193 | int dev_pm_qos_expose_latency_limit(struct device *dev, s32 value); |
194 | void dev_pm_qos_hide_latency_limit(struct device *dev); |
195 | int dev_pm_qos_expose_flags(struct device *dev, s32 value); |
196 | void dev_pm_qos_hide_flags(struct device *dev); |
197 | int dev_pm_qos_update_flags(struct device *dev, s32 mask, bool set); |
198 | |
199 | static inline s32 dev_pm_qos_requested_latency(struct device *dev) |
200 | { |
201 | return dev->power.qos->latency_req->data.pnode.prio; |
202 | } |
203 | |
204 | static inline s32 dev_pm_qos_requested_flags(struct device *dev) |
205 | { |
206 | return dev->power.qos->flags_req->data.flr.flags; |
207 | } |
208 | #else |
209 | static inline int dev_pm_qos_expose_latency_limit(struct device *dev, s32 value) |
210 | { return 0; } |
211 | static inline void dev_pm_qos_hide_latency_limit(struct device *dev) {} |
212 | static inline int dev_pm_qos_expose_flags(struct device *dev, s32 value) |
213 | { return 0; } |
214 | static inline void dev_pm_qos_hide_flags(struct device *dev) {} |
215 | static inline int dev_pm_qos_update_flags(struct device *dev, s32 m, bool set) |
216 | { return 0; } |
217 | |
218 | static inline s32 dev_pm_qos_requested_latency(struct device *dev) { return 0; } |
219 | static inline s32 dev_pm_qos_requested_flags(struct device *dev) { return 0; } |
220 | #endif |
221 | |
222 | #endif |
223 |
Branches:
ben-wpan
ben-wpan-stefan
javiroman/ks7010
jz-2.6.34
jz-2.6.34-rc5
jz-2.6.34-rc6
jz-2.6.34-rc7
jz-2.6.35
jz-2.6.36
jz-2.6.37
jz-2.6.38
jz-2.6.39
jz-3.0
jz-3.1
jz-3.11
jz-3.12
jz-3.13
jz-3.15
jz-3.16
jz-3.18-dt
jz-3.2
jz-3.3
jz-3.4
jz-3.5
jz-3.6
jz-3.6-rc2-pwm
jz-3.9
jz-3.9-clk
jz-3.9-rc8
jz47xx
jz47xx-2.6.38
master
Tags:
od-2011-09-04
od-2011-09-18
v2.6.34-rc5
v2.6.34-rc6
v2.6.34-rc7
v3.9