]> git.karo-electronics.de Git - karo-tx-linux.git/blob - arch/arm/mach-omap2/clock2430_data.c
OMAP2+: clock: remove the DPLL rate tolerance code
[karo-tx-linux.git] / arch / arm / mach-omap2 / clock2430_data.c
1 /*
2  *  linux/arch/arm/mach-omap2/clock2430_data.c
3  *
4  *  Copyright (C) 2005-2009 Texas Instruments, Inc.
5  *  Copyright (C) 2004-2011 Nokia Corporation
6  *
7  *  Contacts:
8  *  Richard Woodruff <r-woodruff2@ti.com>
9  *  Paul Walmsley
10  *
11  * This program is free software; you can redistribute it and/or modify
12  * it under the terms of the GNU General Public License version 2 as
13  * published by the Free Software Foundation.
14  */
15
16 #include <linux/kernel.h>
17 #include <linux/clk.h>
18 #include <linux/list.h>
19
20 #include <plat/clkdev_omap.h>
21
22 #include "clock.h"
23 #include "clock2xxx.h"
24 #include "opp2xxx.h"
25 #include "cm2xxx_3xxx.h"
26 #include "prm2xxx_3xxx.h"
27 #include "prm-regbits-24xx.h"
28 #include "cm-regbits-24xx.h"
29 #include "sdrc.h"
30 #include "control.h"
31
32 #define OMAP_CM_REGADDR                 OMAP2430_CM_REGADDR
33
34 /*
35  * 2430 clock tree.
36  *
37  * NOTE:In many cases here we are assigning a 'default' parent. In many
38  *      cases the parent is selectable. The get/set parent calls will also
39  *      switch sources.
40  *
41  *      Many some clocks say always_enabled, but they can be auto idled for
42  *      power savings. They will always be available upon clock request.
43  *
44  *      Several sources are given initial rates which may be wrong, this will
45  *      be fixed up in the init func.
46  *
47  *      Things are broadly separated below by clock domains. It is
48  *      noteworthy that most periferals have dependencies on multiple clock
49  *      domains. Many get their interface clocks from the L4 domain, but get
50  *      functional clocks from fixed sources or other core domain derived
51  *      clocks.
52  */
53
54 /* Base external input clocks */
55 static struct clk func_32k_ck = {
56         .name           = "func_32k_ck",
57         .ops            = &clkops_null,
58         .rate           = 32768,
59         .clkdm_name     = "wkup_clkdm",
60 };
61
62 static struct clk secure_32k_ck = {
63         .name           = "secure_32k_ck",
64         .ops            = &clkops_null,
65         .rate           = 32768,
66         .clkdm_name     = "wkup_clkdm",
67 };
68
69 /* Typical 12/13MHz in standalone mode, will be 26Mhz in chassis mode */
70 static struct clk osc_ck = {            /* (*12, *13, 19.2, *26, 38.4)MHz */
71         .name           = "osc_ck",
72         .ops            = &clkops_oscck,
73         .clkdm_name     = "wkup_clkdm",
74         .recalc         = &omap2_osc_clk_recalc,
75 };
76
77 /* Without modem likely 12MHz, with modem likely 13MHz */
78 static struct clk sys_ck = {            /* (*12, *13, 19.2, 26, 38.4)MHz */
79         .name           = "sys_ck",             /* ~ ref_clk also */
80         .ops            = &clkops_null,
81         .parent         = &osc_ck,
82         .clkdm_name     = "wkup_clkdm",
83         .recalc         = &omap2xxx_sys_clk_recalc,
84 };
85
86 static struct clk alt_ck = {            /* Typical 54M or 48M, may not exist */
87         .name           = "alt_ck",
88         .ops            = &clkops_null,
89         .rate           = 54000000,
90         .clkdm_name     = "wkup_clkdm",
91 };
92
93 /* Optional external clock input for McBSP CLKS */
94 static struct clk mcbsp_clks = {
95         .name           = "mcbsp_clks",
96         .ops            = &clkops_null,
97 };
98
99 /*
100  * Analog domain root source clocks
101  */
102
103 /* dpll_ck, is broken out in to special cases through clksel */
104 /* REVISIT: Rate changes on dpll_ck trigger a full set change.  ...
105  * deal with this
106  */
107
108 static struct dpll_data dpll_dd = {
109         .mult_div1_reg          = OMAP_CM_REGADDR(PLL_MOD, CM_CLKSEL1),
110         .mult_mask              = OMAP24XX_DPLL_MULT_MASK,
111         .div1_mask              = OMAP24XX_DPLL_DIV_MASK,
112         .clk_bypass             = &sys_ck,
113         .clk_ref                = &sys_ck,
114         .control_reg            = OMAP_CM_REGADDR(PLL_MOD, CM_CLKEN),
115         .enable_mask            = OMAP24XX_EN_DPLL_MASK,
116         .max_multiplier         = 1023,
117         .min_divider            = 1,
118         .max_divider            = 16,
119 };
120
121 /*
122  * XXX Cannot add round_rate here yet, as this is still a composite clock,
123  * not just a DPLL
124  */
125 static struct clk dpll_ck = {
126         .name           = "dpll_ck",
127         .ops            = &clkops_omap2xxx_dpll_ops,
128         .parent         = &sys_ck,              /* Can be func_32k also */
129         .dpll_data      = &dpll_dd,
130         .clkdm_name     = "wkup_clkdm",
131         .recalc         = &omap2_dpllcore_recalc,
132         .set_rate       = &omap2_reprogram_dpllcore,
133 };
134
135 static struct clk apll96_ck = {
136         .name           = "apll96_ck",
137         .ops            = &clkops_apll96,
138         .parent         = &sys_ck,
139         .rate           = 96000000,
140         .flags          = ENABLE_ON_INIT,
141         .clkdm_name     = "wkup_clkdm",
142         .enable_reg     = OMAP_CM_REGADDR(PLL_MOD, CM_CLKEN),
143         .enable_bit     = OMAP24XX_EN_96M_PLL_SHIFT,
144 };
145
146 static struct clk apll54_ck = {
147         .name           = "apll54_ck",
148         .ops            = &clkops_apll54,
149         .parent         = &sys_ck,
150         .rate           = 54000000,
151         .flags          = ENABLE_ON_INIT,
152         .clkdm_name     = "wkup_clkdm",
153         .enable_reg     = OMAP_CM_REGADDR(PLL_MOD, CM_CLKEN),
154         .enable_bit     = OMAP24XX_EN_54M_PLL_SHIFT,
155 };
156
157 /*
158  * PRCM digital base sources
159  */
160
161 /* func_54m_ck */
162
163 static const struct clksel_rate func_54m_apll54_rates[] = {
164         { .div = 1, .val = 0, .flags = RATE_IN_24XX },
165         { .div = 0 },
166 };
167
168 static const struct clksel_rate func_54m_alt_rates[] = {
169         { .div = 1, .val = 1, .flags = RATE_IN_24XX },
170         { .div = 0 },
171 };
172
173 static const struct clksel func_54m_clksel[] = {
174         { .parent = &apll54_ck, .rates = func_54m_apll54_rates, },
175         { .parent = &alt_ck,    .rates = func_54m_alt_rates, },
176         { .parent = NULL },
177 };
178
179 static struct clk func_54m_ck = {
180         .name           = "func_54m_ck",
181         .ops            = &clkops_null,
182         .parent         = &apll54_ck,   /* can also be alt_clk */
183         .clkdm_name     = "wkup_clkdm",
184         .init           = &omap2_init_clksel_parent,
185         .clksel_reg     = OMAP_CM_REGADDR(PLL_MOD, CM_CLKSEL1),
186         .clksel_mask    = OMAP24XX_54M_SOURCE_MASK,
187         .clksel         = func_54m_clksel,
188         .recalc         = &omap2_clksel_recalc,
189 };
190
191 static struct clk core_ck = {
192         .name           = "core_ck",
193         .ops            = &clkops_null,
194         .parent         = &dpll_ck,             /* can also be 32k */
195         .clkdm_name     = "wkup_clkdm",
196         .recalc         = &followparent_recalc,
197 };
198
199 /* func_96m_ck */
200 static const struct clksel_rate func_96m_apll96_rates[] = {
201         { .div = 1, .val = 0, .flags = RATE_IN_24XX },
202         { .div = 0 },
203 };
204
205 static const struct clksel_rate func_96m_alt_rates[] = {
206         { .div = 1, .val = 1, .flags = RATE_IN_243X },
207         { .div = 0 },
208 };
209
210 static const struct clksel func_96m_clksel[] = {
211         { .parent = &apll96_ck, .rates = func_96m_apll96_rates },
212         { .parent = &alt_ck,    .rates = func_96m_alt_rates },
213         { .parent = NULL }
214 };
215
216 static struct clk func_96m_ck = {
217         .name           = "func_96m_ck",
218         .ops            = &clkops_null,
219         .parent         = &apll96_ck,
220         .clkdm_name     = "wkup_clkdm",
221         .init           = &omap2_init_clksel_parent,
222         .clksel_reg     = OMAP_CM_REGADDR(PLL_MOD, CM_CLKSEL1),
223         .clksel_mask    = OMAP2430_96M_SOURCE_MASK,
224         .clksel         = func_96m_clksel,
225         .recalc         = &omap2_clksel_recalc,
226 };
227
228 /* func_48m_ck */
229
230 static const struct clksel_rate func_48m_apll96_rates[] = {
231         { .div = 2, .val = 0, .flags = RATE_IN_24XX },
232         { .div = 0 },
233 };
234
235 static const struct clksel_rate func_48m_alt_rates[] = {
236         { .div = 1, .val = 1, .flags = RATE_IN_24XX },
237         { .div = 0 },
238 };
239
240 static const struct clksel func_48m_clksel[] = {
241         { .parent = &apll96_ck, .rates = func_48m_apll96_rates },
242         { .parent = &alt_ck, .rates = func_48m_alt_rates },
243         { .parent = NULL }
244 };
245
246 static struct clk func_48m_ck = {
247         .name           = "func_48m_ck",
248         .ops            = &clkops_null,
249         .parent         = &apll96_ck,    /* 96M or Alt */
250         .clkdm_name     = "wkup_clkdm",
251         .init           = &omap2_init_clksel_parent,
252         .clksel_reg     = OMAP_CM_REGADDR(PLL_MOD, CM_CLKSEL1),
253         .clksel_mask    = OMAP24XX_48M_SOURCE_MASK,
254         .clksel         = func_48m_clksel,
255         .recalc         = &omap2_clksel_recalc,
256         .round_rate     = &omap2_clksel_round_rate,
257         .set_rate       = &omap2_clksel_set_rate
258 };
259
260 static struct clk func_12m_ck = {
261         .name           = "func_12m_ck",
262         .ops            = &clkops_null,
263         .parent         = &func_48m_ck,
264         .fixed_div      = 4,
265         .clkdm_name     = "wkup_clkdm",
266         .recalc         = &omap_fixed_divisor_recalc,
267 };
268
269 /* Secure timer, only available in secure mode */
270 static struct clk wdt1_osc_ck = {
271         .name           = "ck_wdt1_osc",
272         .ops            = &clkops_null, /* RMK: missing? */
273         .parent         = &osc_ck,
274         .recalc         = &followparent_recalc,
275 };
276
277 /*
278  * The common_clkout* clksel_rate structs are common to
279  * sys_clkout, sys_clkout_src, sys_clkout2, and sys_clkout2_src.
280  * sys_clkout2_* are 2420-only, so the
281  * clksel_rate flags fields are inaccurate for those clocks. This is
282  * harmless since access to those clocks are gated by the struct clk
283  * flags fields, which mark them as 2420-only.
284  */
285 static const struct clksel_rate common_clkout_src_core_rates[] = {
286         { .div = 1, .val = 0, .flags = RATE_IN_24XX },
287         { .div = 0 }
288 };
289
290 static const struct clksel_rate common_clkout_src_sys_rates[] = {
291         { .div = 1, .val = 1, .flags = RATE_IN_24XX },
292         { .div = 0 }
293 };
294
295 static const struct clksel_rate common_clkout_src_96m_rates[] = {
296         { .div = 1, .val = 2, .flags = RATE_IN_24XX },
297         { .div = 0 }
298 };
299
300 static const struct clksel_rate common_clkout_src_54m_rates[] = {
301         { .div = 1, .val = 3, .flags = RATE_IN_24XX },
302         { .div = 0 }
303 };
304
305 static const struct clksel common_clkout_src_clksel[] = {
306         { .parent = &core_ck,     .rates = common_clkout_src_core_rates },
307         { .parent = &sys_ck,      .rates = common_clkout_src_sys_rates },
308         { .parent = &func_96m_ck, .rates = common_clkout_src_96m_rates },
309         { .parent = &func_54m_ck, .rates = common_clkout_src_54m_rates },
310         { .parent = NULL }
311 };
312
313 static struct clk sys_clkout_src = {
314         .name           = "sys_clkout_src",
315         .ops            = &clkops_omap2_dflt,
316         .parent         = &func_54m_ck,
317         .clkdm_name     = "wkup_clkdm",
318         .enable_reg     = OMAP2430_PRCM_CLKOUT_CTRL,
319         .enable_bit     = OMAP24XX_CLKOUT_EN_SHIFT,
320         .init           = &omap2_init_clksel_parent,
321         .clksel_reg     = OMAP2430_PRCM_CLKOUT_CTRL,
322         .clksel_mask    = OMAP24XX_CLKOUT_SOURCE_MASK,
323         .clksel         = common_clkout_src_clksel,
324         .recalc         = &omap2_clksel_recalc,
325         .round_rate     = &omap2_clksel_round_rate,
326         .set_rate       = &omap2_clksel_set_rate
327 };
328
329 static const struct clksel_rate common_clkout_rates[] = {
330         { .div = 1, .val = 0, .flags = RATE_IN_24XX },
331         { .div = 2, .val = 1, .flags = RATE_IN_24XX },
332         { .div = 4, .val = 2, .flags = RATE_IN_24XX },
333         { .div = 8, .val = 3, .flags = RATE_IN_24XX },
334         { .div = 16, .val = 4, .flags = RATE_IN_24XX },
335         { .div = 0 },
336 };
337
338 static const struct clksel sys_clkout_clksel[] = {
339         { .parent = &sys_clkout_src, .rates = common_clkout_rates },
340         { .parent = NULL }
341 };
342
343 static struct clk sys_clkout = {
344         .name           = "sys_clkout",
345         .ops            = &clkops_null,
346         .parent         = &sys_clkout_src,
347         .clkdm_name     = "wkup_clkdm",
348         .clksel_reg     = OMAP2430_PRCM_CLKOUT_CTRL,
349         .clksel_mask    = OMAP24XX_CLKOUT_DIV_MASK,
350         .clksel         = sys_clkout_clksel,
351         .recalc         = &omap2_clksel_recalc,
352         .round_rate     = &omap2_clksel_round_rate,
353         .set_rate       = &omap2_clksel_set_rate
354 };
355
356 static struct clk emul_ck = {
357         .name           = "emul_ck",
358         .ops            = &clkops_omap2_dflt,
359         .parent         = &func_54m_ck,
360         .clkdm_name     = "wkup_clkdm",
361         .enable_reg     = OMAP2430_PRCM_CLKEMUL_CTRL,
362         .enable_bit     = OMAP24XX_EMULATION_EN_SHIFT,
363         .recalc         = &followparent_recalc,
364
365 };
366
367 /*
368  * MPU clock domain
369  *      Clocks:
370  *              MPU_FCLK, MPU_ICLK
371  *              INT_M_FCLK, INT_M_I_CLK
372  *
373  * - Individual clocks are hardware managed.
374  * - Base divider comes from: CM_CLKSEL_MPU
375  *
376  */
377 static const struct clksel_rate mpu_core_rates[] = {
378         { .div = 1, .val = 1, .flags = RATE_IN_24XX },
379         { .div = 2, .val = 2, .flags = RATE_IN_24XX },
380         { .div = 0 },
381 };
382
383 static const struct clksel mpu_clksel[] = {
384         { .parent = &core_ck, .rates = mpu_core_rates },
385         { .parent = NULL }
386 };
387
388 static struct clk mpu_ck = {    /* Control cpu */
389         .name           = "mpu_ck",
390         .ops            = &clkops_null,
391         .parent         = &core_ck,
392         .clkdm_name     = "mpu_clkdm",
393         .init           = &omap2_init_clksel_parent,
394         .clksel_reg     = OMAP_CM_REGADDR(MPU_MOD, CM_CLKSEL),
395         .clksel_mask    = OMAP24XX_CLKSEL_MPU_MASK,
396         .clksel         = mpu_clksel,
397         .recalc         = &omap2_clksel_recalc,
398 };
399
400 /*
401  * DSP (2430-IVA2.1) clock domain
402  * Clocks:
403  *      2430: IVA2.1_FCLK (really just DSP_FCLK), IVA2.1_ICLK
404  *
405  * Won't be too specific here. The core clock comes into this block
406  * it is divided then tee'ed. One branch goes directly to xyz enable
407  * controls. The other branch gets further divided by 2 then possibly
408  * routed into a synchronizer and out of clocks abc.
409  */
410 static const struct clksel_rate dsp_fck_core_rates[] = {
411         { .div = 1, .val = 1, .flags = RATE_IN_24XX },
412         { .div = 2, .val = 2, .flags = RATE_IN_24XX },
413         { .div = 3, .val = 3, .flags = RATE_IN_24XX },
414         { .div = 4, .val = 4, .flags = RATE_IN_24XX },
415         { .div = 0 },
416 };
417
418 static const struct clksel dsp_fck_clksel[] = {
419         { .parent = &core_ck, .rates = dsp_fck_core_rates },
420         { .parent = NULL }
421 };
422
423 static struct clk dsp_fck = {
424         .name           = "dsp_fck",
425         .ops            = &clkops_omap2_dflt_wait,
426         .parent         = &core_ck,
427         .clkdm_name     = "dsp_clkdm",
428         .enable_reg     = OMAP_CM_REGADDR(OMAP24XX_DSP_MOD, CM_FCLKEN),
429         .enable_bit     = OMAP24XX_CM_FCLKEN_DSP_EN_DSP_SHIFT,
430         .clksel_reg     = OMAP_CM_REGADDR(OMAP24XX_DSP_MOD, CM_CLKSEL),
431         .clksel_mask    = OMAP24XX_CLKSEL_DSP_MASK,
432         .clksel         = dsp_fck_clksel,
433         .recalc         = &omap2_clksel_recalc,
434 };
435
436 /* DSP interface clock */
437 static const struct clksel_rate dsp_irate_ick_rates[] = {
438         { .div = 1, .val = 1, .flags = RATE_IN_24XX },
439         { .div = 2, .val = 2, .flags = RATE_IN_24XX },
440         { .div = 3, .val = 3, .flags = RATE_IN_243X },
441         { .div = 0 },
442 };
443
444 static const struct clksel dsp_irate_ick_clksel[] = {
445         { .parent = &dsp_fck, .rates = dsp_irate_ick_rates },
446         { .parent = NULL }
447 };
448
449 /* This clock does not exist as such in the TRM. */
450 static struct clk dsp_irate_ick = {
451         .name           = "dsp_irate_ick",
452         .ops            = &clkops_null,
453         .parent         = &dsp_fck,
454         .clksel_reg     = OMAP_CM_REGADDR(OMAP24XX_DSP_MOD, CM_CLKSEL),
455         .clksel_mask    = OMAP24XX_CLKSEL_DSP_IF_MASK,
456         .clksel         = dsp_irate_ick_clksel,
457         .recalc         = &omap2_clksel_recalc,
458 };
459
460 /* 2430 only - EN_DSP controls both dsp fclk and iclk on 2430 */
461 static struct clk iva2_1_ick = {
462         .name           = "iva2_1_ick",
463         .ops            = &clkops_omap2_dflt_wait,
464         .parent         = &dsp_irate_ick,
465         .enable_reg     = OMAP_CM_REGADDR(OMAP24XX_DSP_MOD, CM_FCLKEN),
466         .enable_bit     = OMAP24XX_CM_FCLKEN_DSP_EN_DSP_SHIFT,
467 };
468
469 /*
470  * L3 clock domain
471  * L3 clocks are used for both interface and functional clocks to
472  * multiple entities. Some of these clocks are completely managed
473  * by hardware, and some others allow software control. Hardware
474  * managed ones general are based on directly CLK_REQ signals and
475  * various auto idle settings. The functional spec sets many of these
476  * as 'tie-high' for their enables.
477  *
478  * I-CLOCKS:
479  *      L3-Interconnect, SMS, GPMC, SDRC, OCM_RAM, OCM_ROM, SDMA
480  *      CAM, HS-USB.
481  * F-CLOCK
482  *      SSI.
483  *
484  * GPMC memories and SDRC have timing and clock sensitive registers which
485  * may very well need notification when the clock changes. Currently for low
486  * operating points, these are taken care of in sleep.S.
487  */
488 static const struct clksel_rate core_l3_core_rates[] = {
489         { .div = 1, .val = 1, .flags = RATE_IN_24XX },
490         { .div = 4, .val = 4, .flags = RATE_IN_24XX },
491         { .div = 6, .val = 6, .flags = RATE_IN_24XX },
492         { .div = 0 }
493 };
494
495 static const struct clksel core_l3_clksel[] = {
496         { .parent = &core_ck, .rates = core_l3_core_rates },
497         { .parent = NULL }
498 };
499
500 static struct clk core_l3_ck = {        /* Used for ick and fck, interconnect */
501         .name           = "core_l3_ck",
502         .ops            = &clkops_null,
503         .parent         = &core_ck,
504         .clkdm_name     = "core_l3_clkdm",
505         .clksel_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL1),
506         .clksel_mask    = OMAP24XX_CLKSEL_L3_MASK,
507         .clksel         = core_l3_clksel,
508         .recalc         = &omap2_clksel_recalc,
509 };
510
511 /* usb_l4_ick */
512 static const struct clksel_rate usb_l4_ick_core_l3_rates[] = {
513         { .div = 1, .val = 1, .flags = RATE_IN_24XX },
514         { .div = 2, .val = 2, .flags = RATE_IN_24XX },
515         { .div = 4, .val = 4, .flags = RATE_IN_24XX },
516         { .div = 0 }
517 };
518
519 static const struct clksel usb_l4_ick_clksel[] = {
520         { .parent = &core_l3_ck, .rates = usb_l4_ick_core_l3_rates },
521         { .parent = NULL },
522 };
523
524 /* It is unclear from TRM whether usb_l4_ick is really in L3 or L4 clkdm */
525 static struct clk usb_l4_ick = {        /* FS-USB interface clock */
526         .name           = "usb_l4_ick",
527         .ops            = &clkops_omap2_iclk_dflt_wait,
528         .parent         = &core_l3_ck,
529         .clkdm_name     = "core_l4_clkdm",
530         .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN2),
531         .enable_bit     = OMAP24XX_EN_USB_SHIFT,
532         .clksel_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL1),
533         .clksel_mask    = OMAP24XX_CLKSEL_USB_MASK,
534         .clksel         = usb_l4_ick_clksel,
535         .recalc         = &omap2_clksel_recalc,
536 };
537
538 /*
539  * L4 clock management domain
540  *
541  * This domain contains lots of interface clocks from the L4 interface, some
542  * functional clocks.   Fixed APLL functional source clocks are managed in
543  * this domain.
544  */
545 static const struct clksel_rate l4_core_l3_rates[] = {
546         { .div = 1, .val = 1, .flags = RATE_IN_24XX },
547         { .div = 2, .val = 2, .flags = RATE_IN_24XX },
548         { .div = 0 }
549 };
550
551 static const struct clksel l4_clksel[] = {
552         { .parent = &core_l3_ck, .rates = l4_core_l3_rates },
553         { .parent = NULL }
554 };
555
556 static struct clk l4_ck = {             /* used both as an ick and fck */
557         .name           = "l4_ck",
558         .ops            = &clkops_null,
559         .parent         = &core_l3_ck,
560         .clkdm_name     = "core_l4_clkdm",
561         .clksel_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL1),
562         .clksel_mask    = OMAP24XX_CLKSEL_L4_MASK,
563         .clksel         = l4_clksel,
564         .recalc         = &omap2_clksel_recalc,
565 };
566
567 /*
568  * SSI is in L3 management domain, its direct parent is core not l3,
569  * many core power domain entities are grouped into the L3 clock
570  * domain.
571  * SSI_SSR_FCLK, SSI_SST_FCLK, SSI_L4_ICLK
572  *
573  * ssr = core/1/2/3/4/5, sst = 1/2 ssr.
574  */
575 static const struct clksel_rate ssi_ssr_sst_fck_core_rates[] = {
576         { .div = 1, .val = 1, .flags = RATE_IN_24XX },
577         { .div = 2, .val = 2, .flags = RATE_IN_24XX },
578         { .div = 3, .val = 3, .flags = RATE_IN_24XX },
579         { .div = 4, .val = 4, .flags = RATE_IN_24XX },
580         { .div = 5, .val = 5, .flags = RATE_IN_243X },
581         { .div = 0 }
582 };
583
584 static const struct clksel ssi_ssr_sst_fck_clksel[] = {
585         { .parent = &core_ck, .rates = ssi_ssr_sst_fck_core_rates },
586         { .parent = NULL }
587 };
588
589 static struct clk ssi_ssr_sst_fck = {
590         .name           = "ssi_fck",
591         .ops            = &clkops_omap2_dflt_wait,
592         .parent         = &core_ck,
593         .clkdm_name     = "core_l3_clkdm",
594         .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, OMAP24XX_CM_FCLKEN2),
595         .enable_bit     = OMAP24XX_EN_SSI_SHIFT,
596         .clksel_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL1),
597         .clksel_mask    = OMAP24XX_CLKSEL_SSI_MASK,
598         .clksel         = ssi_ssr_sst_fck_clksel,
599         .recalc         = &omap2_clksel_recalc,
600 };
601
602 /*
603  * Presumably this is the same as SSI_ICLK.
604  * TRM contradicts itself on what clockdomain SSI_ICLK is in
605  */
606 static struct clk ssi_l4_ick = {
607         .name           = "ssi_l4_ick",
608         .ops            = &clkops_omap2_iclk_dflt_wait,
609         .parent         = &l4_ck,
610         .clkdm_name     = "core_l4_clkdm",
611         .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN2),
612         .enable_bit     = OMAP24XX_EN_SSI_SHIFT,
613         .recalc         = &followparent_recalc,
614 };
615
616
617 /*
618  * GFX clock domain
619  *      Clocks:
620  * GFX_FCLK, GFX_ICLK
621  * GFX_CG1(2d), GFX_CG2(3d)
622  *
623  * GFX_FCLK runs from L3, and is divided by (1,2,3,4)
624  * The 2d and 3d clocks run at a hardware determined
625  * divided value of fclk.
626  *
627  */
628
629 /* This clksel struct is shared between gfx_3d_fck and gfx_2d_fck */
630 static const struct clksel gfx_fck_clksel[] = {
631         { .parent = &core_l3_ck, .rates = gfx_l3_rates },
632         { .parent = NULL },
633 };
634
635 static struct clk gfx_3d_fck = {
636         .name           = "gfx_3d_fck",
637         .ops            = &clkops_omap2_dflt_wait,
638         .parent         = &core_l3_ck,
639         .clkdm_name     = "gfx_clkdm",
640         .enable_reg     = OMAP_CM_REGADDR(GFX_MOD, CM_FCLKEN),
641         .enable_bit     = OMAP24XX_EN_3D_SHIFT,
642         .clksel_reg     = OMAP_CM_REGADDR(GFX_MOD, CM_CLKSEL),
643         .clksel_mask    = OMAP_CLKSEL_GFX_MASK,
644         .clksel         = gfx_fck_clksel,
645         .recalc         = &omap2_clksel_recalc,
646         .round_rate     = &omap2_clksel_round_rate,
647         .set_rate       = &omap2_clksel_set_rate
648 };
649
650 static struct clk gfx_2d_fck = {
651         .name           = "gfx_2d_fck",
652         .ops            = &clkops_omap2_dflt_wait,
653         .parent         = &core_l3_ck,
654         .clkdm_name     = "gfx_clkdm",
655         .enable_reg     = OMAP_CM_REGADDR(GFX_MOD, CM_FCLKEN),
656         .enable_bit     = OMAP24XX_EN_2D_SHIFT,
657         .clksel_reg     = OMAP_CM_REGADDR(GFX_MOD, CM_CLKSEL),
658         .clksel_mask    = OMAP_CLKSEL_GFX_MASK,
659         .clksel         = gfx_fck_clksel,
660         .recalc         = &omap2_clksel_recalc,
661 };
662
663 /* This interface clock does not have a CM_AUTOIDLE bit */
664 static struct clk gfx_ick = {
665         .name           = "gfx_ick",            /* From l3 */
666         .ops            = &clkops_omap2_dflt_wait,
667         .parent         = &core_l3_ck,
668         .clkdm_name     = "gfx_clkdm",
669         .enable_reg     = OMAP_CM_REGADDR(GFX_MOD, CM_ICLKEN),
670         .enable_bit     = OMAP_EN_GFX_SHIFT,
671         .recalc         = &followparent_recalc,
672 };
673
674 /*
675  * Modem clock domain (2430)
676  *      CLOCKS:
677  *              MDM_OSC_CLK
678  *              MDM_ICLK
679  * These clocks are usable in chassis mode only.
680  */
681 static const struct clksel_rate mdm_ick_core_rates[] = {
682         { .div = 1, .val = 1, .flags = RATE_IN_243X },
683         { .div = 4, .val = 4, .flags = RATE_IN_243X },
684         { .div = 6, .val = 6, .flags = RATE_IN_243X },
685         { .div = 9, .val = 9, .flags = RATE_IN_243X },
686         { .div = 0 }
687 };
688
689 static const struct clksel mdm_ick_clksel[] = {
690         { .parent = &core_ck, .rates = mdm_ick_core_rates },
691         { .parent = NULL }
692 };
693
694 static struct clk mdm_ick = {           /* used both as a ick and fck */
695         .name           = "mdm_ick",
696         .ops            = &clkops_omap2_iclk_dflt_wait,
697         .parent         = &core_ck,
698         .clkdm_name     = "mdm_clkdm",
699         .enable_reg     = OMAP_CM_REGADDR(OMAP2430_MDM_MOD, CM_ICLKEN),
700         .enable_bit     = OMAP2430_CM_ICLKEN_MDM_EN_MDM_SHIFT,
701         .clksel_reg     = OMAP_CM_REGADDR(OMAP2430_MDM_MOD, CM_CLKSEL),
702         .clksel_mask    = OMAP2430_CLKSEL_MDM_MASK,
703         .clksel         = mdm_ick_clksel,
704         .recalc         = &omap2_clksel_recalc,
705 };
706
707 static struct clk mdm_osc_ck = {
708         .name           = "mdm_osc_ck",
709         .ops            = &clkops_omap2_mdmclk_dflt_wait,
710         .parent         = &osc_ck,
711         .clkdm_name     = "mdm_clkdm",
712         .enable_reg     = OMAP_CM_REGADDR(OMAP2430_MDM_MOD, CM_FCLKEN),
713         .enable_bit     = OMAP2430_EN_OSC_SHIFT,
714         .recalc         = &followparent_recalc,
715 };
716
717 /*
718  * DSS clock domain
719  * CLOCKs:
720  * DSS_L4_ICLK, DSS_L3_ICLK,
721  * DSS_CLK1, DSS_CLK2, DSS_54MHz_CLK
722  *
723  * DSS is both initiator and target.
724  */
725 /* XXX Add RATE_NOT_VALIDATED */
726
727 static const struct clksel_rate dss1_fck_sys_rates[] = {
728         { .div = 1, .val = 0, .flags = RATE_IN_24XX },
729         { .div = 0 }
730 };
731
732 static const struct clksel_rate dss1_fck_core_rates[] = {
733         { .div = 1, .val = 1, .flags = RATE_IN_24XX },
734         { .div = 2, .val = 2, .flags = RATE_IN_24XX },
735         { .div = 3, .val = 3, .flags = RATE_IN_24XX },
736         { .div = 4, .val = 4, .flags = RATE_IN_24XX },
737         { .div = 5, .val = 5, .flags = RATE_IN_24XX },
738         { .div = 6, .val = 6, .flags = RATE_IN_24XX },
739         { .div = 8, .val = 8, .flags = RATE_IN_24XX },
740         { .div = 9, .val = 9, .flags = RATE_IN_24XX },
741         { .div = 12, .val = 12, .flags = RATE_IN_24XX },
742         { .div = 16, .val = 16, .flags = RATE_IN_24XX },
743         { .div = 0 }
744 };
745
746 static const struct clksel dss1_fck_clksel[] = {
747         { .parent = &sys_ck,  .rates = dss1_fck_sys_rates },
748         { .parent = &core_ck, .rates = dss1_fck_core_rates },
749         { .parent = NULL },
750 };
751
752 static struct clk dss_ick = {           /* Enables both L3,L4 ICLK's */
753         .name           = "dss_ick",
754         .ops            = &clkops_omap2_iclk_dflt,
755         .parent         = &l4_ck,       /* really both l3 and l4 */
756         .clkdm_name     = "dss_clkdm",
757         .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
758         .enable_bit     = OMAP24XX_EN_DSS1_SHIFT,
759         .recalc         = &followparent_recalc,
760 };
761
762 static struct clk dss1_fck = {
763         .name           = "dss1_fck",
764         .ops            = &clkops_omap2_dflt,
765         .parent         = &core_ck,             /* Core or sys */
766         .clkdm_name     = "dss_clkdm",
767         .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
768         .enable_bit     = OMAP24XX_EN_DSS1_SHIFT,
769         .init           = &omap2_init_clksel_parent,
770         .clksel_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL1),
771         .clksel_mask    = OMAP24XX_CLKSEL_DSS1_MASK,
772         .clksel         = dss1_fck_clksel,
773         .recalc         = &omap2_clksel_recalc,
774 };
775
776 static const struct clksel_rate dss2_fck_sys_rates[] = {
777         { .div = 1, .val = 0, .flags = RATE_IN_24XX },
778         { .div = 0 }
779 };
780
781 static const struct clksel_rate dss2_fck_48m_rates[] = {
782         { .div = 1, .val = 1, .flags = RATE_IN_24XX },
783         { .div = 0 }
784 };
785
786 static const struct clksel dss2_fck_clksel[] = {
787         { .parent = &sys_ck,      .rates = dss2_fck_sys_rates },
788         { .parent = &func_48m_ck, .rates = dss2_fck_48m_rates },
789         { .parent = NULL }
790 };
791
792 static struct clk dss2_fck = {          /* Alt clk used in power management */
793         .name           = "dss2_fck",
794         .ops            = &clkops_omap2_dflt,
795         .parent         = &sys_ck,              /* fixed at sys_ck or 48MHz */
796         .clkdm_name     = "dss_clkdm",
797         .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
798         .enable_bit     = OMAP24XX_EN_DSS2_SHIFT,
799         .init           = &omap2_init_clksel_parent,
800         .clksel_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL1),
801         .clksel_mask    = OMAP24XX_CLKSEL_DSS2_MASK,
802         .clksel         = dss2_fck_clksel,
803         .recalc         = &omap2_clksel_recalc,
804 };
805
806 static struct clk dss_54m_fck = {       /* Alt clk used in power management */
807         .name           = "dss_54m_fck",        /* 54m tv clk */
808         .ops            = &clkops_omap2_dflt_wait,
809         .parent         = &func_54m_ck,
810         .clkdm_name     = "dss_clkdm",
811         .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
812         .enable_bit     = OMAP24XX_EN_TV_SHIFT,
813         .recalc         = &followparent_recalc,
814 };
815
816 static struct clk wu_l4_ick = {
817         .name           = "wu_l4_ick",
818         .ops            = &clkops_null,
819         .parent         = &sys_ck,
820         .clkdm_name     = "wkup_clkdm",
821         .recalc         = &followparent_recalc,
822 };
823
824 /*
825  * CORE power domain ICLK & FCLK defines.
826  * Many of the these can have more than one possible parent. Entries
827  * here will likely have an L4 interface parent, and may have multiple
828  * functional clock parents.
829  */
830 static const struct clksel_rate gpt_alt_rates[] = {
831         { .div = 1, .val = 2, .flags = RATE_IN_24XX },
832         { .div = 0 }
833 };
834
835 static const struct clksel omap24xx_gpt_clksel[] = {
836         { .parent = &func_32k_ck, .rates = gpt_32k_rates },
837         { .parent = &sys_ck,      .rates = gpt_sys_rates },
838         { .parent = &alt_ck,      .rates = gpt_alt_rates },
839         { .parent = NULL },
840 };
841
842 static struct clk gpt1_ick = {
843         .name           = "gpt1_ick",
844         .ops            = &clkops_omap2_iclk_dflt_wait,
845         .parent         = &wu_l4_ick,
846         .clkdm_name     = "wkup_clkdm",
847         .enable_reg     = OMAP_CM_REGADDR(WKUP_MOD, CM_ICLKEN),
848         .enable_bit     = OMAP24XX_EN_GPT1_SHIFT,
849         .recalc         = &followparent_recalc,
850 };
851
852 static struct clk gpt1_fck = {
853         .name           = "gpt1_fck",
854         .ops            = &clkops_omap2_dflt_wait,
855         .parent         = &func_32k_ck,
856         .clkdm_name     = "core_l4_clkdm",
857         .enable_reg     = OMAP_CM_REGADDR(WKUP_MOD, CM_FCLKEN),
858         .enable_bit     = OMAP24XX_EN_GPT1_SHIFT,
859         .init           = &omap2_init_clksel_parent,
860         .clksel_reg     = OMAP_CM_REGADDR(WKUP_MOD, CM_CLKSEL1),
861         .clksel_mask    = OMAP24XX_CLKSEL_GPT1_MASK,
862         .clksel         = omap24xx_gpt_clksel,
863         .recalc         = &omap2_clksel_recalc,
864         .round_rate     = &omap2_clksel_round_rate,
865         .set_rate       = &omap2_clksel_set_rate
866 };
867
868 static struct clk gpt2_ick = {
869         .name           = "gpt2_ick",
870         .ops            = &clkops_omap2_iclk_dflt_wait,
871         .parent         = &l4_ck,
872         .clkdm_name     = "core_l4_clkdm",
873         .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
874         .enable_bit     = OMAP24XX_EN_GPT2_SHIFT,
875         .recalc         = &followparent_recalc,
876 };
877
878 static struct clk gpt2_fck = {
879         .name           = "gpt2_fck",
880         .ops            = &clkops_omap2_dflt_wait,
881         .parent         = &func_32k_ck,
882         .clkdm_name     = "core_l4_clkdm",
883         .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
884         .enable_bit     = OMAP24XX_EN_GPT2_SHIFT,
885         .init           = &omap2_init_clksel_parent,
886         .clksel_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL2),
887         .clksel_mask    = OMAP24XX_CLKSEL_GPT2_MASK,
888         .clksel         = omap24xx_gpt_clksel,
889         .recalc         = &omap2_clksel_recalc,
890 };
891
892 static struct clk gpt3_ick = {
893         .name           = "gpt3_ick",
894         .ops            = &clkops_omap2_iclk_dflt_wait,
895         .parent         = &l4_ck,
896         .clkdm_name     = "core_l4_clkdm",
897         .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
898         .enable_bit     = OMAP24XX_EN_GPT3_SHIFT,
899         .recalc         = &followparent_recalc,
900 };
901
902 static struct clk gpt3_fck = {
903         .name           = "gpt3_fck",
904         .ops            = &clkops_omap2_dflt_wait,
905         .parent         = &func_32k_ck,
906         .clkdm_name     = "core_l4_clkdm",
907         .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
908         .enable_bit     = OMAP24XX_EN_GPT3_SHIFT,
909         .init           = &omap2_init_clksel_parent,
910         .clksel_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL2),
911         .clksel_mask    = OMAP24XX_CLKSEL_GPT3_MASK,
912         .clksel         = omap24xx_gpt_clksel,
913         .recalc         = &omap2_clksel_recalc,
914 };
915
916 static struct clk gpt4_ick = {
917         .name           = "gpt4_ick",
918         .ops            = &clkops_omap2_iclk_dflt_wait,
919         .parent         = &l4_ck,
920         .clkdm_name     = "core_l4_clkdm",
921         .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
922         .enable_bit     = OMAP24XX_EN_GPT4_SHIFT,
923         .recalc         = &followparent_recalc,
924 };
925
926 static struct clk gpt4_fck = {
927         .name           = "gpt4_fck",
928         .ops            = &clkops_omap2_dflt_wait,
929         .parent         = &func_32k_ck,
930         .clkdm_name     = "core_l4_clkdm",
931         .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
932         .enable_bit     = OMAP24XX_EN_GPT4_SHIFT,
933         .init           = &omap2_init_clksel_parent,
934         .clksel_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL2),
935         .clksel_mask    = OMAP24XX_CLKSEL_GPT4_MASK,
936         .clksel         = omap24xx_gpt_clksel,
937         .recalc         = &omap2_clksel_recalc,
938 };
939
940 static struct clk gpt5_ick = {
941         .name           = "gpt5_ick",
942         .ops            = &clkops_omap2_iclk_dflt_wait,
943         .parent         = &l4_ck,
944         .clkdm_name     = "core_l4_clkdm",
945         .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
946         .enable_bit     = OMAP24XX_EN_GPT5_SHIFT,
947         .recalc         = &followparent_recalc,
948 };
949
950 static struct clk gpt5_fck = {
951         .name           = "gpt5_fck",
952         .ops            = &clkops_omap2_dflt_wait,
953         .parent         = &func_32k_ck,
954         .clkdm_name     = "core_l4_clkdm",
955         .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
956         .enable_bit     = OMAP24XX_EN_GPT5_SHIFT,
957         .init           = &omap2_init_clksel_parent,
958         .clksel_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL2),
959         .clksel_mask    = OMAP24XX_CLKSEL_GPT5_MASK,
960         .clksel         = omap24xx_gpt_clksel,
961         .recalc         = &omap2_clksel_recalc,
962 };
963
964 static struct clk gpt6_ick = {
965         .name           = "gpt6_ick",
966         .ops            = &clkops_omap2_iclk_dflt_wait,
967         .parent         = &l4_ck,
968         .clkdm_name     = "core_l4_clkdm",
969         .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
970         .enable_bit     = OMAP24XX_EN_GPT6_SHIFT,
971         .recalc         = &followparent_recalc,
972 };
973
974 static struct clk gpt6_fck = {
975         .name           = "gpt6_fck",
976         .ops            = &clkops_omap2_dflt_wait,
977         .parent         = &func_32k_ck,
978         .clkdm_name     = "core_l4_clkdm",
979         .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
980         .enable_bit     = OMAP24XX_EN_GPT6_SHIFT,
981         .init           = &omap2_init_clksel_parent,
982         .clksel_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL2),
983         .clksel_mask    = OMAP24XX_CLKSEL_GPT6_MASK,
984         .clksel         = omap24xx_gpt_clksel,
985         .recalc         = &omap2_clksel_recalc,
986 };
987
988 static struct clk gpt7_ick = {
989         .name           = "gpt7_ick",
990         .ops            = &clkops_omap2_iclk_dflt_wait,
991         .parent         = &l4_ck,
992         .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
993         .enable_bit     = OMAP24XX_EN_GPT7_SHIFT,
994         .recalc         = &followparent_recalc,
995 };
996
997 static struct clk gpt7_fck = {
998         .name           = "gpt7_fck",
999         .ops            = &clkops_omap2_dflt_wait,
1000         .parent         = &func_32k_ck,
1001         .clkdm_name     = "core_l4_clkdm",
1002         .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1003         .enable_bit     = OMAP24XX_EN_GPT7_SHIFT,
1004         .init           = &omap2_init_clksel_parent,
1005         .clksel_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL2),
1006         .clksel_mask    = OMAP24XX_CLKSEL_GPT7_MASK,
1007         .clksel         = omap24xx_gpt_clksel,
1008         .recalc         = &omap2_clksel_recalc,
1009 };
1010
1011 static struct clk gpt8_ick = {
1012         .name           = "gpt8_ick",
1013         .ops            = &clkops_omap2_iclk_dflt_wait,
1014         .parent         = &l4_ck,
1015         .clkdm_name     = "core_l4_clkdm",
1016         .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1017         .enable_bit     = OMAP24XX_EN_GPT8_SHIFT,
1018         .recalc         = &followparent_recalc,
1019 };
1020
1021 static struct clk gpt8_fck = {
1022         .name           = "gpt8_fck",
1023         .ops            = &clkops_omap2_dflt_wait,
1024         .parent         = &func_32k_ck,
1025         .clkdm_name     = "core_l4_clkdm",
1026         .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1027         .enable_bit     = OMAP24XX_EN_GPT8_SHIFT,
1028         .init           = &omap2_init_clksel_parent,
1029         .clksel_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL2),
1030         .clksel_mask    = OMAP24XX_CLKSEL_GPT8_MASK,
1031         .clksel         = omap24xx_gpt_clksel,
1032         .recalc         = &omap2_clksel_recalc,
1033 };
1034
1035 static struct clk gpt9_ick = {
1036         .name           = "gpt9_ick",
1037         .ops            = &clkops_omap2_iclk_dflt_wait,
1038         .parent         = &l4_ck,
1039         .clkdm_name     = "core_l4_clkdm",
1040         .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1041         .enable_bit     = OMAP24XX_EN_GPT9_SHIFT,
1042         .recalc         = &followparent_recalc,
1043 };
1044
1045 static struct clk gpt9_fck = {
1046         .name           = "gpt9_fck",
1047         .ops            = &clkops_omap2_dflt_wait,
1048         .parent         = &func_32k_ck,
1049         .clkdm_name     = "core_l4_clkdm",
1050         .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1051         .enable_bit     = OMAP24XX_EN_GPT9_SHIFT,
1052         .init           = &omap2_init_clksel_parent,
1053         .clksel_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL2),
1054         .clksel_mask    = OMAP24XX_CLKSEL_GPT9_MASK,
1055         .clksel         = omap24xx_gpt_clksel,
1056         .recalc         = &omap2_clksel_recalc,
1057 };
1058
1059 static struct clk gpt10_ick = {
1060         .name           = "gpt10_ick",
1061         .ops            = &clkops_omap2_iclk_dflt_wait,
1062         .parent         = &l4_ck,
1063         .clkdm_name     = "core_l4_clkdm",
1064         .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1065         .enable_bit     = OMAP24XX_EN_GPT10_SHIFT,
1066         .recalc         = &followparent_recalc,
1067 };
1068
1069 static struct clk gpt10_fck = {
1070         .name           = "gpt10_fck",
1071         .ops            = &clkops_omap2_dflt_wait,
1072         .parent         = &func_32k_ck,
1073         .clkdm_name     = "core_l4_clkdm",
1074         .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1075         .enable_bit     = OMAP24XX_EN_GPT10_SHIFT,
1076         .init           = &omap2_init_clksel_parent,
1077         .clksel_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL2),
1078         .clksel_mask    = OMAP24XX_CLKSEL_GPT10_MASK,
1079         .clksel         = omap24xx_gpt_clksel,
1080         .recalc         = &omap2_clksel_recalc,
1081 };
1082
1083 static struct clk gpt11_ick = {
1084         .name           = "gpt11_ick",
1085         .ops            = &clkops_omap2_iclk_dflt_wait,
1086         .parent         = &l4_ck,
1087         .clkdm_name     = "core_l4_clkdm",
1088         .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1089         .enable_bit     = OMAP24XX_EN_GPT11_SHIFT,
1090         .recalc         = &followparent_recalc,
1091 };
1092
1093 static struct clk gpt11_fck = {
1094         .name           = "gpt11_fck",
1095         .ops            = &clkops_omap2_dflt_wait,
1096         .parent         = &func_32k_ck,
1097         .clkdm_name     = "core_l4_clkdm",
1098         .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1099         .enable_bit     = OMAP24XX_EN_GPT11_SHIFT,
1100         .init           = &omap2_init_clksel_parent,
1101         .clksel_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL2),
1102         .clksel_mask    = OMAP24XX_CLKSEL_GPT11_MASK,
1103         .clksel         = omap24xx_gpt_clksel,
1104         .recalc         = &omap2_clksel_recalc,
1105 };
1106
1107 static struct clk gpt12_ick = {
1108         .name           = "gpt12_ick",
1109         .ops            = &clkops_omap2_iclk_dflt_wait,
1110         .parent         = &l4_ck,
1111         .clkdm_name     = "core_l4_clkdm",
1112         .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1113         .enable_bit     = OMAP24XX_EN_GPT12_SHIFT,
1114         .recalc         = &followparent_recalc,
1115 };
1116
1117 static struct clk gpt12_fck = {
1118         .name           = "gpt12_fck",
1119         .ops            = &clkops_omap2_dflt_wait,
1120         .parent         = &secure_32k_ck,
1121         .clkdm_name     = "core_l4_clkdm",
1122         .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1123         .enable_bit     = OMAP24XX_EN_GPT12_SHIFT,
1124         .init           = &omap2_init_clksel_parent,
1125         .clksel_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL2),
1126         .clksel_mask    = OMAP24XX_CLKSEL_GPT12_MASK,
1127         .clksel         = omap24xx_gpt_clksel,
1128         .recalc         = &omap2_clksel_recalc,
1129 };
1130
1131 static struct clk mcbsp1_ick = {
1132         .name           = "mcbsp1_ick",
1133         .ops            = &clkops_omap2_iclk_dflt_wait,
1134         .parent         = &l4_ck,
1135         .clkdm_name     = "core_l4_clkdm",
1136         .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1137         .enable_bit     = OMAP24XX_EN_MCBSP1_SHIFT,
1138         .recalc         = &followparent_recalc,
1139 };
1140
1141 static const struct clksel_rate common_mcbsp_96m_rates[] = {
1142         { .div = 1, .val = 0, .flags = RATE_IN_24XX },
1143         { .div = 0 }
1144 };
1145
1146 static const struct clksel_rate common_mcbsp_mcbsp_rates[] = {
1147         { .div = 1, .val = 1, .flags = RATE_IN_24XX },
1148         { .div = 0 }
1149 };
1150
1151 static const struct clksel mcbsp_fck_clksel[] = {
1152         { .parent = &func_96m_ck,  .rates = common_mcbsp_96m_rates },
1153         { .parent = &mcbsp_clks,   .rates = common_mcbsp_mcbsp_rates },
1154         { .parent = NULL }
1155 };
1156
1157 static struct clk mcbsp1_fck = {
1158         .name           = "mcbsp1_fck",
1159         .ops            = &clkops_omap2_dflt_wait,
1160         .parent         = &func_96m_ck,
1161         .init           = &omap2_init_clksel_parent,
1162         .clkdm_name     = "core_l4_clkdm",
1163         .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1164         .enable_bit     = OMAP24XX_EN_MCBSP1_SHIFT,
1165         .clksel_reg     = OMAP243X_CTRL_REGADDR(OMAP2_CONTROL_DEVCONF0),
1166         .clksel_mask    = OMAP2_MCBSP1_CLKS_MASK,
1167         .clksel         = mcbsp_fck_clksel,
1168         .recalc         = &omap2_clksel_recalc,
1169 };
1170
1171 static struct clk mcbsp2_ick = {
1172         .name           = "mcbsp2_ick",
1173         .ops            = &clkops_omap2_iclk_dflt_wait,
1174         .parent         = &l4_ck,
1175         .clkdm_name     = "core_l4_clkdm",
1176         .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1177         .enable_bit     = OMAP24XX_EN_MCBSP2_SHIFT,
1178         .recalc         = &followparent_recalc,
1179 };
1180
1181 static struct clk mcbsp2_fck = {
1182         .name           = "mcbsp2_fck",
1183         .ops            = &clkops_omap2_dflt_wait,
1184         .parent         = &func_96m_ck,
1185         .init           = &omap2_init_clksel_parent,
1186         .clkdm_name     = "core_l4_clkdm",
1187         .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1188         .enable_bit     = OMAP24XX_EN_MCBSP2_SHIFT,
1189         .clksel_reg     = OMAP243X_CTRL_REGADDR(OMAP2_CONTROL_DEVCONF0),
1190         .clksel_mask    = OMAP2_MCBSP2_CLKS_MASK,
1191         .clksel         = mcbsp_fck_clksel,
1192         .recalc         = &omap2_clksel_recalc,
1193 };
1194
1195 static struct clk mcbsp3_ick = {
1196         .name           = "mcbsp3_ick",
1197         .ops            = &clkops_omap2_iclk_dflt_wait,
1198         .parent         = &l4_ck,
1199         .clkdm_name     = "core_l4_clkdm",
1200         .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN2),
1201         .enable_bit     = OMAP2430_EN_MCBSP3_SHIFT,
1202         .recalc         = &followparent_recalc,
1203 };
1204
1205 static struct clk mcbsp3_fck = {
1206         .name           = "mcbsp3_fck",
1207         .ops            = &clkops_omap2_dflt_wait,
1208         .parent         = &func_96m_ck,
1209         .init           = &omap2_init_clksel_parent,
1210         .clkdm_name     = "core_l4_clkdm",
1211         .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, OMAP24XX_CM_FCLKEN2),
1212         .enable_bit     = OMAP2430_EN_MCBSP3_SHIFT,
1213         .clksel_reg     = OMAP243X_CTRL_REGADDR(OMAP243X_CONTROL_DEVCONF1),
1214         .clksel_mask    = OMAP2_MCBSP3_CLKS_MASK,
1215         .clksel         = mcbsp_fck_clksel,
1216         .recalc         = &omap2_clksel_recalc,
1217 };
1218
1219 static struct clk mcbsp4_ick = {
1220         .name           = "mcbsp4_ick",
1221         .ops            = &clkops_omap2_iclk_dflt_wait,
1222         .parent         = &l4_ck,
1223         .clkdm_name     = "core_l4_clkdm",
1224         .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN2),
1225         .enable_bit     = OMAP2430_EN_MCBSP4_SHIFT,
1226         .recalc         = &followparent_recalc,
1227 };
1228
1229 static struct clk mcbsp4_fck = {
1230         .name           = "mcbsp4_fck",
1231         .ops            = &clkops_omap2_dflt_wait,
1232         .parent         = &func_96m_ck,
1233         .init           = &omap2_init_clksel_parent,
1234         .clkdm_name     = "core_l4_clkdm",
1235         .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, OMAP24XX_CM_FCLKEN2),
1236         .enable_bit     = OMAP2430_EN_MCBSP4_SHIFT,
1237         .clksel_reg     = OMAP243X_CTRL_REGADDR(OMAP243X_CONTROL_DEVCONF1),
1238         .clksel_mask    = OMAP2_MCBSP4_CLKS_MASK,
1239         .clksel         = mcbsp_fck_clksel,
1240         .recalc         = &omap2_clksel_recalc,
1241 };
1242
1243 static struct clk mcbsp5_ick = {
1244         .name           = "mcbsp5_ick",
1245         .ops            = &clkops_omap2_iclk_dflt_wait,
1246         .parent         = &l4_ck,
1247         .clkdm_name     = "core_l4_clkdm",
1248         .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN2),
1249         .enable_bit     = OMAP2430_EN_MCBSP5_SHIFT,
1250         .recalc         = &followparent_recalc,
1251 };
1252
1253 static struct clk mcbsp5_fck = {
1254         .name           = "mcbsp5_fck",
1255         .ops            = &clkops_omap2_dflt_wait,
1256         .parent         = &func_96m_ck,
1257         .init           = &omap2_init_clksel_parent,
1258         .clkdm_name     = "core_l4_clkdm",
1259         .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, OMAP24XX_CM_FCLKEN2),
1260         .enable_bit     = OMAP2430_EN_MCBSP5_SHIFT,
1261         .clksel_reg     = OMAP243X_CTRL_REGADDR(OMAP243X_CONTROL_DEVCONF1),
1262         .clksel_mask    = OMAP2_MCBSP5_CLKS_MASK,
1263         .clksel         = mcbsp_fck_clksel,
1264         .recalc         = &omap2_clksel_recalc,
1265 };
1266
1267 static struct clk mcspi1_ick = {
1268         .name           = "mcspi1_ick",
1269         .ops            = &clkops_omap2_iclk_dflt_wait,
1270         .parent         = &l4_ck,
1271         .clkdm_name     = "core_l4_clkdm",
1272         .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1273         .enable_bit     = OMAP24XX_EN_MCSPI1_SHIFT,
1274         .recalc         = &followparent_recalc,
1275 };
1276
1277 static struct clk mcspi1_fck = {
1278         .name           = "mcspi1_fck",
1279         .ops            = &clkops_omap2_dflt_wait,
1280         .parent         = &func_48m_ck,
1281         .clkdm_name     = "core_l4_clkdm",
1282         .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1283         .enable_bit     = OMAP24XX_EN_MCSPI1_SHIFT,
1284         .recalc         = &followparent_recalc,
1285 };
1286
1287 static struct clk mcspi2_ick = {
1288         .name           = "mcspi2_ick",
1289         .ops            = &clkops_omap2_iclk_dflt_wait,
1290         .parent         = &l4_ck,
1291         .clkdm_name     = "core_l4_clkdm",
1292         .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1293         .enable_bit     = OMAP24XX_EN_MCSPI2_SHIFT,
1294         .recalc         = &followparent_recalc,
1295 };
1296
1297 static struct clk mcspi2_fck = {
1298         .name           = "mcspi2_fck",
1299         .ops            = &clkops_omap2_dflt_wait,
1300         .parent         = &func_48m_ck,
1301         .clkdm_name     = "core_l4_clkdm",
1302         .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1303         .enable_bit     = OMAP24XX_EN_MCSPI2_SHIFT,
1304         .recalc         = &followparent_recalc,
1305 };
1306
1307 static struct clk mcspi3_ick = {
1308         .name           = "mcspi3_ick",
1309         .ops            = &clkops_omap2_iclk_dflt_wait,
1310         .parent         = &l4_ck,
1311         .clkdm_name     = "core_l4_clkdm",
1312         .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN2),
1313         .enable_bit     = OMAP2430_EN_MCSPI3_SHIFT,
1314         .recalc         = &followparent_recalc,
1315 };
1316
1317 static struct clk mcspi3_fck = {
1318         .name           = "mcspi3_fck",
1319         .ops            = &clkops_omap2_dflt_wait,
1320         .parent         = &func_48m_ck,
1321         .clkdm_name     = "core_l4_clkdm",
1322         .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, OMAP24XX_CM_FCLKEN2),
1323         .enable_bit     = OMAP2430_EN_MCSPI3_SHIFT,
1324         .recalc         = &followparent_recalc,
1325 };
1326
1327 static struct clk uart1_ick = {
1328         .name           = "uart1_ick",
1329         .ops            = &clkops_omap2_iclk_dflt_wait,
1330         .parent         = &l4_ck,
1331         .clkdm_name     = "core_l4_clkdm",
1332         .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1333         .enable_bit     = OMAP24XX_EN_UART1_SHIFT,
1334         .recalc         = &followparent_recalc,
1335 };
1336
1337 static struct clk uart1_fck = {
1338         .name           = "uart1_fck",
1339         .ops            = &clkops_omap2_dflt_wait,
1340         .parent         = &func_48m_ck,
1341         .clkdm_name     = "core_l4_clkdm",
1342         .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1343         .enable_bit     = OMAP24XX_EN_UART1_SHIFT,
1344         .recalc         = &followparent_recalc,
1345 };
1346
1347 static struct clk uart2_ick = {
1348         .name           = "uart2_ick",
1349         .ops            = &clkops_omap2_iclk_dflt_wait,
1350         .parent         = &l4_ck,
1351         .clkdm_name     = "core_l4_clkdm",
1352         .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1353         .enable_bit     = OMAP24XX_EN_UART2_SHIFT,
1354         .recalc         = &followparent_recalc,
1355 };
1356
1357 static struct clk uart2_fck = {
1358         .name           = "uart2_fck",
1359         .ops            = &clkops_omap2_dflt_wait,
1360         .parent         = &func_48m_ck,
1361         .clkdm_name     = "core_l4_clkdm",
1362         .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1363         .enable_bit     = OMAP24XX_EN_UART2_SHIFT,
1364         .recalc         = &followparent_recalc,
1365 };
1366
1367 static struct clk uart3_ick = {
1368         .name           = "uart3_ick",
1369         .ops            = &clkops_omap2_iclk_dflt_wait,
1370         .parent         = &l4_ck,
1371         .clkdm_name     = "core_l4_clkdm",
1372         .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN2),
1373         .enable_bit     = OMAP24XX_EN_UART3_SHIFT,
1374         .recalc         = &followparent_recalc,
1375 };
1376
1377 static struct clk uart3_fck = {
1378         .name           = "uart3_fck",
1379         .ops            = &clkops_omap2_dflt_wait,
1380         .parent         = &func_48m_ck,
1381         .clkdm_name     = "core_l4_clkdm",
1382         .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, OMAP24XX_CM_FCLKEN2),
1383         .enable_bit     = OMAP24XX_EN_UART3_SHIFT,
1384         .recalc         = &followparent_recalc,
1385 };
1386
1387 static struct clk gpios_ick = {
1388         .name           = "gpios_ick",
1389         .ops            = &clkops_omap2_iclk_dflt_wait,
1390         .parent         = &wu_l4_ick,
1391         .clkdm_name     = "wkup_clkdm",
1392         .enable_reg     = OMAP_CM_REGADDR(WKUP_MOD, CM_ICLKEN),
1393         .enable_bit     = OMAP24XX_EN_GPIOS_SHIFT,
1394         .recalc         = &followparent_recalc,
1395 };
1396
1397 static struct clk gpios_fck = {
1398         .name           = "gpios_fck",
1399         .ops            = &clkops_omap2_dflt_wait,
1400         .parent         = &func_32k_ck,
1401         .clkdm_name     = "wkup_clkdm",
1402         .enable_reg     = OMAP_CM_REGADDR(WKUP_MOD, CM_FCLKEN),
1403         .enable_bit     = OMAP24XX_EN_GPIOS_SHIFT,
1404         .recalc         = &followparent_recalc,
1405 };
1406
1407 static struct clk mpu_wdt_ick = {
1408         .name           = "mpu_wdt_ick",
1409         .ops            = &clkops_omap2_iclk_dflt_wait,
1410         .parent         = &wu_l4_ick,
1411         .clkdm_name     = "wkup_clkdm",
1412         .enable_reg     = OMAP_CM_REGADDR(WKUP_MOD, CM_ICLKEN),
1413         .enable_bit     = OMAP24XX_EN_MPU_WDT_SHIFT,
1414         .recalc         = &followparent_recalc,
1415 };
1416
1417 static struct clk mpu_wdt_fck = {
1418         .name           = "mpu_wdt_fck",
1419         .ops            = &clkops_omap2_dflt_wait,
1420         .parent         = &func_32k_ck,
1421         .clkdm_name     = "wkup_clkdm",
1422         .enable_reg     = OMAP_CM_REGADDR(WKUP_MOD, CM_FCLKEN),
1423         .enable_bit     = OMAP24XX_EN_MPU_WDT_SHIFT,
1424         .recalc         = &followparent_recalc,
1425 };
1426
1427 static struct clk sync_32k_ick = {
1428         .name           = "sync_32k_ick",
1429         .ops            = &clkops_omap2_iclk_dflt_wait,
1430         .flags          = ENABLE_ON_INIT,
1431         .parent         = &wu_l4_ick,
1432         .clkdm_name     = "wkup_clkdm",
1433         .enable_reg     = OMAP_CM_REGADDR(WKUP_MOD, CM_ICLKEN),
1434         .enable_bit     = OMAP24XX_EN_32KSYNC_SHIFT,
1435         .recalc         = &followparent_recalc,
1436 };
1437
1438 static struct clk wdt1_ick = {
1439         .name           = "wdt1_ick",
1440         .ops            = &clkops_omap2_iclk_dflt_wait,
1441         .parent         = &wu_l4_ick,
1442         .clkdm_name     = "wkup_clkdm",
1443         .enable_reg     = OMAP_CM_REGADDR(WKUP_MOD, CM_ICLKEN),
1444         .enable_bit     = OMAP24XX_EN_WDT1_SHIFT,
1445         .recalc         = &followparent_recalc,
1446 };
1447
1448 static struct clk omapctrl_ick = {
1449         .name           = "omapctrl_ick",
1450         .ops            = &clkops_omap2_iclk_dflt_wait,
1451         .flags          = ENABLE_ON_INIT,
1452         .parent         = &wu_l4_ick,
1453         .clkdm_name     = "wkup_clkdm",
1454         .enable_reg     = OMAP_CM_REGADDR(WKUP_MOD, CM_ICLKEN),
1455         .enable_bit     = OMAP24XX_EN_OMAPCTRL_SHIFT,
1456         .recalc         = &followparent_recalc,
1457 };
1458
1459 static struct clk icr_ick = {
1460         .name           = "icr_ick",
1461         .ops            = &clkops_omap2_iclk_dflt_wait,
1462         .parent         = &wu_l4_ick,
1463         .clkdm_name     = "wkup_clkdm",
1464         .enable_reg     = OMAP_CM_REGADDR(WKUP_MOD, CM_ICLKEN),
1465         .enable_bit     = OMAP2430_EN_ICR_SHIFT,
1466         .recalc         = &followparent_recalc,
1467 };
1468
1469 static struct clk cam_ick = {
1470         .name           = "cam_ick",
1471         .ops            = &clkops_omap2_iclk_dflt,
1472         .parent         = &l4_ck,
1473         .clkdm_name     = "core_l4_clkdm",
1474         .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1475         .enable_bit     = OMAP24XX_EN_CAM_SHIFT,
1476         .recalc         = &followparent_recalc,
1477 };
1478
1479 /*
1480  * cam_fck controls both CAM_MCLK and CAM_FCLK.  It should probably be
1481  * split into two separate clocks, since the parent clocks are different
1482  * and the clockdomains are also different.
1483  */
1484 static struct clk cam_fck = {
1485         .name           = "cam_fck",
1486         .ops            = &clkops_omap2_dflt,
1487         .parent         = &func_96m_ck,
1488         .clkdm_name     = "core_l3_clkdm",
1489         .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1490         .enable_bit     = OMAP24XX_EN_CAM_SHIFT,
1491         .recalc         = &followparent_recalc,
1492 };
1493
1494 static struct clk mailboxes_ick = {
1495         .name           = "mailboxes_ick",
1496         .ops            = &clkops_omap2_iclk_dflt_wait,
1497         .parent         = &l4_ck,
1498         .clkdm_name     = "core_l4_clkdm",
1499         .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1500         .enable_bit     = OMAP24XX_EN_MAILBOXES_SHIFT,
1501         .recalc         = &followparent_recalc,
1502 };
1503
1504 static struct clk wdt4_ick = {
1505         .name           = "wdt4_ick",
1506         .ops            = &clkops_omap2_iclk_dflt_wait,
1507         .parent         = &l4_ck,
1508         .clkdm_name     = "core_l4_clkdm",
1509         .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1510         .enable_bit     = OMAP24XX_EN_WDT4_SHIFT,
1511         .recalc         = &followparent_recalc,
1512 };
1513
1514 static struct clk wdt4_fck = {
1515         .name           = "wdt4_fck",
1516         .ops            = &clkops_omap2_dflt_wait,
1517         .parent         = &func_32k_ck,
1518         .clkdm_name     = "core_l4_clkdm",
1519         .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1520         .enable_bit     = OMAP24XX_EN_WDT4_SHIFT,
1521         .recalc         = &followparent_recalc,
1522 };
1523
1524 static struct clk mspro_ick = {
1525         .name           = "mspro_ick",
1526         .ops            = &clkops_omap2_iclk_dflt_wait,
1527         .parent         = &l4_ck,
1528         .clkdm_name     = "core_l4_clkdm",
1529         .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1530         .enable_bit     = OMAP24XX_EN_MSPRO_SHIFT,
1531         .recalc         = &followparent_recalc,
1532 };
1533
1534 static struct clk mspro_fck = {
1535         .name           = "mspro_fck",
1536         .ops            = &clkops_omap2_dflt_wait,
1537         .parent         = &func_96m_ck,
1538         .clkdm_name     = "core_l4_clkdm",
1539         .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1540         .enable_bit     = OMAP24XX_EN_MSPRO_SHIFT,
1541         .recalc         = &followparent_recalc,
1542 };
1543
1544 static struct clk fac_ick = {
1545         .name           = "fac_ick",
1546         .ops            = &clkops_omap2_iclk_dflt_wait,
1547         .parent         = &l4_ck,
1548         .clkdm_name     = "core_l4_clkdm",
1549         .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1550         .enable_bit     = OMAP24XX_EN_FAC_SHIFT,
1551         .recalc         = &followparent_recalc,
1552 };
1553
1554 static struct clk fac_fck = {
1555         .name           = "fac_fck",
1556         .ops            = &clkops_omap2_dflt_wait,
1557         .parent         = &func_12m_ck,
1558         .clkdm_name     = "core_l4_clkdm",
1559         .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1560         .enable_bit     = OMAP24XX_EN_FAC_SHIFT,
1561         .recalc         = &followparent_recalc,
1562 };
1563
1564 static struct clk hdq_ick = {
1565         .name           = "hdq_ick",
1566         .ops            = &clkops_omap2_iclk_dflt_wait,
1567         .parent         = &l4_ck,
1568         .clkdm_name     = "core_l4_clkdm",
1569         .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1570         .enable_bit     = OMAP24XX_EN_HDQ_SHIFT,
1571         .recalc         = &followparent_recalc,
1572 };
1573
1574 static struct clk hdq_fck = {
1575         .name           = "hdq_fck",
1576         .ops            = &clkops_omap2_dflt_wait,
1577         .parent         = &func_12m_ck,
1578         .clkdm_name     = "core_l4_clkdm",
1579         .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1580         .enable_bit     = OMAP24XX_EN_HDQ_SHIFT,
1581         .recalc         = &followparent_recalc,
1582 };
1583
1584 /*
1585  * XXX This is marked as a 2420-only define, but it claims to be present
1586  * on 2430 also.  Double-check.
1587  */
1588 static struct clk i2c2_ick = {
1589         .name           = "i2c2_ick",
1590         .ops            = &clkops_omap2_iclk_dflt_wait,
1591         .parent         = &l4_ck,
1592         .clkdm_name     = "core_l4_clkdm",
1593         .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1594         .enable_bit     = OMAP2420_EN_I2C2_SHIFT,
1595         .recalc         = &followparent_recalc,
1596 };
1597
1598 static struct clk i2chs2_fck = {
1599         .name           = "i2chs2_fck",
1600         .ops            = &clkops_omap2430_i2chs_wait,
1601         .parent         = &func_96m_ck,
1602         .clkdm_name     = "core_l4_clkdm",
1603         .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, OMAP24XX_CM_FCLKEN2),
1604         .enable_bit     = OMAP2430_EN_I2CHS2_SHIFT,
1605         .recalc         = &followparent_recalc,
1606 };
1607
1608 /*
1609  * XXX This is marked as a 2420-only define, but it claims to be present
1610  * on 2430 also.  Double-check.
1611  */
1612 static struct clk i2c1_ick = {
1613         .name           = "i2c1_ick",
1614         .ops            = &clkops_omap2_iclk_dflt_wait,
1615         .parent         = &l4_ck,
1616         .clkdm_name     = "core_l4_clkdm",
1617         .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1618         .enable_bit     = OMAP2420_EN_I2C1_SHIFT,
1619         .recalc         = &followparent_recalc,
1620 };
1621
1622 static struct clk i2chs1_fck = {
1623         .name           = "i2chs1_fck",
1624         .ops            = &clkops_omap2430_i2chs_wait,
1625         .parent         = &func_96m_ck,
1626         .clkdm_name     = "core_l4_clkdm",
1627         .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, OMAP24XX_CM_FCLKEN2),
1628         .enable_bit     = OMAP2430_EN_I2CHS1_SHIFT,
1629         .recalc         = &followparent_recalc,
1630 };
1631
1632 /*
1633  * The enable_reg/enable_bit in this clock is only used for CM_AUTOIDLE
1634  * accesses derived from this data.
1635  */
1636 static struct clk gpmc_fck = {
1637         .name           = "gpmc_fck",
1638         .ops            = &clkops_omap2_iclk_idle_only,
1639         .parent         = &core_l3_ck,
1640         .flags          = ENABLE_ON_INIT,
1641         .clkdm_name     = "core_l3_clkdm",
1642         .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN3),
1643         .enable_bit     = OMAP24XX_AUTO_GPMC_SHIFT,
1644         .recalc         = &followparent_recalc,
1645 };
1646
1647 static struct clk sdma_fck = {
1648         .name           = "sdma_fck",
1649         .ops            = &clkops_null, /* RMK: missing? */
1650         .parent         = &core_l3_ck,
1651         .clkdm_name     = "core_l3_clkdm",
1652         .recalc         = &followparent_recalc,
1653 };
1654
1655 /*
1656  * The enable_reg/enable_bit in this clock is only used for CM_AUTOIDLE
1657  * accesses derived from this data.
1658  */
1659 static struct clk sdma_ick = {
1660         .name           = "sdma_ick",
1661         .ops            = &clkops_omap2_iclk_idle_only,
1662         .parent         = &core_l3_ck,
1663         .clkdm_name     = "core_l3_clkdm",
1664         .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN3),
1665         .enable_bit     = OMAP24XX_AUTO_SDMA_SHIFT,
1666         .recalc         = &followparent_recalc,
1667 };
1668
1669 static struct clk sdrc_ick = {
1670         .name           = "sdrc_ick",
1671         .ops            = &clkops_omap2_iclk_idle_only,
1672         .parent         = &core_l3_ck,
1673         .flags          = ENABLE_ON_INIT,
1674         .clkdm_name     = "core_l3_clkdm",
1675         .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN3),
1676         .enable_bit     = OMAP2430_EN_SDRC_SHIFT,
1677         .recalc         = &followparent_recalc,
1678 };
1679
1680 static struct clk des_ick = {
1681         .name           = "des_ick",
1682         .ops            = &clkops_omap2_iclk_dflt_wait,
1683         .parent         = &l4_ck,
1684         .clkdm_name     = "core_l4_clkdm",
1685         .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, OMAP24XX_CM_ICLKEN4),
1686         .enable_bit     = OMAP24XX_EN_DES_SHIFT,
1687         .recalc         = &followparent_recalc,
1688 };
1689
1690 static struct clk sha_ick = {
1691         .name           = "sha_ick",
1692         .ops            = &clkops_omap2_iclk_dflt_wait,
1693         .parent         = &l4_ck,
1694         .clkdm_name     = "core_l4_clkdm",
1695         .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, OMAP24XX_CM_ICLKEN4),
1696         .enable_bit     = OMAP24XX_EN_SHA_SHIFT,
1697         .recalc         = &followparent_recalc,
1698 };
1699
1700 static struct clk rng_ick = {
1701         .name           = "rng_ick",
1702         .ops            = &clkops_omap2_iclk_dflt_wait,
1703         .parent         = &l4_ck,
1704         .clkdm_name     = "core_l4_clkdm",
1705         .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, OMAP24XX_CM_ICLKEN4),
1706         .enable_bit     = OMAP24XX_EN_RNG_SHIFT,
1707         .recalc         = &followparent_recalc,
1708 };
1709
1710 static struct clk aes_ick = {
1711         .name           = "aes_ick",
1712         .ops            = &clkops_omap2_iclk_dflt_wait,
1713         .parent         = &l4_ck,
1714         .clkdm_name     = "core_l4_clkdm",
1715         .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, OMAP24XX_CM_ICLKEN4),
1716         .enable_bit     = OMAP24XX_EN_AES_SHIFT,
1717         .recalc         = &followparent_recalc,
1718 };
1719
1720 static struct clk pka_ick = {
1721         .name           = "pka_ick",
1722         .ops            = &clkops_omap2_iclk_dflt_wait,
1723         .parent         = &l4_ck,
1724         .clkdm_name     = "core_l4_clkdm",
1725         .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, OMAP24XX_CM_ICLKEN4),
1726         .enable_bit     = OMAP24XX_EN_PKA_SHIFT,
1727         .recalc         = &followparent_recalc,
1728 };
1729
1730 static struct clk usb_fck = {
1731         .name           = "usb_fck",
1732         .ops            = &clkops_omap2_dflt_wait,
1733         .parent         = &func_48m_ck,
1734         .clkdm_name     = "core_l3_clkdm",
1735         .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, OMAP24XX_CM_FCLKEN2),
1736         .enable_bit     = OMAP24XX_EN_USB_SHIFT,
1737         .recalc         = &followparent_recalc,
1738 };
1739
1740 static struct clk usbhs_ick = {
1741         .name           = "usbhs_ick",
1742         .ops            = &clkops_omap2_iclk_dflt_wait,
1743         .parent         = &core_l3_ck,
1744         .clkdm_name     = "core_l3_clkdm",
1745         .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN2),
1746         .enable_bit     = OMAP2430_EN_USBHS_SHIFT,
1747         .recalc         = &followparent_recalc,
1748 };
1749
1750 static struct clk mmchs1_ick = {
1751         .name           = "mmchs1_ick",
1752         .ops            = &clkops_omap2_iclk_dflt_wait,
1753         .parent         = &l4_ck,
1754         .clkdm_name     = "core_l4_clkdm",
1755         .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN2),
1756         .enable_bit     = OMAP2430_EN_MMCHS1_SHIFT,
1757         .recalc         = &followparent_recalc,
1758 };
1759
1760 static struct clk mmchs1_fck = {
1761         .name           = "mmchs1_fck",
1762         .ops            = &clkops_omap2_dflt_wait,
1763         .parent         = &func_96m_ck,
1764         .clkdm_name     = "core_l3_clkdm",
1765         .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, OMAP24XX_CM_FCLKEN2),
1766         .enable_bit     = OMAP2430_EN_MMCHS1_SHIFT,
1767         .recalc         = &followparent_recalc,
1768 };
1769
1770 static struct clk mmchs2_ick = {
1771         .name           = "mmchs2_ick",
1772         .ops            = &clkops_omap2_iclk_dflt_wait,
1773         .parent         = &l4_ck,
1774         .clkdm_name     = "core_l4_clkdm",
1775         .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN2),
1776         .enable_bit     = OMAP2430_EN_MMCHS2_SHIFT,
1777         .recalc         = &followparent_recalc,
1778 };
1779
1780 static struct clk mmchs2_fck = {
1781         .name           = "mmchs2_fck",
1782         .ops            = &clkops_omap2_dflt_wait,
1783         .parent         = &func_96m_ck,
1784         .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, OMAP24XX_CM_FCLKEN2),
1785         .enable_bit     = OMAP2430_EN_MMCHS2_SHIFT,
1786         .recalc         = &followparent_recalc,
1787 };
1788
1789 static struct clk gpio5_ick = {
1790         .name           = "gpio5_ick",
1791         .ops            = &clkops_omap2_iclk_dflt_wait,
1792         .parent         = &l4_ck,
1793         .clkdm_name     = "core_l4_clkdm",
1794         .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN2),
1795         .enable_bit     = OMAP2430_EN_GPIO5_SHIFT,
1796         .recalc         = &followparent_recalc,
1797 };
1798
1799 static struct clk gpio5_fck = {
1800         .name           = "gpio5_fck",
1801         .ops            = &clkops_omap2_dflt_wait,
1802         .parent         = &func_32k_ck,
1803         .clkdm_name     = "core_l4_clkdm",
1804         .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, OMAP24XX_CM_FCLKEN2),
1805         .enable_bit     = OMAP2430_EN_GPIO5_SHIFT,
1806         .recalc         = &followparent_recalc,
1807 };
1808
1809 static struct clk mdm_intc_ick = {
1810         .name           = "mdm_intc_ick",
1811         .ops            = &clkops_omap2_iclk_dflt_wait,
1812         .parent         = &l4_ck,
1813         .clkdm_name     = "core_l4_clkdm",
1814         .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN2),
1815         .enable_bit     = OMAP2430_EN_MDM_INTC_SHIFT,
1816         .recalc         = &followparent_recalc,
1817 };
1818
1819 static struct clk mmchsdb1_fck = {
1820         .name           = "mmchsdb1_fck",
1821         .ops            = &clkops_omap2_dflt_wait,
1822         .parent         = &func_32k_ck,
1823         .clkdm_name     = "core_l4_clkdm",
1824         .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, OMAP24XX_CM_FCLKEN2),
1825         .enable_bit     = OMAP2430_EN_MMCHSDB1_SHIFT,
1826         .recalc         = &followparent_recalc,
1827 };
1828
1829 static struct clk mmchsdb2_fck = {
1830         .name           = "mmchsdb2_fck",
1831         .ops            = &clkops_omap2_dflt_wait,
1832         .parent         = &func_32k_ck,
1833         .clkdm_name     = "core_l4_clkdm",
1834         .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, OMAP24XX_CM_FCLKEN2),
1835         .enable_bit     = OMAP2430_EN_MMCHSDB2_SHIFT,
1836         .recalc         = &followparent_recalc,
1837 };
1838
1839 /*
1840  * This clock is a composite clock which does entire set changes then
1841  * forces a rebalance. It keys on the MPU speed, but it really could
1842  * be any key speed part of a set in the rate table.
1843  *
1844  * to really change a set, you need memory table sets which get changed
1845  * in sram, pre-notifiers & post notifiers, changing the top set, without
1846  * having low level display recalc's won't work... this is why dpm notifiers
1847  * work, isr's off, walk a list of clocks already _off_ and not messing with
1848  * the bus.
1849  *
1850  * This clock should have no parent. It embodies the entire upper level
1851  * active set. A parent will mess up some of the init also.
1852  */
1853 static struct clk virt_prcm_set = {
1854         .name           = "virt_prcm_set",
1855         .ops            = &clkops_null,
1856         .parent         = &mpu_ck,      /* Indexed by mpu speed, no parent */
1857         .recalc         = &omap2_table_mpu_recalc,      /* sets are keyed on mpu rate */
1858         .set_rate       = &omap2_select_table_rate,
1859         .round_rate     = &omap2_round_to_table_rate,
1860 };
1861
1862
1863 /*
1864  * clkdev integration
1865  */
1866
1867 static struct omap_clk omap2430_clks[] = {
1868         /* external root sources */
1869         CLK(NULL,       "func_32k_ck",  &func_32k_ck,   CK_243X),
1870         CLK(NULL,       "secure_32k_ck", &secure_32k_ck, CK_243X),
1871         CLK(NULL,       "osc_ck",       &osc_ck,        CK_243X),
1872         CLK(NULL,       "sys_ck",       &sys_ck,        CK_243X),
1873         CLK(NULL,       "alt_ck",       &alt_ck,        CK_243X),
1874         CLK("omap-mcbsp.1",     "pad_fck",      &mcbsp_clks,    CK_243X),
1875         CLK("omap-mcbsp.2",     "pad_fck",      &mcbsp_clks,    CK_243X),
1876         CLK("omap-mcbsp.3",     "pad_fck",      &mcbsp_clks,    CK_243X),
1877         CLK("omap-mcbsp.4",     "pad_fck",      &mcbsp_clks,    CK_243X),
1878         CLK("omap-mcbsp.5",     "pad_fck",      &mcbsp_clks,    CK_243X),
1879         CLK(NULL,       "mcbsp_clks",   &mcbsp_clks,    CK_243X),
1880         /* internal analog sources */
1881         CLK(NULL,       "dpll_ck",      &dpll_ck,       CK_243X),
1882         CLK(NULL,       "apll96_ck",    &apll96_ck,     CK_243X),
1883         CLK(NULL,       "apll54_ck",    &apll54_ck,     CK_243X),
1884         /* internal prcm root sources */
1885         CLK(NULL,       "func_54m_ck",  &func_54m_ck,   CK_243X),
1886         CLK(NULL,       "core_ck",      &core_ck,       CK_243X),
1887         CLK("omap-mcbsp.1",     "prcm_fck",     &func_96m_ck,   CK_243X),
1888         CLK("omap-mcbsp.2",     "prcm_fck",     &func_96m_ck,   CK_243X),
1889         CLK("omap-mcbsp.3",     "prcm_fck",     &func_96m_ck,   CK_243X),
1890         CLK("omap-mcbsp.4",     "prcm_fck",     &func_96m_ck,   CK_243X),
1891         CLK("omap-mcbsp.5",     "prcm_fck",     &func_96m_ck,   CK_243X),
1892         CLK(NULL,       "func_96m_ck",  &func_96m_ck,   CK_243X),
1893         CLK(NULL,       "func_48m_ck",  &func_48m_ck,   CK_243X),
1894         CLK(NULL,       "func_12m_ck",  &func_12m_ck,   CK_243X),
1895         CLK(NULL,       "ck_wdt1_osc",  &wdt1_osc_ck,   CK_243X),
1896         CLK(NULL,       "sys_clkout_src", &sys_clkout_src, CK_243X),
1897         CLK(NULL,       "sys_clkout",   &sys_clkout,    CK_243X),
1898         CLK(NULL,       "emul_ck",      &emul_ck,       CK_243X),
1899         /* mpu domain clocks */
1900         CLK(NULL,       "mpu_ck",       &mpu_ck,        CK_243X),
1901         /* dsp domain clocks */
1902         CLK(NULL,       "dsp_fck",      &dsp_fck,       CK_243X),
1903         CLK(NULL,       "dsp_irate_ick", &dsp_irate_ick, CK_243X),
1904         CLK(NULL,       "iva2_1_ick",   &iva2_1_ick,    CK_243X),
1905         /* GFX domain clocks */
1906         CLK(NULL,       "gfx_3d_fck",   &gfx_3d_fck,    CK_243X),
1907         CLK(NULL,       "gfx_2d_fck",   &gfx_2d_fck,    CK_243X),
1908         CLK(NULL,       "gfx_ick",      &gfx_ick,       CK_243X),
1909         /* Modem domain clocks */
1910         CLK(NULL,       "mdm_ick",      &mdm_ick,       CK_243X),
1911         CLK(NULL,       "mdm_osc_ck",   &mdm_osc_ck,    CK_243X),
1912         /* DSS domain clocks */
1913         CLK("omapdss",  "ick",          &dss_ick,       CK_243X),
1914         CLK("omapdss",  "dss1_fck",     &dss1_fck,      CK_243X),
1915         CLK("omapdss",  "dss2_fck",     &dss2_fck,      CK_243X),
1916         CLK("omapdss",  "tv_fck",       &dss_54m_fck,   CK_243X),
1917         /* L3 domain clocks */
1918         CLK(NULL,       "core_l3_ck",   &core_l3_ck,    CK_243X),
1919         CLK(NULL,       "ssi_fck",      &ssi_ssr_sst_fck, CK_243X),
1920         CLK(NULL,       "usb_l4_ick",   &usb_l4_ick,    CK_243X),
1921         /* L4 domain clocks */
1922         CLK(NULL,       "l4_ck",        &l4_ck,         CK_243X),
1923         CLK(NULL,       "ssi_l4_ick",   &ssi_l4_ick,    CK_243X),
1924         CLK(NULL,       "wu_l4_ick",    &wu_l4_ick,     CK_243X),
1925         /* virtual meta-group clock */
1926         CLK(NULL,       "virt_prcm_set", &virt_prcm_set, CK_243X),
1927         /* general l4 interface ck, multi-parent functional clk */
1928         CLK(NULL,       "gpt1_ick",     &gpt1_ick,      CK_243X),
1929         CLK(NULL,       "gpt1_fck",     &gpt1_fck,      CK_243X),
1930         CLK(NULL,       "gpt2_ick",     &gpt2_ick,      CK_243X),
1931         CLK(NULL,       "gpt2_fck",     &gpt2_fck,      CK_243X),
1932         CLK(NULL,       "gpt3_ick",     &gpt3_ick,      CK_243X),
1933         CLK(NULL,       "gpt3_fck",     &gpt3_fck,      CK_243X),
1934         CLK(NULL,       "gpt4_ick",     &gpt4_ick,      CK_243X),
1935         CLK(NULL,       "gpt4_fck",     &gpt4_fck,      CK_243X),
1936         CLK(NULL,       "gpt5_ick",     &gpt5_ick,      CK_243X),
1937         CLK(NULL,       "gpt5_fck",     &gpt5_fck,      CK_243X),
1938         CLK(NULL,       "gpt6_ick",     &gpt6_ick,      CK_243X),
1939         CLK(NULL,       "gpt6_fck",     &gpt6_fck,      CK_243X),
1940         CLK(NULL,       "gpt7_ick",     &gpt7_ick,      CK_243X),
1941         CLK(NULL,       "gpt7_fck",     &gpt7_fck,      CK_243X),
1942         CLK(NULL,       "gpt8_ick",     &gpt8_ick,      CK_243X),
1943         CLK(NULL,       "gpt8_fck",     &gpt8_fck,      CK_243X),
1944         CLK(NULL,       "gpt9_ick",     &gpt9_ick,      CK_243X),
1945         CLK(NULL,       "gpt9_fck",     &gpt9_fck,      CK_243X),
1946         CLK(NULL,       "gpt10_ick",    &gpt10_ick,     CK_243X),
1947         CLK(NULL,       "gpt10_fck",    &gpt10_fck,     CK_243X),
1948         CLK(NULL,       "gpt11_ick",    &gpt11_ick,     CK_243X),
1949         CLK(NULL,       "gpt11_fck",    &gpt11_fck,     CK_243X),
1950         CLK(NULL,       "gpt12_ick",    &gpt12_ick,     CK_243X),
1951         CLK(NULL,       "gpt12_fck",    &gpt12_fck,     CK_243X),
1952         CLK("omap-mcbsp.1", "ick",      &mcbsp1_ick,    CK_243X),
1953         CLK("omap-mcbsp.1", "fck",      &mcbsp1_fck,    CK_243X),
1954         CLK("omap-mcbsp.2", "ick",      &mcbsp2_ick,    CK_243X),
1955         CLK("omap-mcbsp.2", "fck",      &mcbsp2_fck,    CK_243X),
1956         CLK("omap-mcbsp.3", "ick",      &mcbsp3_ick,    CK_243X),
1957         CLK("omap-mcbsp.3", "fck",      &mcbsp3_fck,    CK_243X),
1958         CLK("omap-mcbsp.4", "ick",      &mcbsp4_ick,    CK_243X),
1959         CLK("omap-mcbsp.4", "fck",      &mcbsp4_fck,    CK_243X),
1960         CLK("omap-mcbsp.5", "ick",      &mcbsp5_ick,    CK_243X),
1961         CLK("omap-mcbsp.5", "fck",      &mcbsp5_fck,    CK_243X),
1962         CLK("omap2_mcspi.1", "ick",     &mcspi1_ick,    CK_243X),
1963         CLK("omap2_mcspi.1", "fck",     &mcspi1_fck,    CK_243X),
1964         CLK("omap2_mcspi.2", "ick",     &mcspi2_ick,    CK_243X),
1965         CLK("omap2_mcspi.2", "fck",     &mcspi2_fck,    CK_243X),
1966         CLK("omap2_mcspi.3", "ick",     &mcspi3_ick,    CK_243X),
1967         CLK("omap2_mcspi.3", "fck",     &mcspi3_fck,    CK_243X),
1968         CLK(NULL,       "uart1_ick",    &uart1_ick,     CK_243X),
1969         CLK(NULL,       "uart1_fck",    &uart1_fck,     CK_243X),
1970         CLK(NULL,       "uart2_ick",    &uart2_ick,     CK_243X),
1971         CLK(NULL,       "uart2_fck",    &uart2_fck,     CK_243X),
1972         CLK(NULL,       "uart3_ick",    &uart3_ick,     CK_243X),
1973         CLK(NULL,       "uart3_fck",    &uart3_fck,     CK_243X),
1974         CLK(NULL,       "gpios_ick",    &gpios_ick,     CK_243X),
1975         CLK(NULL,       "gpios_fck",    &gpios_fck,     CK_243X),
1976         CLK("omap_wdt", "ick",          &mpu_wdt_ick,   CK_243X),
1977         CLK("omap_wdt", "fck",          &mpu_wdt_fck,   CK_243X),
1978         CLK(NULL,       "sync_32k_ick", &sync_32k_ick,  CK_243X),
1979         CLK(NULL,       "wdt1_ick",     &wdt1_ick,      CK_243X),
1980         CLK(NULL,       "omapctrl_ick", &omapctrl_ick,  CK_243X),
1981         CLK(NULL,       "icr_ick",      &icr_ick,       CK_243X),
1982         CLK("omap24xxcam", "fck",       &cam_fck,       CK_243X),
1983         CLK("omap24xxcam", "ick",       &cam_ick,       CK_243X),
1984         CLK(NULL,       "mailboxes_ick", &mailboxes_ick,        CK_243X),
1985         CLK(NULL,       "wdt4_ick",     &wdt4_ick,      CK_243X),
1986         CLK(NULL,       "wdt4_fck",     &wdt4_fck,      CK_243X),
1987         CLK(NULL,       "mspro_ick",    &mspro_ick,     CK_243X),
1988         CLK(NULL,       "mspro_fck",    &mspro_fck,     CK_243X),
1989         CLK(NULL,       "fac_ick",      &fac_ick,       CK_243X),
1990         CLK(NULL,       "fac_fck",      &fac_fck,       CK_243X),
1991         CLK("omap_hdq.0", "ick",        &hdq_ick,       CK_243X),
1992         CLK("omap_hdq.1", "fck",        &hdq_fck,       CK_243X),
1993         CLK("omap_i2c.1", "ick",        &i2c1_ick,      CK_243X),
1994         CLK("omap_i2c.1", "fck",        &i2chs1_fck,    CK_243X),
1995         CLK("omap_i2c.2", "ick",        &i2c2_ick,      CK_243X),
1996         CLK("omap_i2c.2", "fck",        &i2chs2_fck,    CK_243X),
1997         CLK(NULL,       "gpmc_fck",     &gpmc_fck,      CK_243X),
1998         CLK(NULL,       "sdma_fck",     &sdma_fck,      CK_243X),
1999         CLK(NULL,       "sdma_ick",     &sdma_ick,      CK_243X),
2000         CLK(NULL,       "sdrc_ick",     &sdrc_ick,      CK_243X),
2001         CLK(NULL,       "des_ick",      &des_ick,       CK_243X),
2002         CLK("omap-sham",        "ick",  &sha_ick,       CK_243X),
2003         CLK("omap_rng", "ick",          &rng_ick,       CK_243X),
2004         CLK("omap-aes", "ick",  &aes_ick,       CK_243X),
2005         CLK(NULL,       "pka_ick",      &pka_ick,       CK_243X),
2006         CLK(NULL,       "usb_fck",      &usb_fck,       CK_243X),
2007         CLK("musb-omap2430",    "ick",  &usbhs_ick,     CK_243X),
2008         CLK("mmci-omap-hs.0", "ick",    &mmchs1_ick,    CK_243X),
2009         CLK("mmci-omap-hs.0", "fck",    &mmchs1_fck,    CK_243X),
2010         CLK("mmci-omap-hs.1", "ick",    &mmchs2_ick,    CK_243X),
2011         CLK("mmci-omap-hs.1", "fck",    &mmchs2_fck,    CK_243X),
2012         CLK(NULL,       "gpio5_ick",    &gpio5_ick,     CK_243X),
2013         CLK(NULL,       "gpio5_fck",    &gpio5_fck,     CK_243X),
2014         CLK(NULL,       "mdm_intc_ick", &mdm_intc_ick,  CK_243X),
2015         CLK("mmci-omap-hs.0", "mmchsdb_fck",    &mmchsdb1_fck,  CK_243X),
2016         CLK("mmci-omap-hs.1", "mmchsdb_fck",    &mmchsdb2_fck,  CK_243X),
2017 };
2018
2019 /*
2020  * init code
2021  */
2022
2023 int __init omap2430_clk_init(void)
2024 {
2025         const struct prcm_config *prcm;
2026         struct omap_clk *c;
2027         u32 clkrate;
2028
2029         prcm_clksrc_ctrl = OMAP2430_PRCM_CLKSRC_CTRL;
2030         cm_idlest_pll = OMAP_CM_REGADDR(PLL_MOD, CM_IDLEST);
2031         cpu_mask = RATE_IN_243X;
2032         rate_table = omap2430_rate_table;
2033
2034         clk_init(&omap2_clk_functions);
2035
2036         for (c = omap2430_clks; c < omap2430_clks + ARRAY_SIZE(omap2430_clks);
2037              c++)
2038                 clk_preinit(c->lk.clk);
2039
2040         osc_ck.rate = omap2_osc_clk_recalc(&osc_ck);
2041         propagate_rate(&osc_ck);
2042         sys_ck.rate = omap2xxx_sys_clk_recalc(&sys_ck);
2043         propagate_rate(&sys_ck);
2044
2045         for (c = omap2430_clks; c < omap2430_clks + ARRAY_SIZE(omap2430_clks);
2046              c++) {
2047                 clkdev_add(&c->lk);
2048                 clk_register(c->lk.clk);
2049                 omap2_init_clk_clkdm(c->lk.clk);
2050         }
2051
2052         /* Disable autoidle on all clocks; let the PM code enable it later */
2053         omap_clk_disable_autoidle_all();
2054
2055         /* Check the MPU rate set by bootloader */
2056         clkrate = omap2xxx_clk_get_core_rate(&dpll_ck);
2057         for (prcm = rate_table; prcm->mpu_speed; prcm++) {
2058                 if (!(prcm->flags & cpu_mask))
2059                         continue;
2060                 if (prcm->xtal_speed != sys_ck.rate)
2061                         continue;
2062                 if (prcm->dpll_speed <= clkrate)
2063                         break;
2064         }
2065         curr_prcm_set = prcm;
2066
2067         recalculate_root_clocks();
2068
2069         pr_info("Clocking rate (Crystal/DPLL/MPU): %ld.%01ld/%ld/%ld MHz\n",
2070                 (sys_ck.rate / 1000000), (sys_ck.rate / 100000) % 10,
2071                 (dpll_ck.rate / 1000000), (mpu_ck.rate / 1000000)) ;
2072
2073         /*
2074          * Only enable those clocks we will need, let the drivers
2075          * enable other clocks as necessary
2076          */
2077         clk_enable_init_clocks();
2078
2079         /* Avoid sleeping sleeping during omap2_clk_prepare_for_reboot() */
2080         vclk = clk_get(NULL, "virt_prcm_set");
2081         sclk = clk_get(NULL, "sys_ck");
2082         dclk = clk_get(NULL, "dpll_ck");
2083
2084         return 0;
2085 }
2086