blob: 31b4174e7a5bfa1b47fd2d9e0e5da6240a305acf [file] [log] [blame]
Thomas Abraham721c42a2013-03-09 17:02:44 +09001/*
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>
Yadwinder Singh Brar07dc76f2013-06-11 15:01:07 +053022#include "clk-pll.h"
Thomas Abraham721c42a2013-03-09 17:02:44 +090023
Thomas Abraham721c42a2013-03-09 17:02:44 +090024/**
Heiko Stuebner5e2e0192013-03-18 13:43:56 +090025 * 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 */
30struct 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
Vikas Sajjand2127ac2013-06-11 15:01:16 +053043#define MHZ (1000 * 1000)
44
Heiko Stuebner5e2e0192013-03-18 13:43:56 +090045/**
Thomas Abraham721c42a2013-03-09 17:02:44 +090046 * 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 */
53struct 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 */
79struct 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 */
112struct 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), \
James Hogan819c1de2013-07-29 12:25:01 +0100133 .flags = (f) | CLK_SET_RATE_NO_REPARENT, \
Thomas Abraham721c42a2013-03-09 17:02:44 +0900134 .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
Tushar Behera41ccf7f2013-06-20 16:17:17 +0530150#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
Thomas Abraham721c42a2013-03-09 17:02:44 +0900153/**
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 */
165struct 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;
Heiko Stuebner798ed612013-03-18 13:43:52 +0900176 struct clk_div_table *table;
Thomas Abraham721c42a2013-03-09 17:02:44 +0900177};
178
Heiko Stuebner798ed612013-03-18 13:43:52 +0900179#define __DIV(_id, dname, cname, pname, o, s, w, f, df, a, t) \
Thomas Abraham721c42a2013-03-09 17:02:44 +0900180 { \
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, \
Heiko Stuebner798ed612013-03-18 13:43:52 +0900191 .table = t, \
Thomas Abraham721c42a2013-03-09 17:02:44 +0900192 }
193
194#define DIV(_id, cname, pname, o, s, w) \
Heiko Stuebner798ed612013-03-18 13:43:52 +0900195 __DIV(_id, NULL, cname, pname, o, s, w, 0, 0, NULL, NULL)
Thomas Abraham721c42a2013-03-09 17:02:44 +0900196
197#define DIV_A(_id, cname, pname, o, s, w, a) \
Heiko Stuebner798ed612013-03-18 13:43:52 +0900198 __DIV(_id, NULL, cname, pname, o, s, w, 0, 0, a, NULL)
Thomas Abraham721c42a2013-03-09 17:02:44 +0900199
200#define DIV_F(_id, cname, pname, o, s, w, f, df) \
Heiko Stuebner798ed612013-03-18 13:43:52 +0900201 __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)
Thomas Abraham721c42a2013-03-09 17:02:44 +0900205
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 */
218struct 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 */
262struct samsung_clk_reg_dump {
263 u32 offset;
264 u32 value;
265};
266
Yadwinder Singh Brar07dc76f2013-06-11 15:01:07 +0530267/**
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 */
279struct 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;
Yadwinder Singh Brar3ff6e0d2013-06-11 15:01:12 +0530288 const struct samsung_pll_rate_table *rate_table;
Yadwinder Singh Brar07dc76f2013-06-11 15:01:07 +0530289 const char *alias;
290};
291
Yadwinder Singh Brar3ff6e0d2013-06-11 15:01:12 +0530292#define __PLL(_typ, _id, _dname, _name, _pname, _flags, _lock, _con, \
293 _rtable, _alias) \
Yadwinder Singh Brar07dc76f2013-06-11 15:01:07 +0530294 { \
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, \
Yadwinder Singh Brar3ff6e0d2013-06-11 15:01:12 +0530303 .rate_table = _rtable, \
Yadwinder Singh Brar07dc76f2013-06-11 15:01:07 +0530304 .alias = _alias, \
305 }
306
Yadwinder Singh Brar3ff6e0d2013-06-11 15:01:12 +0530307#define PLL(_typ, _id, _name, _pname, _lock, _con, _rtable) \
Yadwinder Singh Brar07dc76f2013-06-11 15:01:07 +0530308 __PLL(_typ, _id, NULL, _name, _pname, CLK_GET_RATE_NOCACHE, \
Yadwinder Singh Brar3ff6e0d2013-06-11 15:01:12 +0530309 _lock, _con, _rtable, _name)
Yadwinder Singh Brar07dc76f2013-06-11 15:01:07 +0530310
Yadwinder Singh Brar3ff6e0d2013-06-11 15:01:12 +0530311#define PLL_A(_typ, _id, _name, _pname, _lock, _con, _alias, _rtable) \
Yadwinder Singh Brar07dc76f2013-06-11 15:01:07 +0530312 __PLL(_typ, _id, NULL, _name, _pname, CLK_GET_RATE_NOCACHE, \
Yadwinder Singh Brar3ff6e0d2013-06-11 15:01:12 +0530313 _lock, _con, _rtable, _alias)
Yadwinder Singh Brar07dc76f2013-06-11 15:01:07 +0530314
Thomas Abraham721c42a2013-03-09 17:02:44 +0900315extern void __init samsung_clk_init(struct device_node *np, void __iomem *base,
316 unsigned long nr_clks, unsigned long *rdump,
Tomasz Figa6b5756e2013-04-04 13:35:35 +0900317 unsigned long nr_rdump, unsigned long *soc_rdump,
318 unsigned long nr_soc_rdump);
Thomas Abraham721c42a2013-03-09 17:02:44 +0900319extern 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
324extern void samsung_clk_add_lookup(struct clk *clk, unsigned int id);
325
Heiko Stuebner5e2e0192013-03-18 13:43:56 +0900326extern void samsung_clk_register_alias(struct samsung_clock_alias *list,
327 unsigned int nr_clk);
Thomas Abraham721c42a2013-03-09 17:02:44 +0900328extern void __init samsung_clk_register_fixed_rate(
329 struct samsung_fixed_rate_clock *clk_list, unsigned int nr_clk);
330extern void __init samsung_clk_register_fixed_factor(
331 struct samsung_fixed_factor_clock *list, unsigned int nr_clk);
332extern void __init samsung_clk_register_mux(struct samsung_mux_clock *clk_list,
333 unsigned int nr_clk);
334extern void __init samsung_clk_register_div(struct samsung_div_clock *clk_list,
335 unsigned int nr_clk);
336extern void __init samsung_clk_register_gate(
337 struct samsung_gate_clock *clk_list, unsigned int nr_clk);
Yadwinder Singh Brar07dc76f2013-06-11 15:01:07 +0530338extern void __init samsung_clk_register_pll(struct samsung_pll_clock *pll_list,
339 unsigned int nr_clk, void __iomem *base);
Thomas Abraham721c42a2013-03-09 17:02:44 +0900340
341extern unsigned long _get_rate(const char *clk_name);
342
343#endif /* __SAMSUNG_CLK_H */