xref: /linux-6.15/include/linux/pm_opp.h (revision bb4e9af0)
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/err.h>
15 #include <linux/notifier.h>
16 
17 struct clk;
18 struct regulator;
19 struct dev_pm_opp;
20 struct device;
21 struct opp_table;
22 
23 enum dev_pm_opp_event {
24 	OPP_EVENT_ADD, OPP_EVENT_REMOVE, OPP_EVENT_ENABLE, OPP_EVENT_DISABLE,
25 };
26 
27 /**
28  * struct dev_pm_opp_supply - Power supply voltage/current values
29  * @u_volt:	Target voltage in microvolts corresponding to this OPP
30  * @u_volt_min:	Minimum voltage in microvolts corresponding to this OPP
31  * @u_volt_max:	Maximum voltage in microvolts corresponding to this OPP
32  * @u_amp:	Maximum current drawn by the device in microamperes
33  *
34  * This structure stores the voltage/current values for a single power supply.
35  */
36 struct dev_pm_opp_supply {
37 	unsigned long u_volt;
38 	unsigned long u_volt_min;
39 	unsigned long u_volt_max;
40 	unsigned long u_amp;
41 };
42 
43 /**
44  * struct dev_pm_opp_info - OPP freq/voltage/current values
45  * @rate:	Target clk rate in hz
46  * @supplies:	Array of voltage/current values for all power supplies
47  *
48  * This structure stores the freq/voltage/current values for a single OPP.
49  */
50 struct dev_pm_opp_info {
51 	unsigned long rate;
52 	struct dev_pm_opp_supply *supplies;
53 };
54 
55 /**
56  * struct dev_pm_set_opp_data - Set OPP data
57  * @old_opp:	Old OPP info
58  * @new_opp:	New OPP info
59  * @regulators:	Array of regulator pointers
60  * @regulator_count: Number of regulators
61  * @clk:	Pointer to clk
62  * @dev:	Pointer to the struct device
63  *
64  * This structure contains all information required for setting an OPP.
65  */
66 struct dev_pm_set_opp_data {
67 	struct dev_pm_opp_info old_opp;
68 	struct dev_pm_opp_info new_opp;
69 
70 	struct regulator **regulators;
71 	unsigned int regulator_count;
72 	struct clk *clk;
73 	struct device *dev;
74 };
75 
76 #if defined(CONFIG_PM_OPP)
77 
78 struct opp_table *dev_pm_opp_get_opp_table(struct device *dev);
79 struct opp_table *dev_pm_opp_get_opp_table_indexed(struct device *dev, int index);
80 void dev_pm_opp_put_opp_table(struct opp_table *opp_table);
81 
82 unsigned long dev_pm_opp_get_voltage(struct dev_pm_opp *opp);
83 
84 unsigned long dev_pm_opp_get_freq(struct dev_pm_opp *opp);
85 
86 unsigned int dev_pm_opp_get_level(struct dev_pm_opp *opp);
87 
88 bool dev_pm_opp_is_turbo(struct dev_pm_opp *opp);
89 
90 int dev_pm_opp_get_opp_count(struct device *dev);
91 unsigned long dev_pm_opp_get_max_clock_latency(struct device *dev);
92 unsigned long dev_pm_opp_get_max_volt_latency(struct device *dev);
93 unsigned long dev_pm_opp_get_max_transition_latency(struct device *dev);
94 unsigned long dev_pm_opp_get_suspend_opp_freq(struct device *dev);
95 
96 struct dev_pm_opp *dev_pm_opp_find_freq_exact(struct device *dev,
97 					      unsigned long freq,
98 					      bool available);
99 
100 struct dev_pm_opp *dev_pm_opp_find_freq_floor(struct device *dev,
101 					      unsigned long *freq);
102 struct dev_pm_opp *dev_pm_opp_find_freq_ceil_by_volt(struct device *dev,
103 						     unsigned long u_volt);
104 
105 struct dev_pm_opp *dev_pm_opp_find_freq_ceil(struct device *dev,
106 					     unsigned long *freq);
107 void dev_pm_opp_put(struct dev_pm_opp *opp);
108 
109 int dev_pm_opp_add(struct device *dev, unsigned long freq,
110 		   unsigned long u_volt);
111 void dev_pm_opp_remove(struct device *dev, unsigned long freq);
112 void dev_pm_opp_remove_all_dynamic(struct device *dev);
113 
114 int dev_pm_opp_enable(struct device *dev, unsigned long freq);
115 
116 int dev_pm_opp_disable(struct device *dev, unsigned long freq);
117 
118 int dev_pm_opp_register_notifier(struct device *dev, struct notifier_block *nb);
119 int dev_pm_opp_unregister_notifier(struct device *dev, struct notifier_block *nb);
120 
121 struct opp_table *dev_pm_opp_set_supported_hw(struct device *dev, const u32 *versions, unsigned int count);
122 void dev_pm_opp_put_supported_hw(struct opp_table *opp_table);
123 struct opp_table *dev_pm_opp_set_prop_name(struct device *dev, const char *name);
124 void dev_pm_opp_put_prop_name(struct opp_table *opp_table);
125 struct opp_table *dev_pm_opp_set_regulators(struct device *dev, const char * const names[], unsigned int count);
126 void dev_pm_opp_put_regulators(struct opp_table *opp_table);
127 struct opp_table *dev_pm_opp_set_clkname(struct device *dev, const char * name);
128 void dev_pm_opp_put_clkname(struct opp_table *opp_table);
129 struct opp_table *dev_pm_opp_register_set_opp_helper(struct device *dev, int (*set_opp)(struct dev_pm_set_opp_data *data));
130 void dev_pm_opp_unregister_set_opp_helper(struct opp_table *opp_table);
131 struct opp_table *dev_pm_opp_attach_genpd(struct device *dev, const char **names);
132 void dev_pm_opp_detach_genpd(struct opp_table *opp_table);
133 int dev_pm_opp_xlate_performance_state(struct opp_table *src_table, struct opp_table *dst_table, unsigned int pstate);
134 int dev_pm_opp_set_rate(struct device *dev, unsigned long target_freq);
135 int dev_pm_opp_set_sharing_cpus(struct device *cpu_dev, const struct cpumask *cpumask);
136 int dev_pm_opp_get_sharing_cpus(struct device *cpu_dev, struct cpumask *cpumask);
137 void dev_pm_opp_remove_table(struct device *dev);
138 void dev_pm_opp_cpumask_remove_table(const struct cpumask *cpumask);
139 #else
140 static inline struct opp_table *dev_pm_opp_get_opp_table(struct device *dev)
141 {
142 	return ERR_PTR(-ENOTSUPP);
143 }
144 
145 static inline struct opp_table *dev_pm_opp_get_opp_table_indexed(struct device *dev, int index)
146 {
147 	return ERR_PTR(-ENOTSUPP);
148 }
149 
150 static inline void dev_pm_opp_put_opp_table(struct opp_table *opp_table) {}
151 
152 static inline unsigned long dev_pm_opp_get_voltage(struct dev_pm_opp *opp)
153 {
154 	return 0;
155 }
156 
157 static inline unsigned long dev_pm_opp_get_freq(struct dev_pm_opp *opp)
158 {
159 	return 0;
160 }
161 
162 static inline unsigned int dev_pm_opp_get_level(struct dev_pm_opp *opp)
163 {
164 	return 0;
165 }
166 
167 static inline bool dev_pm_opp_is_turbo(struct dev_pm_opp *opp)
168 {
169 	return false;
170 }
171 
172 static inline int dev_pm_opp_get_opp_count(struct device *dev)
173 {
174 	return 0;
175 }
176 
177 static inline unsigned long dev_pm_opp_get_max_clock_latency(struct device *dev)
178 {
179 	return 0;
180 }
181 
182 static inline unsigned long dev_pm_opp_get_max_volt_latency(struct device *dev)
183 {
184 	return 0;
185 }
186 
187 static inline unsigned long dev_pm_opp_get_max_transition_latency(struct device *dev)
188 {
189 	return 0;
190 }
191 
192 static inline unsigned long dev_pm_opp_get_suspend_opp_freq(struct device *dev)
193 {
194 	return 0;
195 }
196 
197 static inline struct dev_pm_opp *dev_pm_opp_find_freq_exact(struct device *dev,
198 					unsigned long freq, bool available)
199 {
200 	return ERR_PTR(-ENOTSUPP);
201 }
202 
203 static inline struct dev_pm_opp *dev_pm_opp_find_freq_floor(struct device *dev,
204 					unsigned long *freq)
205 {
206 	return ERR_PTR(-ENOTSUPP);
207 }
208 
209 static inline struct dev_pm_opp *dev_pm_opp_find_freq_ceil_by_volt(struct device *dev,
210 					unsigned long u_volt)
211 {
212 	return ERR_PTR(-ENOTSUPP);
213 }
214 
215 static inline struct dev_pm_opp *dev_pm_opp_find_freq_ceil(struct device *dev,
216 					unsigned long *freq)
217 {
218 	return ERR_PTR(-ENOTSUPP);
219 }
220 
221 static inline void dev_pm_opp_put(struct dev_pm_opp *opp) {}
222 
223 static inline int dev_pm_opp_add(struct device *dev, unsigned long freq,
224 					unsigned long u_volt)
225 {
226 	return -ENOTSUPP;
227 }
228 
229 static inline void dev_pm_opp_remove(struct device *dev, unsigned long freq)
230 {
231 }
232 
233 static inline void dev_pm_opp_remove_all_dynamic(struct device *dev)
234 {
235 }
236 
237 static inline int dev_pm_opp_enable(struct device *dev, unsigned long freq)
238 {
239 	return 0;
240 }
241 
242 static inline int dev_pm_opp_disable(struct device *dev, unsigned long freq)
243 {
244 	return 0;
245 }
246 
247 static inline int dev_pm_opp_register_notifier(struct device *dev, struct notifier_block *nb)
248 {
249 	return -ENOTSUPP;
250 }
251 
252 static inline int dev_pm_opp_unregister_notifier(struct device *dev, struct notifier_block *nb)
253 {
254 	return -ENOTSUPP;
255 }
256 
257 static inline struct opp_table *dev_pm_opp_set_supported_hw(struct device *dev,
258 							    const u32 *versions,
259 							    unsigned int count)
260 {
261 	return ERR_PTR(-ENOTSUPP);
262 }
263 
264 static inline void dev_pm_opp_put_supported_hw(struct opp_table *opp_table) {}
265 
266 static inline struct opp_table *dev_pm_opp_register_set_opp_helper(struct device *dev,
267 			int (*set_opp)(struct dev_pm_set_opp_data *data))
268 {
269 	return ERR_PTR(-ENOTSUPP);
270 }
271 
272 static inline void dev_pm_opp_unregister_set_opp_helper(struct opp_table *opp_table) {}
273 
274 static inline struct opp_table *dev_pm_opp_set_prop_name(struct device *dev, const char *name)
275 {
276 	return ERR_PTR(-ENOTSUPP);
277 }
278 
279 static inline void dev_pm_opp_put_prop_name(struct opp_table *opp_table) {}
280 
281 static inline struct opp_table *dev_pm_opp_set_regulators(struct device *dev, const char * const names[], unsigned int count)
282 {
283 	return ERR_PTR(-ENOTSUPP);
284 }
285 
286 static inline void dev_pm_opp_put_regulators(struct opp_table *opp_table) {}
287 
288 static inline struct opp_table *dev_pm_opp_set_clkname(struct device *dev, const char * name)
289 {
290 	return ERR_PTR(-ENOTSUPP);
291 }
292 
293 static inline void dev_pm_opp_put_clkname(struct opp_table *opp_table) {}
294 
295 static inline struct opp_table *dev_pm_opp_attach_genpd(struct device *dev, const char **names)
296 {
297 	return ERR_PTR(-ENOTSUPP);
298 }
299 
300 static inline void dev_pm_opp_detach_genpd(struct opp_table *opp_table) {}
301 
302 static inline int dev_pm_opp_xlate_performance_state(struct opp_table *src_table, struct opp_table *dst_table, unsigned int pstate)
303 {
304 	return -ENOTSUPP;
305 }
306 
307 static inline int dev_pm_opp_set_rate(struct device *dev, unsigned long target_freq)
308 {
309 	return -ENOTSUPP;
310 }
311 
312 static inline int dev_pm_opp_set_sharing_cpus(struct device *cpu_dev, const struct cpumask *cpumask)
313 {
314 	return -ENOTSUPP;
315 }
316 
317 static inline int dev_pm_opp_get_sharing_cpus(struct device *cpu_dev, struct cpumask *cpumask)
318 {
319 	return -EINVAL;
320 }
321 
322 static inline void dev_pm_opp_remove_table(struct device *dev)
323 {
324 }
325 
326 static inline void dev_pm_opp_cpumask_remove_table(const struct cpumask *cpumask)
327 {
328 }
329 
330 #endif		/* CONFIG_PM_OPP */
331 
332 #if defined(CONFIG_PM_OPP) && defined(CONFIG_OF)
333 int dev_pm_opp_of_add_table(struct device *dev);
334 int dev_pm_opp_of_add_table_indexed(struct device *dev, int index);
335 void dev_pm_opp_of_remove_table(struct device *dev);
336 int dev_pm_opp_of_cpumask_add_table(const struct cpumask *cpumask);
337 void dev_pm_opp_of_cpumask_remove_table(const struct cpumask *cpumask);
338 int dev_pm_opp_of_get_sharing_cpus(struct device *cpu_dev, struct cpumask *cpumask);
339 struct device_node *dev_pm_opp_of_get_opp_desc_node(struct device *dev);
340 struct device_node *dev_pm_opp_get_of_node(struct dev_pm_opp *opp);
341 int of_get_required_opp_performance_state(struct device_node *np, int index);
342 void dev_pm_opp_of_register_em(struct cpumask *cpus);
343 #else
344 static inline int dev_pm_opp_of_add_table(struct device *dev)
345 {
346 	return -ENOTSUPP;
347 }
348 
349 static inline int dev_pm_opp_of_add_table_indexed(struct device *dev, int index)
350 {
351 	return -ENOTSUPP;
352 }
353 
354 static inline void dev_pm_opp_of_remove_table(struct device *dev)
355 {
356 }
357 
358 static inline int dev_pm_opp_of_cpumask_add_table(const struct cpumask *cpumask)
359 {
360 	return -ENOTSUPP;
361 }
362 
363 static inline void dev_pm_opp_of_cpumask_remove_table(const struct cpumask *cpumask)
364 {
365 }
366 
367 static inline int dev_pm_opp_of_get_sharing_cpus(struct device *cpu_dev, struct cpumask *cpumask)
368 {
369 	return -ENOTSUPP;
370 }
371 
372 static inline struct device_node *dev_pm_opp_of_get_opp_desc_node(struct device *dev)
373 {
374 	return NULL;
375 }
376 
377 static inline struct device_node *dev_pm_opp_get_of_node(struct dev_pm_opp *opp)
378 {
379 	return NULL;
380 }
381 
382 static inline void dev_pm_opp_of_register_em(struct cpumask *cpus)
383 {
384 }
385 
386 static inline int of_get_required_opp_performance_state(struct device_node *np, int index)
387 {
388 	return -ENOTSUPP;
389 }
390 #endif
391 
392 #endif		/* __LINUX_OPP_H__ */
393