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