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 cpufreq_frequency_table;
20struct regulator;
21struct dev_pm_opp;
22struct device;
23struct opp_table;
24
25enum dev_pm_opp_event {
26	OPP_EVENT_ADD, OPP_EVENT_REMOVE, OPP_EVENT_ENABLE, OPP_EVENT_DISABLE,
27	OPP_EVENT_ADJUST_VOLTAGE,
28};
29
30/**
31 * struct dev_pm_opp_supply - Power supply voltage/current values
32 * @u_volt:	Target voltage in microvolts corresponding to this OPP
33 * @u_volt_min:	Minimum voltage in microvolts corresponding to this OPP
34 * @u_volt_max:	Maximum voltage in microvolts corresponding to this OPP
35 * @u_amp:	Maximum current drawn by the device in microamperes
36 * @u_watt:	Power used by the device in microwatts
37 *
38 * This structure stores the voltage/current/power values for a single power
39 * supply.
40 */
41struct dev_pm_opp_supply {
42	unsigned long u_volt;
43	unsigned long u_volt_min;
44	unsigned long u_volt_max;
45	unsigned long u_amp;
46	unsigned long u_watt;
47};
48
49typedef int (*config_regulators_t)(struct device *dev,
50			struct dev_pm_opp *old_opp, struct dev_pm_opp *new_opp,
51			struct regulator **regulators, unsigned int count);
52
53typedef int (*config_clks_t)(struct device *dev, struct opp_table *opp_table,
54			struct dev_pm_opp *opp, void *data, bool scaling_down);
55
56/**
57 * struct dev_pm_opp_config - Device OPP configuration values
58 * @clk_names: Clk names, NULL terminated array.
59 * @config_clks: Custom set clk helper.
60 * @prop_name: Name to postfix to properties.
61 * @config_regulators: Custom set regulator helper.
62 * @supported_hw: Array of hierarchy of versions to match.
63 * @supported_hw_count: Number of elements in the array.
64 * @regulator_names: Array of pointers to the names of the regulator, NULL terminated.
65 * @genpd_names: Null terminated array of pointers containing names of genpd to
66 *		attach. Mutually exclusive with required_devs.
67 * @virt_devs: Pointer to return the array of genpd virtual devices. Mutually
68 *		exclusive with required_devs.
69 * @required_devs: Required OPP devices. Mutually exclusive with genpd_names/virt_devs.
70 *
71 * This structure contains platform specific OPP configurations for the device.
72 */
73struct dev_pm_opp_config {
74	/* NULL terminated */
75	const char * const *clk_names;
76	config_clks_t config_clks;
77	const char *prop_name;
78	config_regulators_t config_regulators;
79	const unsigned int *supported_hw;
80	unsigned int supported_hw_count;
81	const char * const *regulator_names;
82	const char * const *genpd_names;
83	struct device ***virt_devs;
84	struct device **required_devs;
85};
86
87#define OPP_LEVEL_UNSET			U32_MAX
88
89/**
90 * struct dev_pm_opp_data - The data to use to initialize an OPP.
91 * @turbo: Flag to indicate whether the OPP is to be marked turbo or not.
92 * @level: The performance level for the OPP. Set level to OPP_LEVEL_UNSET if
93 * level field isn't used.
94 * @freq: The clock rate in Hz for the OPP.
95 * @u_volt: The voltage in uV for the OPP.
96 */
97struct dev_pm_opp_data {
98	bool turbo;
99	unsigned int level;
100	unsigned long freq;
101	unsigned long u_volt;
102};
103
104#if defined(CONFIG_PM_OPP)
105
106struct opp_table *dev_pm_opp_get_opp_table(struct device *dev);
107void dev_pm_opp_put_opp_table(struct opp_table *opp_table);
108
109unsigned long dev_pm_opp_get_voltage(struct dev_pm_opp *opp);
110
111int dev_pm_opp_get_supplies(struct dev_pm_opp *opp, struct dev_pm_opp_supply *supplies);
112
113unsigned long dev_pm_opp_get_power(struct dev_pm_opp *opp);
114
115unsigned long dev_pm_opp_get_freq_indexed(struct dev_pm_opp *opp, u32 index);
116
117unsigned int dev_pm_opp_get_level(struct dev_pm_opp *opp);
118
119unsigned int dev_pm_opp_get_required_pstate(struct dev_pm_opp *opp,
120					    unsigned int index);
121
122bool dev_pm_opp_is_turbo(struct dev_pm_opp *opp);
123
124int dev_pm_opp_get_opp_count(struct device *dev);
125unsigned long dev_pm_opp_get_max_clock_latency(struct device *dev);
126unsigned long dev_pm_opp_get_max_volt_latency(struct device *dev);
127unsigned long dev_pm_opp_get_max_transition_latency(struct device *dev);
128unsigned long dev_pm_opp_get_suspend_opp_freq(struct device *dev);
129
130struct dev_pm_opp *dev_pm_opp_find_freq_exact(struct device *dev,
131					      unsigned long freq,
132					      bool available);
133
134struct dev_pm_opp *
135dev_pm_opp_find_freq_exact_indexed(struct device *dev, unsigned long freq,
136				   u32 index, bool available);
137
138struct dev_pm_opp *dev_pm_opp_find_freq_floor(struct device *dev,
139					      unsigned long *freq);
140
141struct dev_pm_opp *dev_pm_opp_find_freq_floor_indexed(struct device *dev,
142						      unsigned long *freq, u32 index);
143
144struct dev_pm_opp *dev_pm_opp_find_freq_ceil(struct device *dev,
145					     unsigned long *freq);
146
147struct dev_pm_opp *dev_pm_opp_find_freq_ceil_indexed(struct device *dev,
148						     unsigned long *freq, u32 index);
149
150struct dev_pm_opp *dev_pm_opp_find_level_exact(struct device *dev,
151					       unsigned int level);
152
153struct dev_pm_opp *dev_pm_opp_find_level_ceil(struct device *dev,
154					      unsigned int *level);
155
156struct dev_pm_opp *dev_pm_opp_find_level_floor(struct device *dev,
157					       unsigned int *level);
158
159struct dev_pm_opp *dev_pm_opp_find_bw_ceil(struct device *dev,
160					   unsigned int *bw, int index);
161
162struct dev_pm_opp *dev_pm_opp_find_bw_floor(struct device *dev,
163					   unsigned int *bw, int index);
164
165void dev_pm_opp_put(struct dev_pm_opp *opp);
166
167int dev_pm_opp_add_dynamic(struct device *dev, struct dev_pm_opp_data *opp);
168
169void dev_pm_opp_remove(struct device *dev, unsigned long freq);
170void dev_pm_opp_remove_all_dynamic(struct device *dev);
171
172int dev_pm_opp_adjust_voltage(struct device *dev, unsigned long freq,
173			      unsigned long u_volt, unsigned long u_volt_min,
174			      unsigned long u_volt_max);
175
176int dev_pm_opp_enable(struct device *dev, unsigned long freq);
177
178int dev_pm_opp_disable(struct device *dev, unsigned long freq);
179
180int dev_pm_opp_register_notifier(struct device *dev, struct notifier_block *nb);
181int dev_pm_opp_unregister_notifier(struct device *dev, struct notifier_block *nb);
182
183int dev_pm_opp_set_config(struct device *dev, struct dev_pm_opp_config *config);
184int devm_pm_opp_set_config(struct device *dev, struct dev_pm_opp_config *config);
185void dev_pm_opp_clear_config(int token);
186int dev_pm_opp_config_clks_simple(struct device *dev,
187		struct opp_table *opp_table, struct dev_pm_opp *opp, void *data,
188		bool scaling_down);
189
190struct 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);
191int dev_pm_opp_xlate_performance_state(struct opp_table *src_table, struct opp_table *dst_table, unsigned int pstate);
192int dev_pm_opp_set_rate(struct device *dev, unsigned long target_freq);
193int dev_pm_opp_set_opp(struct device *dev, struct dev_pm_opp *opp);
194int dev_pm_opp_set_sharing_cpus(struct device *cpu_dev, const struct cpumask *cpumask);
195int dev_pm_opp_get_sharing_cpus(struct device *cpu_dev, struct cpumask *cpumask);
196void dev_pm_opp_remove_table(struct device *dev);
197void dev_pm_opp_cpumask_remove_table(const struct cpumask *cpumask);
198int dev_pm_opp_sync_regulators(struct device *dev);
199#else
200static inline struct opp_table *dev_pm_opp_get_opp_table(struct device *dev)
201{
202	return ERR_PTR(-EOPNOTSUPP);
203}
204
205static inline struct opp_table *dev_pm_opp_get_opp_table_indexed(struct device *dev, int index)
206{
207	return ERR_PTR(-EOPNOTSUPP);
208}
209
210static inline void dev_pm_opp_put_opp_table(struct opp_table *opp_table) {}
211
212static inline unsigned long dev_pm_opp_get_voltage(struct dev_pm_opp *opp)
213{
214	return 0;
215}
216
217static inline int dev_pm_opp_get_supplies(struct dev_pm_opp *opp, struct dev_pm_opp_supply *supplies)
218{
219	return -EOPNOTSUPP;
220}
221
222static inline unsigned long dev_pm_opp_get_power(struct dev_pm_opp *opp)
223{
224	return 0;
225}
226
227static inline unsigned long dev_pm_opp_get_freq_indexed(struct dev_pm_opp *opp, u32 index)
228{
229	return 0;
230}
231
232static inline unsigned int dev_pm_opp_get_level(struct dev_pm_opp *opp)
233{
234	return 0;
235}
236
237static inline
238unsigned int dev_pm_opp_get_required_pstate(struct dev_pm_opp *opp,
239					    unsigned int index)
240{
241	return 0;
242}
243
244static inline bool dev_pm_opp_is_turbo(struct dev_pm_opp *opp)
245{
246	return false;
247}
248
249static inline int dev_pm_opp_get_opp_count(struct device *dev)
250{
251	return 0;
252}
253
254static inline unsigned long dev_pm_opp_get_max_clock_latency(struct device *dev)
255{
256	return 0;
257}
258
259static inline unsigned long dev_pm_opp_get_max_volt_latency(struct device *dev)
260{
261	return 0;
262}
263
264static inline unsigned long dev_pm_opp_get_max_transition_latency(struct device *dev)
265{
266	return 0;
267}
268
269static inline unsigned long dev_pm_opp_get_suspend_opp_freq(struct device *dev)
270{
271	return 0;
272}
273
274static inline struct dev_pm_opp *dev_pm_opp_find_freq_exact(struct device *dev,
275					unsigned long freq, bool available)
276{
277	return ERR_PTR(-EOPNOTSUPP);
278}
279
280static inline struct dev_pm_opp *
281dev_pm_opp_find_freq_exact_indexed(struct device *dev, unsigned long freq,
282				   u32 index, bool available)
283{
284	return ERR_PTR(-EOPNOTSUPP);
285}
286
287static inline struct dev_pm_opp *dev_pm_opp_find_freq_floor(struct device *dev,
288					unsigned long *freq)
289{
290	return ERR_PTR(-EOPNOTSUPP);
291}
292
293static inline struct dev_pm_opp *
294dev_pm_opp_find_freq_floor_indexed(struct device *dev, unsigned long *freq, u32 index)
295{
296	return ERR_PTR(-EOPNOTSUPP);
297}
298
299static inline struct dev_pm_opp *dev_pm_opp_find_freq_ceil(struct device *dev,
300					unsigned long *freq)
301{
302	return ERR_PTR(-EOPNOTSUPP);
303}
304
305static inline struct dev_pm_opp *
306dev_pm_opp_find_freq_ceil_indexed(struct device *dev, unsigned long *freq, u32 index)
307{
308	return ERR_PTR(-EOPNOTSUPP);
309}
310
311static inline struct dev_pm_opp *dev_pm_opp_find_level_exact(struct device *dev,
312					unsigned int level)
313{
314	return ERR_PTR(-EOPNOTSUPP);
315}
316
317static inline struct dev_pm_opp *dev_pm_opp_find_level_ceil(struct device *dev,
318					unsigned int *level)
319{
320	return ERR_PTR(-EOPNOTSUPP);
321}
322
323static inline struct dev_pm_opp *dev_pm_opp_find_level_floor(struct device *dev,
324							     unsigned int *level)
325{
326	return ERR_PTR(-EOPNOTSUPP);
327}
328
329static inline struct dev_pm_opp *dev_pm_opp_find_bw_ceil(struct device *dev,
330					unsigned int *bw, int index)
331{
332	return ERR_PTR(-EOPNOTSUPP);
333}
334
335static inline struct dev_pm_opp *dev_pm_opp_find_bw_floor(struct device *dev,
336					unsigned int *bw, int index)
337{
338	return ERR_PTR(-EOPNOTSUPP);
339}
340
341static inline void dev_pm_opp_put(struct dev_pm_opp *opp) {}
342
343static inline int
344dev_pm_opp_add_dynamic(struct device *dev, struct dev_pm_opp_data *opp)
345{
346	return -EOPNOTSUPP;
347}
348
349static inline void dev_pm_opp_remove(struct device *dev, unsigned long freq)
350{
351}
352
353static inline void dev_pm_opp_remove_all_dynamic(struct device *dev)
354{
355}
356
357static inline int
358dev_pm_opp_adjust_voltage(struct device *dev, unsigned long freq,
359			  unsigned long u_volt, unsigned long u_volt_min,
360			  unsigned long u_volt_max)
361{
362	return 0;
363}
364
365static inline int dev_pm_opp_enable(struct device *dev, unsigned long freq)
366{
367	return 0;
368}
369
370static inline int dev_pm_opp_disable(struct device *dev, unsigned long freq)
371{
372	return 0;
373}
374
375static inline int dev_pm_opp_register_notifier(struct device *dev, struct notifier_block *nb)
376{
377	return -EOPNOTSUPP;
378}
379
380static inline int dev_pm_opp_unregister_notifier(struct device *dev, struct notifier_block *nb)
381{
382	return -EOPNOTSUPP;
383}
384
385static inline int dev_pm_opp_set_config(struct device *dev, struct dev_pm_opp_config *config)
386{
387	return -EOPNOTSUPP;
388}
389
390static inline int devm_pm_opp_set_config(struct device *dev, struct dev_pm_opp_config *config)
391{
392	return -EOPNOTSUPP;
393}
394
395static inline void dev_pm_opp_clear_config(int token) {}
396
397static inline int dev_pm_opp_config_clks_simple(struct device *dev,
398		struct opp_table *opp_table, struct dev_pm_opp *opp, void *data,
399		bool scaling_down)
400{
401	return -EOPNOTSUPP;
402}
403
404static inline struct dev_pm_opp *dev_pm_opp_xlate_required_opp(struct opp_table *src_table,
405				struct opp_table *dst_table, struct dev_pm_opp *src_opp)
406{
407	return ERR_PTR(-EOPNOTSUPP);
408}
409
410static inline int dev_pm_opp_xlate_performance_state(struct opp_table *src_table, struct opp_table *dst_table, unsigned int pstate)
411{
412	return -EOPNOTSUPP;
413}
414
415static inline int dev_pm_opp_set_rate(struct device *dev, unsigned long target_freq)
416{
417	return -EOPNOTSUPP;
418}
419
420static inline int dev_pm_opp_set_opp(struct device *dev, struct dev_pm_opp *opp)
421{
422	return -EOPNOTSUPP;
423}
424
425static inline int dev_pm_opp_set_sharing_cpus(struct device *cpu_dev, const struct cpumask *cpumask)
426{
427	return -EOPNOTSUPP;
428}
429
430static inline int dev_pm_opp_get_sharing_cpus(struct device *cpu_dev, struct cpumask *cpumask)
431{
432	return -EINVAL;
433}
434
435static inline void dev_pm_opp_remove_table(struct device *dev)
436{
437}
438
439static inline void dev_pm_opp_cpumask_remove_table(const struct cpumask *cpumask)
440{
441}
442
443static inline int dev_pm_opp_sync_regulators(struct device *dev)
444{
445	return -EOPNOTSUPP;
446}
447
448#endif		/* CONFIG_PM_OPP */
449
450#if defined(CONFIG_CPU_FREQ) && defined(CONFIG_PM_OPP)
451int dev_pm_opp_init_cpufreq_table(struct device *dev, struct cpufreq_frequency_table **table);
452void dev_pm_opp_free_cpufreq_table(struct device *dev, struct cpufreq_frequency_table **table);
453#else
454static inline int dev_pm_opp_init_cpufreq_table(struct device *dev, struct cpufreq_frequency_table **table)
455{
456	return -EINVAL;
457}
458
459static inline void dev_pm_opp_free_cpufreq_table(struct device *dev, struct cpufreq_frequency_table **table)
460{
461}
462#endif
463
464
465#if defined(CONFIG_PM_OPP) && defined(CONFIG_OF)
466int dev_pm_opp_of_add_table(struct device *dev);
467int dev_pm_opp_of_add_table_indexed(struct device *dev, int index);
468int devm_pm_opp_of_add_table_indexed(struct device *dev, int index);
469void dev_pm_opp_of_remove_table(struct device *dev);
470int devm_pm_opp_of_add_table(struct device *dev);
471int dev_pm_opp_of_cpumask_add_table(const struct cpumask *cpumask);
472void dev_pm_opp_of_cpumask_remove_table(const struct cpumask *cpumask);
473int dev_pm_opp_of_get_sharing_cpus(struct device *cpu_dev, struct cpumask *cpumask);
474struct device_node *dev_pm_opp_of_get_opp_desc_node(struct device *dev);
475struct device_node *dev_pm_opp_get_of_node(struct dev_pm_opp *opp);
476int of_get_required_opp_performance_state(struct device_node *np, int index);
477int dev_pm_opp_of_find_icc_paths(struct device *dev, struct opp_table *opp_table);
478int dev_pm_opp_of_register_em(struct device *dev, struct cpumask *cpus);
479static inline void dev_pm_opp_of_unregister_em(struct device *dev)
480{
481	em_dev_unregister_perf_domain(dev);
482}
483#else
484static inline int dev_pm_opp_of_add_table(struct device *dev)
485{
486	return -EOPNOTSUPP;
487}
488
489static inline int dev_pm_opp_of_add_table_indexed(struct device *dev, int index)
490{
491	return -EOPNOTSUPP;
492}
493
494static inline int devm_pm_opp_of_add_table_indexed(struct device *dev, int index)
495{
496	return -EOPNOTSUPP;
497}
498
499static inline void dev_pm_opp_of_remove_table(struct device *dev)
500{
501}
502
503static inline int devm_pm_opp_of_add_table(struct device *dev)
504{
505	return -EOPNOTSUPP;
506}
507
508static inline int dev_pm_opp_of_cpumask_add_table(const struct cpumask *cpumask)
509{
510	return -EOPNOTSUPP;
511}
512
513static inline void dev_pm_opp_of_cpumask_remove_table(const struct cpumask *cpumask)
514{
515}
516
517static inline int dev_pm_opp_of_get_sharing_cpus(struct device *cpu_dev, struct cpumask *cpumask)
518{
519	return -EOPNOTSUPP;
520}
521
522static inline struct device_node *dev_pm_opp_of_get_opp_desc_node(struct device *dev)
523{
524	return NULL;
525}
526
527static inline struct device_node *dev_pm_opp_get_of_node(struct dev_pm_opp *opp)
528{
529	return NULL;
530}
531
532static inline int dev_pm_opp_of_register_em(struct device *dev,
533					    struct cpumask *cpus)
534{
535	return -EOPNOTSUPP;
536}
537
538static inline void dev_pm_opp_of_unregister_em(struct device *dev)
539{
540}
541
542static inline int of_get_required_opp_performance_state(struct device_node *np, int index)
543{
544	return -EOPNOTSUPP;
545}
546
547static inline int dev_pm_opp_of_find_icc_paths(struct device *dev, struct opp_table *opp_table)
548{
549	return -EOPNOTSUPP;
550}
551#endif
552
553/* OPP Configuration helpers */
554
555static inline int dev_pm_opp_add(struct device *dev, unsigned long freq,
556				 unsigned long u_volt)
557{
558	struct dev_pm_opp_data data = {
559		.freq = freq,
560		.u_volt = u_volt,
561	};
562
563	return dev_pm_opp_add_dynamic(dev, &data);
564}
565
566/* Regulators helpers */
567static inline int dev_pm_opp_set_regulators(struct device *dev,
568					    const char * const names[])
569{
570	struct dev_pm_opp_config config = {
571		.regulator_names = names,
572	};
573
574	return dev_pm_opp_set_config(dev, &config);
575}
576
577static inline void dev_pm_opp_put_regulators(int token)
578{
579	dev_pm_opp_clear_config(token);
580}
581
582static inline int devm_pm_opp_set_regulators(struct device *dev,
583					     const char * const names[])
584{
585	struct dev_pm_opp_config config = {
586		.regulator_names = names,
587	};
588
589	return devm_pm_opp_set_config(dev, &config);
590}
591
592/* Supported-hw helpers */
593static inline int dev_pm_opp_set_supported_hw(struct device *dev,
594					      const u32 *versions,
595					      unsigned int count)
596{
597	struct dev_pm_opp_config config = {
598		.supported_hw = versions,
599		.supported_hw_count = count,
600	};
601
602	return dev_pm_opp_set_config(dev, &config);
603}
604
605static inline void dev_pm_opp_put_supported_hw(int token)
606{
607	dev_pm_opp_clear_config(token);
608}
609
610static inline int devm_pm_opp_set_supported_hw(struct device *dev,
611					       const u32 *versions,
612					       unsigned int count)
613{
614	struct dev_pm_opp_config config = {
615		.supported_hw = versions,
616		.supported_hw_count = count,
617	};
618
619	return devm_pm_opp_set_config(dev, &config);
620}
621
622/* clkname helpers */
623static inline int dev_pm_opp_set_clkname(struct device *dev, const char *name)
624{
625	const char *names[] = { name, NULL };
626	struct dev_pm_opp_config config = {
627		.clk_names = names,
628	};
629
630	return dev_pm_opp_set_config(dev, &config);
631}
632
633static inline void dev_pm_opp_put_clkname(int token)
634{
635	dev_pm_opp_clear_config(token);
636}
637
638static inline int devm_pm_opp_set_clkname(struct device *dev, const char *name)
639{
640	const char *names[] = { name, NULL };
641	struct dev_pm_opp_config config = {
642		.clk_names = names,
643	};
644
645	return devm_pm_opp_set_config(dev, &config);
646}
647
648/* config-regulators helpers */
649static inline int dev_pm_opp_set_config_regulators(struct device *dev,
650						   config_regulators_t helper)
651{
652	struct dev_pm_opp_config config = {
653		.config_regulators = helper,
654	};
655
656	return dev_pm_opp_set_config(dev, &config);
657}
658
659static inline void dev_pm_opp_put_config_regulators(int token)
660{
661	dev_pm_opp_clear_config(token);
662}
663
664/* genpd helpers */
665static inline int dev_pm_opp_attach_genpd(struct device *dev,
666					  const char * const *names,
667					  struct device ***virt_devs)
668{
669	struct dev_pm_opp_config config = {
670		.genpd_names = names,
671		.virt_devs = virt_devs,
672	};
673
674	return dev_pm_opp_set_config(dev, &config);
675}
676
677static inline void dev_pm_opp_detach_genpd(int token)
678{
679	dev_pm_opp_clear_config(token);
680}
681
682static inline int devm_pm_opp_attach_genpd(struct device *dev,
683					   const char * const *names,
684					   struct device ***virt_devs)
685{
686	struct dev_pm_opp_config config = {
687		.genpd_names = names,
688		.virt_devs = virt_devs,
689	};
690
691	return devm_pm_opp_set_config(dev, &config);
692}
693
694/* prop-name helpers */
695static inline int dev_pm_opp_set_prop_name(struct device *dev, const char *name)
696{
697	struct dev_pm_opp_config config = {
698		.prop_name = name,
699	};
700
701	return dev_pm_opp_set_config(dev, &config);
702}
703
704static inline void dev_pm_opp_put_prop_name(int token)
705{
706	dev_pm_opp_clear_config(token);
707}
708
709static inline unsigned long dev_pm_opp_get_freq(struct dev_pm_opp *opp)
710{
711	return dev_pm_opp_get_freq_indexed(opp, 0);
712}
713
714#endif		/* __LINUX_OPP_H__ */
715