4 * Copyright (C) 2007-2010 Texas Instruments, Inc.
5 * Copyright (C) 2007-2011 Nokia Corporation
7 * Written by Paul Walmsley
8 * With many device clock fixes by Kevin Hilman and Jouni Högander
9 * DPLL bypass clock support added by Roman Tereshonkov
14 * Virtual clocks are introduced as convenient tools.
15 * They are sources for other clocks and not supposed
16 * to be requested from drivers directly.
19 #include <linux/kernel.h>
20 #include <linux/clk.h>
21 #include <linux/list.h>
23 #include <plat/clkdev_omap.h>
26 #include "clock3xxx.h"
27 #include "clock34xx.h"
28 #include "clock36xx.h"
29 #include "clock3517.h"
31 #include "cm2xxx_3xxx.h"
32 #include "cm-regbits-34xx.h"
33 #include "prm2xxx_3xxx.h"
34 #include "prm-regbits-34xx.h"
41 #define OMAP_CM_REGADDR OMAP34XX_CM_REGADDR
43 /* Maximum DPLL multiplier, divider values for OMAP3 */
44 #define OMAP3_MAX_DPLL_MULT 2047
45 #define OMAP3630_MAX_JTYPE_DPLL_MULT 4095
46 #define OMAP3_MAX_DPLL_DIV 128
49 * DPLL1 supplies clock to the MPU.
50 * DPLL2 supplies clock to the IVA2.
51 * DPLL3 supplies CORE domain clocks.
52 * DPLL4 supplies peripheral clocks.
53 * DPLL5 supplies other peripheral clocks (USBHOST, USIM).
56 /* Forward declarations for DPLL bypass clocks */
57 static struct clk dpll1_fck;
58 static struct clk dpll2_fck;
62 /* According to timer32k.c, this is a 32768Hz clock, not a 32000Hz clock. */
63 static struct clk omap_32k_fck = {
64 .name = "omap_32k_fck",
69 static struct clk secure_32k_fck = {
70 .name = "secure_32k_fck",
75 /* Virtual source clocks for osc_sys_ck */
76 static struct clk virt_12m_ck = {
77 .name = "virt_12m_ck",
82 static struct clk virt_13m_ck = {
83 .name = "virt_13m_ck",
88 static struct clk virt_16_8m_ck = {
89 .name = "virt_16_8m_ck",
94 static struct clk virt_19_2m_ck = {
95 .name = "virt_19_2m_ck",
100 static struct clk virt_26m_ck = {
101 .name = "virt_26m_ck",
106 static struct clk virt_38_4m_ck = {
107 .name = "virt_38_4m_ck",
112 static const struct clksel_rate osc_sys_12m_rates[] = {
113 { .div = 1, .val = 0, .flags = RATE_IN_3XXX },
117 static const struct clksel_rate osc_sys_13m_rates[] = {
118 { .div = 1, .val = 1, .flags = RATE_IN_3XXX },
122 static const struct clksel_rate osc_sys_16_8m_rates[] = {
123 { .div = 1, .val = 5, .flags = RATE_IN_3430ES2PLUS_36XX },
127 static const struct clksel_rate osc_sys_19_2m_rates[] = {
128 { .div = 1, .val = 2, .flags = RATE_IN_3XXX },
132 static const struct clksel_rate osc_sys_26m_rates[] = {
133 { .div = 1, .val = 3, .flags = RATE_IN_3XXX },
137 static const struct clksel_rate osc_sys_38_4m_rates[] = {
138 { .div = 1, .val = 4, .flags = RATE_IN_3XXX },
142 static const struct clksel osc_sys_clksel[] = {
143 { .parent = &virt_12m_ck, .rates = osc_sys_12m_rates },
144 { .parent = &virt_13m_ck, .rates = osc_sys_13m_rates },
145 { .parent = &virt_16_8m_ck, .rates = osc_sys_16_8m_rates },
146 { .parent = &virt_19_2m_ck, .rates = osc_sys_19_2m_rates },
147 { .parent = &virt_26m_ck, .rates = osc_sys_26m_rates },
148 { .parent = &virt_38_4m_ck, .rates = osc_sys_38_4m_rates },
152 /* Oscillator clock */
153 /* 12, 13, 16.8, 19.2, 26, or 38.4 MHz */
154 static struct clk osc_sys_ck = {
155 .name = "osc_sys_ck",
157 .init = &omap2_init_clksel_parent,
158 .clksel_reg = OMAP3430_PRM_CLKSEL,
159 .clksel_mask = OMAP3430_SYS_CLKIN_SEL_MASK,
160 .clksel = osc_sys_clksel,
161 /* REVISIT: deal with autoextclkmode? */
162 .recalc = &omap2_clksel_recalc,
165 static const struct clksel_rate div2_rates[] = {
166 { .div = 1, .val = 1, .flags = RATE_IN_3XXX },
167 { .div = 2, .val = 2, .flags = RATE_IN_3XXX },
171 static const struct clksel sys_clksel[] = {
172 { .parent = &osc_sys_ck, .rates = div2_rates },
176 /* Latency: this clock is only enabled after PRM_CLKSETUP.SETUP_TIME */
177 /* Feeds DPLLs - divided first by PRM_CLKSRC_CTRL.SYSCLKDIV? */
178 static struct clk sys_ck = {
181 .parent = &osc_sys_ck,
182 .init = &omap2_init_clksel_parent,
183 .clksel_reg = OMAP3430_PRM_CLKSRC_CTRL,
184 .clksel_mask = OMAP_SYSCLKDIV_MASK,
185 .clksel = sys_clksel,
186 .recalc = &omap2_clksel_recalc,
189 static struct clk sys_altclk = {
190 .name = "sys_altclk",
194 /* Optional external clock input for some McBSPs */
195 static struct clk mcbsp_clks = {
196 .name = "mcbsp_clks",
200 /* PRM EXTERNAL CLOCK OUTPUT */
202 static struct clk sys_clkout1 = {
203 .name = "sys_clkout1",
204 .ops = &clkops_omap2_dflt,
205 .parent = &osc_sys_ck,
206 .enable_reg = OMAP3430_PRM_CLKOUT_CTRL,
207 .enable_bit = OMAP3430_CLKOUT_EN_SHIFT,
208 .recalc = &followparent_recalc,
215 static const struct clksel_rate div16_dpll_rates[] = {
216 { .div = 1, .val = 1, .flags = RATE_IN_3XXX },
217 { .div = 2, .val = 2, .flags = RATE_IN_3XXX },
218 { .div = 3, .val = 3, .flags = RATE_IN_3XXX },
219 { .div = 4, .val = 4, .flags = RATE_IN_3XXX },
220 { .div = 5, .val = 5, .flags = RATE_IN_3XXX },
221 { .div = 6, .val = 6, .flags = RATE_IN_3XXX },
222 { .div = 7, .val = 7, .flags = RATE_IN_3XXX },
223 { .div = 8, .val = 8, .flags = RATE_IN_3XXX },
224 { .div = 9, .val = 9, .flags = RATE_IN_3XXX },
225 { .div = 10, .val = 10, .flags = RATE_IN_3XXX },
226 { .div = 11, .val = 11, .flags = RATE_IN_3XXX },
227 { .div = 12, .val = 12, .flags = RATE_IN_3XXX },
228 { .div = 13, .val = 13, .flags = RATE_IN_3XXX },
229 { .div = 14, .val = 14, .flags = RATE_IN_3XXX },
230 { .div = 15, .val = 15, .flags = RATE_IN_3XXX },
231 { .div = 16, .val = 16, .flags = RATE_IN_3XXX },
235 static const struct clksel_rate dpll4_rates[] = {
236 { .div = 1, .val = 1, .flags = RATE_IN_3XXX },
237 { .div = 2, .val = 2, .flags = RATE_IN_3XXX },
238 { .div = 3, .val = 3, .flags = RATE_IN_3XXX },
239 { .div = 4, .val = 4, .flags = RATE_IN_3XXX },
240 { .div = 5, .val = 5, .flags = RATE_IN_3XXX },
241 { .div = 6, .val = 6, .flags = RATE_IN_3XXX },
242 { .div = 7, .val = 7, .flags = RATE_IN_3XXX },
243 { .div = 8, .val = 8, .flags = RATE_IN_3XXX },
244 { .div = 9, .val = 9, .flags = RATE_IN_3XXX },
245 { .div = 10, .val = 10, .flags = RATE_IN_3XXX },
246 { .div = 11, .val = 11, .flags = RATE_IN_3XXX },
247 { .div = 12, .val = 12, .flags = RATE_IN_3XXX },
248 { .div = 13, .val = 13, .flags = RATE_IN_3XXX },
249 { .div = 14, .val = 14, .flags = RATE_IN_3XXX },
250 { .div = 15, .val = 15, .flags = RATE_IN_3XXX },
251 { .div = 16, .val = 16, .flags = RATE_IN_3XXX },
252 { .div = 17, .val = 17, .flags = RATE_IN_36XX },
253 { .div = 18, .val = 18, .flags = RATE_IN_36XX },
254 { .div = 19, .val = 19, .flags = RATE_IN_36XX },
255 { .div = 20, .val = 20, .flags = RATE_IN_36XX },
256 { .div = 21, .val = 21, .flags = RATE_IN_36XX },
257 { .div = 22, .val = 22, .flags = RATE_IN_36XX },
258 { .div = 23, .val = 23, .flags = RATE_IN_36XX },
259 { .div = 24, .val = 24, .flags = RATE_IN_36XX },
260 { .div = 25, .val = 25, .flags = RATE_IN_36XX },
261 { .div = 26, .val = 26, .flags = RATE_IN_36XX },
262 { .div = 27, .val = 27, .flags = RATE_IN_36XX },
263 { .div = 28, .val = 28, .flags = RATE_IN_36XX },
264 { .div = 29, .val = 29, .flags = RATE_IN_36XX },
265 { .div = 30, .val = 30, .flags = RATE_IN_36XX },
266 { .div = 31, .val = 31, .flags = RATE_IN_36XX },
267 { .div = 32, .val = 32, .flags = RATE_IN_36XX },
272 /* MPU clock source */
274 static struct dpll_data dpll1_dd = {
275 .mult_div1_reg = OMAP_CM_REGADDR(MPU_MOD, OMAP3430_CM_CLKSEL1_PLL),
276 .mult_mask = OMAP3430_MPU_DPLL_MULT_MASK,
277 .div1_mask = OMAP3430_MPU_DPLL_DIV_MASK,
278 .clk_bypass = &dpll1_fck,
280 .freqsel_mask = OMAP3430_MPU_DPLL_FREQSEL_MASK,
281 .control_reg = OMAP_CM_REGADDR(MPU_MOD, OMAP3430_CM_CLKEN_PLL),
282 .enable_mask = OMAP3430_EN_MPU_DPLL_MASK,
283 .modes = (1 << DPLL_LOW_POWER_BYPASS) | (1 << DPLL_LOCKED),
284 .auto_recal_bit = OMAP3430_EN_MPU_DPLL_DRIFTGUARD_SHIFT,
285 .recal_en_bit = OMAP3430_MPU_DPLL_RECAL_EN_SHIFT,
286 .recal_st_bit = OMAP3430_MPU_DPLL_ST_SHIFT,
287 .autoidle_reg = OMAP_CM_REGADDR(MPU_MOD, OMAP3430_CM_AUTOIDLE_PLL),
288 .autoidle_mask = OMAP3430_AUTO_MPU_DPLL_MASK,
289 .idlest_reg = OMAP_CM_REGADDR(MPU_MOD, OMAP3430_CM_IDLEST_PLL),
290 .idlest_mask = OMAP3430_ST_MPU_CLK_MASK,
291 .max_multiplier = OMAP3_MAX_DPLL_MULT,
293 .max_divider = OMAP3_MAX_DPLL_DIV,
296 static struct clk dpll1_ck = {
298 .ops = &clkops_omap3_noncore_dpll_ops,
300 .dpll_data = &dpll1_dd,
301 .round_rate = &omap2_dpll_round_rate,
302 .set_rate = &omap3_noncore_dpll_set_rate,
303 .clkdm_name = "dpll1_clkdm",
304 .recalc = &omap3_dpll_recalc,
308 * This virtual clock provides the CLKOUTX2 output from the DPLL if the
309 * DPLL isn't bypassed.
311 static struct clk dpll1_x2_ck = {
312 .name = "dpll1_x2_ck",
315 .clkdm_name = "dpll1_clkdm",
316 .recalc = &omap3_clkoutx2_recalc,
319 /* On DPLL1, unlike other DPLLs, the divider is downstream from CLKOUTX2 */
320 static const struct clksel div16_dpll1_x2m2_clksel[] = {
321 { .parent = &dpll1_x2_ck, .rates = div16_dpll_rates },
326 * Does not exist in the TRM - needed to separate the M2 divider from
327 * bypass selection in mpu_ck
329 static struct clk dpll1_x2m2_ck = {
330 .name = "dpll1_x2m2_ck",
332 .parent = &dpll1_x2_ck,
333 .init = &omap2_init_clksel_parent,
334 .clksel_reg = OMAP_CM_REGADDR(MPU_MOD, OMAP3430_CM_CLKSEL2_PLL),
335 .clksel_mask = OMAP3430_MPU_DPLL_CLKOUT_DIV_MASK,
336 .clksel = div16_dpll1_x2m2_clksel,
337 .clkdm_name = "dpll1_clkdm",
338 .recalc = &omap2_clksel_recalc,
342 /* IVA2 clock source */
345 static struct dpll_data dpll2_dd = {
346 .mult_div1_reg = OMAP_CM_REGADDR(OMAP3430_IVA2_MOD, OMAP3430_CM_CLKSEL1_PLL),
347 .mult_mask = OMAP3430_IVA2_DPLL_MULT_MASK,
348 .div1_mask = OMAP3430_IVA2_DPLL_DIV_MASK,
349 .clk_bypass = &dpll2_fck,
351 .freqsel_mask = OMAP3430_IVA2_DPLL_FREQSEL_MASK,
352 .control_reg = OMAP_CM_REGADDR(OMAP3430_IVA2_MOD, OMAP3430_CM_CLKEN_PLL),
353 .enable_mask = OMAP3430_EN_IVA2_DPLL_MASK,
354 .modes = (1 << DPLL_LOW_POWER_STOP) | (1 << DPLL_LOCKED) |
355 (1 << DPLL_LOW_POWER_BYPASS),
356 .auto_recal_bit = OMAP3430_EN_IVA2_DPLL_DRIFTGUARD_SHIFT,
357 .recal_en_bit = OMAP3430_PRM_IRQENABLE_MPU_IVA2_DPLL_RECAL_EN_SHIFT,
358 .recal_st_bit = OMAP3430_PRM_IRQSTATUS_MPU_IVA2_DPLL_ST_SHIFT,
359 .autoidle_reg = OMAP_CM_REGADDR(OMAP3430_IVA2_MOD, OMAP3430_CM_AUTOIDLE_PLL),
360 .autoidle_mask = OMAP3430_AUTO_IVA2_DPLL_MASK,
361 .idlest_reg = OMAP_CM_REGADDR(OMAP3430_IVA2_MOD, OMAP3430_CM_IDLEST_PLL),
362 .idlest_mask = OMAP3430_ST_IVA2_CLK_MASK,
363 .max_multiplier = OMAP3_MAX_DPLL_MULT,
365 .max_divider = OMAP3_MAX_DPLL_DIV,
368 static struct clk dpll2_ck = {
370 .ops = &clkops_omap3_noncore_dpll_ops,
372 .dpll_data = &dpll2_dd,
373 .round_rate = &omap2_dpll_round_rate,
374 .set_rate = &omap3_noncore_dpll_set_rate,
375 .clkdm_name = "dpll2_clkdm",
376 .recalc = &omap3_dpll_recalc,
379 static const struct clksel div16_dpll2_m2x2_clksel[] = {
380 { .parent = &dpll2_ck, .rates = div16_dpll_rates },
385 * The TRM is conflicted on whether IVA2 clock comes from DPLL2 CLKOUT
386 * or CLKOUTX2. CLKOUT seems most plausible.
388 static struct clk dpll2_m2_ck = {
389 .name = "dpll2_m2_ck",
392 .init = &omap2_init_clksel_parent,
393 .clksel_reg = OMAP_CM_REGADDR(OMAP3430_IVA2_MOD,
394 OMAP3430_CM_CLKSEL2_PLL),
395 .clksel_mask = OMAP3430_IVA2_DPLL_CLKOUT_DIV_MASK,
396 .clksel = div16_dpll2_m2x2_clksel,
397 .clkdm_name = "dpll2_clkdm",
398 .recalc = &omap2_clksel_recalc,
403 * Source clock for all interfaces and for some device fclks
404 * REVISIT: Also supports fast relock bypass - not included below
406 static struct dpll_data dpll3_dd = {
407 .mult_div1_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKSEL1),
408 .mult_mask = OMAP3430_CORE_DPLL_MULT_MASK,
409 .div1_mask = OMAP3430_CORE_DPLL_DIV_MASK,
410 .clk_bypass = &sys_ck,
412 .freqsel_mask = OMAP3430_CORE_DPLL_FREQSEL_MASK,
413 .control_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKEN),
414 .enable_mask = OMAP3430_EN_CORE_DPLL_MASK,
415 .auto_recal_bit = OMAP3430_EN_CORE_DPLL_DRIFTGUARD_SHIFT,
416 .recal_en_bit = OMAP3430_CORE_DPLL_RECAL_EN_SHIFT,
417 .recal_st_bit = OMAP3430_CORE_DPLL_ST_SHIFT,
418 .autoidle_reg = OMAP_CM_REGADDR(PLL_MOD, CM_AUTOIDLE),
419 .autoidle_mask = OMAP3430_AUTO_CORE_DPLL_MASK,
420 .idlest_reg = OMAP_CM_REGADDR(PLL_MOD, CM_IDLEST),
421 .idlest_mask = OMAP3430_ST_CORE_CLK_MASK,
422 .max_multiplier = OMAP3_MAX_DPLL_MULT,
424 .max_divider = OMAP3_MAX_DPLL_DIV,
427 static struct clk dpll3_ck = {
429 .ops = &clkops_omap3_core_dpll_ops,
431 .dpll_data = &dpll3_dd,
432 .round_rate = &omap2_dpll_round_rate,
433 .clkdm_name = "dpll3_clkdm",
434 .recalc = &omap3_dpll_recalc,
438 * This virtual clock provides the CLKOUTX2 output from the DPLL if the
439 * DPLL isn't bypassed
441 static struct clk dpll3_x2_ck = {
442 .name = "dpll3_x2_ck",
445 .clkdm_name = "dpll3_clkdm",
446 .recalc = &omap3_clkoutx2_recalc,
449 static const struct clksel_rate div31_dpll3_rates[] = {
450 { .div = 1, .val = 1, .flags = RATE_IN_3XXX },
451 { .div = 2, .val = 2, .flags = RATE_IN_3XXX },
452 { .div = 3, .val = 3, .flags = RATE_IN_3430ES2PLUS_36XX },
453 { .div = 4, .val = 4, .flags = RATE_IN_3430ES2PLUS_36XX },
454 { .div = 5, .val = 5, .flags = RATE_IN_3430ES2PLUS_36XX },
455 { .div = 6, .val = 6, .flags = RATE_IN_3430ES2PLUS_36XX },
456 { .div = 7, .val = 7, .flags = RATE_IN_3430ES2PLUS_36XX },
457 { .div = 8, .val = 8, .flags = RATE_IN_3430ES2PLUS_36XX },
458 { .div = 9, .val = 9, .flags = RATE_IN_3430ES2PLUS_36XX },
459 { .div = 10, .val = 10, .flags = RATE_IN_3430ES2PLUS_36XX },
460 { .div = 11, .val = 11, .flags = RATE_IN_3430ES2PLUS_36XX },
461 { .div = 12, .val = 12, .flags = RATE_IN_3430ES2PLUS_36XX },
462 { .div = 13, .val = 13, .flags = RATE_IN_3430ES2PLUS_36XX },
463 { .div = 14, .val = 14, .flags = RATE_IN_3430ES2PLUS_36XX },
464 { .div = 15, .val = 15, .flags = RATE_IN_3430ES2PLUS_36XX },
465 { .div = 16, .val = 16, .flags = RATE_IN_3430ES2PLUS_36XX },
466 { .div = 17, .val = 17, .flags = RATE_IN_3430ES2PLUS_36XX },
467 { .div = 18, .val = 18, .flags = RATE_IN_3430ES2PLUS_36XX },
468 { .div = 19, .val = 19, .flags = RATE_IN_3430ES2PLUS_36XX },
469 { .div = 20, .val = 20, .flags = RATE_IN_3430ES2PLUS_36XX },
470 { .div = 21, .val = 21, .flags = RATE_IN_3430ES2PLUS_36XX },
471 { .div = 22, .val = 22, .flags = RATE_IN_3430ES2PLUS_36XX },
472 { .div = 23, .val = 23, .flags = RATE_IN_3430ES2PLUS_36XX },
473 { .div = 24, .val = 24, .flags = RATE_IN_3430ES2PLUS_36XX },
474 { .div = 25, .val = 25, .flags = RATE_IN_3430ES2PLUS_36XX },
475 { .div = 26, .val = 26, .flags = RATE_IN_3430ES2PLUS_36XX },
476 { .div = 27, .val = 27, .flags = RATE_IN_3430ES2PLUS_36XX },
477 { .div = 28, .val = 28, .flags = RATE_IN_3430ES2PLUS_36XX },
478 { .div = 29, .val = 29, .flags = RATE_IN_3430ES2PLUS_36XX },
479 { .div = 30, .val = 30, .flags = RATE_IN_3430ES2PLUS_36XX },
480 { .div = 31, .val = 31, .flags = RATE_IN_3430ES2PLUS_36XX },
484 static const struct clksel div31_dpll3m2_clksel[] = {
485 { .parent = &dpll3_ck, .rates = div31_dpll3_rates },
489 /* DPLL3 output M2 - primary control point for CORE speed */
490 static struct clk dpll3_m2_ck = {
491 .name = "dpll3_m2_ck",
494 .init = &omap2_init_clksel_parent,
495 .clksel_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKSEL1),
496 .clksel_mask = OMAP3430_CORE_DPLL_CLKOUT_DIV_MASK,
497 .clksel = div31_dpll3m2_clksel,
498 .clkdm_name = "dpll3_clkdm",
499 .round_rate = &omap2_clksel_round_rate,
500 .set_rate = &omap3_core_dpll_m2_set_rate,
501 .recalc = &omap2_clksel_recalc,
504 static struct clk core_ck = {
507 .parent = &dpll3_m2_ck,
508 .recalc = &followparent_recalc,
511 static struct clk dpll3_m2x2_ck = {
512 .name = "dpll3_m2x2_ck",
514 .parent = &dpll3_m2_ck,
515 .clkdm_name = "dpll3_clkdm",
516 .recalc = &omap3_clkoutx2_recalc,
519 /* The PWRDN bit is apparently only available on 3430ES2 and above */
520 static const struct clksel div16_dpll3_clksel[] = {
521 { .parent = &dpll3_ck, .rates = div16_dpll_rates },
525 /* This virtual clock is the source for dpll3_m3x2_ck */
526 static struct clk dpll3_m3_ck = {
527 .name = "dpll3_m3_ck",
530 .init = &omap2_init_clksel_parent,
531 .clksel_reg = OMAP_CM_REGADDR(OMAP3430_EMU_MOD, CM_CLKSEL1),
532 .clksel_mask = OMAP3430_DIV_DPLL3_MASK,
533 .clksel = div16_dpll3_clksel,
534 .clkdm_name = "dpll3_clkdm",
535 .recalc = &omap2_clksel_recalc,
538 /* The PWRDN bit is apparently only available on 3430ES2 and above */
539 static struct clk dpll3_m3x2_ck = {
540 .name = "dpll3_m3x2_ck",
541 .ops = &clkops_omap2_dflt_wait,
542 .parent = &dpll3_m3_ck,
543 .enable_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKEN),
544 .enable_bit = OMAP3430_PWRDN_EMU_CORE_SHIFT,
545 .flags = INVERT_ENABLE,
546 .clkdm_name = "dpll3_clkdm",
547 .recalc = &omap3_clkoutx2_recalc,
550 static struct clk emu_core_alwon_ck = {
551 .name = "emu_core_alwon_ck",
553 .parent = &dpll3_m3x2_ck,
554 .clkdm_name = "dpll3_clkdm",
555 .recalc = &followparent_recalc,
559 /* Supplies 96MHz, 54Mhz TV DAC, DSS fclk, CAM sensor clock, emul trace clk */
561 static struct dpll_data dpll4_dd;
563 static struct dpll_data dpll4_dd_34xx __initdata = {
564 .mult_div1_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKSEL2),
565 .mult_mask = OMAP3430_PERIPH_DPLL_MULT_MASK,
566 .div1_mask = OMAP3430_PERIPH_DPLL_DIV_MASK,
567 .clk_bypass = &sys_ck,
569 .freqsel_mask = OMAP3430_PERIPH_DPLL_FREQSEL_MASK,
570 .control_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKEN),
571 .enable_mask = OMAP3430_EN_PERIPH_DPLL_MASK,
572 .modes = (1 << DPLL_LOW_POWER_STOP) | (1 << DPLL_LOCKED),
573 .auto_recal_bit = OMAP3430_EN_PERIPH_DPLL_DRIFTGUARD_SHIFT,
574 .recal_en_bit = OMAP3430_PERIPH_DPLL_RECAL_EN_SHIFT,
575 .recal_st_bit = OMAP3430_PERIPH_DPLL_ST_SHIFT,
576 .autoidle_reg = OMAP_CM_REGADDR(PLL_MOD, CM_AUTOIDLE),
577 .autoidle_mask = OMAP3430_AUTO_PERIPH_DPLL_MASK,
578 .idlest_reg = OMAP_CM_REGADDR(PLL_MOD, CM_IDLEST),
579 .idlest_mask = OMAP3430_ST_PERIPH_CLK_MASK,
580 .max_multiplier = OMAP3_MAX_DPLL_MULT,
582 .max_divider = OMAP3_MAX_DPLL_DIV,
585 static struct dpll_data dpll4_dd_3630 __initdata = {
586 .mult_div1_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKSEL2),
587 .mult_mask = OMAP3630_PERIPH_DPLL_MULT_MASK,
588 .div1_mask = OMAP3430_PERIPH_DPLL_DIV_MASK,
589 .clk_bypass = &sys_ck,
591 .control_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKEN),
592 .enable_mask = OMAP3430_EN_PERIPH_DPLL_MASK,
593 .modes = (1 << DPLL_LOW_POWER_STOP) | (1 << DPLL_LOCKED),
594 .auto_recal_bit = OMAP3430_EN_PERIPH_DPLL_DRIFTGUARD_SHIFT,
595 .recal_en_bit = OMAP3430_PERIPH_DPLL_RECAL_EN_SHIFT,
596 .recal_st_bit = OMAP3430_PERIPH_DPLL_ST_SHIFT,
597 .autoidle_reg = OMAP_CM_REGADDR(PLL_MOD, CM_AUTOIDLE),
598 .autoidle_mask = OMAP3430_AUTO_PERIPH_DPLL_MASK,
599 .idlest_reg = OMAP_CM_REGADDR(PLL_MOD, CM_IDLEST),
600 .idlest_mask = OMAP3430_ST_PERIPH_CLK_MASK,
601 .dco_mask = OMAP3630_PERIPH_DPLL_DCO_SEL_MASK,
602 .sddiv_mask = OMAP3630_PERIPH_DPLL_SD_DIV_MASK,
603 .max_multiplier = OMAP3630_MAX_JTYPE_DPLL_MULT,
605 .max_divider = OMAP3_MAX_DPLL_DIV,
609 static struct clk dpll4_ck = {
611 .ops = &clkops_omap3_noncore_dpll_ops,
613 .dpll_data = &dpll4_dd,
614 .round_rate = &omap2_dpll_round_rate,
615 .set_rate = &omap3_dpll4_set_rate,
616 .clkdm_name = "dpll4_clkdm",
617 .recalc = &omap3_dpll_recalc,
621 * This virtual clock provides the CLKOUTX2 output from the DPLL if the
622 * DPLL isn't bypassed --
623 * XXX does this serve any downstream clocks?
625 static struct clk dpll4_x2_ck = {
626 .name = "dpll4_x2_ck",
629 .clkdm_name = "dpll4_clkdm",
630 .recalc = &omap3_clkoutx2_recalc,
633 static const struct clksel dpll4_clksel[] = {
634 { .parent = &dpll4_ck, .rates = dpll4_rates },
638 /* This virtual clock is the source for dpll4_m2x2_ck */
639 static struct clk dpll4_m2_ck = {
640 .name = "dpll4_m2_ck",
643 .init = &omap2_init_clksel_parent,
644 .clksel_reg = OMAP_CM_REGADDR(PLL_MOD, OMAP3430_CM_CLKSEL3),
645 .clksel_mask = OMAP3630_DIV_96M_MASK,
646 .clksel = dpll4_clksel,
647 .clkdm_name = "dpll4_clkdm",
648 .recalc = &omap2_clksel_recalc,
651 /* The PWRDN bit is apparently only available on 3430ES2 and above */
652 static struct clk dpll4_m2x2_ck = {
653 .name = "dpll4_m2x2_ck",
654 .ops = &clkops_omap2_dflt_wait,
655 .parent = &dpll4_m2_ck,
656 .enable_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKEN),
657 .enable_bit = OMAP3430_PWRDN_96M_SHIFT,
658 .flags = INVERT_ENABLE,
659 .clkdm_name = "dpll4_clkdm",
660 .recalc = &omap3_clkoutx2_recalc,
664 * DPLL4 generates DPLL4_M2X2_CLK which is then routed into the PRM as
665 * PRM_96M_ALWON_(F)CLK. Two clocks then emerge from the PRM:
666 * 96M_ALWON_FCLK (called "omap_96m_alwon_fck" below) and
670 /* Adding 192MHz Clock node needed by SGX */
671 static struct clk omap_192m_alwon_fck = {
672 .name = "omap_192m_alwon_fck",
674 .parent = &dpll4_m2x2_ck,
675 .recalc = &followparent_recalc,
678 static const struct clksel_rate omap_96m_alwon_fck_rates[] = {
679 { .div = 1, .val = 1, .flags = RATE_IN_36XX },
680 { .div = 2, .val = 2, .flags = RATE_IN_36XX },
684 static const struct clksel omap_96m_alwon_fck_clksel[] = {
685 { .parent = &omap_192m_alwon_fck, .rates = omap_96m_alwon_fck_rates },
689 static const struct clksel_rate omap_96m_dpll_rates[] = {
690 { .div = 1, .val = 0, .flags = RATE_IN_3XXX },
694 static const struct clksel_rate omap_96m_sys_rates[] = {
695 { .div = 1, .val = 1, .flags = RATE_IN_3XXX },
699 static struct clk omap_96m_alwon_fck = {
700 .name = "omap_96m_alwon_fck",
702 .parent = &dpll4_m2x2_ck,
703 .recalc = &followparent_recalc,
706 static struct clk omap_96m_alwon_fck_3630 = {
707 .name = "omap_96m_alwon_fck",
708 .parent = &omap_192m_alwon_fck,
709 .init = &omap2_init_clksel_parent,
711 .recalc = &omap2_clksel_recalc,
712 .clksel_reg = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL),
713 .clksel_mask = OMAP3630_CLKSEL_96M_MASK,
714 .clksel = omap_96m_alwon_fck_clksel
717 static struct clk cm_96m_fck = {
718 .name = "cm_96m_fck",
720 .parent = &omap_96m_alwon_fck,
721 .recalc = &followparent_recalc,
724 static const struct clksel omap_96m_fck_clksel[] = {
725 { .parent = &cm_96m_fck, .rates = omap_96m_dpll_rates },
726 { .parent = &sys_ck, .rates = omap_96m_sys_rates },
730 static struct clk omap_96m_fck = {
731 .name = "omap_96m_fck",
734 .init = &omap2_init_clksel_parent,
735 .clksel_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKSEL1),
736 .clksel_mask = OMAP3430_SOURCE_96M_MASK,
737 .clksel = omap_96m_fck_clksel,
738 .recalc = &omap2_clksel_recalc,
741 /* This virtual clock is the source for dpll4_m3x2_ck */
742 static struct clk dpll4_m3_ck = {
743 .name = "dpll4_m3_ck",
746 .init = &omap2_init_clksel_parent,
747 .clksel_reg = OMAP_CM_REGADDR(OMAP3430_DSS_MOD, CM_CLKSEL),
748 .clksel_mask = OMAP3630_CLKSEL_TV_MASK,
749 .clksel = dpll4_clksel,
750 .clkdm_name = "dpll4_clkdm",
751 .recalc = &omap2_clksel_recalc,
754 /* The PWRDN bit is apparently only available on 3430ES2 and above */
755 static struct clk dpll4_m3x2_ck = {
756 .name = "dpll4_m3x2_ck",
757 .ops = &clkops_omap2_dflt_wait,
758 .parent = &dpll4_m3_ck,
759 .enable_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKEN),
760 .enable_bit = OMAP3430_PWRDN_TV_SHIFT,
761 .flags = INVERT_ENABLE,
762 .clkdm_name = "dpll4_clkdm",
763 .recalc = &omap3_clkoutx2_recalc,
766 static const struct clksel_rate omap_54m_d4m3x2_rates[] = {
767 { .div = 1, .val = 0, .flags = RATE_IN_3XXX },
771 static const struct clksel_rate omap_54m_alt_rates[] = {
772 { .div = 1, .val = 1, .flags = RATE_IN_3XXX },
776 static const struct clksel omap_54m_clksel[] = {
777 { .parent = &dpll4_m3x2_ck, .rates = omap_54m_d4m3x2_rates },
778 { .parent = &sys_altclk, .rates = omap_54m_alt_rates },
782 static struct clk omap_54m_fck = {
783 .name = "omap_54m_fck",
785 .init = &omap2_init_clksel_parent,
786 .clksel_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKSEL1),
787 .clksel_mask = OMAP3430_SOURCE_54M_MASK,
788 .clksel = omap_54m_clksel,
789 .recalc = &omap2_clksel_recalc,
792 static const struct clksel_rate omap_48m_cm96m_rates[] = {
793 { .div = 2, .val = 0, .flags = RATE_IN_3XXX },
797 static const struct clksel_rate omap_48m_alt_rates[] = {
798 { .div = 1, .val = 1, .flags = RATE_IN_3XXX },
802 static const struct clksel omap_48m_clksel[] = {
803 { .parent = &cm_96m_fck, .rates = omap_48m_cm96m_rates },
804 { .parent = &sys_altclk, .rates = omap_48m_alt_rates },
808 static struct clk omap_48m_fck = {
809 .name = "omap_48m_fck",
811 .init = &omap2_init_clksel_parent,
812 .clksel_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKSEL1),
813 .clksel_mask = OMAP3430_SOURCE_48M_MASK,
814 .clksel = omap_48m_clksel,
815 .recalc = &omap2_clksel_recalc,
818 static struct clk omap_12m_fck = {
819 .name = "omap_12m_fck",
821 .parent = &omap_48m_fck,
823 .recalc = &omap_fixed_divisor_recalc,
826 /* This virtual clock is the source for dpll4_m4x2_ck */
827 static struct clk dpll4_m4_ck = {
828 .name = "dpll4_m4_ck",
831 .init = &omap2_init_clksel_parent,
832 .clksel_reg = OMAP_CM_REGADDR(OMAP3430_DSS_MOD, CM_CLKSEL),
833 .clksel_mask = OMAP3630_CLKSEL_DSS1_MASK,
834 .clksel = dpll4_clksel,
835 .clkdm_name = "dpll4_clkdm",
836 .recalc = &omap2_clksel_recalc,
837 .set_rate = &omap2_clksel_set_rate,
838 .round_rate = &omap2_clksel_round_rate,
841 /* The PWRDN bit is apparently only available on 3430ES2 and above */
842 static struct clk dpll4_m4x2_ck = {
843 .name = "dpll4_m4x2_ck",
844 .ops = &clkops_omap2_dflt_wait,
845 .parent = &dpll4_m4_ck,
846 .enable_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKEN),
847 .enable_bit = OMAP3430_PWRDN_DSS1_SHIFT,
848 .flags = INVERT_ENABLE,
849 .clkdm_name = "dpll4_clkdm",
850 .recalc = &omap3_clkoutx2_recalc,
853 /* This virtual clock is the source for dpll4_m5x2_ck */
854 static struct clk dpll4_m5_ck = {
855 .name = "dpll4_m5_ck",
858 .init = &omap2_init_clksel_parent,
859 .clksel_reg = OMAP_CM_REGADDR(OMAP3430_CAM_MOD, CM_CLKSEL),
860 .clksel_mask = OMAP3630_CLKSEL_CAM_MASK,
861 .clksel = dpll4_clksel,
862 .clkdm_name = "dpll4_clkdm",
863 .set_rate = &omap2_clksel_set_rate,
864 .round_rate = &omap2_clksel_round_rate,
865 .recalc = &omap2_clksel_recalc,
868 /* The PWRDN bit is apparently only available on 3430ES2 and above */
869 static struct clk dpll4_m5x2_ck = {
870 .name = "dpll4_m5x2_ck",
871 .ops = &clkops_omap2_dflt_wait,
872 .parent = &dpll4_m5_ck,
873 .enable_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKEN),
874 .enable_bit = OMAP3430_PWRDN_CAM_SHIFT,
875 .flags = INVERT_ENABLE,
876 .clkdm_name = "dpll4_clkdm",
877 .recalc = &omap3_clkoutx2_recalc,
880 /* This virtual clock is the source for dpll4_m6x2_ck */
881 static struct clk dpll4_m6_ck = {
882 .name = "dpll4_m6_ck",
885 .init = &omap2_init_clksel_parent,
886 .clksel_reg = OMAP_CM_REGADDR(OMAP3430_EMU_MOD, CM_CLKSEL1),
887 .clksel_mask = OMAP3630_DIV_DPLL4_MASK,
888 .clksel = dpll4_clksel,
889 .clkdm_name = "dpll4_clkdm",
890 .recalc = &omap2_clksel_recalc,
893 /* The PWRDN bit is apparently only available on 3430ES2 and above */
894 static struct clk dpll4_m6x2_ck = {
895 .name = "dpll4_m6x2_ck",
896 .ops = &clkops_omap2_dflt_wait,
897 .parent = &dpll4_m6_ck,
898 .enable_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKEN),
899 .enable_bit = OMAP3430_PWRDN_EMU_PERIPH_SHIFT,
900 .flags = INVERT_ENABLE,
901 .clkdm_name = "dpll4_clkdm",
902 .recalc = &omap3_clkoutx2_recalc,
905 static struct clk emu_per_alwon_ck = {
906 .name = "emu_per_alwon_ck",
908 .parent = &dpll4_m6x2_ck,
909 .clkdm_name = "dpll4_clkdm",
910 .recalc = &followparent_recalc,
914 /* Supplies 120MHz clock, USIM source clock */
917 static struct dpll_data dpll5_dd = {
918 .mult_div1_reg = OMAP_CM_REGADDR(PLL_MOD, OMAP3430ES2_CM_CLKSEL4),
919 .mult_mask = OMAP3430ES2_PERIPH2_DPLL_MULT_MASK,
920 .div1_mask = OMAP3430ES2_PERIPH2_DPLL_DIV_MASK,
921 .clk_bypass = &sys_ck,
923 .freqsel_mask = OMAP3430ES2_PERIPH2_DPLL_FREQSEL_MASK,
924 .control_reg = OMAP_CM_REGADDR(PLL_MOD, OMAP3430ES2_CM_CLKEN2),
925 .enable_mask = OMAP3430ES2_EN_PERIPH2_DPLL_MASK,
926 .modes = (1 << DPLL_LOW_POWER_STOP) | (1 << DPLL_LOCKED),
927 .auto_recal_bit = OMAP3430ES2_EN_PERIPH2_DPLL_DRIFTGUARD_SHIFT,
928 .recal_en_bit = OMAP3430ES2_SND_PERIPH_DPLL_RECAL_EN_SHIFT,
929 .recal_st_bit = OMAP3430ES2_SND_PERIPH_DPLL_ST_SHIFT,
930 .autoidle_reg = OMAP_CM_REGADDR(PLL_MOD, OMAP3430ES2_CM_AUTOIDLE2_PLL),
931 .autoidle_mask = OMAP3430ES2_AUTO_PERIPH2_DPLL_MASK,
932 .idlest_reg = OMAP_CM_REGADDR(PLL_MOD, CM_IDLEST2),
933 .idlest_mask = OMAP3430ES2_ST_PERIPH2_CLK_MASK,
934 .max_multiplier = OMAP3_MAX_DPLL_MULT,
936 .max_divider = OMAP3_MAX_DPLL_DIV,
939 static struct clk dpll5_ck = {
941 .ops = &clkops_omap3_noncore_dpll_ops,
943 .dpll_data = &dpll5_dd,
944 .round_rate = &omap2_dpll_round_rate,
945 .set_rate = &omap3_dpll5_set_rate,
946 .clkdm_name = "dpll5_clkdm",
947 .recalc = &omap3_dpll_recalc,
950 static const struct clksel div16_dpll5_clksel[] = {
951 { .parent = &dpll5_ck, .rates = div16_dpll_rates },
955 static struct clk dpll5_m2_ck = {
956 .name = "dpll5_m2_ck",
959 .init = &omap2_init_clksel_parent,
960 .clksel_reg = OMAP_CM_REGADDR(PLL_MOD, OMAP3430ES2_CM_CLKSEL5),
961 .clksel_mask = OMAP3430ES2_DIV_120M_MASK,
962 .clksel = div16_dpll5_clksel,
963 .clkdm_name = "dpll5_clkdm",
964 .recalc = &omap2_clksel_recalc,
967 /* CM EXTERNAL CLOCK OUTPUTS */
969 static const struct clksel_rate clkout2_src_core_rates[] = {
970 { .div = 1, .val = 0, .flags = RATE_IN_3XXX },
974 static const struct clksel_rate clkout2_src_sys_rates[] = {
975 { .div = 1, .val = 1, .flags = RATE_IN_3XXX },
979 static const struct clksel_rate clkout2_src_96m_rates[] = {
980 { .div = 1, .val = 2, .flags = RATE_IN_3XXX },
984 static const struct clksel_rate clkout2_src_54m_rates[] = {
985 { .div = 1, .val = 3, .flags = RATE_IN_3XXX },
989 static const struct clksel clkout2_src_clksel[] = {
990 { .parent = &core_ck, .rates = clkout2_src_core_rates },
991 { .parent = &sys_ck, .rates = clkout2_src_sys_rates },
992 { .parent = &cm_96m_fck, .rates = clkout2_src_96m_rates },
993 { .parent = &omap_54m_fck, .rates = clkout2_src_54m_rates },
997 static struct clk clkout2_src_ck = {
998 .name = "clkout2_src_ck",
999 .ops = &clkops_omap2_dflt,
1000 .init = &omap2_init_clksel_parent,
1001 .enable_reg = OMAP3430_CM_CLKOUT_CTRL,
1002 .enable_bit = OMAP3430_CLKOUT2_EN_SHIFT,
1003 .clksel_reg = OMAP3430_CM_CLKOUT_CTRL,
1004 .clksel_mask = OMAP3430_CLKOUT2SOURCE_MASK,
1005 .clksel = clkout2_src_clksel,
1006 .clkdm_name = "core_clkdm",
1007 .recalc = &omap2_clksel_recalc,
1010 static const struct clksel_rate sys_clkout2_rates[] = {
1011 { .div = 1, .val = 0, .flags = RATE_IN_3XXX },
1012 { .div = 2, .val = 1, .flags = RATE_IN_3XXX },
1013 { .div = 4, .val = 2, .flags = RATE_IN_3XXX },
1014 { .div = 8, .val = 3, .flags = RATE_IN_3XXX },
1015 { .div = 16, .val = 4, .flags = RATE_IN_3XXX },
1019 static const struct clksel sys_clkout2_clksel[] = {
1020 { .parent = &clkout2_src_ck, .rates = sys_clkout2_rates },
1024 static struct clk sys_clkout2 = {
1025 .name = "sys_clkout2",
1026 .ops = &clkops_null,
1027 .init = &omap2_init_clksel_parent,
1028 .clksel_reg = OMAP3430_CM_CLKOUT_CTRL,
1029 .clksel_mask = OMAP3430_CLKOUT2_DIV_MASK,
1030 .clksel = sys_clkout2_clksel,
1031 .recalc = &omap2_clksel_recalc,
1032 .round_rate = &omap2_clksel_round_rate,
1033 .set_rate = &omap2_clksel_set_rate
1036 /* CM OUTPUT CLOCKS */
1038 static struct clk corex2_fck = {
1039 .name = "corex2_fck",
1040 .ops = &clkops_null,
1041 .parent = &dpll3_m2x2_ck,
1042 .recalc = &followparent_recalc,
1045 /* DPLL power domain clock controls */
1047 static const struct clksel_rate div4_rates[] = {
1048 { .div = 1, .val = 1, .flags = RATE_IN_3XXX },
1049 { .div = 2, .val = 2, .flags = RATE_IN_3XXX },
1050 { .div = 4, .val = 4, .flags = RATE_IN_3XXX },
1054 static const struct clksel div4_core_clksel[] = {
1055 { .parent = &core_ck, .rates = div4_rates },
1060 * REVISIT: Are these in DPLL power domain or CM power domain? docs
1061 * may be inconsistent here?
1063 static struct clk dpll1_fck = {
1064 .name = "dpll1_fck",
1065 .ops = &clkops_null,
1067 .init = &omap2_init_clksel_parent,
1068 .clksel_reg = OMAP_CM_REGADDR(MPU_MOD, OMAP3430_CM_CLKSEL1_PLL),
1069 .clksel_mask = OMAP3430_MPU_CLK_SRC_MASK,
1070 .clksel = div4_core_clksel,
1071 .recalc = &omap2_clksel_recalc,
1074 static struct clk mpu_ck = {
1076 .ops = &clkops_null,
1077 .parent = &dpll1_x2m2_ck,
1078 .clkdm_name = "mpu_clkdm",
1079 .recalc = &followparent_recalc,
1082 /* arm_fck is divided by two when DPLL1 locked; otherwise, passthrough mpu_ck */
1083 static const struct clksel_rate arm_fck_rates[] = {
1084 { .div = 1, .val = 0, .flags = RATE_IN_3XXX },
1085 { .div = 2, .val = 1, .flags = RATE_IN_3XXX },
1089 static const struct clksel arm_fck_clksel[] = {
1090 { .parent = &mpu_ck, .rates = arm_fck_rates },
1094 static struct clk arm_fck = {
1096 .ops = &clkops_null,
1098 .init = &omap2_init_clksel_parent,
1099 .clksel_reg = OMAP_CM_REGADDR(MPU_MOD, OMAP3430_CM_IDLEST_PLL),
1100 .clksel_mask = OMAP3430_ST_MPU_CLK_MASK,
1101 .clksel = arm_fck_clksel,
1102 .clkdm_name = "mpu_clkdm",
1103 .recalc = &omap2_clksel_recalc,
1106 /* XXX What about neon_clkdm ? */
1109 * REVISIT: This clock is never specifically defined in the 3430 TRM,
1110 * although it is referenced - so this is a guess
1112 static struct clk emu_mpu_alwon_ck = {
1113 .name = "emu_mpu_alwon_ck",
1114 .ops = &clkops_null,
1116 .recalc = &followparent_recalc,
1119 static struct clk dpll2_fck = {
1120 .name = "dpll2_fck",
1121 .ops = &clkops_null,
1123 .init = &omap2_init_clksel_parent,
1124 .clksel_reg = OMAP_CM_REGADDR(OMAP3430_IVA2_MOD, OMAP3430_CM_CLKSEL1_PLL),
1125 .clksel_mask = OMAP3430_IVA2_CLK_SRC_MASK,
1126 .clksel = div4_core_clksel,
1127 .recalc = &omap2_clksel_recalc,
1130 static struct clk iva2_ck = {
1132 .ops = &clkops_omap2_dflt_wait,
1133 .parent = &dpll2_m2_ck,
1134 .enable_reg = OMAP_CM_REGADDR(OMAP3430_IVA2_MOD, CM_FCLKEN),
1135 .enable_bit = OMAP3430_CM_FCLKEN_IVA2_EN_IVA2_SHIFT,
1136 .clkdm_name = "iva2_clkdm",
1137 .recalc = &followparent_recalc,
1140 /* Common interface clocks */
1142 static const struct clksel div2_core_clksel[] = {
1143 { .parent = &core_ck, .rates = div2_rates },
1147 static struct clk l3_ick = {
1149 .ops = &clkops_null,
1151 .init = &omap2_init_clksel_parent,
1152 .clksel_reg = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL),
1153 .clksel_mask = OMAP3430_CLKSEL_L3_MASK,
1154 .clksel = div2_core_clksel,
1155 .clkdm_name = "core_l3_clkdm",
1156 .recalc = &omap2_clksel_recalc,
1159 static const struct clksel div2_l3_clksel[] = {
1160 { .parent = &l3_ick, .rates = div2_rates },
1164 static struct clk l4_ick = {
1166 .ops = &clkops_null,
1168 .init = &omap2_init_clksel_parent,
1169 .clksel_reg = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL),
1170 .clksel_mask = OMAP3430_CLKSEL_L4_MASK,
1171 .clksel = div2_l3_clksel,
1172 .clkdm_name = "core_l4_clkdm",
1173 .recalc = &omap2_clksel_recalc,
1177 static const struct clksel div2_l4_clksel[] = {
1178 { .parent = &l4_ick, .rates = div2_rates },
1182 static struct clk rm_ick = {
1184 .ops = &clkops_null,
1186 .init = &omap2_init_clksel_parent,
1187 .clksel_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_CLKSEL),
1188 .clksel_mask = OMAP3430_CLKSEL_RM_MASK,
1189 .clksel = div2_l4_clksel,
1190 .recalc = &omap2_clksel_recalc,
1193 /* GFX power domain */
1195 /* GFX clocks are in 3430ES1 only. 3430ES2 and later uses the SGX instead */
1197 static const struct clksel gfx_l3_clksel[] = {
1198 { .parent = &l3_ick, .rates = gfx_l3_rates },
1203 * Virtual parent clock for gfx_l3_ick and gfx_l3_fck
1204 * This interface clock does not have a CM_AUTOIDLE bit
1206 static struct clk gfx_l3_ck = {
1207 .name = "gfx_l3_ck",
1208 .ops = &clkops_omap2_dflt_wait,
1210 .enable_reg = OMAP_CM_REGADDR(GFX_MOD, CM_ICLKEN),
1211 .enable_bit = OMAP_EN_GFX_SHIFT,
1212 .recalc = &followparent_recalc,
1215 static struct clk gfx_l3_fck = {
1216 .name = "gfx_l3_fck",
1217 .ops = &clkops_null,
1218 .parent = &gfx_l3_ck,
1219 .init = &omap2_init_clksel_parent,
1220 .clksel_reg = OMAP_CM_REGADDR(GFX_MOD, CM_CLKSEL),
1221 .clksel_mask = OMAP_CLKSEL_GFX_MASK,
1222 .clksel = gfx_l3_clksel,
1223 .clkdm_name = "gfx_3430es1_clkdm",
1224 .recalc = &omap2_clksel_recalc,
1227 static struct clk gfx_l3_ick = {
1228 .name = "gfx_l3_ick",
1229 .ops = &clkops_null,
1230 .parent = &gfx_l3_ck,
1231 .clkdm_name = "gfx_3430es1_clkdm",
1232 .recalc = &followparent_recalc,
1235 static struct clk gfx_cg1_ck = {
1236 .name = "gfx_cg1_ck",
1237 .ops = &clkops_omap2_dflt_wait,
1238 .parent = &gfx_l3_fck, /* REVISIT: correct? */
1239 .enable_reg = OMAP_CM_REGADDR(GFX_MOD, CM_FCLKEN),
1240 .enable_bit = OMAP3430ES1_EN_2D_SHIFT,
1241 .clkdm_name = "gfx_3430es1_clkdm",
1242 .recalc = &followparent_recalc,
1245 static struct clk gfx_cg2_ck = {
1246 .name = "gfx_cg2_ck",
1247 .ops = &clkops_omap2_dflt_wait,
1248 .parent = &gfx_l3_fck, /* REVISIT: correct? */
1249 .enable_reg = OMAP_CM_REGADDR(GFX_MOD, CM_FCLKEN),
1250 .enable_bit = OMAP3430ES1_EN_3D_SHIFT,
1251 .clkdm_name = "gfx_3430es1_clkdm",
1252 .recalc = &followparent_recalc,
1255 /* SGX power domain - 3430ES2 only */
1257 static const struct clksel_rate sgx_core_rates[] = {
1258 { .div = 2, .val = 5, .flags = RATE_IN_36XX },
1259 { .div = 3, .val = 0, .flags = RATE_IN_3XXX },
1260 { .div = 4, .val = 1, .flags = RATE_IN_3XXX },
1261 { .div = 6, .val = 2, .flags = RATE_IN_3XXX },
1265 static const struct clksel_rate sgx_192m_rates[] = {
1266 { .div = 1, .val = 4, .flags = RATE_IN_36XX },
1270 static const struct clksel_rate sgx_corex2_rates[] = {
1271 { .div = 3, .val = 6, .flags = RATE_IN_36XX },
1272 { .div = 5, .val = 7, .flags = RATE_IN_36XX },
1276 static const struct clksel_rate sgx_96m_rates[] = {
1277 { .div = 1, .val = 3, .flags = RATE_IN_3XXX },
1281 static const struct clksel sgx_clksel[] = {
1282 { .parent = &core_ck, .rates = sgx_core_rates },
1283 { .parent = &cm_96m_fck, .rates = sgx_96m_rates },
1284 { .parent = &omap_192m_alwon_fck, .rates = sgx_192m_rates },
1285 { .parent = &corex2_fck, .rates = sgx_corex2_rates },
1289 static struct clk sgx_fck = {
1291 .ops = &clkops_omap2_dflt_wait,
1292 .init = &omap2_init_clksel_parent,
1293 .enable_reg = OMAP_CM_REGADDR(OMAP3430ES2_SGX_MOD, CM_FCLKEN),
1294 .enable_bit = OMAP3430ES2_CM_FCLKEN_SGX_EN_SGX_SHIFT,
1295 .clksel_reg = OMAP_CM_REGADDR(OMAP3430ES2_SGX_MOD, CM_CLKSEL),
1296 .clksel_mask = OMAP3430ES2_CLKSEL_SGX_MASK,
1297 .clksel = sgx_clksel,
1298 .clkdm_name = "sgx_clkdm",
1299 .recalc = &omap2_clksel_recalc,
1300 .set_rate = &omap2_clksel_set_rate,
1301 .round_rate = &omap2_clksel_round_rate
1304 /* This interface clock does not have a CM_AUTOIDLE bit */
1305 static struct clk sgx_ick = {
1307 .ops = &clkops_omap2_dflt_wait,
1309 .enable_reg = OMAP_CM_REGADDR(OMAP3430ES2_SGX_MOD, CM_ICLKEN),
1310 .enable_bit = OMAP3430ES2_CM_ICLKEN_SGX_EN_SGX_SHIFT,
1311 .clkdm_name = "sgx_clkdm",
1312 .recalc = &followparent_recalc,
1315 /* CORE power domain */
1317 static struct clk d2d_26m_fck = {
1318 .name = "d2d_26m_fck",
1319 .ops = &clkops_omap2_dflt_wait,
1321 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1322 .enable_bit = OMAP3430ES1_EN_D2D_SHIFT,
1323 .clkdm_name = "d2d_clkdm",
1324 .recalc = &followparent_recalc,
1327 static struct clk modem_fck = {
1328 .name = "modem_fck",
1329 .ops = &clkops_omap2_mdmclk_dflt_wait,
1331 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1332 .enable_bit = OMAP3430_EN_MODEM_SHIFT,
1333 .clkdm_name = "d2d_clkdm",
1334 .recalc = &followparent_recalc,
1337 static struct clk sad2d_ick = {
1338 .name = "sad2d_ick",
1339 .ops = &clkops_omap2_iclk_dflt_wait,
1341 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1342 .enable_bit = OMAP3430_EN_SAD2D_SHIFT,
1343 .clkdm_name = "d2d_clkdm",
1344 .recalc = &followparent_recalc,
1347 static struct clk mad2d_ick = {
1348 .name = "mad2d_ick",
1349 .ops = &clkops_omap2_iclk_dflt_wait,
1351 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN3),
1352 .enable_bit = OMAP3430_EN_MAD2D_SHIFT,
1353 .clkdm_name = "d2d_clkdm",
1354 .recalc = &followparent_recalc,
1357 static const struct clksel omap343x_gpt_clksel[] = {
1358 { .parent = &omap_32k_fck, .rates = gpt_32k_rates },
1359 { .parent = &sys_ck, .rates = gpt_sys_rates },
1363 static struct clk gpt10_fck = {
1364 .name = "gpt10_fck",
1365 .ops = &clkops_omap2_dflt_wait,
1367 .init = &omap2_init_clksel_parent,
1368 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1369 .enable_bit = OMAP3430_EN_GPT10_SHIFT,
1370 .clksel_reg = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL),
1371 .clksel_mask = OMAP3430_CLKSEL_GPT10_MASK,
1372 .clksel = omap343x_gpt_clksel,
1373 .clkdm_name = "core_l4_clkdm",
1374 .recalc = &omap2_clksel_recalc,
1377 static struct clk gpt11_fck = {
1378 .name = "gpt11_fck",
1379 .ops = &clkops_omap2_dflt_wait,
1381 .init = &omap2_init_clksel_parent,
1382 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1383 .enable_bit = OMAP3430_EN_GPT11_SHIFT,
1384 .clksel_reg = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL),
1385 .clksel_mask = OMAP3430_CLKSEL_GPT11_MASK,
1386 .clksel = omap343x_gpt_clksel,
1387 .clkdm_name = "core_l4_clkdm",
1388 .recalc = &omap2_clksel_recalc,
1391 static struct clk cpefuse_fck = {
1392 .name = "cpefuse_fck",
1393 .ops = &clkops_omap2_dflt,
1395 .clkdm_name = "core_l4_clkdm",
1396 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, OMAP3430ES2_CM_FCLKEN3),
1397 .enable_bit = OMAP3430ES2_EN_CPEFUSE_SHIFT,
1398 .recalc = &followparent_recalc,
1401 static struct clk ts_fck = {
1403 .ops = &clkops_omap2_dflt,
1404 .parent = &omap_32k_fck,
1405 .clkdm_name = "core_l4_clkdm",
1406 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, OMAP3430ES2_CM_FCLKEN3),
1407 .enable_bit = OMAP3430ES2_EN_TS_SHIFT,
1408 .recalc = &followparent_recalc,
1411 static struct clk usbtll_fck = {
1412 .name = "usbtll_fck",
1413 .ops = &clkops_omap2_dflt_wait,
1414 .parent = &dpll5_m2_ck,
1415 .clkdm_name = "core_l4_clkdm",
1416 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, OMAP3430ES2_CM_FCLKEN3),
1417 .enable_bit = OMAP3430ES2_EN_USBTLL_SHIFT,
1418 .recalc = &followparent_recalc,
1421 /* CORE 96M FCLK-derived clocks */
1423 static struct clk core_96m_fck = {
1424 .name = "core_96m_fck",
1425 .ops = &clkops_null,
1426 .parent = &omap_96m_fck,
1427 .clkdm_name = "core_l4_clkdm",
1428 .recalc = &followparent_recalc,
1431 static struct clk mmchs3_fck = {
1432 .name = "mmchs3_fck",
1433 .ops = &clkops_omap2_dflt_wait,
1434 .parent = &core_96m_fck,
1435 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1436 .enable_bit = OMAP3430ES2_EN_MMC3_SHIFT,
1437 .clkdm_name = "core_l4_clkdm",
1438 .recalc = &followparent_recalc,
1441 static struct clk mmchs2_fck = {
1442 .name = "mmchs2_fck",
1443 .ops = &clkops_omap2_dflt_wait,
1444 .parent = &core_96m_fck,
1445 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1446 .enable_bit = OMAP3430_EN_MMC2_SHIFT,
1447 .clkdm_name = "core_l4_clkdm",
1448 .recalc = &followparent_recalc,
1451 static struct clk mspro_fck = {
1452 .name = "mspro_fck",
1453 .ops = &clkops_omap2_dflt_wait,
1454 .parent = &core_96m_fck,
1455 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1456 .enable_bit = OMAP3430_EN_MSPRO_SHIFT,
1457 .clkdm_name = "core_l4_clkdm",
1458 .recalc = &followparent_recalc,
1461 static struct clk mmchs1_fck = {
1462 .name = "mmchs1_fck",
1463 .ops = &clkops_omap2_dflt_wait,
1464 .parent = &core_96m_fck,
1465 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1466 .enable_bit = OMAP3430_EN_MMC1_SHIFT,
1467 .clkdm_name = "core_l4_clkdm",
1468 .recalc = &followparent_recalc,
1471 static struct clk i2c3_fck = {
1473 .ops = &clkops_omap2_dflt_wait,
1474 .parent = &core_96m_fck,
1475 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1476 .enable_bit = OMAP3430_EN_I2C3_SHIFT,
1477 .clkdm_name = "core_l4_clkdm",
1478 .recalc = &followparent_recalc,
1481 static struct clk i2c2_fck = {
1483 .ops = &clkops_omap2_dflt_wait,
1484 .parent = &core_96m_fck,
1485 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1486 .enable_bit = OMAP3430_EN_I2C2_SHIFT,
1487 .clkdm_name = "core_l4_clkdm",
1488 .recalc = &followparent_recalc,
1491 static struct clk i2c1_fck = {
1493 .ops = &clkops_omap2_dflt_wait,
1494 .parent = &core_96m_fck,
1495 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1496 .enable_bit = OMAP3430_EN_I2C1_SHIFT,
1497 .clkdm_name = "core_l4_clkdm",
1498 .recalc = &followparent_recalc,
1502 * MCBSP 1 & 5 get their 96MHz clock from core_96m_fck;
1503 * MCBSP 2, 3, 4 get their 96MHz clock from per_96m_fck.
1505 static const struct clksel_rate common_mcbsp_96m_rates[] = {
1506 { .div = 1, .val = 0, .flags = RATE_IN_3XXX },
1510 static const struct clksel_rate common_mcbsp_mcbsp_rates[] = {
1511 { .div = 1, .val = 1, .flags = RATE_IN_3XXX },
1515 static const struct clksel mcbsp_15_clksel[] = {
1516 { .parent = &core_96m_fck, .rates = common_mcbsp_96m_rates },
1517 { .parent = &mcbsp_clks, .rates = common_mcbsp_mcbsp_rates },
1521 static struct clk mcbsp5_fck = {
1522 .name = "mcbsp5_fck",
1523 .ops = &clkops_omap2_dflt_wait,
1524 .init = &omap2_init_clksel_parent,
1525 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1526 .enable_bit = OMAP3430_EN_MCBSP5_SHIFT,
1527 .clksel_reg = OMAP343X_CTRL_REGADDR(OMAP343X_CONTROL_DEVCONF1),
1528 .clksel_mask = OMAP2_MCBSP5_CLKS_MASK,
1529 .clksel = mcbsp_15_clksel,
1530 .clkdm_name = "core_l4_clkdm",
1531 .recalc = &omap2_clksel_recalc,
1534 static struct clk mcbsp1_fck = {
1535 .name = "mcbsp1_fck",
1536 .ops = &clkops_omap2_dflt_wait,
1537 .init = &omap2_init_clksel_parent,
1538 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1539 .enable_bit = OMAP3430_EN_MCBSP1_SHIFT,
1540 .clksel_reg = OMAP343X_CTRL_REGADDR(OMAP2_CONTROL_DEVCONF0),
1541 .clksel_mask = OMAP2_MCBSP1_CLKS_MASK,
1542 .clksel = mcbsp_15_clksel,
1543 .clkdm_name = "core_l4_clkdm",
1544 .recalc = &omap2_clksel_recalc,
1547 /* CORE_48M_FCK-derived clocks */
1549 static struct clk core_48m_fck = {
1550 .name = "core_48m_fck",
1551 .ops = &clkops_null,
1552 .parent = &omap_48m_fck,
1553 .clkdm_name = "core_l4_clkdm",
1554 .recalc = &followparent_recalc,
1557 static struct clk mcspi4_fck = {
1558 .name = "mcspi4_fck",
1559 .ops = &clkops_omap2_dflt_wait,
1560 .parent = &core_48m_fck,
1561 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1562 .enable_bit = OMAP3430_EN_MCSPI4_SHIFT,
1563 .recalc = &followparent_recalc,
1564 .clkdm_name = "core_l4_clkdm",
1567 static struct clk mcspi3_fck = {
1568 .name = "mcspi3_fck",
1569 .ops = &clkops_omap2_dflt_wait,
1570 .parent = &core_48m_fck,
1571 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1572 .enable_bit = OMAP3430_EN_MCSPI3_SHIFT,
1573 .recalc = &followparent_recalc,
1574 .clkdm_name = "core_l4_clkdm",
1577 static struct clk mcspi2_fck = {
1578 .name = "mcspi2_fck",
1579 .ops = &clkops_omap2_dflt_wait,
1580 .parent = &core_48m_fck,
1581 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1582 .enable_bit = OMAP3430_EN_MCSPI2_SHIFT,
1583 .recalc = &followparent_recalc,
1584 .clkdm_name = "core_l4_clkdm",
1587 static struct clk mcspi1_fck = {
1588 .name = "mcspi1_fck",
1589 .ops = &clkops_omap2_dflt_wait,
1590 .parent = &core_48m_fck,
1591 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1592 .enable_bit = OMAP3430_EN_MCSPI1_SHIFT,
1593 .recalc = &followparent_recalc,
1594 .clkdm_name = "core_l4_clkdm",
1597 static struct clk uart2_fck = {
1598 .name = "uart2_fck",
1599 .ops = &clkops_omap2_dflt_wait,
1600 .parent = &core_48m_fck,
1601 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1602 .enable_bit = OMAP3430_EN_UART2_SHIFT,
1603 .clkdm_name = "core_l4_clkdm",
1604 .recalc = &followparent_recalc,
1607 static struct clk uart1_fck = {
1608 .name = "uart1_fck",
1609 .ops = &clkops_omap2_dflt_wait,
1610 .parent = &core_48m_fck,
1611 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1612 .enable_bit = OMAP3430_EN_UART1_SHIFT,
1613 .clkdm_name = "core_l4_clkdm",
1614 .recalc = &followparent_recalc,
1617 static struct clk fshostusb_fck = {
1618 .name = "fshostusb_fck",
1619 .ops = &clkops_omap2_dflt_wait,
1620 .parent = &core_48m_fck,
1621 .clkdm_name = "core_l4_clkdm",
1622 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1623 .enable_bit = OMAP3430ES1_EN_FSHOSTUSB_SHIFT,
1624 .recalc = &followparent_recalc,
1627 /* CORE_12M_FCK based clocks */
1629 static struct clk core_12m_fck = {
1630 .name = "core_12m_fck",
1631 .ops = &clkops_null,
1632 .parent = &omap_12m_fck,
1633 .clkdm_name = "core_l4_clkdm",
1634 .recalc = &followparent_recalc,
1637 static struct clk hdq_fck = {
1639 .ops = &clkops_omap2_dflt_wait,
1640 .parent = &core_12m_fck,
1641 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1642 .enable_bit = OMAP3430_EN_HDQ_SHIFT,
1643 .recalc = &followparent_recalc,
1646 /* DPLL3-derived clock */
1648 static const struct clksel_rate ssi_ssr_corex2_rates[] = {
1649 { .div = 1, .val = 1, .flags = RATE_IN_3XXX },
1650 { .div = 2, .val = 2, .flags = RATE_IN_3XXX },
1651 { .div = 3, .val = 3, .flags = RATE_IN_3XXX },
1652 { .div = 4, .val = 4, .flags = RATE_IN_3XXX },
1653 { .div = 6, .val = 6, .flags = RATE_IN_3XXX },
1654 { .div = 8, .val = 8, .flags = RATE_IN_3XXX },
1658 static const struct clksel ssi_ssr_clksel[] = {
1659 { .parent = &corex2_fck, .rates = ssi_ssr_corex2_rates },
1663 static struct clk ssi_ssr_fck_3430es1 = {
1664 .name = "ssi_ssr_fck",
1665 .ops = &clkops_omap2_dflt,
1666 .init = &omap2_init_clksel_parent,
1667 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1668 .enable_bit = OMAP3430_EN_SSI_SHIFT,
1669 .clksel_reg = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL),
1670 .clksel_mask = OMAP3430_CLKSEL_SSI_MASK,
1671 .clksel = ssi_ssr_clksel,
1672 .clkdm_name = "core_l4_clkdm",
1673 .recalc = &omap2_clksel_recalc,
1676 static struct clk ssi_ssr_fck_3430es2 = {
1677 .name = "ssi_ssr_fck",
1678 .ops = &clkops_omap3430es2_ssi_wait,
1679 .init = &omap2_init_clksel_parent,
1680 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1681 .enable_bit = OMAP3430_EN_SSI_SHIFT,
1682 .clksel_reg = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL),
1683 .clksel_mask = OMAP3430_CLKSEL_SSI_MASK,
1684 .clksel = ssi_ssr_clksel,
1685 .clkdm_name = "core_l4_clkdm",
1686 .recalc = &omap2_clksel_recalc,
1689 static struct clk ssi_sst_fck_3430es1 = {
1690 .name = "ssi_sst_fck",
1691 .ops = &clkops_null,
1692 .parent = &ssi_ssr_fck_3430es1,
1694 .recalc = &omap_fixed_divisor_recalc,
1697 static struct clk ssi_sst_fck_3430es2 = {
1698 .name = "ssi_sst_fck",
1699 .ops = &clkops_null,
1700 .parent = &ssi_ssr_fck_3430es2,
1702 .recalc = &omap_fixed_divisor_recalc,
1707 /* CORE_L3_ICK based clocks */
1710 * XXX must add clk_enable/clk_disable for these if standard code won't
1713 static struct clk core_l3_ick = {
1714 .name = "core_l3_ick",
1715 .ops = &clkops_null,
1717 .clkdm_name = "core_l3_clkdm",
1718 .recalc = &followparent_recalc,
1721 static struct clk hsotgusb_ick_3430es1 = {
1722 .name = "hsotgusb_ick",
1723 .ops = &clkops_omap2_iclk_dflt,
1724 .parent = &core_l3_ick,
1725 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1726 .enable_bit = OMAP3430_EN_HSOTGUSB_SHIFT,
1727 .clkdm_name = "core_l3_clkdm",
1728 .recalc = &followparent_recalc,
1731 static struct clk hsotgusb_ick_3430es2 = {
1732 .name = "hsotgusb_ick",
1733 .ops = &clkops_omap3430es2_iclk_hsotgusb_wait,
1734 .parent = &core_l3_ick,
1735 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1736 .enable_bit = OMAP3430_EN_HSOTGUSB_SHIFT,
1737 .clkdm_name = "core_l3_clkdm",
1738 .recalc = &followparent_recalc,
1741 /* This interface clock does not have a CM_AUTOIDLE bit */
1742 static struct clk sdrc_ick = {
1744 .ops = &clkops_omap2_dflt_wait,
1745 .parent = &core_l3_ick,
1746 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1747 .enable_bit = OMAP3430_EN_SDRC_SHIFT,
1748 .flags = ENABLE_ON_INIT,
1749 .clkdm_name = "core_l3_clkdm",
1750 .recalc = &followparent_recalc,
1753 static struct clk gpmc_fck = {
1755 .ops = &clkops_null,
1756 .parent = &core_l3_ick,
1757 .flags = ENABLE_ON_INIT, /* huh? */
1758 .clkdm_name = "core_l3_clkdm",
1759 .recalc = &followparent_recalc,
1762 /* SECURITY_L3_ICK based clocks */
1764 static struct clk security_l3_ick = {
1765 .name = "security_l3_ick",
1766 .ops = &clkops_null,
1768 .recalc = &followparent_recalc,
1771 static struct clk pka_ick = {
1773 .ops = &clkops_omap2_iclk_dflt_wait,
1774 .parent = &security_l3_ick,
1775 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN2),
1776 .enable_bit = OMAP3430_EN_PKA_SHIFT,
1777 .recalc = &followparent_recalc,
1780 /* CORE_L4_ICK based clocks */
1782 static struct clk core_l4_ick = {
1783 .name = "core_l4_ick",
1784 .ops = &clkops_null,
1786 .clkdm_name = "core_l4_clkdm",
1787 .recalc = &followparent_recalc,
1790 static struct clk usbtll_ick = {
1791 .name = "usbtll_ick",
1792 .ops = &clkops_omap2_iclk_dflt_wait,
1793 .parent = &core_l4_ick,
1794 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN3),
1795 .enable_bit = OMAP3430ES2_EN_USBTLL_SHIFT,
1796 .clkdm_name = "core_l4_clkdm",
1797 .recalc = &followparent_recalc,
1800 static struct clk mmchs3_ick = {
1801 .name = "mmchs3_ick",
1802 .ops = &clkops_omap2_iclk_dflt_wait,
1803 .parent = &core_l4_ick,
1804 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1805 .enable_bit = OMAP3430ES2_EN_MMC3_SHIFT,
1806 .clkdm_name = "core_l4_clkdm",
1807 .recalc = &followparent_recalc,
1810 /* Intersystem Communication Registers - chassis mode only */
1811 static struct clk icr_ick = {
1813 .ops = &clkops_omap2_iclk_dflt_wait,
1814 .parent = &core_l4_ick,
1815 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1816 .enable_bit = OMAP3430_EN_ICR_SHIFT,
1817 .clkdm_name = "core_l4_clkdm",
1818 .recalc = &followparent_recalc,
1821 static struct clk aes2_ick = {
1823 .ops = &clkops_omap2_iclk_dflt_wait,
1824 .parent = &core_l4_ick,
1825 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1826 .enable_bit = OMAP3430_EN_AES2_SHIFT,
1827 .clkdm_name = "core_l4_clkdm",
1828 .recalc = &followparent_recalc,
1831 static struct clk sha12_ick = {
1832 .name = "sha12_ick",
1833 .ops = &clkops_omap2_iclk_dflt_wait,
1834 .parent = &core_l4_ick,
1835 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1836 .enable_bit = OMAP3430_EN_SHA12_SHIFT,
1837 .clkdm_name = "core_l4_clkdm",
1838 .recalc = &followparent_recalc,
1841 static struct clk des2_ick = {
1843 .ops = &clkops_omap2_iclk_dflt_wait,
1844 .parent = &core_l4_ick,
1845 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1846 .enable_bit = OMAP3430_EN_DES2_SHIFT,
1847 .clkdm_name = "core_l4_clkdm",
1848 .recalc = &followparent_recalc,
1851 static struct clk mmchs2_ick = {
1852 .name = "mmchs2_ick",
1853 .ops = &clkops_omap2_iclk_dflt_wait,
1854 .parent = &core_l4_ick,
1855 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1856 .enable_bit = OMAP3430_EN_MMC2_SHIFT,
1857 .clkdm_name = "core_l4_clkdm",
1858 .recalc = &followparent_recalc,
1861 static struct clk mmchs1_ick = {
1862 .name = "mmchs1_ick",
1863 .ops = &clkops_omap2_iclk_dflt_wait,
1864 .parent = &core_l4_ick,
1865 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1866 .enable_bit = OMAP3430_EN_MMC1_SHIFT,
1867 .clkdm_name = "core_l4_clkdm",
1868 .recalc = &followparent_recalc,
1871 static struct clk mspro_ick = {
1872 .name = "mspro_ick",
1873 .ops = &clkops_omap2_iclk_dflt_wait,
1874 .parent = &core_l4_ick,
1875 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1876 .enable_bit = OMAP3430_EN_MSPRO_SHIFT,
1877 .clkdm_name = "core_l4_clkdm",
1878 .recalc = &followparent_recalc,
1881 static struct clk hdq_ick = {
1883 .ops = &clkops_omap2_iclk_dflt_wait,
1884 .parent = &core_l4_ick,
1885 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1886 .enable_bit = OMAP3430_EN_HDQ_SHIFT,
1887 .clkdm_name = "core_l4_clkdm",
1888 .recalc = &followparent_recalc,
1891 static struct clk mcspi4_ick = {
1892 .name = "mcspi4_ick",
1893 .ops = &clkops_omap2_iclk_dflt_wait,
1894 .parent = &core_l4_ick,
1895 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1896 .enable_bit = OMAP3430_EN_MCSPI4_SHIFT,
1897 .clkdm_name = "core_l4_clkdm",
1898 .recalc = &followparent_recalc,
1901 static struct clk mcspi3_ick = {
1902 .name = "mcspi3_ick",
1903 .ops = &clkops_omap2_iclk_dflt_wait,
1904 .parent = &core_l4_ick,
1905 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1906 .enable_bit = OMAP3430_EN_MCSPI3_SHIFT,
1907 .clkdm_name = "core_l4_clkdm",
1908 .recalc = &followparent_recalc,
1911 static struct clk mcspi2_ick = {
1912 .name = "mcspi2_ick",
1913 .ops = &clkops_omap2_iclk_dflt_wait,
1914 .parent = &core_l4_ick,
1915 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1916 .enable_bit = OMAP3430_EN_MCSPI2_SHIFT,
1917 .clkdm_name = "core_l4_clkdm",
1918 .recalc = &followparent_recalc,
1921 static struct clk mcspi1_ick = {
1922 .name = "mcspi1_ick",
1923 .ops = &clkops_omap2_iclk_dflt_wait,
1924 .parent = &core_l4_ick,
1925 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1926 .enable_bit = OMAP3430_EN_MCSPI1_SHIFT,
1927 .clkdm_name = "core_l4_clkdm",
1928 .recalc = &followparent_recalc,
1931 static struct clk i2c3_ick = {
1933 .ops = &clkops_omap2_iclk_dflt_wait,
1934 .parent = &core_l4_ick,
1935 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1936 .enable_bit = OMAP3430_EN_I2C3_SHIFT,
1937 .clkdm_name = "core_l4_clkdm",
1938 .recalc = &followparent_recalc,
1941 static struct clk i2c2_ick = {
1943 .ops = &clkops_omap2_iclk_dflt_wait,
1944 .parent = &core_l4_ick,
1945 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1946 .enable_bit = OMAP3430_EN_I2C2_SHIFT,
1947 .clkdm_name = "core_l4_clkdm",
1948 .recalc = &followparent_recalc,
1951 static struct clk i2c1_ick = {
1953 .ops = &clkops_omap2_iclk_dflt_wait,
1954 .parent = &core_l4_ick,
1955 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1956 .enable_bit = OMAP3430_EN_I2C1_SHIFT,
1957 .clkdm_name = "core_l4_clkdm",
1958 .recalc = &followparent_recalc,
1961 static struct clk uart2_ick = {
1962 .name = "uart2_ick",
1963 .ops = &clkops_omap2_iclk_dflt_wait,
1964 .parent = &core_l4_ick,
1965 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1966 .enable_bit = OMAP3430_EN_UART2_SHIFT,
1967 .clkdm_name = "core_l4_clkdm",
1968 .recalc = &followparent_recalc,
1971 static struct clk uart1_ick = {
1972 .name = "uart1_ick",
1973 .ops = &clkops_omap2_iclk_dflt_wait,
1974 .parent = &core_l4_ick,
1975 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1976 .enable_bit = OMAP3430_EN_UART1_SHIFT,
1977 .clkdm_name = "core_l4_clkdm",
1978 .recalc = &followparent_recalc,
1981 static struct clk gpt11_ick = {
1982 .name = "gpt11_ick",
1983 .ops = &clkops_omap2_iclk_dflt_wait,
1984 .parent = &core_l4_ick,
1985 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1986 .enable_bit = OMAP3430_EN_GPT11_SHIFT,
1987 .clkdm_name = "core_l4_clkdm",
1988 .recalc = &followparent_recalc,
1991 static struct clk gpt10_ick = {
1992 .name = "gpt10_ick",
1993 .ops = &clkops_omap2_iclk_dflt_wait,
1994 .parent = &core_l4_ick,
1995 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1996 .enable_bit = OMAP3430_EN_GPT10_SHIFT,
1997 .clkdm_name = "core_l4_clkdm",
1998 .recalc = &followparent_recalc,
2001 static struct clk mcbsp5_ick = {
2002 .name = "mcbsp5_ick",
2003 .ops = &clkops_omap2_iclk_dflt_wait,
2004 .parent = &core_l4_ick,
2005 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
2006 .enable_bit = OMAP3430_EN_MCBSP5_SHIFT,
2007 .clkdm_name = "core_l4_clkdm",
2008 .recalc = &followparent_recalc,
2011 static struct clk mcbsp1_ick = {
2012 .name = "mcbsp1_ick",
2013 .ops = &clkops_omap2_iclk_dflt_wait,
2014 .parent = &core_l4_ick,
2015 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
2016 .enable_bit = OMAP3430_EN_MCBSP1_SHIFT,
2017 .clkdm_name = "core_l4_clkdm",
2018 .recalc = &followparent_recalc,
2021 static struct clk fac_ick = {
2023 .ops = &clkops_omap2_iclk_dflt_wait,
2024 .parent = &core_l4_ick,
2025 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
2026 .enable_bit = OMAP3430ES1_EN_FAC_SHIFT,
2027 .clkdm_name = "core_l4_clkdm",
2028 .recalc = &followparent_recalc,
2031 static struct clk mailboxes_ick = {
2032 .name = "mailboxes_ick",
2033 .ops = &clkops_omap2_iclk_dflt_wait,
2034 .parent = &core_l4_ick,
2035 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
2036 .enable_bit = OMAP3430_EN_MAILBOXES_SHIFT,
2037 .clkdm_name = "core_l4_clkdm",
2038 .recalc = &followparent_recalc,
2041 static struct clk omapctrl_ick = {
2042 .name = "omapctrl_ick",
2043 .ops = &clkops_omap2_iclk_dflt_wait,
2044 .parent = &core_l4_ick,
2045 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
2046 .enable_bit = OMAP3430_EN_OMAPCTRL_SHIFT,
2047 .flags = ENABLE_ON_INIT,
2048 .clkdm_name = "core_l4_clkdm",
2049 .recalc = &followparent_recalc,
2052 /* SSI_L4_ICK based clocks */
2054 static struct clk ssi_l4_ick = {
2055 .name = "ssi_l4_ick",
2056 .ops = &clkops_null,
2058 .clkdm_name = "core_l4_clkdm",
2059 .recalc = &followparent_recalc,
2062 static struct clk ssi_ick_3430es1 = {
2064 .ops = &clkops_omap2_iclk_dflt,
2065 .parent = &ssi_l4_ick,
2066 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
2067 .enable_bit = OMAP3430_EN_SSI_SHIFT,
2068 .clkdm_name = "core_l4_clkdm",
2069 .recalc = &followparent_recalc,
2072 static struct clk ssi_ick_3430es2 = {
2074 .ops = &clkops_omap3430es2_iclk_ssi_wait,
2075 .parent = &ssi_l4_ick,
2076 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
2077 .enable_bit = OMAP3430_EN_SSI_SHIFT,
2078 .clkdm_name = "core_l4_clkdm",
2079 .recalc = &followparent_recalc,
2082 /* REVISIT: Technically the TRM claims that this is CORE_CLK based,
2083 * but l4_ick makes more sense to me */
2085 static const struct clksel usb_l4_clksel[] = {
2086 { .parent = &l4_ick, .rates = div2_rates },
2090 static struct clk usb_l4_ick = {
2091 .name = "usb_l4_ick",
2092 .ops = &clkops_omap2_iclk_dflt_wait,
2094 .init = &omap2_init_clksel_parent,
2095 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
2096 .enable_bit = OMAP3430ES1_EN_FSHOSTUSB_SHIFT,
2097 .clksel_reg = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL),
2098 .clksel_mask = OMAP3430ES1_CLKSEL_FSHOSTUSB_MASK,
2099 .clksel = usb_l4_clksel,
2100 .clkdm_name = "core_l4_clkdm",
2101 .recalc = &omap2_clksel_recalc,
2104 /* SECURITY_L4_ICK2 based clocks */
2106 static struct clk security_l4_ick2 = {
2107 .name = "security_l4_ick2",
2108 .ops = &clkops_null,
2110 .recalc = &followparent_recalc,
2113 static struct clk aes1_ick = {
2115 .ops = &clkops_omap2_iclk_dflt_wait,
2116 .parent = &security_l4_ick2,
2117 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN2),
2118 .enable_bit = OMAP3430_EN_AES1_SHIFT,
2119 .recalc = &followparent_recalc,
2122 static struct clk rng_ick = {
2124 .ops = &clkops_omap2_iclk_dflt_wait,
2125 .parent = &security_l4_ick2,
2126 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN2),
2127 .enable_bit = OMAP3430_EN_RNG_SHIFT,
2128 .recalc = &followparent_recalc,
2131 static struct clk sha11_ick = {
2132 .name = "sha11_ick",
2133 .ops = &clkops_omap2_iclk_dflt_wait,
2134 .parent = &security_l4_ick2,
2135 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN2),
2136 .enable_bit = OMAP3430_EN_SHA11_SHIFT,
2137 .recalc = &followparent_recalc,
2140 static struct clk des1_ick = {
2142 .ops = &clkops_omap2_iclk_dflt_wait,
2143 .parent = &security_l4_ick2,
2144 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN2),
2145 .enable_bit = OMAP3430_EN_DES1_SHIFT,
2146 .recalc = &followparent_recalc,
2150 static struct clk dss1_alwon_fck_3430es1 = {
2151 .name = "dss1_alwon_fck",
2152 .ops = &clkops_omap2_dflt,
2153 .parent = &dpll4_m4x2_ck,
2154 .enable_reg = OMAP_CM_REGADDR(OMAP3430_DSS_MOD, CM_FCLKEN),
2155 .enable_bit = OMAP3430_EN_DSS1_SHIFT,
2156 .clkdm_name = "dss_clkdm",
2157 .recalc = &followparent_recalc,
2160 static struct clk dss1_alwon_fck_3430es2 = {
2161 .name = "dss1_alwon_fck",
2162 .ops = &clkops_omap3430es2_dss_usbhost_wait,
2163 .parent = &dpll4_m4x2_ck,
2164 .enable_reg = OMAP_CM_REGADDR(OMAP3430_DSS_MOD, CM_FCLKEN),
2165 .enable_bit = OMAP3430_EN_DSS1_SHIFT,
2166 .clkdm_name = "dss_clkdm",
2167 .recalc = &followparent_recalc,
2170 static struct clk dss_tv_fck = {
2171 .name = "dss_tv_fck",
2172 .ops = &clkops_omap2_dflt,
2173 .parent = &omap_54m_fck,
2174 .enable_reg = OMAP_CM_REGADDR(OMAP3430_DSS_MOD, CM_FCLKEN),
2175 .enable_bit = OMAP3430_EN_TV_SHIFT,
2176 .clkdm_name = "dss_clkdm",
2177 .recalc = &followparent_recalc,
2180 static struct clk dss_96m_fck = {
2181 .name = "dss_96m_fck",
2182 .ops = &clkops_omap2_dflt,
2183 .parent = &omap_96m_fck,
2184 .enable_reg = OMAP_CM_REGADDR(OMAP3430_DSS_MOD, CM_FCLKEN),
2185 .enable_bit = OMAP3430_EN_TV_SHIFT,
2186 .clkdm_name = "dss_clkdm",
2187 .recalc = &followparent_recalc,
2190 static struct clk dss2_alwon_fck = {
2191 .name = "dss2_alwon_fck",
2192 .ops = &clkops_omap2_dflt,
2194 .enable_reg = OMAP_CM_REGADDR(OMAP3430_DSS_MOD, CM_FCLKEN),
2195 .enable_bit = OMAP3430_EN_DSS2_SHIFT,
2196 .clkdm_name = "dss_clkdm",
2197 .recalc = &followparent_recalc,
2200 static struct clk dss_ick_3430es1 = {
2201 /* Handles both L3 and L4 clocks */
2203 .ops = &clkops_omap2_iclk_dflt,
2205 .enable_reg = OMAP_CM_REGADDR(OMAP3430_DSS_MOD, CM_ICLKEN),
2206 .enable_bit = OMAP3430_CM_ICLKEN_DSS_EN_DSS_SHIFT,
2207 .clkdm_name = "dss_clkdm",
2208 .recalc = &followparent_recalc,
2211 static struct clk dss_ick_3430es2 = {
2212 /* Handles both L3 and L4 clocks */
2214 .ops = &clkops_omap3430es2_iclk_dss_usbhost_wait,
2216 .enable_reg = OMAP_CM_REGADDR(OMAP3430_DSS_MOD, CM_ICLKEN),
2217 .enable_bit = OMAP3430_CM_ICLKEN_DSS_EN_DSS_SHIFT,
2218 .clkdm_name = "dss_clkdm",
2219 .recalc = &followparent_recalc,
2224 static struct clk cam_mclk = {
2226 .ops = &clkops_omap2_dflt,
2227 .parent = &dpll4_m5x2_ck,
2228 .enable_reg = OMAP_CM_REGADDR(OMAP3430_CAM_MOD, CM_FCLKEN),
2229 .enable_bit = OMAP3430_EN_CAM_SHIFT,
2230 .clkdm_name = "cam_clkdm",
2231 .recalc = &followparent_recalc,
2234 static struct clk cam_ick = {
2235 /* Handles both L3 and L4 clocks */
2237 .ops = &clkops_omap2_iclk_dflt,
2239 .enable_reg = OMAP_CM_REGADDR(OMAP3430_CAM_MOD, CM_ICLKEN),
2240 .enable_bit = OMAP3430_EN_CAM_SHIFT,
2241 .clkdm_name = "cam_clkdm",
2242 .recalc = &followparent_recalc,
2245 static struct clk csi2_96m_fck = {
2246 .name = "csi2_96m_fck",
2247 .ops = &clkops_omap2_dflt,
2248 .parent = &core_96m_fck,
2249 .enable_reg = OMAP_CM_REGADDR(OMAP3430_CAM_MOD, CM_FCLKEN),
2250 .enable_bit = OMAP3430_EN_CSI2_SHIFT,
2251 .clkdm_name = "cam_clkdm",
2252 .recalc = &followparent_recalc,
2255 /* USBHOST - 3430ES2 only */
2257 static struct clk usbhost_120m_fck = {
2258 .name = "usbhost_120m_fck",
2259 .ops = &clkops_omap2_dflt,
2260 .parent = &dpll5_m2_ck,
2261 .enable_reg = OMAP_CM_REGADDR(OMAP3430ES2_USBHOST_MOD, CM_FCLKEN),
2262 .enable_bit = OMAP3430ES2_EN_USBHOST2_SHIFT,
2263 .clkdm_name = "usbhost_clkdm",
2264 .recalc = &followparent_recalc,
2267 static struct clk usbhost_48m_fck = {
2268 .name = "usbhost_48m_fck",
2269 .ops = &clkops_omap3430es2_dss_usbhost_wait,
2270 .parent = &omap_48m_fck,
2271 .enable_reg = OMAP_CM_REGADDR(OMAP3430ES2_USBHOST_MOD, CM_FCLKEN),
2272 .enable_bit = OMAP3430ES2_EN_USBHOST1_SHIFT,
2273 .clkdm_name = "usbhost_clkdm",
2274 .recalc = &followparent_recalc,
2277 static struct clk usbhost_ick = {
2278 /* Handles both L3 and L4 clocks */
2279 .name = "usbhost_ick",
2280 .ops = &clkops_omap3430es2_iclk_dss_usbhost_wait,
2282 .enable_reg = OMAP_CM_REGADDR(OMAP3430ES2_USBHOST_MOD, CM_ICLKEN),
2283 .enable_bit = OMAP3430ES2_EN_USBHOST_SHIFT,
2284 .clkdm_name = "usbhost_clkdm",
2285 .recalc = &followparent_recalc,
2290 static const struct clksel_rate usim_96m_rates[] = {
2291 { .div = 2, .val = 3, .flags = RATE_IN_3XXX },
2292 { .div = 4, .val = 4, .flags = RATE_IN_3XXX },
2293 { .div = 8, .val = 5, .flags = RATE_IN_3XXX },
2294 { .div = 10, .val = 6, .flags = RATE_IN_3XXX },
2298 static const struct clksel_rate usim_120m_rates[] = {
2299 { .div = 4, .val = 7, .flags = RATE_IN_3XXX },
2300 { .div = 8, .val = 8, .flags = RATE_IN_3XXX },
2301 { .div = 16, .val = 9, .flags = RATE_IN_3XXX },
2302 { .div = 20, .val = 10, .flags = RATE_IN_3XXX },
2306 static const struct clksel usim_clksel[] = {
2307 { .parent = &omap_96m_fck, .rates = usim_96m_rates },
2308 { .parent = &dpll5_m2_ck, .rates = usim_120m_rates },
2309 { .parent = &sys_ck, .rates = div2_rates },
2314 static struct clk usim_fck = {
2316 .ops = &clkops_omap2_dflt_wait,
2317 .init = &omap2_init_clksel_parent,
2318 .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_FCLKEN),
2319 .enable_bit = OMAP3430ES2_EN_USIMOCP_SHIFT,
2320 .clksel_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_CLKSEL),
2321 .clksel_mask = OMAP3430ES2_CLKSEL_USIMOCP_MASK,
2322 .clksel = usim_clksel,
2323 .recalc = &omap2_clksel_recalc,
2326 /* XXX should gpt1's clksel have wkup_32k_fck as the 32k opt? */
2327 static struct clk gpt1_fck = {
2329 .ops = &clkops_omap2_dflt_wait,
2330 .init = &omap2_init_clksel_parent,
2331 .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_FCLKEN),
2332 .enable_bit = OMAP3430_EN_GPT1_SHIFT,
2333 .clksel_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_CLKSEL),
2334 .clksel_mask = OMAP3430_CLKSEL_GPT1_MASK,
2335 .clksel = omap343x_gpt_clksel,
2336 .clkdm_name = "wkup_clkdm",
2337 .recalc = &omap2_clksel_recalc,
2340 static struct clk wkup_32k_fck = {
2341 .name = "wkup_32k_fck",
2342 .ops = &clkops_null,
2343 .parent = &omap_32k_fck,
2344 .clkdm_name = "wkup_clkdm",
2345 .recalc = &followparent_recalc,
2348 static struct clk gpio1_dbck = {
2349 .name = "gpio1_dbck",
2350 .ops = &clkops_omap2_dflt,
2351 .parent = &wkup_32k_fck,
2352 .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_FCLKEN),
2353 .enable_bit = OMAP3430_EN_GPIO1_SHIFT,
2354 .clkdm_name = "wkup_clkdm",
2355 .recalc = &followparent_recalc,
2358 static struct clk wdt2_fck = {
2360 .ops = &clkops_omap2_dflt_wait,
2361 .parent = &wkup_32k_fck,
2362 .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_FCLKEN),
2363 .enable_bit = OMAP3430_EN_WDT2_SHIFT,
2364 .clkdm_name = "wkup_clkdm",
2365 .recalc = &followparent_recalc,
2368 static struct clk wkup_l4_ick = {
2369 .name = "wkup_l4_ick",
2370 .ops = &clkops_null,
2372 .clkdm_name = "wkup_clkdm",
2373 .recalc = &followparent_recalc,
2377 /* Never specifically named in the TRM, so we have to infer a likely name */
2378 static struct clk usim_ick = {
2380 .ops = &clkops_omap2_iclk_dflt_wait,
2381 .parent = &wkup_l4_ick,
2382 .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_ICLKEN),
2383 .enable_bit = OMAP3430ES2_EN_USIMOCP_SHIFT,
2384 .clkdm_name = "wkup_clkdm",
2385 .recalc = &followparent_recalc,
2388 static struct clk wdt2_ick = {
2390 .ops = &clkops_omap2_iclk_dflt_wait,
2391 .parent = &wkup_l4_ick,
2392 .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_ICLKEN),
2393 .enable_bit = OMAP3430_EN_WDT2_SHIFT,
2394 .clkdm_name = "wkup_clkdm",
2395 .recalc = &followparent_recalc,
2398 static struct clk wdt1_ick = {
2400 .ops = &clkops_omap2_iclk_dflt_wait,
2401 .parent = &wkup_l4_ick,
2402 .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_ICLKEN),
2403 .enable_bit = OMAP3430_EN_WDT1_SHIFT,
2404 .clkdm_name = "wkup_clkdm",
2405 .recalc = &followparent_recalc,
2408 static struct clk gpio1_ick = {
2409 .name = "gpio1_ick",
2410 .ops = &clkops_omap2_iclk_dflt_wait,
2411 .parent = &wkup_l4_ick,
2412 .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_ICLKEN),
2413 .enable_bit = OMAP3430_EN_GPIO1_SHIFT,
2414 .clkdm_name = "wkup_clkdm",
2415 .recalc = &followparent_recalc,
2418 static struct clk omap_32ksync_ick = {
2419 .name = "omap_32ksync_ick",
2420 .ops = &clkops_omap2_iclk_dflt_wait,
2421 .parent = &wkup_l4_ick,
2422 .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_ICLKEN),
2423 .enable_bit = OMAP3430_EN_32KSYNC_SHIFT,
2424 .clkdm_name = "wkup_clkdm",
2425 .recalc = &followparent_recalc,
2428 /* XXX This clock no longer exists in 3430 TRM rev F */
2429 static struct clk gpt12_ick = {
2430 .name = "gpt12_ick",
2431 .ops = &clkops_omap2_iclk_dflt_wait,
2432 .parent = &wkup_l4_ick,
2433 .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_ICLKEN),
2434 .enable_bit = OMAP3430_EN_GPT12_SHIFT,
2435 .clkdm_name = "wkup_clkdm",
2436 .recalc = &followparent_recalc,
2439 static struct clk gpt1_ick = {
2441 .ops = &clkops_omap2_iclk_dflt_wait,
2442 .parent = &wkup_l4_ick,
2443 .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_ICLKEN),
2444 .enable_bit = OMAP3430_EN_GPT1_SHIFT,
2445 .clkdm_name = "wkup_clkdm",
2446 .recalc = &followparent_recalc,
2451 /* PER clock domain */
2453 static struct clk per_96m_fck = {
2454 .name = "per_96m_fck",
2455 .ops = &clkops_null,
2456 .parent = &omap_96m_alwon_fck,
2457 .clkdm_name = "per_clkdm",
2458 .recalc = &followparent_recalc,
2461 static struct clk per_48m_fck = {
2462 .name = "per_48m_fck",
2463 .ops = &clkops_null,
2464 .parent = &omap_48m_fck,
2465 .clkdm_name = "per_clkdm",
2466 .recalc = &followparent_recalc,
2469 static struct clk uart3_fck = {
2470 .name = "uart3_fck",
2471 .ops = &clkops_omap2_dflt_wait,
2472 .parent = &per_48m_fck,
2473 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_FCLKEN),
2474 .enable_bit = OMAP3430_EN_UART3_SHIFT,
2475 .clkdm_name = "per_clkdm",
2476 .recalc = &followparent_recalc,
2479 static struct clk uart4_fck = {
2480 .name = "uart4_fck",
2481 .ops = &clkops_omap2_dflt_wait,
2482 .parent = &per_48m_fck,
2483 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_FCLKEN),
2484 .enable_bit = OMAP3630_EN_UART4_SHIFT,
2485 .clkdm_name = "per_clkdm",
2486 .recalc = &followparent_recalc,
2489 static struct clk gpt2_fck = {
2491 .ops = &clkops_omap2_dflt_wait,
2492 .init = &omap2_init_clksel_parent,
2493 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_FCLKEN),
2494 .enable_bit = OMAP3430_EN_GPT2_SHIFT,
2495 .clksel_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_CLKSEL),
2496 .clksel_mask = OMAP3430_CLKSEL_GPT2_MASK,
2497 .clksel = omap343x_gpt_clksel,
2498 .clkdm_name = "per_clkdm",
2499 .recalc = &omap2_clksel_recalc,
2502 static struct clk gpt3_fck = {
2504 .ops = &clkops_omap2_dflt_wait,
2505 .init = &omap2_init_clksel_parent,
2506 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_FCLKEN),
2507 .enable_bit = OMAP3430_EN_GPT3_SHIFT,
2508 .clksel_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_CLKSEL),
2509 .clksel_mask = OMAP3430_CLKSEL_GPT3_MASK,
2510 .clksel = omap343x_gpt_clksel,
2511 .clkdm_name = "per_clkdm",
2512 .recalc = &omap2_clksel_recalc,
2515 static struct clk gpt4_fck = {
2517 .ops = &clkops_omap2_dflt_wait,
2518 .init = &omap2_init_clksel_parent,
2519 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_FCLKEN),
2520 .enable_bit = OMAP3430_EN_GPT4_SHIFT,
2521 .clksel_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_CLKSEL),
2522 .clksel_mask = OMAP3430_CLKSEL_GPT4_MASK,
2523 .clksel = omap343x_gpt_clksel,
2524 .clkdm_name = "per_clkdm",
2525 .recalc = &omap2_clksel_recalc,
2528 static struct clk gpt5_fck = {
2530 .ops = &clkops_omap2_dflt_wait,
2531 .init = &omap2_init_clksel_parent,
2532 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_FCLKEN),
2533 .enable_bit = OMAP3430_EN_GPT5_SHIFT,
2534 .clksel_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_CLKSEL),
2535 .clksel_mask = OMAP3430_CLKSEL_GPT5_MASK,
2536 .clksel = omap343x_gpt_clksel,
2537 .clkdm_name = "per_clkdm",
2538 .recalc = &omap2_clksel_recalc,
2541 static struct clk gpt6_fck = {
2543 .ops = &clkops_omap2_dflt_wait,
2544 .init = &omap2_init_clksel_parent,
2545 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_FCLKEN),
2546 .enable_bit = OMAP3430_EN_GPT6_SHIFT,
2547 .clksel_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_CLKSEL),
2548 .clksel_mask = OMAP3430_CLKSEL_GPT6_MASK,
2549 .clksel = omap343x_gpt_clksel,
2550 .clkdm_name = "per_clkdm",
2551 .recalc = &omap2_clksel_recalc,
2554 static struct clk gpt7_fck = {
2556 .ops = &clkops_omap2_dflt_wait,
2557 .init = &omap2_init_clksel_parent,
2558 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_FCLKEN),
2559 .enable_bit = OMAP3430_EN_GPT7_SHIFT,
2560 .clksel_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_CLKSEL),
2561 .clksel_mask = OMAP3430_CLKSEL_GPT7_MASK,
2562 .clksel = omap343x_gpt_clksel,
2563 .clkdm_name = "per_clkdm",
2564 .recalc = &omap2_clksel_recalc,
2567 static struct clk gpt8_fck = {
2569 .ops = &clkops_omap2_dflt_wait,
2570 .init = &omap2_init_clksel_parent,
2571 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_FCLKEN),
2572 .enable_bit = OMAP3430_EN_GPT8_SHIFT,
2573 .clksel_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_CLKSEL),
2574 .clksel_mask = OMAP3430_CLKSEL_GPT8_MASK,
2575 .clksel = omap343x_gpt_clksel,
2576 .clkdm_name = "per_clkdm",
2577 .recalc = &omap2_clksel_recalc,
2580 static struct clk gpt9_fck = {
2582 .ops = &clkops_omap2_dflt_wait,
2583 .init = &omap2_init_clksel_parent,
2584 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_FCLKEN),
2585 .enable_bit = OMAP3430_EN_GPT9_SHIFT,
2586 .clksel_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_CLKSEL),
2587 .clksel_mask = OMAP3430_CLKSEL_GPT9_MASK,
2588 .clksel = omap343x_gpt_clksel,
2589 .clkdm_name = "per_clkdm",
2590 .recalc = &omap2_clksel_recalc,
2593 static struct clk per_32k_alwon_fck = {
2594 .name = "per_32k_alwon_fck",
2595 .ops = &clkops_null,
2596 .parent = &omap_32k_fck,
2597 .clkdm_name = "per_clkdm",
2598 .recalc = &followparent_recalc,
2601 static struct clk gpio6_dbck = {
2602 .name = "gpio6_dbck",
2603 .ops = &clkops_omap2_dflt,
2604 .parent = &per_32k_alwon_fck,
2605 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_FCLKEN),
2606 .enable_bit = OMAP3430_EN_GPIO6_SHIFT,
2607 .clkdm_name = "per_clkdm",
2608 .recalc = &followparent_recalc,
2611 static struct clk gpio5_dbck = {
2612 .name = "gpio5_dbck",
2613 .ops = &clkops_omap2_dflt,
2614 .parent = &per_32k_alwon_fck,
2615 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_FCLKEN),
2616 .enable_bit = OMAP3430_EN_GPIO5_SHIFT,
2617 .clkdm_name = "per_clkdm",
2618 .recalc = &followparent_recalc,
2621 static struct clk gpio4_dbck = {
2622 .name = "gpio4_dbck",
2623 .ops = &clkops_omap2_dflt,
2624 .parent = &per_32k_alwon_fck,
2625 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_FCLKEN),
2626 .enable_bit = OMAP3430_EN_GPIO4_SHIFT,
2627 .clkdm_name = "per_clkdm",
2628 .recalc = &followparent_recalc,
2631 static struct clk gpio3_dbck = {
2632 .name = "gpio3_dbck",
2633 .ops = &clkops_omap2_dflt,
2634 .parent = &per_32k_alwon_fck,
2635 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_FCLKEN),
2636 .enable_bit = OMAP3430_EN_GPIO3_SHIFT,
2637 .clkdm_name = "per_clkdm",
2638 .recalc = &followparent_recalc,
2641 static struct clk gpio2_dbck = {
2642 .name = "gpio2_dbck",
2643 .ops = &clkops_omap2_dflt,
2644 .parent = &per_32k_alwon_fck,
2645 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_FCLKEN),
2646 .enable_bit = OMAP3430_EN_GPIO2_SHIFT,
2647 .clkdm_name = "per_clkdm",
2648 .recalc = &followparent_recalc,
2651 static struct clk wdt3_fck = {
2653 .ops = &clkops_omap2_dflt_wait,
2654 .parent = &per_32k_alwon_fck,
2655 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_FCLKEN),
2656 .enable_bit = OMAP3430_EN_WDT3_SHIFT,
2657 .clkdm_name = "per_clkdm",
2658 .recalc = &followparent_recalc,
2661 static struct clk per_l4_ick = {
2662 .name = "per_l4_ick",
2663 .ops = &clkops_null,
2665 .clkdm_name = "per_clkdm",
2666 .recalc = &followparent_recalc,
2669 static struct clk gpio6_ick = {
2670 .name = "gpio6_ick",
2671 .ops = &clkops_omap2_iclk_dflt_wait,
2672 .parent = &per_l4_ick,
2673 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN),
2674 .enable_bit = OMAP3430_EN_GPIO6_SHIFT,
2675 .clkdm_name = "per_clkdm",
2676 .recalc = &followparent_recalc,
2679 static struct clk gpio5_ick = {
2680 .name = "gpio5_ick",
2681 .ops = &clkops_omap2_iclk_dflt_wait,
2682 .parent = &per_l4_ick,
2683 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN),
2684 .enable_bit = OMAP3430_EN_GPIO5_SHIFT,
2685 .clkdm_name = "per_clkdm",
2686 .recalc = &followparent_recalc,
2689 static struct clk gpio4_ick = {
2690 .name = "gpio4_ick",
2691 .ops = &clkops_omap2_iclk_dflt_wait,
2692 .parent = &per_l4_ick,
2693 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN),
2694 .enable_bit = OMAP3430_EN_GPIO4_SHIFT,
2695 .clkdm_name = "per_clkdm",
2696 .recalc = &followparent_recalc,
2699 static struct clk gpio3_ick = {
2700 .name = "gpio3_ick",
2701 .ops = &clkops_omap2_iclk_dflt_wait,
2702 .parent = &per_l4_ick,
2703 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN),
2704 .enable_bit = OMAP3430_EN_GPIO3_SHIFT,
2705 .clkdm_name = "per_clkdm",
2706 .recalc = &followparent_recalc,
2709 static struct clk gpio2_ick = {
2710 .name = "gpio2_ick",
2711 .ops = &clkops_omap2_iclk_dflt_wait,
2712 .parent = &per_l4_ick,
2713 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN),
2714 .enable_bit = OMAP3430_EN_GPIO2_SHIFT,
2715 .clkdm_name = "per_clkdm",
2716 .recalc = &followparent_recalc,
2719 static struct clk wdt3_ick = {
2721 .ops = &clkops_omap2_iclk_dflt_wait,
2722 .parent = &per_l4_ick,
2723 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN),
2724 .enable_bit = OMAP3430_EN_WDT3_SHIFT,
2725 .clkdm_name = "per_clkdm",
2726 .recalc = &followparent_recalc,
2729 static struct clk uart3_ick = {
2730 .name = "uart3_ick",
2731 .ops = &clkops_omap2_iclk_dflt_wait,
2732 .parent = &per_l4_ick,
2733 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN),
2734 .enable_bit = OMAP3430_EN_UART3_SHIFT,
2735 .clkdm_name = "per_clkdm",
2736 .recalc = &followparent_recalc,
2739 static struct clk uart4_ick = {
2740 .name = "uart4_ick",
2741 .ops = &clkops_omap2_iclk_dflt_wait,
2742 .parent = &per_l4_ick,
2743 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN),
2744 .enable_bit = OMAP3630_EN_UART4_SHIFT,
2745 .clkdm_name = "per_clkdm",
2746 .recalc = &followparent_recalc,
2749 static struct clk gpt9_ick = {
2751 .ops = &clkops_omap2_iclk_dflt_wait,
2752 .parent = &per_l4_ick,
2753 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN),
2754 .enable_bit = OMAP3430_EN_GPT9_SHIFT,
2755 .clkdm_name = "per_clkdm",
2756 .recalc = &followparent_recalc,
2759 static struct clk gpt8_ick = {
2761 .ops = &clkops_omap2_iclk_dflt_wait,
2762 .parent = &per_l4_ick,
2763 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN),
2764 .enable_bit = OMAP3430_EN_GPT8_SHIFT,
2765 .clkdm_name = "per_clkdm",
2766 .recalc = &followparent_recalc,
2769 static struct clk gpt7_ick = {
2771 .ops = &clkops_omap2_iclk_dflt_wait,
2772 .parent = &per_l4_ick,
2773 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN),
2774 .enable_bit = OMAP3430_EN_GPT7_SHIFT,
2775 .clkdm_name = "per_clkdm",
2776 .recalc = &followparent_recalc,
2779 static struct clk gpt6_ick = {
2781 .ops = &clkops_omap2_iclk_dflt_wait,
2782 .parent = &per_l4_ick,
2783 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN),
2784 .enable_bit = OMAP3430_EN_GPT6_SHIFT,
2785 .clkdm_name = "per_clkdm",
2786 .recalc = &followparent_recalc,
2789 static struct clk gpt5_ick = {
2791 .ops = &clkops_omap2_iclk_dflt_wait,
2792 .parent = &per_l4_ick,
2793 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN),
2794 .enable_bit = OMAP3430_EN_GPT5_SHIFT,
2795 .clkdm_name = "per_clkdm",
2796 .recalc = &followparent_recalc,
2799 static struct clk gpt4_ick = {
2801 .ops = &clkops_omap2_iclk_dflt_wait,
2802 .parent = &per_l4_ick,
2803 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN),
2804 .enable_bit = OMAP3430_EN_GPT4_SHIFT,
2805 .clkdm_name = "per_clkdm",
2806 .recalc = &followparent_recalc,
2809 static struct clk gpt3_ick = {
2811 .ops = &clkops_omap2_iclk_dflt_wait,
2812 .parent = &per_l4_ick,
2813 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN),
2814 .enable_bit = OMAP3430_EN_GPT3_SHIFT,
2815 .clkdm_name = "per_clkdm",
2816 .recalc = &followparent_recalc,
2819 static struct clk gpt2_ick = {
2821 .ops = &clkops_omap2_iclk_dflt_wait,
2822 .parent = &per_l4_ick,
2823 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN),
2824 .enable_bit = OMAP3430_EN_GPT2_SHIFT,
2825 .clkdm_name = "per_clkdm",
2826 .recalc = &followparent_recalc,
2829 static struct clk mcbsp2_ick = {
2830 .name = "mcbsp2_ick",
2831 .ops = &clkops_omap2_iclk_dflt_wait,
2832 .parent = &per_l4_ick,
2833 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN),
2834 .enable_bit = OMAP3430_EN_MCBSP2_SHIFT,
2835 .clkdm_name = "per_clkdm",
2836 .recalc = &followparent_recalc,
2839 static struct clk mcbsp3_ick = {
2840 .name = "mcbsp3_ick",
2841 .ops = &clkops_omap2_iclk_dflt_wait,
2842 .parent = &per_l4_ick,
2843 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN),
2844 .enable_bit = OMAP3430_EN_MCBSP3_SHIFT,
2845 .clkdm_name = "per_clkdm",
2846 .recalc = &followparent_recalc,
2849 static struct clk mcbsp4_ick = {
2850 .name = "mcbsp4_ick",
2851 .ops = &clkops_omap2_iclk_dflt_wait,
2852 .parent = &per_l4_ick,
2853 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN),
2854 .enable_bit = OMAP3430_EN_MCBSP4_SHIFT,
2855 .clkdm_name = "per_clkdm",
2856 .recalc = &followparent_recalc,
2859 static const struct clksel mcbsp_234_clksel[] = {
2860 { .parent = &per_96m_fck, .rates = common_mcbsp_96m_rates },
2861 { .parent = &mcbsp_clks, .rates = common_mcbsp_mcbsp_rates },
2865 static struct clk mcbsp2_fck = {
2866 .name = "mcbsp2_fck",
2867 .ops = &clkops_omap2_dflt_wait,
2868 .init = &omap2_init_clksel_parent,
2869 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_FCLKEN),
2870 .enable_bit = OMAP3430_EN_MCBSP2_SHIFT,
2871 .clksel_reg = OMAP343X_CTRL_REGADDR(OMAP2_CONTROL_DEVCONF0),
2872 .clksel_mask = OMAP2_MCBSP2_CLKS_MASK,
2873 .clksel = mcbsp_234_clksel,
2874 .clkdm_name = "per_clkdm",
2875 .recalc = &omap2_clksel_recalc,
2878 static struct clk mcbsp3_fck = {
2879 .name = "mcbsp3_fck",
2880 .ops = &clkops_omap2_dflt_wait,
2881 .init = &omap2_init_clksel_parent,
2882 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_FCLKEN),
2883 .enable_bit = OMAP3430_EN_MCBSP3_SHIFT,
2884 .clksel_reg = OMAP343X_CTRL_REGADDR(OMAP343X_CONTROL_DEVCONF1),
2885 .clksel_mask = OMAP2_MCBSP3_CLKS_MASK,
2886 .clksel = mcbsp_234_clksel,
2887 .clkdm_name = "per_clkdm",
2888 .recalc = &omap2_clksel_recalc,
2891 static struct clk mcbsp4_fck = {
2892 .name = "mcbsp4_fck",
2893 .ops = &clkops_omap2_dflt_wait,
2894 .init = &omap2_init_clksel_parent,
2895 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_FCLKEN),
2896 .enable_bit = OMAP3430_EN_MCBSP4_SHIFT,
2897 .clksel_reg = OMAP343X_CTRL_REGADDR(OMAP343X_CONTROL_DEVCONF1),
2898 .clksel_mask = OMAP2_MCBSP4_CLKS_MASK,
2899 .clksel = mcbsp_234_clksel,
2900 .clkdm_name = "per_clkdm",
2901 .recalc = &omap2_clksel_recalc,
2906 /* More information: ARM Cortex-A8 Technical Reference Manual, sect 10.1 */
2908 static const struct clksel_rate emu_src_sys_rates[] = {
2909 { .div = 1, .val = 0, .flags = RATE_IN_3XXX },
2913 static const struct clksel_rate emu_src_core_rates[] = {
2914 { .div = 1, .val = 1, .flags = RATE_IN_3XXX },
2918 static const struct clksel_rate emu_src_per_rates[] = {
2919 { .div = 1, .val = 2, .flags = RATE_IN_3XXX },
2923 static const struct clksel_rate emu_src_mpu_rates[] = {
2924 { .div = 1, .val = 3, .flags = RATE_IN_3XXX },
2928 static const struct clksel emu_src_clksel[] = {
2929 { .parent = &sys_ck, .rates = emu_src_sys_rates },
2930 { .parent = &emu_core_alwon_ck, .rates = emu_src_core_rates },
2931 { .parent = &emu_per_alwon_ck, .rates = emu_src_per_rates },
2932 { .parent = &emu_mpu_alwon_ck, .rates = emu_src_mpu_rates },
2937 * Like the clkout_src clocks, emu_src_clk is a virtual clock, existing only
2938 * to switch the source of some of the EMU clocks.
2939 * XXX Are there CLKEN bits for these EMU clks?
2941 static struct clk emu_src_ck = {
2942 .name = "emu_src_ck",
2943 .ops = &clkops_null,
2944 .init = &omap2_init_clksel_parent,
2945 .clksel_reg = OMAP_CM_REGADDR(OMAP3430_EMU_MOD, CM_CLKSEL1),
2946 .clksel_mask = OMAP3430_MUX_CTRL_MASK,
2947 .clksel = emu_src_clksel,
2948 .clkdm_name = "emu_clkdm",
2949 .recalc = &omap2_clksel_recalc,
2952 static const struct clksel_rate pclk_emu_rates[] = {
2953 { .div = 2, .val = 2, .flags = RATE_IN_3XXX },
2954 { .div = 3, .val = 3, .flags = RATE_IN_3XXX },
2955 { .div = 4, .val = 4, .flags = RATE_IN_3XXX },
2956 { .div = 6, .val = 6, .flags = RATE_IN_3XXX },
2960 static const struct clksel pclk_emu_clksel[] = {
2961 { .parent = &emu_src_ck, .rates = pclk_emu_rates },
2965 static struct clk pclk_fck = {
2967 .ops = &clkops_null,
2968 .init = &omap2_init_clksel_parent,
2969 .clksel_reg = OMAP_CM_REGADDR(OMAP3430_EMU_MOD, CM_CLKSEL1),
2970 .clksel_mask = OMAP3430_CLKSEL_PCLK_MASK,
2971 .clksel = pclk_emu_clksel,
2972 .clkdm_name = "emu_clkdm",
2973 .recalc = &omap2_clksel_recalc,
2976 static const struct clksel_rate pclkx2_emu_rates[] = {
2977 { .div = 1, .val = 1, .flags = RATE_IN_3XXX },
2978 { .div = 2, .val = 2, .flags = RATE_IN_3XXX },
2979 { .div = 3, .val = 3, .flags = RATE_IN_3XXX },
2983 static const struct clksel pclkx2_emu_clksel[] = {
2984 { .parent = &emu_src_ck, .rates = pclkx2_emu_rates },
2988 static struct clk pclkx2_fck = {
2989 .name = "pclkx2_fck",
2990 .ops = &clkops_null,
2991 .init = &omap2_init_clksel_parent,
2992 .clksel_reg = OMAP_CM_REGADDR(OMAP3430_EMU_MOD, CM_CLKSEL1),
2993 .clksel_mask = OMAP3430_CLKSEL_PCLKX2_MASK,
2994 .clksel = pclkx2_emu_clksel,
2995 .clkdm_name = "emu_clkdm",
2996 .recalc = &omap2_clksel_recalc,
2999 static const struct clksel atclk_emu_clksel[] = {
3000 { .parent = &emu_src_ck, .rates = div2_rates },
3004 static struct clk atclk_fck = {
3005 .name = "atclk_fck",
3006 .ops = &clkops_null,
3007 .init = &omap2_init_clksel_parent,
3008 .clksel_reg = OMAP_CM_REGADDR(OMAP3430_EMU_MOD, CM_CLKSEL1),
3009 .clksel_mask = OMAP3430_CLKSEL_ATCLK_MASK,
3010 .clksel = atclk_emu_clksel,
3011 .clkdm_name = "emu_clkdm",
3012 .recalc = &omap2_clksel_recalc,
3015 static struct clk traceclk_src_fck = {
3016 .name = "traceclk_src_fck",
3017 .ops = &clkops_null,
3018 .init = &omap2_init_clksel_parent,
3019 .clksel_reg = OMAP_CM_REGADDR(OMAP3430_EMU_MOD, CM_CLKSEL1),
3020 .clksel_mask = OMAP3430_TRACE_MUX_CTRL_MASK,
3021 .clksel = emu_src_clksel,
3022 .clkdm_name = "emu_clkdm",
3023 .recalc = &omap2_clksel_recalc,
3026 static const struct clksel_rate traceclk_rates[] = {
3027 { .div = 1, .val = 1, .flags = RATE_IN_3XXX },
3028 { .div = 2, .val = 2, .flags = RATE_IN_3XXX },