1
2
3
4
5
6
7
8
9
10
11
12
13
14#ifndef __LINUX_OPP_H__
15#define __LINUX_OPP_H__
16
17#include <linux/err.h>
18#include <linux/notifier.h>
19
20struct clk;
21struct regulator;
22struct dev_pm_opp;
23struct device;
24struct opp_table;
25
26enum dev_pm_opp_event {
27 OPP_EVENT_ADD, OPP_EVENT_REMOVE, OPP_EVENT_ENABLE, OPP_EVENT_DISABLE,
28};
29
30
31
32
33
34
35
36
37
38
39struct dev_pm_opp_supply {
40 unsigned long u_volt;
41 unsigned long u_volt_min;
42 unsigned long u_volt_max;
43 unsigned long u_amp;
44};
45
46
47
48
49
50
51
52
53struct dev_pm_opp_info {
54 unsigned long rate;
55 struct dev_pm_opp_supply *supplies;
56};
57
58
59
60
61
62
63
64
65
66
67
68
69struct dev_pm_set_opp_data {
70 struct dev_pm_opp_info old_opp;
71 struct dev_pm_opp_info new_opp;
72
73 struct regulator **regulators;
74 unsigned int regulator_count;
75 struct clk *clk;
76 struct device *dev;
77};
78
79#if defined(CONFIG_PM_OPP)
80
81struct opp_table *dev_pm_opp_get_opp_table(struct device *dev);
82void dev_pm_opp_put_opp_table(struct opp_table *opp_table);
83
84unsigned long dev_pm_opp_get_voltage(struct dev_pm_opp *opp);
85
86unsigned long dev_pm_opp_get_freq(struct dev_pm_opp *opp);
87
88bool dev_pm_opp_is_turbo(struct dev_pm_opp *opp);
89
90int dev_pm_opp_get_opp_count(struct device *dev);
91unsigned long dev_pm_opp_get_max_clock_latency(struct device *dev);
92unsigned long dev_pm_opp_get_max_volt_latency(struct device *dev);
93unsigned long dev_pm_opp_get_max_transition_latency(struct device *dev);
94unsigned long dev_pm_opp_get_suspend_opp_freq(struct device *dev);
95
96struct dev_pm_opp *dev_pm_opp_find_freq_exact(struct device *dev,
97 unsigned long freq,
98 bool available);
99
100struct dev_pm_opp *dev_pm_opp_find_freq_floor(struct device *dev,
101 unsigned long *freq);
102
103struct dev_pm_opp *dev_pm_opp_find_freq_ceil(struct device *dev,
104 unsigned long *freq);
105void dev_pm_opp_put(struct dev_pm_opp *opp);
106
107int dev_pm_opp_add(struct device *dev, unsigned long freq,
108 unsigned long u_volt);
109void dev_pm_opp_remove(struct device *dev, unsigned long freq);
110
111int dev_pm_opp_enable(struct device *dev, unsigned long freq);
112
113int dev_pm_opp_disable(struct device *dev, unsigned long freq);
114
115int dev_pm_opp_register_notifier(struct device *dev, struct notifier_block *nb);
116int dev_pm_opp_unregister_notifier(struct device *dev, struct notifier_block *nb);
117
118struct opp_table *dev_pm_opp_set_supported_hw(struct device *dev, const u32 *versions, unsigned int count);
119void dev_pm_opp_put_supported_hw(struct opp_table *opp_table);
120struct opp_table *dev_pm_opp_set_prop_name(struct device *dev, const char *name);
121void dev_pm_opp_put_prop_name(struct opp_table *opp_table);
122struct opp_table *dev_pm_opp_set_regulators(struct device *dev, const char * const names[], unsigned int count);
123void dev_pm_opp_put_regulators(struct opp_table *opp_table);
124struct opp_table *dev_pm_opp_set_clkname(struct device *dev, const char * name);
125void dev_pm_opp_put_clkname(struct opp_table *opp_table);
126struct opp_table *dev_pm_opp_register_set_opp_helper(struct device *dev, int (*set_opp)(struct dev_pm_set_opp_data *data));
127void dev_pm_opp_unregister_set_opp_helper(struct opp_table *opp_table);
128struct opp_table *dev_pm_opp_register_get_pstate_helper(struct device *dev, int (*get_pstate)(struct device *dev, unsigned long rate));
129void dev_pm_opp_unregister_get_pstate_helper(struct opp_table *opp_table);
130int dev_pm_opp_set_rate(struct device *dev, unsigned long target_freq);
131int dev_pm_opp_set_sharing_cpus(struct device *cpu_dev, const struct cpumask *cpumask);
132int dev_pm_opp_get_sharing_cpus(struct device *cpu_dev, struct cpumask *cpumask);
133void dev_pm_opp_remove_table(struct device *dev);
134void dev_pm_opp_cpumask_remove_table(const struct cpumask *cpumask);
135#else
136static inline struct opp_table *dev_pm_opp_get_opp_table(struct device *dev)
137{
138 return ERR_PTR(-ENOTSUPP);
139}
140
141static inline void dev_pm_opp_put_opp_table(struct opp_table *opp_table) {}
142
143static inline unsigned long dev_pm_opp_get_voltage(struct dev_pm_opp *opp)
144{
145 return 0;
146}
147
148static inline unsigned long dev_pm_opp_get_freq(struct dev_pm_opp *opp)
149{
150 return 0;
151}
152
153static inline bool dev_pm_opp_is_turbo(struct dev_pm_opp *opp)
154{
155 return false;
156}
157
158static inline int dev_pm_opp_get_opp_count(struct device *dev)
159{
160 return 0;
161}
162
163static inline unsigned long dev_pm_opp_get_max_clock_latency(struct device *dev)
164{
165 return 0;
166}
167
168static inline unsigned long dev_pm_opp_get_max_volt_latency(struct device *dev)
169{
170 return 0;
171}
172
173static inline unsigned long dev_pm_opp_get_max_transition_latency(struct device *dev)
174{
175 return 0;
176}
177
178static inline unsigned long dev_pm_opp_get_suspend_opp_freq(struct device *dev)
179{
180 return 0;
181}
182
183static inline struct dev_pm_opp *dev_pm_opp_find_freq_exact(struct device *dev,
184 unsigned long freq, bool available)
185{
186 return ERR_PTR(-ENOTSUPP);
187}
188
189static inline struct dev_pm_opp *dev_pm_opp_find_freq_floor(struct device *dev,
190 unsigned long *freq)
191{
192 return ERR_PTR(-ENOTSUPP);
193}
194
195static inline struct dev_pm_opp *dev_pm_opp_find_freq_ceil(struct device *dev,
196 unsigned long *freq)
197{
198 return ERR_PTR(-ENOTSUPP);
199}
200
201static inline void dev_pm_opp_put(struct dev_pm_opp *opp) {}
202
203static inline int dev_pm_opp_add(struct device *dev, unsigned long freq,
204 unsigned long u_volt)
205{
206 return -ENOTSUPP;
207}
208
209static inline void dev_pm_opp_remove(struct device *dev, unsigned long freq)
210{
211}
212
213static inline int dev_pm_opp_enable(struct device *dev, unsigned long freq)
214{
215 return 0;
216}
217
218static inline int dev_pm_opp_disable(struct device *dev, unsigned long freq)
219{
220 return 0;
221}
222
223static inline int dev_pm_opp_register_notifier(struct device *dev, struct notifier_block *nb)
224{
225 return -ENOTSUPP;
226}
227
228static inline int dev_pm_opp_unregister_notifier(struct device *dev, struct notifier_block *nb)
229{
230 return -ENOTSUPP;
231}
232
233static inline struct opp_table *dev_pm_opp_set_supported_hw(struct device *dev,
234 const u32 *versions,
235 unsigned int count)
236{
237 return ERR_PTR(-ENOTSUPP);
238}
239
240static inline void dev_pm_opp_put_supported_hw(struct opp_table *opp_table) {}
241
242static inline struct opp_table *dev_pm_opp_register_set_opp_helper(struct device *dev,
243 int (*set_opp)(struct dev_pm_set_opp_data *data))
244{
245 return ERR_PTR(-ENOTSUPP);
246}
247
248static inline void dev_pm_opp_unregister_set_opp_helper(struct opp_table *opp_table) {}
249
250static inline struct opp_table *dev_pm_opp_register_get_pstate_helper(struct device *dev,
251 int (*get_pstate)(struct device *dev, unsigned long rate))
252{
253 return ERR_PTR(-ENOTSUPP);
254}
255
256static inline void dev_pm_opp_unregister_get_pstate_helper(struct opp_table *opp_table) {}
257
258static inline struct opp_table *dev_pm_opp_set_prop_name(struct device *dev, const char *name)
259{
260 return ERR_PTR(-ENOTSUPP);
261}
262
263static inline void dev_pm_opp_put_prop_name(struct opp_table *opp_table) {}
264
265static inline struct opp_table *dev_pm_opp_set_regulators(struct device *dev, const char * const names[], unsigned int count)
266{
267 return ERR_PTR(-ENOTSUPP);
268}
269
270static inline void dev_pm_opp_put_regulators(struct opp_table *opp_table) {}
271
272static inline struct opp_table *dev_pm_opp_set_clkname(struct device *dev, const char * name)
273{
274 return ERR_PTR(-ENOTSUPP);
275}
276
277static inline void dev_pm_opp_put_clkname(struct opp_table *opp_table) {}
278
279static inline int dev_pm_opp_set_rate(struct device *dev, unsigned long target_freq)
280{
281 return -ENOTSUPP;
282}
283
284static inline int dev_pm_opp_set_sharing_cpus(struct device *cpu_dev, const struct cpumask *cpumask)
285{
286 return -ENOTSUPP;
287}
288
289static inline int dev_pm_opp_get_sharing_cpus(struct device *cpu_dev, struct cpumask *cpumask)
290{
291 return -EINVAL;
292}
293
294static inline void dev_pm_opp_remove_table(struct device *dev)
295{
296}
297
298static inline void dev_pm_opp_cpumask_remove_table(const struct cpumask *cpumask)
299{
300}
301
302#endif
303
304#if defined(CONFIG_PM_OPP) && defined(CONFIG_OF)
305int dev_pm_opp_of_add_table(struct device *dev);
306void dev_pm_opp_of_remove_table(struct device *dev);
307int dev_pm_opp_of_cpumask_add_table(const struct cpumask *cpumask);
308void dev_pm_opp_of_cpumask_remove_table(const struct cpumask *cpumask);
309int dev_pm_opp_of_get_sharing_cpus(struct device *cpu_dev, struct cpumask *cpumask);
310struct device_node *dev_pm_opp_of_get_opp_desc_node(struct device *dev);
311#else
312static inline int dev_pm_opp_of_add_table(struct device *dev)
313{
314 return -ENOTSUPP;
315}
316
317static inline void dev_pm_opp_of_remove_table(struct device *dev)
318{
319}
320
321static inline int dev_pm_opp_of_cpumask_add_table(const struct cpumask *cpumask)
322{
323 return -ENOTSUPP;
324}
325
326static inline void dev_pm_opp_of_cpumask_remove_table(const struct cpumask *cpumask)
327{
328}
329
330static inline int dev_pm_opp_of_get_sharing_cpus(struct device *cpu_dev, struct cpumask *cpumask)
331{
332 return -ENOTSUPP;
333}
334
335static inline struct device_node *dev_pm_opp_of_get_opp_desc_node(struct device *dev)
336{
337 return NULL;
338}
339#endif
340
341#endif
342