]>
git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blob - include/linux/pm_opp.h
2 * Generic OPP Interface
4 * Copyright (C) 2009-2010 Texas Instruments Incorporated.
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License version 2 as
11 * published by the Free Software Foundation.
14 #ifndef __LINUX_OPP_H__
15 #define __LINUX_OPP_H__
17 #include <linux/err.h>
18 #include <linux/notifier.h>
26 enum dev_pm_opp_event
{
27 OPP_EVENT_ADD
, OPP_EVENT_REMOVE
, OPP_EVENT_ENABLE
, OPP_EVENT_DISABLE
,
28 OPP_EVENT_ADJUST_VOLTAGE
,
32 * struct dev_pm_opp_supply - Power supply voltage/current values
33 * @u_volt: Target voltage in microvolts corresponding to this OPP
34 * @u_volt_min: Minimum voltage in microvolts corresponding to this OPP
35 * @u_volt_max: Maximum voltage in microvolts corresponding to this OPP
36 * @u_amp: Maximum current drawn by the device in microamperes
38 * This structure stores the voltage/current values for a single power supply.
40 struct dev_pm_opp_supply
{
42 unsigned long u_volt_min
;
43 unsigned long u_volt_max
;
48 * struct dev_pm_opp_info - OPP freq/voltage/current values
49 * @rate: Target clk rate in hz
50 * @supplies: Array of voltage/current values for all power supplies
52 * This structure stores the freq/voltage/current values for a single OPP.
54 struct dev_pm_opp_info
{
56 struct dev_pm_opp_supply
*supplies
;
60 * struct dev_pm_set_opp_data - Set OPP data
61 * @old_opp: Old OPP info
62 * @new_opp: New OPP info
63 * @regulators: Array of regulator pointers
64 * @regulator_count: Number of regulators
65 * @clk: Pointer to clk
66 * @dev: Pointer to the struct device
68 * This structure contains all information required for setting an OPP.
70 struct dev_pm_set_opp_data
{
71 struct dev_pm_opp_info old_opp
;
72 struct dev_pm_opp_info new_opp
;
74 struct regulator
**regulators
;
75 unsigned int regulator_count
;
80 #if defined(CONFIG_PM_OPP)
82 struct opp_table
*dev_pm_opp_get_opp_table(struct device
*dev
);
83 void dev_pm_opp_put_opp_table(struct opp_table
*opp_table
);
85 unsigned long dev_pm_opp_get_voltage(struct dev_pm_opp
*opp
);
87 unsigned long dev_pm_opp_get_freq(struct dev_pm_opp
*opp
);
88 struct regulator
*dev_pm_opp_get_regulator(struct device
*dev
);
90 bool dev_pm_opp_is_turbo(struct dev_pm_opp
*opp
);
92 int dev_pm_opp_get_opp_count(struct device
*dev
);
93 unsigned long dev_pm_opp_get_max_clock_latency(struct device
*dev
);
94 unsigned long dev_pm_opp_get_max_volt_latency(struct device
*dev
);
95 unsigned long dev_pm_opp_get_max_transition_latency(struct device
*dev
);
96 unsigned long dev_pm_opp_get_suspend_opp_freq(struct device
*dev
);
98 struct dev_pm_opp
*dev_pm_opp_find_freq_exact(struct device
*dev
,
102 struct dev_pm_opp
*dev_pm_opp_find_freq_floor(struct device
*dev
,
103 unsigned long *freq
);
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
);
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
);
113 int dev_pm_opp_adjust_voltage(struct device
*dev
, unsigned long freq
,
114 unsigned long u_volt
);
116 int dev_pm_opp_enable(struct device
*dev
, unsigned long freq
);
118 int dev_pm_opp_disable(struct device
*dev
, unsigned long freq
);
120 int dev_pm_opp_register_notifier(struct device
*dev
, struct notifier_block
*nb
);
121 int dev_pm_opp_unregister_notifier(struct device
*dev
, struct notifier_block
*nb
);
123 struct opp_table
*dev_pm_opp_set_supported_hw(struct device
*dev
, const u32
*versions
, unsigned int count
);
124 void dev_pm_opp_put_supported_hw(struct opp_table
*opp_table
);
125 struct opp_table
*dev_pm_opp_set_prop_name(struct device
*dev
, const char *name
);
126 void dev_pm_opp_put_prop_name(struct opp_table
*opp_table
);
127 struct opp_table
*dev_pm_opp_set_regulators(struct device
*dev
, const char * const names
[], unsigned int count
);
128 void dev_pm_opp_put_regulators(struct opp_table
*opp_table
);
129 struct opp_table
*dev_pm_opp_set_clkname(struct device
*dev
, const char * name
);
130 void dev_pm_opp_put_clkname(struct opp_table
*opp_table
);
131 struct opp_table
*dev_pm_opp_register_set_opp_helper(struct device
*dev
, int (*set_opp
)(struct dev_pm_set_opp_data
*data
));
132 void dev_pm_opp_unregister_set_opp_helper(struct opp_table
*opp_table
);
133 struct opp_table
*dev_pm_opp_register_get_pstate_helper(struct device
*dev
, int (*get_pstate
)(struct device
*dev
, unsigned long rate
));
134 void dev_pm_opp_unregister_get_pstate_helper(struct opp_table
*opp_table
);
135 int dev_pm_opp_set_rate(struct device
*dev
, unsigned long target_freq
);
136 int dev_pm_opp_set_sharing_cpus(struct device
*cpu_dev
, const struct cpumask
*cpumask
);
137 int dev_pm_opp_get_sharing_cpus(struct device
*cpu_dev
, struct cpumask
*cpumask
);
138 void dev_pm_opp_remove_table(struct device
*dev
);
139 void dev_pm_opp_cpumask_remove_table(const struct cpumask
*cpumask
);
141 static inline struct opp_table
*dev_pm_opp_get_opp_table(struct device
*dev
)
143 return ERR_PTR(-ENOTSUPP
);
146 static inline void dev_pm_opp_put_opp_table(struct opp_table
*opp_table
) {}
148 static inline unsigned long dev_pm_opp_get_voltage(struct dev_pm_opp
*opp
)
153 static inline unsigned long dev_pm_opp_get_freq(struct dev_pm_opp
*opp
)
158 static inline bool dev_pm_opp_is_turbo(struct dev_pm_opp
*opp
)
163 static inline int dev_pm_opp_get_opp_count(struct device
*dev
)
168 static inline unsigned long dev_pm_opp_get_max_clock_latency(struct device
*dev
)
173 static inline unsigned long dev_pm_opp_get_max_volt_latency(struct device
*dev
)
178 static inline unsigned long dev_pm_opp_get_max_transition_latency(struct device
*dev
)
183 static inline unsigned long dev_pm_opp_get_suspend_opp_freq(struct device
*dev
)
188 static inline struct dev_pm_opp
*dev_pm_opp_find_freq_exact(struct device
*dev
,
189 unsigned long freq
, bool available
)
191 return ERR_PTR(-ENOTSUPP
);
194 static inline struct dev_pm_opp
*dev_pm_opp_find_freq_floor(struct device
*dev
,
197 return ERR_PTR(-ENOTSUPP
);
200 static inline struct dev_pm_opp
*dev_pm_opp_find_freq_ceil(struct device
*dev
,
203 return ERR_PTR(-ENOTSUPP
);
206 static inline void dev_pm_opp_put(struct dev_pm_opp
*opp
) {}
208 static inline int dev_pm_opp_add(struct device
*dev
, unsigned long freq
,
209 unsigned long u_volt
)
214 static inline void dev_pm_opp_remove(struct device
*dev
, unsigned long freq
)
219 dev_pm_opp_adjust_voltage(struct device
*dev
, unsigned long freq
,
220 unsigned long u_volt
)
225 static inline int dev_pm_opp_enable(struct device
*dev
, unsigned long freq
)
230 static inline int dev_pm_opp_disable(struct device
*dev
, unsigned long freq
)
235 static inline int dev_pm_opp_register_notifier(struct device
*dev
, struct notifier_block
*nb
)
240 static inline int dev_pm_opp_unregister_notifier(struct device
*dev
, struct notifier_block
*nb
)
245 static inline struct opp_table
*dev_pm_opp_set_supported_hw(struct device
*dev
,
249 return ERR_PTR(-ENOTSUPP
);
252 static inline void dev_pm_opp_put_supported_hw(struct opp_table
*opp_table
) {}
254 static inline struct opp_table
*dev_pm_opp_register_set_opp_helper(struct device
*dev
,
255 int (*set_opp
)(struct dev_pm_set_opp_data
*data
))
257 return ERR_PTR(-ENOTSUPP
);
260 static inline void dev_pm_opp_unregister_set_opp_helper(struct opp_table
*opp_table
) {}
262 static inline struct opp_table
*dev_pm_opp_register_get_pstate_helper(struct device
*dev
,
263 int (*get_pstate
)(struct device
*dev
, unsigned long rate
))
265 return ERR_PTR(-ENOTSUPP
);
268 static inline void dev_pm_opp_unregister_get_pstate_helper(struct opp_table
*opp_table
) {}
270 static inline struct opp_table
*dev_pm_opp_set_prop_name(struct device
*dev
, const char *name
)
272 return ERR_PTR(-ENOTSUPP
);
275 static inline void dev_pm_opp_put_prop_name(struct opp_table
*opp_table
) {}
277 static inline struct opp_table
*dev_pm_opp_set_regulators(struct device
*dev
, const char * const names
[], unsigned int count
)
279 return ERR_PTR(-ENOTSUPP
);
282 static inline void dev_pm_opp_put_regulators(struct opp_table
*opp_table
) {}
284 static inline struct opp_table
*dev_pm_opp_set_clkname(struct device
*dev
, const char * name
)
286 return ERR_PTR(-ENOTSUPP
);
289 static inline void dev_pm_opp_put_clkname(struct opp_table
*opp_table
) {}
291 static inline int dev_pm_opp_set_rate(struct device
*dev
, unsigned long target_freq
)
296 static inline int dev_pm_opp_set_sharing_cpus(struct device
*cpu_dev
, const struct cpumask
*cpumask
)
301 static inline int dev_pm_opp_get_sharing_cpus(struct device
*cpu_dev
, struct cpumask
*cpumask
)
306 static inline void dev_pm_opp_remove_table(struct device
*dev
)
310 static inline void dev_pm_opp_cpumask_remove_table(const struct cpumask
*cpumask
)
314 #endif /* CONFIG_PM_OPP */
316 #if defined(CONFIG_PM_OPP) && defined(CONFIG_OF)
317 int dev_pm_opp_of_add_table(struct device
*dev
);
318 void dev_pm_opp_of_remove_table(struct device
*dev
);
319 int dev_pm_opp_of_cpumask_add_table(const struct cpumask
*cpumask
);
320 void dev_pm_opp_of_cpumask_remove_table(const struct cpumask
*cpumask
);
321 int dev_pm_opp_of_get_sharing_cpus(struct device
*cpu_dev
, struct cpumask
*cpumask
);
322 struct device_node
*dev_pm_opp_of_get_opp_desc_node(struct device
*dev
);
324 static inline int dev_pm_opp_of_add_table(struct device
*dev
)
329 static inline void dev_pm_opp_of_remove_table(struct device
*dev
)
333 static inline int dev_pm_opp_of_cpumask_add_table(const struct cpumask
*cpumask
)
338 static inline void dev_pm_opp_of_cpumask_remove_table(const struct cpumask
*cpumask
)
342 static inline int dev_pm_opp_of_get_sharing_cpus(struct device
*cpu_dev
, struct cpumask
*cpumask
)
347 static inline struct device_node
*dev_pm_opp_of_get_opp_desc_node(struct device
*dev
)
353 #endif /* __LINUX_OPP_H__ */