xref: /openbmc/linux/drivers/clk/samsung/clk.h (revision 9cfc5c90)
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-provider.h>
17 #include "clk-pll.h"
18 
19 struct clk;
20 
21 /**
22  * struct samsung_clk_provider: information about clock provider
23  * @reg_base: virtual address for the register base.
24  * @clk_data: holds clock related data like clk* and number of clocks.
25  * @lock: maintains exclusion between callbacks for a given clock-provider.
26  */
27 struct samsung_clk_provider {
28 	void __iomem *reg_base;
29 	struct clk_onecell_data clk_data;
30 	spinlock_t lock;
31 };
32 
33 /**
34  * struct samsung_clock_alias: information about mux clock
35  * @id: platform specific id of the clock.
36  * @dev_name: name of the device to which this clock belongs.
37  * @alias: optional clock alias name to be assigned to this clock.
38  */
39 struct samsung_clock_alias {
40 	unsigned int		id;
41 	const char		*dev_name;
42 	const char		*alias;
43 };
44 
45 #define ALIAS(_id, dname, a)	\
46 	{							\
47 		.id		= _id,				\
48 		.dev_name	= dname,			\
49 		.alias		= a,				\
50 	}
51 
52 #define MHZ (1000 * 1000)
53 
54 /**
55  * struct samsung_fixed_rate_clock: information about fixed-rate clock
56  * @id: platform specific id of the clock.
57  * @name: name of this fixed-rate clock.
58  * @parent_name: optional parent clock name.
59  * @flags: optional fixed-rate clock flags.
60  * @fixed-rate: fixed clock rate of this clock.
61  */
62 struct samsung_fixed_rate_clock {
63 	unsigned int		id;
64 	char			*name;
65 	const char		*parent_name;
66 	unsigned long		flags;
67 	unsigned long		fixed_rate;
68 };
69 
70 #define FRATE(_id, cname, pname, f, frate)		\
71 	{						\
72 		.id		= _id,			\
73 		.name		= cname,		\
74 		.parent_name	= pname,		\
75 		.flags		= f,			\
76 		.fixed_rate	= frate,		\
77 	}
78 
79 /*
80  * struct samsung_fixed_factor_clock: information about fixed-factor clock
81  * @id: platform specific id of the clock.
82  * @name: name of this fixed-factor clock.
83  * @parent_name: parent clock name.
84  * @mult: fixed multiplication factor.
85  * @div: fixed division factor.
86  * @flags: optional fixed-factor clock flags.
87  */
88 struct samsung_fixed_factor_clock {
89 	unsigned int		id;
90 	char			*name;
91 	const char		*parent_name;
92 	unsigned long		mult;
93 	unsigned long		div;
94 	unsigned long		flags;
95 };
96 
97 #define FFACTOR(_id, cname, pname, m, d, f)		\
98 	{						\
99 		.id		= _id,			\
100 		.name		= cname,		\
101 		.parent_name	= pname,		\
102 		.mult		= m,			\
103 		.div		= d,			\
104 		.flags		= f,			\
105 	}
106 
107 /**
108  * struct samsung_mux_clock: information about mux clock
109  * @id: platform specific id of the clock.
110  * @dev_name: name of the device to which this clock belongs.
111  * @name: name of this mux clock.
112  * @parent_names: array of pointer to parent clock names.
113  * @num_parents: number of parents listed in @parent_names.
114  * @flags: optional flags for basic clock.
115  * @offset: offset of the register for configuring the mux.
116  * @shift: starting bit location of the mux control bit-field in @reg.
117  * @width: width of the mux control bit-field in @reg.
118  * @mux_flags: flags for mux-type clock.
119  * @alias: optional clock alias name to be assigned to this clock.
120  */
121 struct samsung_mux_clock {
122 	unsigned int		id;
123 	const char		*dev_name;
124 	const char		*name;
125 	const char		*const *parent_names;
126 	u8			num_parents;
127 	unsigned long		flags;
128 	unsigned long		offset;
129 	u8			shift;
130 	u8			width;
131 	u8			mux_flags;
132 	const char		*alias;
133 };
134 
135 #define __MUX(_id, dname, cname, pnames, o, s, w, f, mf, a)	\
136 	{							\
137 		.id		= _id,				\
138 		.dev_name	= dname,			\
139 		.name		= cname,			\
140 		.parent_names	= pnames,			\
141 		.num_parents	= ARRAY_SIZE(pnames),		\
142 		.flags		= (f) | CLK_SET_RATE_NO_REPARENT, \
143 		.offset		= o,				\
144 		.shift		= s,				\
145 		.width		= w,				\
146 		.mux_flags	= mf,				\
147 		.alias		= a,				\
148 	}
149 
150 #define MUX(_id, cname, pnames, o, s, w)			\
151 	__MUX(_id, NULL, cname, pnames, o, s, w, 0, 0, NULL)
152 
153 #define MUX_A(_id, cname, pnames, o, s, w, a)			\
154 	__MUX(_id, NULL, cname, pnames, o, s, w, 0, 0, a)
155 
156 #define MUX_F(_id, cname, pnames, o, s, w, f, mf)		\
157 	__MUX(_id, NULL, cname, pnames, o, s, w, f, mf, NULL)
158 
159 #define MUX_FA(_id, cname, pnames, o, s, w, f, mf, a)		\
160 	__MUX(_id, NULL, cname, pnames, o, s, w, f, mf, a)
161 
162 /**
163  * @id: platform specific id of the clock.
164  * struct samsung_div_clock: information about div clock
165  * @dev_name: name of the device to which this clock belongs.
166  * @name: name of this div clock.
167  * @parent_name: name of the parent clock.
168  * @flags: optional flags for basic clock.
169  * @offset: offset of the register for configuring the div.
170  * @shift: starting bit location of the div control bit-field in @reg.
171  * @div_flags: flags for div-type clock.
172  * @alias: optional clock alias name to be assigned to this clock.
173  */
174 struct samsung_div_clock {
175 	unsigned int		id;
176 	const char		*dev_name;
177 	const char		*name;
178 	const char		*parent_name;
179 	unsigned long		flags;
180 	unsigned long		offset;
181 	u8			shift;
182 	u8			width;
183 	u8			div_flags;
184 	const char		*alias;
185 	struct clk_div_table	*table;
186 };
187 
188 #define __DIV(_id, dname, cname, pname, o, s, w, f, df, a, t)	\
189 	{							\
190 		.id		= _id,				\
191 		.dev_name	= dname,			\
192 		.name		= cname,			\
193 		.parent_name	= pname,			\
194 		.flags		= f,				\
195 		.offset		= o,				\
196 		.shift		= s,				\
197 		.width		= w,				\
198 		.div_flags	= df,				\
199 		.alias		= a,				\
200 		.table		= t,				\
201 	}
202 
203 #define DIV(_id, cname, pname, o, s, w)				\
204 	__DIV(_id, NULL, cname, pname, o, s, w, 0, 0, NULL, NULL)
205 
206 #define DIV_A(_id, cname, pname, o, s, w, a)			\
207 	__DIV(_id, NULL, cname, pname, o, s, w, 0, 0, a, NULL)
208 
209 #define DIV_F(_id, cname, pname, o, s, w, f, df)		\
210 	__DIV(_id, NULL, cname, pname, o, s, w, f, df, NULL, NULL)
211 
212 #define DIV_T(_id, cname, pname, o, s, w, t)			\
213 	__DIV(_id, NULL, cname, pname, o, s, w, 0, 0, NULL, t)
214 
215 /**
216  * struct samsung_gate_clock: information about gate clock
217  * @id: platform specific id of the clock.
218  * @dev_name: name of the device to which this clock belongs.
219  * @name: name of this gate clock.
220  * @parent_name: name of the parent clock.
221  * @flags: optional flags for basic clock.
222  * @offset: offset of the register for configuring the gate.
223  * @bit_idx: bit index of the gate control bit-field in @reg.
224  * @gate_flags: flags for gate-type clock.
225  * @alias: optional clock alias name to be assigned to this clock.
226  */
227 struct samsung_gate_clock {
228 	unsigned int		id;
229 	const char		*dev_name;
230 	const char		*name;
231 	const char		*parent_name;
232 	unsigned long		flags;
233 	unsigned long		offset;
234 	u8			bit_idx;
235 	u8			gate_flags;
236 	const char		*alias;
237 };
238 
239 #define __GATE(_id, dname, cname, pname, o, b, f, gf, a)	\
240 	{							\
241 		.id		= _id,				\
242 		.dev_name	= dname,			\
243 		.name		= cname,			\
244 		.parent_name	= pname,			\
245 		.flags		= f,				\
246 		.offset		= o,				\
247 		.bit_idx	= b,				\
248 		.gate_flags	= gf,				\
249 		.alias		= a,				\
250 	}
251 
252 #define GATE(_id, cname, pname, o, b, f, gf)			\
253 	__GATE(_id, NULL, cname, pname, o, b, f, gf, NULL)
254 
255 #define GATE_A(_id, cname, pname, o, b, f, gf, a)		\
256 	__GATE(_id, NULL, cname, pname, o, b, f, gf, a)
257 
258 #define GATE_D(_id, dname, cname, pname, o, b, f, gf)		\
259 	__GATE(_id, dname, cname, pname, o, b, f, gf, NULL)
260 
261 #define GATE_DA(_id, dname, cname, pname, o, b, f, gf, a)	\
262 	__GATE(_id, dname, cname, pname, o, b, f, gf, a)
263 
264 #define PNAME(x) static const char *x[] __initdata
265 
266 /**
267  * struct samsung_clk_reg_dump: register dump of clock controller registers.
268  * @offset: clock register offset from the controller base address.
269  * @value: the value to be register at offset.
270  */
271 struct samsung_clk_reg_dump {
272 	u32	offset;
273 	u32	value;
274 };
275 
276 /**
277  * struct samsung_pll_clock: information about pll clock
278  * @id: platform specific id of the clock.
279  * @dev_name: name of the device to which this clock belongs.
280  * @name: name of this pll clock.
281  * @parent_name: name of the parent clock.
282  * @flags: optional flags for basic clock.
283  * @con_offset: offset of the register for configuring the PLL.
284  * @lock_offset: offset of the register for locking the PLL.
285  * @type: Type of PLL to be registered.
286  * @alias: optional clock alias name to be assigned to this clock.
287  */
288 struct samsung_pll_clock {
289 	unsigned int		id;
290 	const char		*dev_name;
291 	const char		*name;
292 	const char		*parent_name;
293 	unsigned long		flags;
294 	int			con_offset;
295 	int			lock_offset;
296 	enum samsung_pll_type	type;
297 	const struct samsung_pll_rate_table *rate_table;
298 	const char              *alias;
299 };
300 
301 #define __PLL(_typ, _id, _dname, _name, _pname, _flags, _lock, _con,	\
302 		_rtable, _alias)					\
303 	{								\
304 		.id		= _id,					\
305 		.type		= _typ,					\
306 		.dev_name	= _dname,				\
307 		.name		= _name,				\
308 		.parent_name	= _pname,				\
309 		.flags		= CLK_GET_RATE_NOCACHE,			\
310 		.con_offset	= _con,					\
311 		.lock_offset	= _lock,				\
312 		.rate_table	= _rtable,				\
313 		.alias		= _alias,				\
314 	}
315 
316 #define PLL(_typ, _id, _name, _pname, _lock, _con, _rtable)	\
317 	__PLL(_typ, _id, NULL, _name, _pname, CLK_GET_RATE_NOCACHE,	\
318 		_lock, _con, _rtable, _name)
319 
320 #define PLL_A(_typ, _id, _name, _pname, _lock, _con, _alias, _rtable) \
321 	__PLL(_typ, _id, NULL, _name, _pname, CLK_GET_RATE_NOCACHE,	\
322 		_lock, _con, _rtable, _alias)
323 
324 struct samsung_clock_reg_cache {
325 	struct list_head node;
326 	void __iomem *reg_base;
327 	struct samsung_clk_reg_dump *rdump;
328 	unsigned int rd_num;
329 };
330 
331 struct samsung_cmu_info {
332 	/* list of pll clocks and respective count */
333 	struct samsung_pll_clock *pll_clks;
334 	unsigned int nr_pll_clks;
335 	/* list of mux clocks and respective count */
336 	struct samsung_mux_clock *mux_clks;
337 	unsigned int nr_mux_clks;
338 	/* list of div clocks and respective count */
339 	struct samsung_div_clock *div_clks;
340 	unsigned int nr_div_clks;
341 	/* list of gate clocks and respective count */
342 	struct samsung_gate_clock *gate_clks;
343 	unsigned int nr_gate_clks;
344 	/* list of fixed clocks and respective count */
345 	struct samsung_fixed_rate_clock *fixed_clks;
346 	unsigned int nr_fixed_clks;
347 	/* list of fixed factor clocks and respective count */
348 	struct samsung_fixed_factor_clock *fixed_factor_clks;
349 	unsigned int nr_fixed_factor_clks;
350 	/* total number of clocks with IDs assigned*/
351 	unsigned int nr_clk_ids;
352 
353 	/* list and number of clocks registers */
354 	unsigned long *clk_regs;
355 	unsigned int nr_clk_regs;
356 };
357 
358 extern struct samsung_clk_provider *__init samsung_clk_init(
359 			struct device_node *np, void __iomem *base,
360 			unsigned long nr_clks);
361 extern void __init samsung_clk_of_add_provider(struct device_node *np,
362 			struct samsung_clk_provider *ctx);
363 extern void __init samsung_clk_of_register_fixed_ext(
364 			struct samsung_clk_provider *ctx,
365 			struct samsung_fixed_rate_clock *fixed_rate_clk,
366 			unsigned int nr_fixed_rate_clk,
367 			const struct of_device_id *clk_matches);
368 
369 extern void samsung_clk_add_lookup(struct samsung_clk_provider *ctx,
370 			struct clk *clk, unsigned int id);
371 
372 extern void __init samsung_clk_register_alias(struct samsung_clk_provider *ctx,
373 			const struct samsung_clock_alias *list,
374 			unsigned int nr_clk);
375 extern void __init samsung_clk_register_fixed_rate(
376 			struct samsung_clk_provider *ctx,
377 			const struct samsung_fixed_rate_clock *clk_list,
378 			unsigned int nr_clk);
379 extern void __init samsung_clk_register_fixed_factor(
380 			struct samsung_clk_provider *ctx,
381 			const struct samsung_fixed_factor_clock *list,
382 			unsigned int nr_clk);
383 extern void __init samsung_clk_register_mux(struct samsung_clk_provider *ctx,
384 			const struct samsung_mux_clock *clk_list,
385 			unsigned int nr_clk);
386 extern void __init samsung_clk_register_div(struct samsung_clk_provider *ctx,
387 			const struct samsung_div_clock *clk_list,
388 			unsigned int nr_clk);
389 extern void __init samsung_clk_register_gate(struct samsung_clk_provider *ctx,
390 			const struct samsung_gate_clock *clk_list,
391 			unsigned int nr_clk);
392 extern void __init samsung_clk_register_pll(struct samsung_clk_provider *ctx,
393 			const struct samsung_pll_clock *pll_list,
394 			unsigned int nr_clk, void __iomem *base);
395 
396 extern struct samsung_clk_provider __init *samsung_cmu_register_one(
397 			struct device_node *,
398 			struct samsung_cmu_info *);
399 
400 extern unsigned long _get_rate(const char *clk_name);
401 
402 extern void samsung_clk_save(void __iomem *base,
403 			struct samsung_clk_reg_dump *rd,
404 			unsigned int num_regs);
405 extern void samsung_clk_restore(void __iomem *base,
406 			const struct samsung_clk_reg_dump *rd,
407 			unsigned int num_regs);
408 extern struct samsung_clk_reg_dump *samsung_clk_alloc_reg_dump(
409 			const unsigned long *rdump,
410 			unsigned long nr_rdump);
411 
412 #endif /* __SAMSUNG_CLK_H */
413