1
2
3
4
5
6
7
8
9
10
11#ifndef __DRIVER_OPP_H__
12#define __DRIVER_OPP_H__
13
14#include <linux/device.h>
15#include <linux/kernel.h>
16#include <linux/kref.h>
17#include <linux/list.h>
18#include <linux/limits.h>
19#include <linux/pm_opp.h>
20#include <linux/notifier.h>
21
22struct clk;
23struct regulator;
24
25
26extern struct mutex opp_table_lock;
27
28extern struct list_head opp_tables;
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71struct dev_pm_opp {
72 struct list_head node;
73 struct kref kref;
74
75 bool available;
76 bool dynamic;
77 bool turbo;
78 bool suspend;
79 unsigned int pstate;
80 unsigned long rate;
81 unsigned int level;
82
83 struct dev_pm_opp_supply *supplies;
84
85 unsigned long clock_latency_ns;
86
87 struct dev_pm_opp **required_opps;
88 struct opp_table *opp_table;
89
90 struct device_node *np;
91
92#ifdef CONFIG_DEBUG_FS
93 struct dentry *dentry;
94#endif
95};
96
97
98
99
100
101
102
103
104
105
106struct opp_device {
107 struct list_head node;
108 const struct device *dev;
109
110#ifdef CONFIG_DEBUG_FS
111 struct dentry *dentry;
112#endif
113};
114
115enum opp_table_access {
116 OPP_TABLE_ACCESS_UNKNOWN = 0,
117 OPP_TABLE_ACCESS_EXCLUSIVE = 1,
118 OPP_TABLE_ACCESS_SHARED = 2,
119};
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162struct opp_table {
163 struct list_head node;
164
165 struct blocking_notifier_head head;
166 struct list_head dev_list;
167 struct list_head opp_list;
168 struct kref kref;
169 struct mutex lock;
170
171 struct device_node *np;
172 unsigned long clock_latency_ns_max;
173
174
175 unsigned int voltage_tolerance_v1;
176
177 unsigned int parsed_static_opps;
178 enum opp_table_access shared_opp;
179 struct dev_pm_opp *suspend_opp;
180
181 struct mutex genpd_virt_dev_lock;
182 struct device **genpd_virt_devs;
183 struct opp_table **required_opp_tables;
184 unsigned int required_opp_count;
185
186 unsigned int *supported_hw;
187 unsigned int supported_hw_count;
188 const char *prop_name;
189 struct clk *clk;
190 struct regulator **regulators;
191 int regulator_count;
192 bool genpd_performance_state;
193 bool is_genpd;
194
195 int (*set_opp)(struct dev_pm_set_opp_data *data);
196 struct dev_pm_set_opp_data *set_opp_data;
197
198#ifdef CONFIG_DEBUG_FS
199 struct dentry *dentry;
200 char dentry_name[NAME_MAX];
201#endif
202};
203
204
205void dev_pm_opp_get(struct dev_pm_opp *opp);
206void _opp_remove_all_static(struct opp_table *opp_table);
207void _get_opp_table_kref(struct opp_table *opp_table);
208int _get_opp_count(struct opp_table *opp_table);
209struct opp_table *_find_opp_table(struct device *dev);
210struct opp_device *_add_opp_dev(const struct device *dev, struct opp_table *opp_table);
211void _dev_pm_opp_find_and_remove_table(struct device *dev);
212struct dev_pm_opp *_opp_allocate(struct opp_table *opp_table);
213void _opp_free(struct dev_pm_opp *opp);
214int _opp_add(struct device *dev, struct dev_pm_opp *new_opp, struct opp_table *opp_table, bool rate_not_available);
215int _opp_add_v1(struct opp_table *opp_table, struct device *dev, unsigned long freq, long u_volt, bool dynamic);
216void _dev_pm_opp_cpumask_remove_table(const struct cpumask *cpumask, int last_cpu);
217struct opp_table *_add_opp_table(struct device *dev);
218void _put_opp_list_kref(struct opp_table *opp_table);
219
220#ifdef CONFIG_OF
221void _of_init_opp_table(struct opp_table *opp_table, struct device *dev, int index);
222void _of_clear_opp_table(struct opp_table *opp_table);
223struct opp_table *_managed_opp(struct device *dev, int index);
224void _of_opp_free_required_opps(struct opp_table *opp_table,
225 struct dev_pm_opp *opp);
226#else
227static inline void _of_init_opp_table(struct opp_table *opp_table, struct device *dev, int index) {}
228static inline void _of_clear_opp_table(struct opp_table *opp_table) {}
229static inline struct opp_table *_managed_opp(struct device *dev, int index) { return NULL; }
230static inline void _of_opp_free_required_opps(struct opp_table *opp_table,
231 struct dev_pm_opp *opp) {}
232#endif
233
234#ifdef CONFIG_DEBUG_FS
235void opp_debug_remove_one(struct dev_pm_opp *opp);
236void opp_debug_create_one(struct dev_pm_opp *opp, struct opp_table *opp_table);
237void opp_debug_register(struct opp_device *opp_dev, struct opp_table *opp_table);
238void opp_debug_unregister(struct opp_device *opp_dev, struct opp_table *opp_table);
239#else
240static inline void opp_debug_remove_one(struct dev_pm_opp *opp) {}
241
242static inline void opp_debug_create_one(struct dev_pm_opp *opp,
243 struct opp_table *opp_table) { }
244
245static inline void opp_debug_register(struct opp_device *opp_dev,
246 struct opp_table *opp_table) { }
247
248static inline void opp_debug_unregister(struct opp_device *opp_dev,
249 struct opp_table *opp_table)
250{ }
251#endif
252
253#endif
254