Linux kernel mirror (for testing)
git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel
os
linux
1/* SPDX-License-Identifier: GPL-2.0-only */
2/*
3 * Generic OPP Interface
4 *
5 * Copyright (C) 2009-2010 Texas Instruments Incorporated.
6 * Nishanth Menon
7 * Romit Dasgupta
8 * Kevin Hilman
9 */
10
11#ifndef __LINUX_OPP_H__
12#define __LINUX_OPP_H__
13
14#include <linux/energy_model.h>
15#include <linux/err.h>
16#include <linux/notifier.h>
17
18struct clk;
19struct regulator;
20struct dev_pm_opp;
21struct device;
22struct opp_table;
23
24enum dev_pm_opp_event {
25 OPP_EVENT_ADD, OPP_EVENT_REMOVE, OPP_EVENT_ENABLE, OPP_EVENT_DISABLE,
26 OPP_EVENT_ADJUST_VOLTAGE,
27};
28
29/**
30 * struct dev_pm_opp_supply - Power supply voltage/current values
31 * @u_volt: Target voltage in microvolts corresponding to this OPP
32 * @u_volt_min: Minimum voltage in microvolts corresponding to this OPP
33 * @u_volt_max: Maximum voltage in microvolts corresponding to this OPP
34 * @u_amp: Maximum current drawn by the device in microamperes
35 * @u_watt: Power used by the device in microwatts
36 *
37 * This structure stores the voltage/current/power values for a single power
38 * supply.
39 */
40struct dev_pm_opp_supply {
41 unsigned long u_volt;
42 unsigned long u_volt_min;
43 unsigned long u_volt_max;
44 unsigned long u_amp;
45 unsigned long u_watt;
46};
47
48/**
49 * struct dev_pm_opp_icc_bw - Interconnect bandwidth values
50 * @avg: Average bandwidth corresponding to this OPP (in icc units)
51 * @peak: Peak bandwidth corresponding to this OPP (in icc units)
52 *
53 * This structure stores the bandwidth values for a single interconnect path.
54 */
55struct dev_pm_opp_icc_bw {
56 u32 avg;
57 u32 peak;
58};
59
60/**
61 * struct dev_pm_opp_info - OPP freq/voltage/current values
62 * @rate: Target clk rate in hz
63 * @supplies: Array of voltage/current values for all power supplies
64 *
65 * This structure stores the freq/voltage/current values for a single OPP.
66 */
67struct dev_pm_opp_info {
68 unsigned long rate;
69 struct dev_pm_opp_supply *supplies;
70};
71
72/**
73 * struct dev_pm_set_opp_data - Set OPP data
74 * @old_opp: Old OPP info
75 * @new_opp: New OPP info
76 * @regulators: Array of regulator pointers
77 * @regulator_count: Number of regulators
78 * @clk: Pointer to clk
79 * @dev: Pointer to the struct device
80 *
81 * This structure contains all information required for setting an OPP.
82 */
83struct dev_pm_set_opp_data {
84 struct dev_pm_opp_info old_opp;
85 struct dev_pm_opp_info new_opp;
86
87 struct regulator **regulators;
88 unsigned int regulator_count;
89 struct clk *clk;
90 struct device *dev;
91};
92
93#if defined(CONFIG_PM_OPP)
94
95struct opp_table *dev_pm_opp_get_opp_table(struct device *dev);
96void dev_pm_opp_put_opp_table(struct opp_table *opp_table);
97
98unsigned long dev_pm_opp_get_voltage(struct dev_pm_opp *opp);
99
100unsigned long dev_pm_opp_get_power(struct dev_pm_opp *opp);
101
102unsigned long dev_pm_opp_get_freq(struct dev_pm_opp *opp);
103
104unsigned int dev_pm_opp_get_level(struct dev_pm_opp *opp);
105
106unsigned int dev_pm_opp_get_required_pstate(struct dev_pm_opp *opp,
107 unsigned int index);
108
109bool dev_pm_opp_is_turbo(struct dev_pm_opp *opp);
110
111int dev_pm_opp_get_opp_count(struct device *dev);
112unsigned long dev_pm_opp_get_max_clock_latency(struct device *dev);
113unsigned long dev_pm_opp_get_max_volt_latency(struct device *dev);
114unsigned long dev_pm_opp_get_max_transition_latency(struct device *dev);
115unsigned long dev_pm_opp_get_suspend_opp_freq(struct device *dev);
116
117struct dev_pm_opp *dev_pm_opp_find_freq_exact(struct device *dev,
118 unsigned long freq,
119 bool available);
120struct dev_pm_opp *dev_pm_opp_find_freq_floor(struct device *dev,
121 unsigned long *freq);
122struct dev_pm_opp *dev_pm_opp_find_freq_ceil_by_volt(struct device *dev,
123 unsigned long u_volt);
124
125struct dev_pm_opp *dev_pm_opp_find_level_exact(struct device *dev,
126 unsigned int level);
127struct dev_pm_opp *dev_pm_opp_find_level_ceil(struct device *dev,
128 unsigned int *level);
129
130struct dev_pm_opp *dev_pm_opp_find_freq_ceil(struct device *dev,
131 unsigned long *freq);
132
133struct dev_pm_opp *dev_pm_opp_find_bw_ceil(struct device *dev,
134 unsigned int *bw, int index);
135
136struct dev_pm_opp *dev_pm_opp_find_bw_floor(struct device *dev,
137 unsigned int *bw, int index);
138
139void dev_pm_opp_put(struct dev_pm_opp *opp);
140
141int dev_pm_opp_add(struct device *dev, unsigned long freq,
142 unsigned long u_volt);
143void dev_pm_opp_remove(struct device *dev, unsigned long freq);
144void dev_pm_opp_remove_all_dynamic(struct device *dev);
145
146int dev_pm_opp_adjust_voltage(struct device *dev, unsigned long freq,
147 unsigned long u_volt, unsigned long u_volt_min,
148 unsigned long u_volt_max);
149
150int dev_pm_opp_enable(struct device *dev, unsigned long freq);
151
152int dev_pm_opp_disable(struct device *dev, unsigned long freq);
153
154int dev_pm_opp_register_notifier(struct device *dev, struct notifier_block *nb);
155int dev_pm_opp_unregister_notifier(struct device *dev, struct notifier_block *nb);
156
157struct opp_table *dev_pm_opp_set_supported_hw(struct device *dev, const u32 *versions, unsigned int count);
158void dev_pm_opp_put_supported_hw(struct opp_table *opp_table);
159int devm_pm_opp_set_supported_hw(struct device *dev, const u32 *versions, unsigned int count);
160struct opp_table *dev_pm_opp_set_prop_name(struct device *dev, const char *name);
161void dev_pm_opp_put_prop_name(struct opp_table *opp_table);
162struct opp_table *dev_pm_opp_set_regulators(struct device *dev, const char * const names[], unsigned int count);
163void dev_pm_opp_put_regulators(struct opp_table *opp_table);
164int devm_pm_opp_set_regulators(struct device *dev, const char * const names[], unsigned int count);
165struct opp_table *dev_pm_opp_set_clkname(struct device *dev, const char *name);
166void dev_pm_opp_put_clkname(struct opp_table *opp_table);
167int devm_pm_opp_set_clkname(struct device *dev, const char *name);
168struct opp_table *dev_pm_opp_register_set_opp_helper(struct device *dev, int (*set_opp)(struct dev_pm_set_opp_data *data));
169void dev_pm_opp_unregister_set_opp_helper(struct opp_table *opp_table);
170int devm_pm_opp_register_set_opp_helper(struct device *dev, int (*set_opp)(struct dev_pm_set_opp_data *data));
171struct opp_table *dev_pm_opp_attach_genpd(struct device *dev, const char * const *names, struct device ***virt_devs);
172void dev_pm_opp_detach_genpd(struct opp_table *opp_table);
173int devm_pm_opp_attach_genpd(struct device *dev, const char * const *names, struct device ***virt_devs);
174struct dev_pm_opp *dev_pm_opp_xlate_required_opp(struct opp_table *src_table, struct opp_table *dst_table, struct dev_pm_opp *src_opp);
175int dev_pm_opp_xlate_performance_state(struct opp_table *src_table, struct opp_table *dst_table, unsigned int pstate);
176int dev_pm_opp_set_rate(struct device *dev, unsigned long target_freq);
177int dev_pm_opp_set_opp(struct device *dev, struct dev_pm_opp *opp);
178int dev_pm_opp_set_sharing_cpus(struct device *cpu_dev, const struct cpumask *cpumask);
179int dev_pm_opp_get_sharing_cpus(struct device *cpu_dev, struct cpumask *cpumask);
180void dev_pm_opp_remove_table(struct device *dev);
181void dev_pm_opp_cpumask_remove_table(const struct cpumask *cpumask);
182int dev_pm_opp_sync_regulators(struct device *dev);
183#else
184static inline struct opp_table *dev_pm_opp_get_opp_table(struct device *dev)
185{
186 return ERR_PTR(-EOPNOTSUPP);
187}
188
189static inline struct opp_table *dev_pm_opp_get_opp_table_indexed(struct device *dev, int index)
190{
191 return ERR_PTR(-EOPNOTSUPP);
192}
193
194static inline void dev_pm_opp_put_opp_table(struct opp_table *opp_table) {}
195
196static inline unsigned long dev_pm_opp_get_voltage(struct dev_pm_opp *opp)
197{
198 return 0;
199}
200
201static inline unsigned long dev_pm_opp_get_power(struct dev_pm_opp *opp)
202{
203 return 0;
204}
205
206static inline unsigned long dev_pm_opp_get_freq(struct dev_pm_opp *opp)
207{
208 return 0;
209}
210
211static inline unsigned int dev_pm_opp_get_level(struct dev_pm_opp *opp)
212{
213 return 0;
214}
215
216static inline
217unsigned int dev_pm_opp_get_required_pstate(struct dev_pm_opp *opp,
218 unsigned int index)
219{
220 return 0;
221}
222
223static inline bool dev_pm_opp_is_turbo(struct dev_pm_opp *opp)
224{
225 return false;
226}
227
228static inline int dev_pm_opp_get_opp_count(struct device *dev)
229{
230 return 0;
231}
232
233static inline unsigned long dev_pm_opp_get_max_clock_latency(struct device *dev)
234{
235 return 0;
236}
237
238static inline unsigned long dev_pm_opp_get_max_volt_latency(struct device *dev)
239{
240 return 0;
241}
242
243static inline unsigned long dev_pm_opp_get_max_transition_latency(struct device *dev)
244{
245 return 0;
246}
247
248static inline unsigned long dev_pm_opp_get_suspend_opp_freq(struct device *dev)
249{
250 return 0;
251}
252
253static inline struct dev_pm_opp *dev_pm_opp_find_level_exact(struct device *dev,
254 unsigned int level)
255{
256 return ERR_PTR(-EOPNOTSUPP);
257}
258
259static inline struct dev_pm_opp *dev_pm_opp_find_level_ceil(struct device *dev,
260 unsigned int *level)
261{
262 return ERR_PTR(-EOPNOTSUPP);
263}
264
265static inline struct dev_pm_opp *dev_pm_opp_find_freq_exact(struct device *dev,
266 unsigned long freq, bool available)
267{
268 return ERR_PTR(-EOPNOTSUPP);
269}
270
271static inline struct dev_pm_opp *dev_pm_opp_find_freq_floor(struct device *dev,
272 unsigned long *freq)
273{
274 return ERR_PTR(-EOPNOTSUPP);
275}
276
277static inline struct dev_pm_opp *dev_pm_opp_find_freq_ceil_by_volt(struct device *dev,
278 unsigned long u_volt)
279{
280 return ERR_PTR(-EOPNOTSUPP);
281}
282
283static inline struct dev_pm_opp *dev_pm_opp_find_freq_ceil(struct device *dev,
284 unsigned long *freq)
285{
286 return ERR_PTR(-EOPNOTSUPP);
287}
288
289static inline struct dev_pm_opp *dev_pm_opp_find_bw_ceil(struct device *dev,
290 unsigned int *bw, int index)
291{
292 return ERR_PTR(-EOPNOTSUPP);
293}
294
295static inline struct dev_pm_opp *dev_pm_opp_find_bw_floor(struct device *dev,
296 unsigned int *bw, int index)
297{
298 return ERR_PTR(-EOPNOTSUPP);
299}
300
301static inline void dev_pm_opp_put(struct dev_pm_opp *opp) {}
302
303static inline int dev_pm_opp_add(struct device *dev, unsigned long freq,
304 unsigned long u_volt)
305{
306 return -EOPNOTSUPP;
307}
308
309static inline void dev_pm_opp_remove(struct device *dev, unsigned long freq)
310{
311}
312
313static inline void dev_pm_opp_remove_all_dynamic(struct device *dev)
314{
315}
316
317static inline int
318dev_pm_opp_adjust_voltage(struct device *dev, unsigned long freq,
319 unsigned long u_volt, unsigned long u_volt_min,
320 unsigned long u_volt_max)
321{
322 return 0;
323}
324
325static inline int dev_pm_opp_enable(struct device *dev, unsigned long freq)
326{
327 return 0;
328}
329
330static inline int dev_pm_opp_disable(struct device *dev, unsigned long freq)
331{
332 return 0;
333}
334
335static inline int dev_pm_opp_register_notifier(struct device *dev, struct notifier_block *nb)
336{
337 return -EOPNOTSUPP;
338}
339
340static inline int dev_pm_opp_unregister_notifier(struct device *dev, struct notifier_block *nb)
341{
342 return -EOPNOTSUPP;
343}
344
345static inline struct opp_table *dev_pm_opp_set_supported_hw(struct device *dev,
346 const u32 *versions,
347 unsigned int count)
348{
349 return ERR_PTR(-EOPNOTSUPP);
350}
351
352static inline void dev_pm_opp_put_supported_hw(struct opp_table *opp_table) {}
353
354static inline int devm_pm_opp_set_supported_hw(struct device *dev,
355 const u32 *versions,
356 unsigned int count)
357{
358 return -EOPNOTSUPP;
359}
360
361static inline struct opp_table *dev_pm_opp_register_set_opp_helper(struct device *dev,
362 int (*set_opp)(struct dev_pm_set_opp_data *data))
363{
364 return ERR_PTR(-EOPNOTSUPP);
365}
366
367static inline void dev_pm_opp_unregister_set_opp_helper(struct opp_table *opp_table) {}
368
369static inline int devm_pm_opp_register_set_opp_helper(struct device *dev,
370 int (*set_opp)(struct dev_pm_set_opp_data *data))
371{
372 return -EOPNOTSUPP;
373}
374
375static inline struct opp_table *dev_pm_opp_set_prop_name(struct device *dev, const char *name)
376{
377 return ERR_PTR(-EOPNOTSUPP);
378}
379
380static inline void dev_pm_opp_put_prop_name(struct opp_table *opp_table) {}
381
382static inline struct opp_table *dev_pm_opp_set_regulators(struct device *dev, const char * const names[], unsigned int count)
383{
384 return ERR_PTR(-EOPNOTSUPP);
385}
386
387static inline void dev_pm_opp_put_regulators(struct opp_table *opp_table) {}
388
389static inline int devm_pm_opp_set_regulators(struct device *dev,
390 const char * const names[],
391 unsigned int count)
392{
393 return -EOPNOTSUPP;
394}
395
396static inline struct opp_table *dev_pm_opp_set_clkname(struct device *dev, const char *name)
397{
398 return ERR_PTR(-EOPNOTSUPP);
399}
400
401static inline void dev_pm_opp_put_clkname(struct opp_table *opp_table) {}
402
403static inline int devm_pm_opp_set_clkname(struct device *dev, const char *name)
404{
405 return -EOPNOTSUPP;
406}
407
408static inline struct opp_table *dev_pm_opp_attach_genpd(struct device *dev, const char * const *names, struct device ***virt_devs)
409{
410 return ERR_PTR(-EOPNOTSUPP);
411}
412
413static inline void dev_pm_opp_detach_genpd(struct opp_table *opp_table) {}
414
415static inline int devm_pm_opp_attach_genpd(struct device *dev,
416 const char * const *names,
417 struct device ***virt_devs)
418{
419 return -EOPNOTSUPP;
420}
421
422static inline struct dev_pm_opp *dev_pm_opp_xlate_required_opp(struct opp_table *src_table,
423 struct opp_table *dst_table, struct dev_pm_opp *src_opp)
424{
425 return ERR_PTR(-EOPNOTSUPP);
426}
427
428static inline int dev_pm_opp_xlate_performance_state(struct opp_table *src_table, struct opp_table *dst_table, unsigned int pstate)
429{
430 return -EOPNOTSUPP;
431}
432
433static inline int dev_pm_opp_set_rate(struct device *dev, unsigned long target_freq)
434{
435 return -EOPNOTSUPP;
436}
437
438static inline int dev_pm_opp_set_opp(struct device *dev, struct dev_pm_opp *opp)
439{
440 return -EOPNOTSUPP;
441}
442
443static inline int dev_pm_opp_set_sharing_cpus(struct device *cpu_dev, const struct cpumask *cpumask)
444{
445 return -EOPNOTSUPP;
446}
447
448static inline int dev_pm_opp_get_sharing_cpus(struct device *cpu_dev, struct cpumask *cpumask)
449{
450 return -EINVAL;
451}
452
453static inline void dev_pm_opp_remove_table(struct device *dev)
454{
455}
456
457static inline void dev_pm_opp_cpumask_remove_table(const struct cpumask *cpumask)
458{
459}
460
461static inline int dev_pm_opp_sync_regulators(struct device *dev)
462{
463 return -EOPNOTSUPP;
464}
465
466#endif /* CONFIG_PM_OPP */
467
468#if defined(CONFIG_PM_OPP) && defined(CONFIG_OF)
469int dev_pm_opp_of_add_table(struct device *dev);
470int dev_pm_opp_of_add_table_indexed(struct device *dev, int index);
471int devm_pm_opp_of_add_table_indexed(struct device *dev, int index);
472int dev_pm_opp_of_add_table_noclk(struct device *dev, int index);
473int devm_pm_opp_of_add_table_noclk(struct device *dev, int index);
474void dev_pm_opp_of_remove_table(struct device *dev);
475int devm_pm_opp_of_add_table(struct device *dev);
476int dev_pm_opp_of_cpumask_add_table(const struct cpumask *cpumask);
477void dev_pm_opp_of_cpumask_remove_table(const struct cpumask *cpumask);
478int dev_pm_opp_of_get_sharing_cpus(struct device *cpu_dev, struct cpumask *cpumask);
479struct device_node *dev_pm_opp_of_get_opp_desc_node(struct device *dev);
480struct device_node *dev_pm_opp_get_of_node(struct dev_pm_opp *opp);
481int of_get_required_opp_performance_state(struct device_node *np, int index);
482int dev_pm_opp_of_find_icc_paths(struct device *dev, struct opp_table *opp_table);
483int dev_pm_opp_of_register_em(struct device *dev, struct cpumask *cpus);
484static inline void dev_pm_opp_of_unregister_em(struct device *dev)
485{
486 em_dev_unregister_perf_domain(dev);
487}
488#else
489static inline int dev_pm_opp_of_add_table(struct device *dev)
490{
491 return -EOPNOTSUPP;
492}
493
494static inline int dev_pm_opp_of_add_table_indexed(struct device *dev, int index)
495{
496 return -EOPNOTSUPP;
497}
498
499static inline int devm_pm_opp_of_add_table_indexed(struct device *dev, int index)
500{
501 return -EOPNOTSUPP;
502}
503
504static inline int dev_pm_opp_of_add_table_noclk(struct device *dev, int index)
505{
506 return -EOPNOTSUPP;
507}
508
509static inline int devm_pm_opp_of_add_table_noclk(struct device *dev, int index)
510{
511 return -EOPNOTSUPP;
512}
513
514static inline void dev_pm_opp_of_remove_table(struct device *dev)
515{
516}
517
518static inline int devm_pm_opp_of_add_table(struct device *dev)
519{
520 return -EOPNOTSUPP;
521}
522
523static inline int dev_pm_opp_of_cpumask_add_table(const struct cpumask *cpumask)
524{
525 return -EOPNOTSUPP;
526}
527
528static inline void dev_pm_opp_of_cpumask_remove_table(const struct cpumask *cpumask)
529{
530}
531
532static inline int dev_pm_opp_of_get_sharing_cpus(struct device *cpu_dev, struct cpumask *cpumask)
533{
534 return -EOPNOTSUPP;
535}
536
537static inline struct device_node *dev_pm_opp_of_get_opp_desc_node(struct device *dev)
538{
539 return NULL;
540}
541
542static inline struct device_node *dev_pm_opp_get_of_node(struct dev_pm_opp *opp)
543{
544 return NULL;
545}
546
547static inline int dev_pm_opp_of_register_em(struct device *dev,
548 struct cpumask *cpus)
549{
550 return -EOPNOTSUPP;
551}
552
553static inline void dev_pm_opp_of_unregister_em(struct device *dev)
554{
555}
556
557static inline int of_get_required_opp_performance_state(struct device_node *np, int index)
558{
559 return -EOPNOTSUPP;
560}
561
562static inline int dev_pm_opp_of_find_icc_paths(struct device *dev, struct opp_table *opp_table)
563{
564 return -EOPNOTSUPP;
565}
566#endif
567
568#endif /* __LINUX_OPP_H__ */