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