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