xref: /linux-6.15/include/linux/pm_opp.h (revision b489e794)
1d2912cb1SThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-only */
2e4db1c74SNishanth Menon /*
3e4db1c74SNishanth Menon  * Generic OPP Interface
4e4db1c74SNishanth Menon  *
5e4db1c74SNishanth Menon  * Copyright (C) 2009-2010 Texas Instruments Incorporated.
6e4db1c74SNishanth Menon  *	Nishanth Menon
7e4db1c74SNishanth Menon  *	Romit Dasgupta
8e4db1c74SNishanth Menon  *	Kevin Hilman
9e4db1c74SNishanth Menon  */
10e4db1c74SNishanth Menon 
11e4db1c74SNishanth Menon #ifndef __LINUX_OPP_H__
12e4db1c74SNishanth Menon #define __LINUX_OPP_H__
13e4db1c74SNishanth Menon 
140e0ffa85SLukasz Luba #include <linux/energy_model.h>
15e4db1c74SNishanth Menon #include <linux/err.h>
16e4db1c74SNishanth Menon #include <linux/notifier.h>
17e4db1c74SNishanth Menon 
1894735585SViresh Kumar struct clk;
19838a4772SViresh Kumar struct cpufreq_frequency_table;
2094735585SViresh Kumar struct regulator;
21e4db1c74SNishanth Menon struct dev_pm_opp;
22e4db1c74SNishanth Menon struct device;
2391291d9aSStephen Boyd struct opp_table;
24e4db1c74SNishanth Menon 
25e4db1c74SNishanth Menon enum dev_pm_opp_event {
26129eec55SViresh Kumar 	OPP_EVENT_ADD, OPP_EVENT_REMOVE, OPP_EVENT_ENABLE, OPP_EVENT_DISABLE,
2725cb20a2SStephen Boyd 	OPP_EVENT_ADJUST_VOLTAGE,
28e4db1c74SNishanth Menon };
29e4db1c74SNishanth Menon 
300f0fe7e0SViresh Kumar /**
310f0fe7e0SViresh Kumar  * struct dev_pm_opp_supply - Power supply voltage/current values
320f0fe7e0SViresh Kumar  * @u_volt:	Target voltage in microvolts corresponding to this OPP
330f0fe7e0SViresh Kumar  * @u_volt_min:	Minimum voltage in microvolts corresponding to this OPP
340f0fe7e0SViresh Kumar  * @u_volt_max:	Maximum voltage in microvolts corresponding to this OPP
350f0fe7e0SViresh Kumar  * @u_amp:	Maximum current drawn by the device in microamperes
364f9a7a1dSLukasz Luba  * @u_watt:	Power used by the device in microwatts
370f0fe7e0SViresh Kumar  *
384f9a7a1dSLukasz Luba  * This structure stores the voltage/current/power values for a single power
394f9a7a1dSLukasz Luba  * supply.
400f0fe7e0SViresh Kumar  */
410f0fe7e0SViresh Kumar struct dev_pm_opp_supply {
420f0fe7e0SViresh Kumar 	unsigned long u_volt;
430f0fe7e0SViresh Kumar 	unsigned long u_volt_min;
440f0fe7e0SViresh Kumar 	unsigned long u_volt_max;
450f0fe7e0SViresh Kumar 	unsigned long u_amp;
464f9a7a1dSLukasz Luba 	unsigned long u_watt;
470f0fe7e0SViresh Kumar };
480f0fe7e0SViresh Kumar 
49aee3352fSViresh Kumar typedef int (*config_regulators_t)(struct device *dev,
50aee3352fSViresh Kumar 			struct dev_pm_opp *old_opp, struct dev_pm_opp *new_opp,
51aee3352fSViresh Kumar 			struct regulator **regulators, unsigned int count);
52aee3352fSViresh Kumar 
532083da24SViresh Kumar typedef int (*config_clks_t)(struct device *dev, struct opp_table *opp_table,
542083da24SViresh Kumar 			struct dev_pm_opp *opp, void *data, bool scaling_down);
552083da24SViresh Kumar 
5611b9b663SViresh Kumar /**
5711b9b663SViresh Kumar  * struct dev_pm_opp_config - Device OPP configuration values
582083da24SViresh Kumar  * @clk_names: Clk names, NULL terminated array.
592083da24SViresh Kumar  * @config_clks: Custom set clk helper.
6011b9b663SViresh Kumar  * @prop_name: Name to postfix to properties.
61aee3352fSViresh Kumar  * @config_regulators: Custom set regulator helper.
6211b9b663SViresh Kumar  * @supported_hw: Array of hierarchy of versions to match.
6311b9b663SViresh Kumar  * @supported_hw_count: Number of elements in the array.
6411b9b663SViresh Kumar  * @regulator_names: Array of pointers to the names of the regulator, NULL terminated.
65d6caca30SUlf Hansson  * @required_dev: The required OPP device.
660e8158b4SUlf Hansson  * @required_dev_index: The index of the required OPP for the @required_dev.
6711b9b663SViresh Kumar  *
6811b9b663SViresh Kumar  * This structure contains platform specific OPP configurations for the device.
6911b9b663SViresh Kumar  */
7011b9b663SViresh Kumar struct dev_pm_opp_config {
7111b9b663SViresh Kumar 	/* NULL terminated */
7211b9b663SViresh Kumar 	const char * const *clk_names;
732083da24SViresh Kumar 	config_clks_t config_clks;
7411b9b663SViresh Kumar 	const char *prop_name;
75aee3352fSViresh Kumar 	config_regulators_t config_regulators;
7611b9b663SViresh Kumar 	const unsigned int *supported_hw;
7711b9b663SViresh Kumar 	unsigned int supported_hw_count;
7811b9b663SViresh Kumar 	const char * const *regulator_names;
790e8158b4SUlf Hansson 	struct device *required_dev;
800e8158b4SUlf Hansson 	unsigned int required_dev_index;
8111b9b663SViresh Kumar };
8211b9b663SViresh Kumar 
83073d3d2cSViresh Kumar #define OPP_LEVEL_UNSET			U32_MAX
84073d3d2cSViresh Kumar 
85248a38d5SUlf Hansson /**
86248a38d5SUlf Hansson  * struct dev_pm_opp_data - The data to use to initialize an OPP.
87abb3f971SSibi Sankar  * @turbo: Flag to indicate whether the OPP is to be marked turbo or not.
88073d3d2cSViresh Kumar  * @level: The performance level for the OPP. Set level to OPP_LEVEL_UNSET if
89073d3d2cSViresh Kumar  * level field isn't used.
90248a38d5SUlf Hansson  * @freq: The clock rate in Hz for the OPP.
91248a38d5SUlf Hansson  * @u_volt: The voltage in uV for the OPP.
92248a38d5SUlf Hansson  */
93248a38d5SUlf Hansson struct dev_pm_opp_data {
94abb3f971SSibi Sankar 	bool turbo;
953166383dSUlf Hansson 	unsigned int level;
96248a38d5SUlf Hansson 	unsigned long freq;
97248a38d5SUlf Hansson 	unsigned long u_volt;
98248a38d5SUlf Hansson };
99248a38d5SUlf Hansson 
100e4db1c74SNishanth Menon #if defined(CONFIG_PM_OPP)
101e4db1c74SNishanth Menon 
102f067a982SViresh Kumar struct opp_table *dev_pm_opp_get_opp_table(struct device *dev);
103*b489e794SViresh Kumar void dev_pm_opp_get_opp_table_ref(struct opp_table *opp_table);
104f067a982SViresh Kumar void dev_pm_opp_put_opp_table(struct opp_table *opp_table);
105f067a982SViresh Kumar 
106b89c0ed0SNeil Armstrong unsigned long dev_pm_opp_get_bw(struct dev_pm_opp *opp, bool peak, int index);
107b89c0ed0SNeil Armstrong 
108e4db1c74SNishanth Menon unsigned long dev_pm_opp_get_voltage(struct dev_pm_opp *opp);
109e4db1c74SNishanth Menon 
11069b1af17SViresh Kumar int dev_pm_opp_get_supplies(struct dev_pm_opp *opp, struct dev_pm_opp_supply *supplies);
11169b1af17SViresh Kumar 
1124f9a7a1dSLukasz Luba unsigned long dev_pm_opp_get_power(struct dev_pm_opp *opp);
1134f9a7a1dSLukasz Luba 
1145f756d03SManivannan Sadhasivam unsigned long dev_pm_opp_get_freq_indexed(struct dev_pm_opp *opp, u32 index);
1155f756d03SManivannan Sadhasivam 
1165b93ac54SRajendra Nayak unsigned int dev_pm_opp_get_level(struct dev_pm_opp *opp);
1175b93ac54SRajendra Nayak 
118597ff543SDmitry Osipenko unsigned int dev_pm_opp_get_required_pstate(struct dev_pm_opp *opp,
119597ff543SDmitry Osipenko 					    unsigned int index);
120597ff543SDmitry Osipenko 
12119445b25SBartlomiej Zolnierkiewicz bool dev_pm_opp_is_turbo(struct dev_pm_opp *opp);
12219445b25SBartlomiej Zolnierkiewicz 
123e4db1c74SNishanth Menon int dev_pm_opp_get_opp_count(struct device *dev);
1243ca9bb33SViresh Kumar unsigned long dev_pm_opp_get_max_clock_latency(struct device *dev);
125655c9df9SViresh Kumar unsigned long dev_pm_opp_get_max_volt_latency(struct device *dev);
12621743447SViresh Kumar unsigned long dev_pm_opp_get_max_transition_latency(struct device *dev);
1273aa26a3bSViresh Kumar unsigned long dev_pm_opp_get_suspend_opp_freq(struct device *dev);
128e4db1c74SNishanth Menon 
129e4db1c74SNishanth Menon struct dev_pm_opp *dev_pm_opp_find_freq_exact(struct device *dev,
130e4db1c74SNishanth Menon 					      unsigned long freq,
131e4db1c74SNishanth Menon 					      bool available);
132754833b3SViresh Kumar 
133a5893928SViresh Kumar struct dev_pm_opp *
134a5893928SViresh Kumar dev_pm_opp_find_freq_exact_indexed(struct device *dev, unsigned long freq,
135a5893928SViresh Kumar 				   u32 index, bool available);
136a5893928SViresh Kumar 
137e4db1c74SNishanth Menon struct dev_pm_opp *dev_pm_opp_find_freq_floor(struct device *dev,
138e4db1c74SNishanth Menon 					      unsigned long *freq);
139e4db1c74SNishanth Menon 
140142e17c1SManivannan Sadhasivam struct dev_pm_opp *dev_pm_opp_find_freq_floor_indexed(struct device *dev,
141142e17c1SManivannan Sadhasivam 						      unsigned long *freq, u32 index);
142142e17c1SManivannan Sadhasivam 
143754833b3SViresh Kumar struct dev_pm_opp *dev_pm_opp_find_freq_ceil(struct device *dev,
144754833b3SViresh Kumar 					     unsigned long *freq);
145754833b3SViresh Kumar 
146142e17c1SManivannan Sadhasivam struct dev_pm_opp *dev_pm_opp_find_freq_ceil_indexed(struct device *dev,
147142e17c1SManivannan Sadhasivam 						     unsigned long *freq, u32 index);
148142e17c1SManivannan Sadhasivam 
14922079af7SViresh Kumar struct dev_pm_opp *dev_pm_opp_find_level_exact(struct device *dev,
15022079af7SViresh Kumar 					       unsigned int level);
151754833b3SViresh Kumar 
15222079af7SViresh Kumar struct dev_pm_opp *dev_pm_opp_find_level_ceil(struct device *dev,
15322079af7SViresh Kumar 					      unsigned int *level);
15422079af7SViresh Kumar 
155a0242c81SKrishna chaitanya chundru struct dev_pm_opp *dev_pm_opp_find_level_floor(struct device *dev,
156ba367479SViresh Kumar 					       unsigned int *level);
157a0242c81SKrishna chaitanya chundru 
15800ce3873SKrzysztof Kozlowski struct dev_pm_opp *dev_pm_opp_find_bw_ceil(struct device *dev,
15900ce3873SKrzysztof Kozlowski 					   unsigned int *bw, int index);
16000ce3873SKrzysztof Kozlowski 
16100ce3873SKrzysztof Kozlowski struct dev_pm_opp *dev_pm_opp_find_bw_floor(struct device *dev,
16200ce3873SKrzysztof Kozlowski 					   unsigned int *bw, int index);
16300ce3873SKrzysztof Kozlowski 
164*b489e794SViresh Kumar void dev_pm_opp_get(struct dev_pm_opp *opp);
1657034764aSViresh Kumar void dev_pm_opp_put(struct dev_pm_opp *opp);
166e4db1c74SNishanth Menon 
167248a38d5SUlf Hansson int dev_pm_opp_add_dynamic(struct device *dev, struct dev_pm_opp_data *opp);
168248a38d5SUlf Hansson 
169129eec55SViresh Kumar void dev_pm_opp_remove(struct device *dev, unsigned long freq);
1701690d8bbSViresh Kumar void dev_pm_opp_remove_all_dynamic(struct device *dev);
171e4db1c74SNishanth Menon 
17225cb20a2SStephen Boyd int dev_pm_opp_adjust_voltage(struct device *dev, unsigned long freq,
17325cb20a2SStephen Boyd 			      unsigned long u_volt, unsigned long u_volt_min,
17425cb20a2SStephen Boyd 			      unsigned long u_volt_max);
17525cb20a2SStephen Boyd 
176e4db1c74SNishanth Menon int dev_pm_opp_enable(struct device *dev, unsigned long freq);
177e4db1c74SNishanth Menon 
178e4db1c74SNishanth Menon int dev_pm_opp_disable(struct device *dev, unsigned long freq);
179e4db1c74SNishanth Menon 
180dc2c9ad5SViresh Kumar int dev_pm_opp_register_notifier(struct device *dev, struct notifier_block *nb);
181dc2c9ad5SViresh Kumar int dev_pm_opp_unregister_notifier(struct device *dev, struct notifier_block *nb);
182dc2c9ad5SViresh Kumar 
18311b9b663SViresh Kumar int dev_pm_opp_set_config(struct device *dev, struct dev_pm_opp_config *config);
18411b9b663SViresh Kumar int devm_pm_opp_set_config(struct device *dev, struct dev_pm_opp_config *config);
18511b9b663SViresh Kumar void dev_pm_opp_clear_config(int token);
1868174a3a6SViresh Kumar int dev_pm_opp_config_clks_simple(struct device *dev,
1878174a3a6SViresh Kumar 		struct opp_table *opp_table, struct dev_pm_opp *opp, void *data,
1888174a3a6SViresh Kumar 		bool scaling_down);
18911b9b663SViresh Kumar 
1907d8658efSSaravana Kannan struct 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);
191c8a59103SViresh Kumar int dev_pm_opp_xlate_performance_state(struct opp_table *src_table, struct opp_table *dst_table, unsigned int pstate);
1926a0712f6SViresh Kumar int dev_pm_opp_set_rate(struct device *dev, unsigned long target_freq);
193abbe3483SViresh Kumar int dev_pm_opp_set_opp(struct device *dev, struct dev_pm_opp *opp);
194ddbb74bcSArnd Bergmann int dev_pm_opp_set_sharing_cpus(struct device *cpu_dev, const struct cpumask *cpumask);
195ddbb74bcSArnd Bergmann int dev_pm_opp_get_sharing_cpus(struct device *cpu_dev, struct cpumask *cpumask);
196411466c5SSudeep Holla void dev_pm_opp_remove_table(struct device *dev);
197411466c5SSudeep Holla void dev_pm_opp_cpumask_remove_table(const struct cpumask *cpumask);
198ce8073d8SDmitry Osipenko int dev_pm_opp_sync_regulators(struct device *dev);
199e4db1c74SNishanth Menon #else
dev_pm_opp_get_opp_table(struct device * dev)200f067a982SViresh Kumar static inline struct opp_table *dev_pm_opp_get_opp_table(struct device *dev)
201f067a982SViresh Kumar {
2021d614920SViresh Kumar 	return ERR_PTR(-EOPNOTSUPP);
203f067a982SViresh Kumar }
204f067a982SViresh Kumar 
dev_pm_opp_get_opp_table_indexed(struct device * dev,int index)205eb7c8743SViresh Kumar static inline struct opp_table *dev_pm_opp_get_opp_table_indexed(struct device *dev, int index)
206eb7c8743SViresh Kumar {
2071d614920SViresh Kumar 	return ERR_PTR(-EOPNOTSUPP);
208eb7c8743SViresh Kumar }
209eb7c8743SViresh Kumar 
dev_pm_opp_get_opp_table_ref(struct opp_table * opp_table)210*b489e794SViresh Kumar static inline void dev_pm_opp_get_opp_table_ref(struct opp_table *opp_table) {}
211*b489e794SViresh Kumar 
dev_pm_opp_put_opp_table(struct opp_table * opp_table)212f067a982SViresh Kumar static inline void dev_pm_opp_put_opp_table(struct opp_table *opp_table) {}
213f067a982SViresh Kumar 
dev_pm_opp_get_bw(struct dev_pm_opp * opp,bool peak,int index)214b89c0ed0SNeil Armstrong static inline unsigned long dev_pm_opp_get_bw(struct dev_pm_opp *opp, bool peak, int index)
215b89c0ed0SNeil Armstrong {
216b89c0ed0SNeil Armstrong 	return 0;
217b89c0ed0SNeil Armstrong }
218b89c0ed0SNeil Armstrong 
dev_pm_opp_get_voltage(struct dev_pm_opp * opp)219e4db1c74SNishanth Menon static inline unsigned long dev_pm_opp_get_voltage(struct dev_pm_opp *opp)
220e4db1c74SNishanth Menon {
221e4db1c74SNishanth Menon 	return 0;
222e4db1c74SNishanth Menon }
223e4db1c74SNishanth Menon 
dev_pm_opp_get_supplies(struct dev_pm_opp * opp,struct dev_pm_opp_supply * supplies)22469b1af17SViresh Kumar static inline int dev_pm_opp_get_supplies(struct dev_pm_opp *opp, struct dev_pm_opp_supply *supplies)
22569b1af17SViresh Kumar {
22669b1af17SViresh Kumar 	return -EOPNOTSUPP;
22769b1af17SViresh Kumar }
22869b1af17SViresh Kumar 
dev_pm_opp_get_power(struct dev_pm_opp * opp)2294f9a7a1dSLukasz Luba static inline unsigned long dev_pm_opp_get_power(struct dev_pm_opp *opp)
2304f9a7a1dSLukasz Luba {
2314f9a7a1dSLukasz Luba 	return 0;
2324f9a7a1dSLukasz Luba }
2334f9a7a1dSLukasz Luba 
dev_pm_opp_get_freq_indexed(struct dev_pm_opp * opp,u32 index)2345f756d03SManivannan Sadhasivam static inline unsigned long dev_pm_opp_get_freq_indexed(struct dev_pm_opp *opp, u32 index)
2355f756d03SManivannan Sadhasivam {
2365f756d03SManivannan Sadhasivam 	return 0;
2375f756d03SManivannan Sadhasivam }
2385f756d03SManivannan Sadhasivam 
dev_pm_opp_get_level(struct dev_pm_opp * opp)2395b93ac54SRajendra Nayak static inline unsigned int dev_pm_opp_get_level(struct dev_pm_opp *opp)
2405b93ac54SRajendra Nayak {
2415b93ac54SRajendra Nayak 	return 0;
2425b93ac54SRajendra Nayak }
2435b93ac54SRajendra Nayak 
244597ff543SDmitry Osipenko static inline
dev_pm_opp_get_required_pstate(struct dev_pm_opp * opp,unsigned int index)245597ff543SDmitry Osipenko unsigned int dev_pm_opp_get_required_pstate(struct dev_pm_opp *opp,
246597ff543SDmitry Osipenko 					    unsigned int index)
247597ff543SDmitry Osipenko {
248597ff543SDmitry Osipenko 	return 0;
249597ff543SDmitry Osipenko }
250597ff543SDmitry Osipenko 
dev_pm_opp_is_turbo(struct dev_pm_opp * opp)25119445b25SBartlomiej Zolnierkiewicz static inline bool dev_pm_opp_is_turbo(struct dev_pm_opp *opp)
25219445b25SBartlomiej Zolnierkiewicz {
25319445b25SBartlomiej Zolnierkiewicz 	return false;
25419445b25SBartlomiej Zolnierkiewicz }
25519445b25SBartlomiej Zolnierkiewicz 
dev_pm_opp_get_opp_count(struct device * dev)256e4db1c74SNishanth Menon static inline int dev_pm_opp_get_opp_count(struct device *dev)
257e4db1c74SNishanth Menon {
258e4db1c74SNishanth Menon 	return 0;
259e4db1c74SNishanth Menon }
260e4db1c74SNishanth Menon 
dev_pm_opp_get_max_clock_latency(struct device * dev)2613ca9bb33SViresh Kumar static inline unsigned long dev_pm_opp_get_max_clock_latency(struct device *dev)
2623ca9bb33SViresh Kumar {
2633ca9bb33SViresh Kumar 	return 0;
2643ca9bb33SViresh Kumar }
2653ca9bb33SViresh Kumar 
dev_pm_opp_get_max_volt_latency(struct device * dev)266655c9df9SViresh Kumar static inline unsigned long dev_pm_opp_get_max_volt_latency(struct device *dev)
267655c9df9SViresh Kumar {
268655c9df9SViresh Kumar 	return 0;
269655c9df9SViresh Kumar }
270655c9df9SViresh Kumar 
dev_pm_opp_get_max_transition_latency(struct device * dev)27121743447SViresh Kumar static inline unsigned long dev_pm_opp_get_max_transition_latency(struct device *dev)
27221743447SViresh Kumar {
27321743447SViresh Kumar 	return 0;
27421743447SViresh Kumar }
27521743447SViresh Kumar 
dev_pm_opp_get_suspend_opp_freq(struct device * dev)2763aa26a3bSViresh Kumar static inline unsigned long dev_pm_opp_get_suspend_opp_freq(struct device *dev)
2774eafbd15SBartlomiej Zolnierkiewicz {
2783aa26a3bSViresh Kumar 	return 0;
2794eafbd15SBartlomiej Zolnierkiewicz }
2804eafbd15SBartlomiej Zolnierkiewicz 
dev_pm_opp_find_freq_exact(struct device * dev,unsigned long freq,bool available)28122079af7SViresh Kumar static inline struct dev_pm_opp *dev_pm_opp_find_freq_exact(struct device *dev,
28222079af7SViresh Kumar 					unsigned long freq, bool available)
28322079af7SViresh Kumar {
28422079af7SViresh Kumar 	return ERR_PTR(-EOPNOTSUPP);
28522079af7SViresh Kumar }
28622079af7SViresh Kumar 
287a5893928SViresh Kumar static inline struct dev_pm_opp *
dev_pm_opp_find_freq_exact_indexed(struct device * dev,unsigned long freq,u32 index,bool available)288a5893928SViresh Kumar dev_pm_opp_find_freq_exact_indexed(struct device *dev, unsigned long freq,
289a5893928SViresh Kumar 				   u32 index, bool available)
290a5893928SViresh Kumar {
291a5893928SViresh Kumar 	return ERR_PTR(-EOPNOTSUPP);
292a5893928SViresh Kumar }
293a5893928SViresh Kumar 
dev_pm_opp_find_freq_floor(struct device * dev,unsigned long * freq)294e4db1c74SNishanth Menon static inline struct dev_pm_opp *dev_pm_opp_find_freq_floor(struct device *dev,
295e4db1c74SNishanth Menon 					unsigned long *freq)
296e4db1c74SNishanth Menon {
2971d614920SViresh Kumar 	return ERR_PTR(-EOPNOTSUPP);
298e4db1c74SNishanth Menon }
299e4db1c74SNishanth Menon 
300142e17c1SManivannan Sadhasivam static inline struct dev_pm_opp *
dev_pm_opp_find_freq_floor_indexed(struct device * dev,unsigned long * freq,u32 index)301142e17c1SManivannan Sadhasivam dev_pm_opp_find_freq_floor_indexed(struct device *dev, unsigned long *freq, u32 index)
302142e17c1SManivannan Sadhasivam {
303142e17c1SManivannan Sadhasivam 	return ERR_PTR(-EOPNOTSUPP);
304142e17c1SManivannan Sadhasivam }
305142e17c1SManivannan Sadhasivam 
dev_pm_opp_find_freq_ceil(struct device * dev,unsigned long * freq)306e4db1c74SNishanth Menon static inline struct dev_pm_opp *dev_pm_opp_find_freq_ceil(struct device *dev,
307e4db1c74SNishanth Menon 					unsigned long *freq)
308e4db1c74SNishanth Menon {
3091d614920SViresh Kumar 	return ERR_PTR(-EOPNOTSUPP);
310e4db1c74SNishanth Menon }
311e4db1c74SNishanth Menon 
312142e17c1SManivannan Sadhasivam static inline struct dev_pm_opp *
dev_pm_opp_find_freq_ceil_indexed(struct device * dev,unsigned long * freq,u32 index)313142e17c1SManivannan Sadhasivam dev_pm_opp_find_freq_ceil_indexed(struct device *dev, unsigned long *freq, u32 index)
314142e17c1SManivannan Sadhasivam {
315142e17c1SManivannan Sadhasivam 	return ERR_PTR(-EOPNOTSUPP);
316142e17c1SManivannan Sadhasivam }
317142e17c1SManivannan Sadhasivam 
dev_pm_opp_find_level_exact(struct device * dev,unsigned int level)318754833b3SViresh Kumar static inline struct dev_pm_opp *dev_pm_opp_find_level_exact(struct device *dev,
319754833b3SViresh Kumar 					unsigned int level)
320754833b3SViresh Kumar {
321754833b3SViresh Kumar 	return ERR_PTR(-EOPNOTSUPP);
322754833b3SViresh Kumar }
323754833b3SViresh Kumar 
dev_pm_opp_find_level_ceil(struct device * dev,unsigned int * level)324754833b3SViresh Kumar static inline struct dev_pm_opp *dev_pm_opp_find_level_ceil(struct device *dev,
325754833b3SViresh Kumar 					unsigned int *level)
326754833b3SViresh Kumar {
327754833b3SViresh Kumar 	return ERR_PTR(-EOPNOTSUPP);
328754833b3SViresh Kumar }
329754833b3SViresh Kumar 
dev_pm_opp_find_level_floor(struct device * dev,unsigned int * level)330a0242c81SKrishna chaitanya chundru static inline struct dev_pm_opp *dev_pm_opp_find_level_floor(struct device *dev,
331ba367479SViresh Kumar 							     unsigned int *level)
332a0242c81SKrishna chaitanya chundru {
333a0242c81SKrishna chaitanya chundru 	return ERR_PTR(-EOPNOTSUPP);
334a0242c81SKrishna chaitanya chundru }
335a0242c81SKrishna chaitanya chundru 
dev_pm_opp_find_bw_ceil(struct device * dev,unsigned int * bw,int index)33600ce3873SKrzysztof Kozlowski static inline struct dev_pm_opp *dev_pm_opp_find_bw_ceil(struct device *dev,
33700ce3873SKrzysztof Kozlowski 					unsigned int *bw, int index)
33800ce3873SKrzysztof Kozlowski {
33900ce3873SKrzysztof Kozlowski 	return ERR_PTR(-EOPNOTSUPP);
34000ce3873SKrzysztof Kozlowski }
34100ce3873SKrzysztof Kozlowski 
dev_pm_opp_find_bw_floor(struct device * dev,unsigned int * bw,int index)34200ce3873SKrzysztof Kozlowski static inline struct dev_pm_opp *dev_pm_opp_find_bw_floor(struct device *dev,
34300ce3873SKrzysztof Kozlowski 					unsigned int *bw, int index)
34400ce3873SKrzysztof Kozlowski {
34500ce3873SKrzysztof Kozlowski 	return ERR_PTR(-EOPNOTSUPP);
34600ce3873SKrzysztof Kozlowski }
34700ce3873SKrzysztof Kozlowski 
dev_pm_opp_get(struct dev_pm_opp * opp)348*b489e794SViresh Kumar static inline void dev_pm_opp_get(struct dev_pm_opp *opp) {}
349*b489e794SViresh Kumar 
dev_pm_opp_put(struct dev_pm_opp * opp)3507034764aSViresh Kumar static inline void dev_pm_opp_put(struct dev_pm_opp *opp) {}
3517034764aSViresh Kumar 
352248a38d5SUlf Hansson static inline int
dev_pm_opp_add_dynamic(struct device * dev,struct dev_pm_opp_data * opp)353248a38d5SUlf Hansson dev_pm_opp_add_dynamic(struct device *dev, struct dev_pm_opp_data *opp)
354e4db1c74SNishanth Menon {
3551d614920SViresh Kumar 	return -EOPNOTSUPP;
356e4db1c74SNishanth Menon }
357e4db1c74SNishanth Menon 
dev_pm_opp_remove(struct device * dev,unsigned long freq)358129eec55SViresh Kumar static inline void dev_pm_opp_remove(struct device *dev, unsigned long freq)
359129eec55SViresh Kumar {
360129eec55SViresh Kumar }
361129eec55SViresh Kumar 
dev_pm_opp_remove_all_dynamic(struct device * dev)3621690d8bbSViresh Kumar static inline void dev_pm_opp_remove_all_dynamic(struct device *dev)
3631690d8bbSViresh Kumar {
3641690d8bbSViresh Kumar }
3651690d8bbSViresh Kumar 
36625cb20a2SStephen Boyd static inline int
dev_pm_opp_adjust_voltage(struct device * dev,unsigned long freq,unsigned long u_volt,unsigned long u_volt_min,unsigned long u_volt_max)36725cb20a2SStephen Boyd dev_pm_opp_adjust_voltage(struct device *dev, unsigned long freq,
36825cb20a2SStephen Boyd 			  unsigned long u_volt, unsigned long u_volt_min,
36925cb20a2SStephen Boyd 			  unsigned long u_volt_max)
37025cb20a2SStephen Boyd {
37125cb20a2SStephen Boyd 	return 0;
37225cb20a2SStephen Boyd }
37325cb20a2SStephen Boyd 
dev_pm_opp_enable(struct device * dev,unsigned long freq)374e4db1c74SNishanth Menon static inline int dev_pm_opp_enable(struct device *dev, unsigned long freq)
375e4db1c74SNishanth Menon {
376e4db1c74SNishanth Menon 	return 0;
377e4db1c74SNishanth Menon }
378e4db1c74SNishanth Menon 
dev_pm_opp_disable(struct device * dev,unsigned long freq)379e4db1c74SNishanth Menon static inline int dev_pm_opp_disable(struct device *dev, unsigned long freq)
380e4db1c74SNishanth Menon {
381e4db1c74SNishanth Menon 	return 0;
382e4db1c74SNishanth Menon }
383e4db1c74SNishanth Menon 
dev_pm_opp_register_notifier(struct device * dev,struct notifier_block * nb)384dc2c9ad5SViresh Kumar static inline int dev_pm_opp_register_notifier(struct device *dev, struct notifier_block *nb)
385e4db1c74SNishanth Menon {
3861d614920SViresh Kumar 	return -EOPNOTSUPP;
387dc2c9ad5SViresh Kumar }
388dc2c9ad5SViresh Kumar 
dev_pm_opp_unregister_notifier(struct device * dev,struct notifier_block * nb)389dc2c9ad5SViresh Kumar static inline int dev_pm_opp_unregister_notifier(struct device *dev, struct notifier_block *nb)
390dc2c9ad5SViresh Kumar {
3911d614920SViresh Kumar 	return -EOPNOTSUPP;
392e4db1c74SNishanth Menon }
3937de36b0aSViresh Kumar 
dev_pm_opp_set_config(struct device * dev,struct dev_pm_opp_config * config)39411b9b663SViresh Kumar static inline int dev_pm_opp_set_config(struct device *dev, struct dev_pm_opp_config *config)
39511b9b663SViresh Kumar {
39611b9b663SViresh Kumar 	return -EOPNOTSUPP;
39711b9b663SViresh Kumar }
39811b9b663SViresh Kumar 
devm_pm_opp_set_config(struct device * dev,struct dev_pm_opp_config * config)39911b9b663SViresh Kumar static inline int devm_pm_opp_set_config(struct device *dev, struct dev_pm_opp_config *config)
40011b9b663SViresh Kumar {
40111b9b663SViresh Kumar 	return -EOPNOTSUPP;
40211b9b663SViresh Kumar }
40311b9b663SViresh Kumar 
dev_pm_opp_clear_config(int token)40411b9b663SViresh Kumar static inline void dev_pm_opp_clear_config(int token) {}
40511b9b663SViresh Kumar 
dev_pm_opp_config_clks_simple(struct device * dev,struct opp_table * opp_table,struct dev_pm_opp * opp,void * data,bool scaling_down)4068174a3a6SViresh Kumar static inline int dev_pm_opp_config_clks_simple(struct device *dev,
4078174a3a6SViresh Kumar 		struct opp_table *opp_table, struct dev_pm_opp *opp, void *data,
4088174a3a6SViresh Kumar 		bool scaling_down)
4098174a3a6SViresh Kumar {
4108174a3a6SViresh Kumar 	return -EOPNOTSUPP;
4118174a3a6SViresh Kumar }
4128174a3a6SViresh Kumar 
dev_pm_opp_xlate_required_opp(struct opp_table * src_table,struct opp_table * dst_table,struct dev_pm_opp * src_opp)4137d8658efSSaravana Kannan static inline struct dev_pm_opp *dev_pm_opp_xlate_required_opp(struct opp_table *src_table,
4147d8658efSSaravana Kannan 				struct opp_table *dst_table, struct dev_pm_opp *src_opp)
4157d8658efSSaravana Kannan {
4167d8658efSSaravana Kannan 	return ERR_PTR(-EOPNOTSUPP);
4177d8658efSSaravana Kannan }
4187d8658efSSaravana Kannan 
dev_pm_opp_xlate_performance_state(struct opp_table * src_table,struct opp_table * dst_table,unsigned int pstate)419c8a59103SViresh Kumar static inline int dev_pm_opp_xlate_performance_state(struct opp_table *src_table, struct opp_table *dst_table, unsigned int pstate)
420c8a59103SViresh Kumar {
4211d614920SViresh Kumar 	return -EOPNOTSUPP;
422c8a59103SViresh Kumar }
423c8a59103SViresh Kumar 
dev_pm_opp_set_rate(struct device * dev,unsigned long target_freq)4246a0712f6SViresh Kumar static inline int dev_pm_opp_set_rate(struct device *dev, unsigned long target_freq)
4256a0712f6SViresh Kumar {
4261d614920SViresh Kumar 	return -EOPNOTSUPP;
4276a0712f6SViresh Kumar }
4286a0712f6SViresh Kumar 
dev_pm_opp_set_opp(struct device * dev,struct dev_pm_opp * opp)429abbe3483SViresh Kumar static inline int dev_pm_opp_set_opp(struct device *dev, struct dev_pm_opp *opp)
430abbe3483SViresh Kumar {
4311d614920SViresh Kumar 	return -EOPNOTSUPP;
432abbe3483SViresh Kumar }
433abbe3483SViresh Kumar 
dev_pm_opp_set_sharing_cpus(struct device * cpu_dev,const struct cpumask * cpumask)434ddbb74bcSArnd Bergmann static inline int dev_pm_opp_set_sharing_cpus(struct device *cpu_dev, const struct cpumask *cpumask)
435642aa8ceSViresh Kumar {
4361d614920SViresh Kumar 	return -EOPNOTSUPP;
437642aa8ceSViresh Kumar }
438642aa8ceSViresh Kumar 
dev_pm_opp_get_sharing_cpus(struct device * cpu_dev,struct cpumask * cpumask)439ddbb74bcSArnd Bergmann static inline int dev_pm_opp_get_sharing_cpus(struct device *cpu_dev, struct cpumask *cpumask)
4406f707daaSViresh Kumar {
4416f707daaSViresh Kumar 	return -EINVAL;
4426f707daaSViresh Kumar }
4436f707daaSViresh Kumar 
dev_pm_opp_remove_table(struct device * dev)444411466c5SSudeep Holla static inline void dev_pm_opp_remove_table(struct device *dev)
445411466c5SSudeep Holla {
446411466c5SSudeep Holla }
447411466c5SSudeep Holla 
dev_pm_opp_cpumask_remove_table(const struct cpumask * cpumask)448411466c5SSudeep Holla static inline void dev_pm_opp_cpumask_remove_table(const struct cpumask *cpumask)
449411466c5SSudeep Holla {
450411466c5SSudeep Holla }
451411466c5SSudeep Holla 
dev_pm_opp_sync_regulators(struct device * dev)452ce8073d8SDmitry Osipenko static inline int dev_pm_opp_sync_regulators(struct device *dev)
453ce8073d8SDmitry Osipenko {
4541d614920SViresh Kumar 	return -EOPNOTSUPP;
455ce8073d8SDmitry Osipenko }
456ce8073d8SDmitry Osipenko 
457e4db1c74SNishanth Menon #endif		/* CONFIG_PM_OPP */
458e4db1c74SNishanth Menon 
459838a4772SViresh Kumar #if defined(CONFIG_CPU_FREQ) && defined(CONFIG_PM_OPP)
460838a4772SViresh Kumar int dev_pm_opp_init_cpufreq_table(struct device *dev, struct cpufreq_frequency_table **table);
461838a4772SViresh Kumar void dev_pm_opp_free_cpufreq_table(struct device *dev, struct cpufreq_frequency_table **table);
462838a4772SViresh Kumar #else
dev_pm_opp_init_cpufreq_table(struct device * dev,struct cpufreq_frequency_table ** table)463838a4772SViresh Kumar static inline int dev_pm_opp_init_cpufreq_table(struct device *dev, struct cpufreq_frequency_table **table)
464838a4772SViresh Kumar {
465838a4772SViresh Kumar 	return -EINVAL;
466838a4772SViresh Kumar }
467838a4772SViresh Kumar 
dev_pm_opp_free_cpufreq_table(struct device * dev,struct cpufreq_frequency_table ** table)468838a4772SViresh Kumar static inline void dev_pm_opp_free_cpufreq_table(struct device *dev, struct cpufreq_frequency_table **table)
469838a4772SViresh Kumar {
470838a4772SViresh Kumar }
471838a4772SViresh Kumar #endif
472838a4772SViresh Kumar 
473838a4772SViresh Kumar 
474e4db1c74SNishanth Menon #if defined(CONFIG_PM_OPP) && defined(CONFIG_OF)
4758f8d37b2SViresh Kumar int dev_pm_opp_of_add_table(struct device *dev);
476fa9b274fSViresh Kumar int dev_pm_opp_of_add_table_indexed(struct device *dev, int index);
477e69709f6SDmitry Osipenko int devm_pm_opp_of_add_table_indexed(struct device *dev, int index);
4788f8d37b2SViresh Kumar void dev_pm_opp_of_remove_table(struct device *dev);
4793d5cfbb6SYangtao Li int devm_pm_opp_of_add_table(struct device *dev);
480ddbb74bcSArnd Bergmann int dev_pm_opp_of_cpumask_add_table(const struct cpumask *cpumask);
481ddbb74bcSArnd Bergmann void dev_pm_opp_of_cpumask_remove_table(const struct cpumask *cpumask);
482ddbb74bcSArnd Bergmann int dev_pm_opp_of_get_sharing_cpus(struct device *cpu_dev, struct cpumask *cpumask);
4830764c604SDave Gerlach struct device_node *dev_pm_opp_of_get_opp_desc_node(struct device *dev);
484e2f4b5f8SViresh Kumar struct device_node *dev_pm_opp_get_of_node(struct dev_pm_opp *opp);
4852feb5a89SViresh Kumar int of_get_required_opp_performance_state(struct device_node *np, int index);
486e3943f00SUlf Hansson bool dev_pm_opp_of_has_required_opp(struct device *dev);
4876d3f922cSGeorgi Djakov int dev_pm_opp_of_find_icc_paths(struct device *dev, struct opp_table *opp_table);
4880e0ffa85SLukasz Luba int dev_pm_opp_of_register_em(struct device *dev, struct cpumask *cpus);
489e3ac0f36SLukasz Luba int dev_pm_opp_calc_power(struct device *dev, unsigned long *uW,
490e3ac0f36SLukasz Luba 			  unsigned long *kHz);
dev_pm_opp_of_unregister_em(struct device * dev)4910e0ffa85SLukasz Luba static inline void dev_pm_opp_of_unregister_em(struct device *dev)
4920e0ffa85SLukasz Luba {
4930e0ffa85SLukasz Luba 	em_dev_unregister_perf_domain(dev);
4940e0ffa85SLukasz Luba }
495e4db1c74SNishanth Menon #else
dev_pm_opp_of_add_table(struct device * dev)4968f8d37b2SViresh Kumar static inline int dev_pm_opp_of_add_table(struct device *dev)
497e4db1c74SNishanth Menon {
4981d614920SViresh Kumar 	return -EOPNOTSUPP;
499e4db1c74SNishanth Menon }
500129eec55SViresh Kumar 
dev_pm_opp_of_add_table_indexed(struct device * dev,int index)501fa9b274fSViresh Kumar static inline int dev_pm_opp_of_add_table_indexed(struct device *dev, int index)
502fa9b274fSViresh Kumar {
5031d614920SViresh Kumar 	return -EOPNOTSUPP;
504fa9b274fSViresh Kumar }
505fa9b274fSViresh Kumar 
devm_pm_opp_of_add_table_indexed(struct device * dev,int index)506e69709f6SDmitry Osipenko static inline int devm_pm_opp_of_add_table_indexed(struct device *dev, int index)
507e69709f6SDmitry Osipenko {
508e69709f6SDmitry Osipenko 	return -EOPNOTSUPP;
509e69709f6SDmitry Osipenko }
510e69709f6SDmitry Osipenko 
dev_pm_opp_of_remove_table(struct device * dev)5118f8d37b2SViresh Kumar static inline void dev_pm_opp_of_remove_table(struct device *dev)
512129eec55SViresh Kumar {
513129eec55SViresh Kumar }
5148d4d4e98SViresh Kumar 
devm_pm_opp_of_add_table(struct device * dev)5153d5cfbb6SYangtao Li static inline int devm_pm_opp_of_add_table(struct device *dev)
5163d5cfbb6SYangtao Li {
5173d5cfbb6SYangtao Li 	return -EOPNOTSUPP;
5183d5cfbb6SYangtao Li }
5193d5cfbb6SYangtao Li 
dev_pm_opp_of_cpumask_add_table(const struct cpumask * cpumask)520ddbb74bcSArnd Bergmann static inline int dev_pm_opp_of_cpumask_add_table(const struct cpumask *cpumask)
5218d4d4e98SViresh Kumar {
5221d614920SViresh Kumar 	return -EOPNOTSUPP;
5238d4d4e98SViresh Kumar }
5248d4d4e98SViresh Kumar 
dev_pm_opp_of_cpumask_remove_table(const struct cpumask * cpumask)525ddbb74bcSArnd Bergmann static inline void dev_pm_opp_of_cpumask_remove_table(const struct cpumask *cpumask)
5268d4d4e98SViresh Kumar {
5278d4d4e98SViresh Kumar }
5288d4d4e98SViresh Kumar 
dev_pm_opp_of_get_sharing_cpus(struct device * cpu_dev,struct cpumask * cpumask)529ddbb74bcSArnd Bergmann static inline int dev_pm_opp_of_get_sharing_cpus(struct device *cpu_dev, struct cpumask *cpumask)
5308d4d4e98SViresh Kumar {
5311d614920SViresh Kumar 	return -EOPNOTSUPP;
5328d4d4e98SViresh Kumar }
5330764c604SDave Gerlach 
dev_pm_opp_of_get_opp_desc_node(struct device * dev)5340764c604SDave Gerlach static inline struct device_node *dev_pm_opp_of_get_opp_desc_node(struct device *dev)
5350764c604SDave Gerlach {
5360764c604SDave Gerlach 	return NULL;
5370764c604SDave Gerlach }
538a88bd2a5SViresh Kumar 
dev_pm_opp_get_of_node(struct dev_pm_opp * opp)539e2f4b5f8SViresh Kumar static inline struct device_node *dev_pm_opp_get_of_node(struct dev_pm_opp *opp)
540e2f4b5f8SViresh Kumar {
541e2f4b5f8SViresh Kumar 	return NULL;
542e2f4b5f8SViresh Kumar }
543a4f342b9SQuentin Perret 
dev_pm_opp_of_register_em(struct device * dev,struct cpumask * cpus)5440e0ffa85SLukasz Luba static inline int dev_pm_opp_of_register_em(struct device *dev,
5450e0ffa85SLukasz Luba 					    struct cpumask *cpus)
5460e0ffa85SLukasz Luba {
5471d614920SViresh Kumar 	return -EOPNOTSUPP;
5480e0ffa85SLukasz Luba }
5490e0ffa85SLukasz Luba 
dev_pm_opp_of_unregister_em(struct device * dev)5500e0ffa85SLukasz Luba static inline void dev_pm_opp_of_unregister_em(struct device *dev)
551a4f342b9SQuentin Perret {
552a4f342b9SQuentin Perret }
553a4f342b9SQuentin Perret 
dev_pm_opp_calc_power(struct device * dev,unsigned long * uW,unsigned long * kHz)554e3ac0f36SLukasz Luba static inline int dev_pm_opp_calc_power(struct device *dev, unsigned long *uW,
555e3ac0f36SLukasz Luba 					unsigned long *kHz)
556e3ac0f36SLukasz Luba {
557e3ac0f36SLukasz Luba 	return -EOPNOTSUPP;
558e3ac0f36SLukasz Luba }
559e3ac0f36SLukasz Luba 
of_get_required_opp_performance_state(struct device_node * np,int index)5602feb5a89SViresh Kumar static inline int of_get_required_opp_performance_state(struct device_node *np, int index)
5614c6a343eSViresh Kumar {
5621d614920SViresh Kumar 	return -EOPNOTSUPP;
5634c6a343eSViresh Kumar }
5646d3f922cSGeorgi Djakov 
dev_pm_opp_of_has_required_opp(struct device * dev)565e3943f00SUlf Hansson static inline bool dev_pm_opp_of_has_required_opp(struct device *dev)
566e3943f00SUlf Hansson {
567e3943f00SUlf Hansson 	return false;
568e3943f00SUlf Hansson }
569e3943f00SUlf Hansson 
dev_pm_opp_of_find_icc_paths(struct device * dev,struct opp_table * opp_table)5706d3f922cSGeorgi Djakov static inline int dev_pm_opp_of_find_icc_paths(struct device *dev, struct opp_table *opp_table)
5716d3f922cSGeorgi Djakov {
5721d614920SViresh Kumar 	return -EOPNOTSUPP;
5736d3f922cSGeorgi Djakov }
574e4db1c74SNishanth Menon #endif
575e4db1c74SNishanth Menon 
576b0ec0942SViresh Kumar /* OPP Configuration helpers */
577b0ec0942SViresh Kumar 
dev_pm_opp_add(struct device * dev,unsigned long freq,unsigned long u_volt)578248a38d5SUlf Hansson static inline int dev_pm_opp_add(struct device *dev, unsigned long freq,
579248a38d5SUlf Hansson 				 unsigned long u_volt)
580248a38d5SUlf Hansson {
581248a38d5SUlf Hansson 	struct dev_pm_opp_data data = {
582248a38d5SUlf Hansson 		.freq = freq,
583248a38d5SUlf Hansson 		.u_volt = u_volt,
584248a38d5SUlf Hansson 	};
585248a38d5SUlf Hansson 
586248a38d5SUlf Hansson 	return dev_pm_opp_add_dynamic(dev, &data);
587248a38d5SUlf Hansson }
588248a38d5SUlf Hansson 
589b0ec0942SViresh Kumar /* Regulators helpers */
dev_pm_opp_set_regulators(struct device * dev,const char * const names[])590b0ec0942SViresh Kumar static inline int dev_pm_opp_set_regulators(struct device *dev,
591b0ec0942SViresh Kumar 					    const char * const names[])
592b0ec0942SViresh Kumar {
593b0ec0942SViresh Kumar 	struct dev_pm_opp_config config = {
594b0ec0942SViresh Kumar 		.regulator_names = names,
595b0ec0942SViresh Kumar 	};
596b0ec0942SViresh Kumar 
597b0ec0942SViresh Kumar 	return dev_pm_opp_set_config(dev, &config);
598b0ec0942SViresh Kumar }
599b0ec0942SViresh Kumar 
dev_pm_opp_put_regulators(int token)600b0ec0942SViresh Kumar static inline void dev_pm_opp_put_regulators(int token)
601b0ec0942SViresh Kumar {
602b0ec0942SViresh Kumar 	dev_pm_opp_clear_config(token);
603b0ec0942SViresh Kumar }
604b0ec0942SViresh Kumar 
devm_pm_opp_set_regulators(struct device * dev,const char * const names[])605b0ec0942SViresh Kumar static inline int devm_pm_opp_set_regulators(struct device *dev,
606b0ec0942SViresh Kumar 					     const char * const names[])
607b0ec0942SViresh Kumar {
608b0ec0942SViresh Kumar 	struct dev_pm_opp_config config = {
609b0ec0942SViresh Kumar 		.regulator_names = names,
610b0ec0942SViresh Kumar 	};
611b0ec0942SViresh Kumar 
612b0ec0942SViresh Kumar 	return devm_pm_opp_set_config(dev, &config);
613b0ec0942SViresh Kumar }
614b0ec0942SViresh Kumar 
61589f03984SViresh Kumar /* Supported-hw helpers */
dev_pm_opp_set_supported_hw(struct device * dev,const u32 * versions,unsigned int count)61689f03984SViresh Kumar static inline int dev_pm_opp_set_supported_hw(struct device *dev,
61789f03984SViresh Kumar 					      const u32 *versions,
61889f03984SViresh Kumar 					      unsigned int count)
61989f03984SViresh Kumar {
62089f03984SViresh Kumar 	struct dev_pm_opp_config config = {
62189f03984SViresh Kumar 		.supported_hw = versions,
62289f03984SViresh Kumar 		.supported_hw_count = count,
62389f03984SViresh Kumar 	};
62489f03984SViresh Kumar 
62589f03984SViresh Kumar 	return dev_pm_opp_set_config(dev, &config);
62689f03984SViresh Kumar }
62789f03984SViresh Kumar 
dev_pm_opp_put_supported_hw(int token)62889f03984SViresh Kumar static inline void dev_pm_opp_put_supported_hw(int token)
62989f03984SViresh Kumar {
63089f03984SViresh Kumar 	dev_pm_opp_clear_config(token);
63189f03984SViresh Kumar }
63289f03984SViresh Kumar 
devm_pm_opp_set_supported_hw(struct device * dev,const u32 * versions,unsigned int count)63389f03984SViresh Kumar static inline int devm_pm_opp_set_supported_hw(struct device *dev,
63489f03984SViresh Kumar 					       const u32 *versions,
63589f03984SViresh Kumar 					       unsigned int count)
63689f03984SViresh Kumar {
63789f03984SViresh Kumar 	struct dev_pm_opp_config config = {
63889f03984SViresh Kumar 		.supported_hw = versions,
63989f03984SViresh Kumar 		.supported_hw_count = count,
64089f03984SViresh Kumar 	};
64189f03984SViresh Kumar 
64289f03984SViresh Kumar 	return devm_pm_opp_set_config(dev, &config);
64389f03984SViresh Kumar }
64489f03984SViresh Kumar 
6452368f576SViresh Kumar /* clkname helpers */
dev_pm_opp_set_clkname(struct device * dev,const char * name)6462368f576SViresh Kumar static inline int dev_pm_opp_set_clkname(struct device *dev, const char *name)
6472368f576SViresh Kumar {
6482368f576SViresh Kumar 	const char *names[] = { name, NULL };
6492368f576SViresh Kumar 	struct dev_pm_opp_config config = {
6502368f576SViresh Kumar 		.clk_names = names,
6512368f576SViresh Kumar 	};
6522368f576SViresh Kumar 
6532368f576SViresh Kumar 	return dev_pm_opp_set_config(dev, &config);
6542368f576SViresh Kumar }
6552368f576SViresh Kumar 
dev_pm_opp_put_clkname(int token)6562368f576SViresh Kumar static inline void dev_pm_opp_put_clkname(int token)
6572368f576SViresh Kumar {
6582368f576SViresh Kumar 	dev_pm_opp_clear_config(token);
6592368f576SViresh Kumar }
6602368f576SViresh Kumar 
devm_pm_opp_set_clkname(struct device * dev,const char * name)6612368f576SViresh Kumar static inline int devm_pm_opp_set_clkname(struct device *dev, const char *name)
6622368f576SViresh Kumar {
6632368f576SViresh Kumar 	const char *names[] = { name, NULL };
6642368f576SViresh Kumar 	struct dev_pm_opp_config config = {
6652368f576SViresh Kumar 		.clk_names = names,
6662368f576SViresh Kumar 	};
6672368f576SViresh Kumar 
6682368f576SViresh Kumar 	return devm_pm_opp_set_config(dev, &config);
6692368f576SViresh Kumar }
6702368f576SViresh Kumar 
671aee3352fSViresh Kumar /* config-regulators helpers */
dev_pm_opp_set_config_regulators(struct device * dev,config_regulators_t helper)672aee3352fSViresh Kumar static inline int dev_pm_opp_set_config_regulators(struct device *dev,
673aee3352fSViresh Kumar 						   config_regulators_t helper)
674aee3352fSViresh Kumar {
675aee3352fSViresh Kumar 	struct dev_pm_opp_config config = {
676aee3352fSViresh Kumar 		.config_regulators = helper,
677aee3352fSViresh Kumar 	};
678aee3352fSViresh Kumar 
679aee3352fSViresh Kumar 	return dev_pm_opp_set_config(dev, &config);
680aee3352fSViresh Kumar }
681aee3352fSViresh Kumar 
dev_pm_opp_put_config_regulators(int token)682aee3352fSViresh Kumar static inline void dev_pm_opp_put_config_regulators(int token)
683aee3352fSViresh Kumar {
684aee3352fSViresh Kumar 	dev_pm_opp_clear_config(token);
685aee3352fSViresh Kumar }
686aee3352fSViresh Kumar 
687298098e5SViresh Kumar /* prop-name helpers */
dev_pm_opp_set_prop_name(struct device * dev,const char * name)688298098e5SViresh Kumar static inline int dev_pm_opp_set_prop_name(struct device *dev, const char *name)
689298098e5SViresh Kumar {
690298098e5SViresh Kumar 	struct dev_pm_opp_config config = {
691298098e5SViresh Kumar 		.prop_name = name,
692298098e5SViresh Kumar 	};
693298098e5SViresh Kumar 
694298098e5SViresh Kumar 	return dev_pm_opp_set_config(dev, &config);
695298098e5SViresh Kumar }
696298098e5SViresh Kumar 
dev_pm_opp_put_prop_name(int token)697298098e5SViresh Kumar static inline void dev_pm_opp_put_prop_name(int token)
698298098e5SViresh Kumar {
699298098e5SViresh Kumar 	dev_pm_opp_clear_config(token);
700298098e5SViresh Kumar }
701442e7a17SViresh Kumar 
dev_pm_opp_get_freq(struct dev_pm_opp * opp)702746de825SViresh Kumar static inline unsigned long dev_pm_opp_get_freq(struct dev_pm_opp *opp)
703746de825SViresh Kumar {
704746de825SViresh Kumar 	return dev_pm_opp_get_freq_indexed(opp, 0);
705746de825SViresh Kumar }
706746de825SViresh Kumar 
707e4db1c74SNishanth Menon #endif		/* __LINUX_OPP_H__ */
708