Merge branch 'x86-intel-mid-for-linus' of git://git.kernel.org/pub/scm/linux/kernel...
[deliverable/linux.git] / drivers / clk / samsung / clk.h
1 /*
2 * Copyright (c) 2013 Samsung Electronics Co., Ltd.
3 * Copyright (c) 2013 Linaro Ltd.
4 * Author: Thomas Abraham <thomas.ab@samsung.com>
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License version 2 as
8 * published by the Free Software Foundation.
9 *
10 * Common Clock Framework support for all Samsung platforms
11 */
12
13 #ifndef __SAMSUNG_CLK_H
14 #define __SAMSUNG_CLK_H
15
16 #include <linux/clk.h>
17 #include <linux/clkdev.h>
18 #include <linux/io.h>
19 #include <linux/clk-provider.h>
20 #include <linux/of.h>
21 #include <linux/of_address.h>
22 #include "clk-pll.h"
23
24 /**
25 * struct samsung_clock_alias: information about mux clock
26 * @id: platform specific id of the clock.
27 * @dev_name: name of the device to which this clock belongs.
28 * @alias: optional clock alias name to be assigned to this clock.
29 */
30 struct samsung_clock_alias {
31 unsigned int id;
32 const char *dev_name;
33 const char *alias;
34 };
35
36 #define ALIAS(_id, dname, a) \
37 { \
38 .id = _id, \
39 .dev_name = dname, \
40 .alias = a, \
41 }
42
43 #define MHZ (1000 * 1000)
44
45 /**
46 * struct samsung_fixed_rate_clock: information about fixed-rate clock
47 * @id: platform specific id of the clock.
48 * @name: name of this fixed-rate clock.
49 * @parent_name: optional parent clock name.
50 * @flags: optional fixed-rate clock flags.
51 * @fixed-rate: fixed clock rate of this clock.
52 */
53 struct samsung_fixed_rate_clock {
54 unsigned int id;
55 char *name;
56 const char *parent_name;
57 unsigned long flags;
58 unsigned long fixed_rate;
59 };
60
61 #define FRATE(_id, cname, pname, f, frate) \
62 { \
63 .id = _id, \
64 .name = cname, \
65 .parent_name = pname, \
66 .flags = f, \
67 .fixed_rate = frate, \
68 }
69
70 /*
71 * struct samsung_fixed_factor_clock: information about fixed-factor clock
72 * @id: platform specific id of the clock.
73 * @name: name of this fixed-factor clock.
74 * @parent_name: parent clock name.
75 * @mult: fixed multiplication factor.
76 * @div: fixed division factor.
77 * @flags: optional fixed-factor clock flags.
78 */
79 struct samsung_fixed_factor_clock {
80 unsigned int id;
81 char *name;
82 const char *parent_name;
83 unsigned long mult;
84 unsigned long div;
85 unsigned long flags;
86 };
87
88 #define FFACTOR(_id, cname, pname, m, d, f) \
89 { \
90 .id = _id, \
91 .name = cname, \
92 .parent_name = pname, \
93 .mult = m, \
94 .div = d, \
95 .flags = f, \
96 }
97
98 /**
99 * struct samsung_mux_clock: information about mux clock
100 * @id: platform specific id of the clock.
101 * @dev_name: name of the device to which this clock belongs.
102 * @name: name of this mux clock.
103 * @parent_names: array of pointer to parent clock names.
104 * @num_parents: number of parents listed in @parent_names.
105 * @flags: optional flags for basic clock.
106 * @offset: offset of the register for configuring the mux.
107 * @shift: starting bit location of the mux control bit-field in @reg.
108 * @width: width of the mux control bit-field in @reg.
109 * @mux_flags: flags for mux-type clock.
110 * @alias: optional clock alias name to be assigned to this clock.
111 */
112 struct samsung_mux_clock {
113 unsigned int id;
114 const char *dev_name;
115 const char *name;
116 const char **parent_names;
117 u8 num_parents;
118 unsigned long flags;
119 unsigned long offset;
120 u8 shift;
121 u8 width;
122 u8 mux_flags;
123 const char *alias;
124 };
125
126 #define __MUX(_id, dname, cname, pnames, o, s, w, f, mf, a) \
127 { \
128 .id = _id, \
129 .dev_name = dname, \
130 .name = cname, \
131 .parent_names = pnames, \
132 .num_parents = ARRAY_SIZE(pnames), \
133 .flags = (f) | CLK_SET_RATE_NO_REPARENT, \
134 .offset = o, \
135 .shift = s, \
136 .width = w, \
137 .mux_flags = mf, \
138 .alias = a, \
139 }
140
141 #define MUX(_id, cname, pnames, o, s, w) \
142 __MUX(_id, NULL, cname, pnames, o, s, w, 0, 0, NULL)
143
144 #define MUX_A(_id, cname, pnames, o, s, w, a) \
145 __MUX(_id, NULL, cname, pnames, o, s, w, 0, 0, a)
146
147 #define MUX_F(_id, cname, pnames, o, s, w, f, mf) \
148 __MUX(_id, NULL, cname, pnames, o, s, w, f, mf, NULL)
149
150 #define MUX_FA(_id, cname, pnames, o, s, w, f, mf, a) \
151 __MUX(_id, NULL, cname, pnames, o, s, w, f, mf, a)
152
153 /**
154 * @id: platform specific id of the clock.
155 * struct samsung_div_clock: information about div clock
156 * @dev_name: name of the device to which this clock belongs.
157 * @name: name of this div clock.
158 * @parent_name: name of the parent clock.
159 * @flags: optional flags for basic clock.
160 * @offset: offset of the register for configuring the div.
161 * @shift: starting bit location of the div control bit-field in @reg.
162 * @div_flags: flags for div-type clock.
163 * @alias: optional clock alias name to be assigned to this clock.
164 */
165 struct samsung_div_clock {
166 unsigned int id;
167 const char *dev_name;
168 const char *name;
169 const char *parent_name;
170 unsigned long flags;
171 unsigned long offset;
172 u8 shift;
173 u8 width;
174 u8 div_flags;
175 const char *alias;
176 struct clk_div_table *table;
177 };
178
179 #define __DIV(_id, dname, cname, pname, o, s, w, f, df, a, t) \
180 { \
181 .id = _id, \
182 .dev_name = dname, \
183 .name = cname, \
184 .parent_name = pname, \
185 .flags = f, \
186 .offset = o, \
187 .shift = s, \
188 .width = w, \
189 .div_flags = df, \
190 .alias = a, \
191 .table = t, \
192 }
193
194 #define DIV(_id, cname, pname, o, s, w) \
195 __DIV(_id, NULL, cname, pname, o, s, w, 0, 0, NULL, NULL)
196
197 #define DIV_A(_id, cname, pname, o, s, w, a) \
198 __DIV(_id, NULL, cname, pname, o, s, w, 0, 0, a, NULL)
199
200 #define DIV_F(_id, cname, pname, o, s, w, f, df) \
201 __DIV(_id, NULL, cname, pname, o, s, w, f, df, NULL, NULL)
202
203 #define DIV_T(_id, cname, pname, o, s, w, t) \
204 __DIV(_id, NULL, cname, pname, o, s, w, 0, 0, NULL, t)
205
206 /**
207 * struct samsung_gate_clock: information about gate clock
208 * @id: platform specific id of the clock.
209 * @dev_name: name of the device to which this clock belongs.
210 * @name: name of this gate clock.
211 * @parent_name: name of the parent clock.
212 * @flags: optional flags for basic clock.
213 * @offset: offset of the register for configuring the gate.
214 * @bit_idx: bit index of the gate control bit-field in @reg.
215 * @gate_flags: flags for gate-type clock.
216 * @alias: optional clock alias name to be assigned to this clock.
217 */
218 struct samsung_gate_clock {
219 unsigned int id;
220 const char *dev_name;
221 const char *name;
222 const char *parent_name;
223 unsigned long flags;
224 unsigned long offset;
225 u8 bit_idx;
226 u8 gate_flags;
227 const char *alias;
228 };
229
230 #define __GATE(_id, dname, cname, pname, o, b, f, gf, a) \
231 { \
232 .id = _id, \
233 .dev_name = dname, \
234 .name = cname, \
235 .parent_name = pname, \
236 .flags = f, \
237 .offset = o, \
238 .bit_idx = b, \
239 .gate_flags = gf, \
240 .alias = a, \
241 }
242
243 #define GATE(_id, cname, pname, o, b, f, gf) \
244 __GATE(_id, NULL, cname, pname, o, b, f, gf, NULL)
245
246 #define GATE_A(_id, cname, pname, o, b, f, gf, a) \
247 __GATE(_id, NULL, cname, pname, o, b, f, gf, a)
248
249 #define GATE_D(_id, dname, cname, pname, o, b, f, gf) \
250 __GATE(_id, dname, cname, pname, o, b, f, gf, NULL)
251
252 #define GATE_DA(_id, dname, cname, pname, o, b, f, gf, a) \
253 __GATE(_id, dname, cname, pname, o, b, f, gf, a)
254
255 #define PNAME(x) static const char *x[] __initdata
256
257 /**
258 * struct samsung_clk_reg_dump: register dump of clock controller registers.
259 * @offset: clock register offset from the controller base address.
260 * @value: the value to be register at offset.
261 */
262 struct samsung_clk_reg_dump {
263 u32 offset;
264 u32 value;
265 };
266
267 /**
268 * struct samsung_pll_clock: information about pll clock
269 * @id: platform specific id of the clock.
270 * @dev_name: name of the device to which this clock belongs.
271 * @name: name of this pll clock.
272 * @parent_name: name of the parent clock.
273 * @flags: optional flags for basic clock.
274 * @con_offset: offset of the register for configuring the PLL.
275 * @lock_offset: offset of the register for locking the PLL.
276 * @type: Type of PLL to be registered.
277 * @alias: optional clock alias name to be assigned to this clock.
278 */
279 struct samsung_pll_clock {
280 unsigned int id;
281 const char *dev_name;
282 const char *name;
283 const char *parent_name;
284 unsigned long flags;
285 int con_offset;
286 int lock_offset;
287 enum samsung_pll_type type;
288 const struct samsung_pll_rate_table *rate_table;
289 const char *alias;
290 };
291
292 #define __PLL(_typ, _id, _dname, _name, _pname, _flags, _lock, _con, \
293 _rtable, _alias) \
294 { \
295 .id = _id, \
296 .type = _typ, \
297 .dev_name = _dname, \
298 .name = _name, \
299 .parent_name = _pname, \
300 .flags = CLK_GET_RATE_NOCACHE, \
301 .con_offset = _con, \
302 .lock_offset = _lock, \
303 .rate_table = _rtable, \
304 .alias = _alias, \
305 }
306
307 #define PLL(_typ, _id, _name, _pname, _lock, _con, _rtable) \
308 __PLL(_typ, _id, NULL, _name, _pname, CLK_GET_RATE_NOCACHE, \
309 _lock, _con, _rtable, _name)
310
311 #define PLL_A(_typ, _id, _name, _pname, _lock, _con, _alias, _rtable) \
312 __PLL(_typ, _id, NULL, _name, _pname, CLK_GET_RATE_NOCACHE, \
313 _lock, _con, _rtable, _alias)
314
315 extern void __init samsung_clk_init(struct device_node *np, void __iomem *base,
316 unsigned long nr_clks, unsigned long *rdump,
317 unsigned long nr_rdump, unsigned long *soc_rdump,
318 unsigned long nr_soc_rdump);
319 extern void __init samsung_clk_of_register_fixed_ext(
320 struct samsung_fixed_rate_clock *fixed_rate_clk,
321 unsigned int nr_fixed_rate_clk,
322 struct of_device_id *clk_matches);
323
324 extern void samsung_clk_add_lookup(struct clk *clk, unsigned int id);
325
326 extern void samsung_clk_register_alias(struct samsung_clock_alias *list,
327 unsigned int nr_clk);
328 extern void __init samsung_clk_register_fixed_rate(
329 struct samsung_fixed_rate_clock *clk_list, unsigned int nr_clk);
330 extern void __init samsung_clk_register_fixed_factor(
331 struct samsung_fixed_factor_clock *list, unsigned int nr_clk);
332 extern void __init samsung_clk_register_mux(struct samsung_mux_clock *clk_list,
333 unsigned int nr_clk);
334 extern void __init samsung_clk_register_div(struct samsung_div_clock *clk_list,
335 unsigned int nr_clk);
336 extern void __init samsung_clk_register_gate(
337 struct samsung_gate_clock *clk_list, unsigned int nr_clk);
338 extern void __init samsung_clk_register_pll(struct samsung_pll_clock *pll_list,
339 unsigned int nr_clk, void __iomem *base);
340
341 extern unsigned long _get_rate(const char *clk_name);
342
343 #endif /* __SAMSUNG_CLK_H */
This page took 0.03856 seconds and 5 git commands to generate.