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