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