diff options
-rw-r--r-- | arch/arm/mach-omap2/clock.c | 8 | ||||
-rw-r--r-- | arch/arm/mach-omap2/clock34xx.c | 4 | ||||
-rw-r--r-- | arch/arm/mach-omap2/clock34xx.h | 503 | ||||
-rw-r--r-- | arch/arm/mach-omap2/cm-regbits-34xx.h | 4 | ||||
-rw-r--r-- | include/asm-arm/arch-omap/clock.h | 2 |
5 files changed, 410 insertions, 111 deletions
diff --git a/arch/arm/mach-omap2/clock.c b/arch/arm/mach-omap2/clock.c index a5b9564ea78e..b57ffb5a22a5 100644 --- a/arch/arm/mach-omap2/clock.c +++ b/arch/arm/mach-omap2/clock.c | |||
@@ -111,14 +111,6 @@ u32 omap2_get_dpll_rate(struct clk *clk) | |||
111 | dpll_clk = (long long)clk->parent->rate * dpll_mult; | 111 | dpll_clk = (long long)clk->parent->rate * dpll_mult; |
112 | do_div(dpll_clk, dpll_div + 1); | 112 | do_div(dpll_clk, dpll_div + 1); |
113 | 113 | ||
114 | /* 34XX only */ | ||
115 | if (dd->div2_reg) { | ||
116 | dpll = __raw_readl(dd->div2_reg); | ||
117 | dpll_div = dpll & dd->div2_mask; | ||
118 | dpll_div >>= __ffs(dd->div2_mask); | ||
119 | do_div(dpll_clk, dpll_div + 1); | ||
120 | } | ||
121 | |||
122 | return dpll_clk; | 114 | return dpll_clk; |
123 | } | 115 | } |
124 | 116 | ||
diff --git a/arch/arm/mach-omap2/clock34xx.c b/arch/arm/mach-omap2/clock34xx.c index f6c82a333815..b42bdd6079a5 100644 --- a/arch/arm/mach-omap2/clock34xx.c +++ b/arch/arm/mach-omap2/clock34xx.c | |||
@@ -212,10 +212,10 @@ int __init omap2_clk_init(void) | |||
212 | 212 | ||
213 | recalculate_root_clocks(); | 213 | recalculate_root_clocks(); |
214 | 214 | ||
215 | printk(KERN_INFO "Clocking rate (Crystal/DPLL/MPU): " | 215 | printk(KERN_INFO "Clocking rate (Crystal/DPLL/ARM core): " |
216 | "%ld.%01ld/%ld/%ld MHz\n", | 216 | "%ld.%01ld/%ld/%ld MHz\n", |
217 | (osc_sys_ck.rate / 1000000), (osc_sys_ck.rate / 100000) % 10, | 217 | (osc_sys_ck.rate / 1000000), (osc_sys_ck.rate / 100000) % 10, |
218 | (core_ck.rate / 1000000), (dpll1_fck.rate / 1000000)) ; | 218 | (core_ck.rate / 1000000), (arm_fck.rate / 1000000)); |
219 | 219 | ||
220 | /* | 220 | /* |
221 | * Only enable those clocks we will need, let the drivers | 221 | * Only enable those clocks we will need, let the drivers |
diff --git a/arch/arm/mach-omap2/clock34xx.h b/arch/arm/mach-omap2/clock34xx.h index e4d73455f4c1..cf4644a94b9b 100644 --- a/arch/arm/mach-omap2/clock34xx.h +++ b/arch/arm/mach-omap2/clock34xx.h | |||
@@ -1,6 +1,10 @@ | |||
1 | /* | 1 | /* |
2 | * OMAP3 clock framework | 2 | * OMAP3 clock framework |
3 | * | 3 | * |
4 | * Virtual clocks are introduced as a convenient tools. | ||
5 | * They are sources for other clocks and not supposed | ||
6 | * to be requested from drivers directly. | ||
7 | * | ||
4 | * Copyright (C) 2007-2008 Texas Instruments, Inc. | 8 | * Copyright (C) 2007-2008 Texas Instruments, Inc. |
5 | * Copyright (C) 2007-2008 Nokia Corporation | 9 | * Copyright (C) 2007-2008 Nokia Corporation |
6 | * | 10 | * |
@@ -203,6 +207,36 @@ static struct clk sys_clkout1 = { | |||
203 | 207 | ||
204 | /* CM CLOCKS */ | 208 | /* CM CLOCKS */ |
205 | 209 | ||
210 | static const struct clksel_rate dpll_bypass_rates[] = { | ||
211 | { .div = 1, .val = 0, .flags = RATE_IN_343X | DEFAULT_RATE }, | ||
212 | { .div = 0 } | ||
213 | }; | ||
214 | |||
215 | static const struct clksel_rate dpll_locked_rates[] = { | ||
216 | { .div = 1, .val = 1, .flags = RATE_IN_343X | DEFAULT_RATE }, | ||
217 | { .div = 0 } | ||
218 | }; | ||
219 | |||
220 | static const struct clksel_rate div16_dpll_rates[] = { | ||
221 | { .div = 1, .val = 1, .flags = RATE_IN_343X | DEFAULT_RATE }, | ||
222 | { .div = 2, .val = 2, .flags = RATE_IN_343X }, | ||
223 | { .div = 3, .val = 3, .flags = RATE_IN_343X }, | ||
224 | { .div = 4, .val = 4, .flags = RATE_IN_343X }, | ||
225 | { .div = 5, .val = 5, .flags = RATE_IN_343X }, | ||
226 | { .div = 6, .val = 6, .flags = RATE_IN_343X }, | ||
227 | { .div = 7, .val = 7, .flags = RATE_IN_343X }, | ||
228 | { .div = 8, .val = 8, .flags = RATE_IN_343X }, | ||
229 | { .div = 9, .val = 9, .flags = RATE_IN_343X }, | ||
230 | { .div = 10, .val = 10, .flags = RATE_IN_343X }, | ||
231 | { .div = 11, .val = 11, .flags = RATE_IN_343X }, | ||
232 | { .div = 12, .val = 12, .flags = RATE_IN_343X }, | ||
233 | { .div = 13, .val = 13, .flags = RATE_IN_343X }, | ||
234 | { .div = 14, .val = 14, .flags = RATE_IN_343X }, | ||
235 | { .div = 15, .val = 15, .flags = RATE_IN_343X }, | ||
236 | { .div = 16, .val = 16, .flags = RATE_IN_343X }, | ||
237 | { .div = 0 } | ||
238 | }; | ||
239 | |||
206 | /* DPLL1 */ | 240 | /* DPLL1 */ |
207 | /* MPU clock source */ | 241 | /* MPU clock source */ |
208 | /* Type: DPLL */ | 242 | /* Type: DPLL */ |
@@ -210,8 +244,6 @@ static const struct dpll_data dpll1_dd = { | |||
210 | .mult_div1_reg = OMAP_CM_REGADDR(MPU_MOD, OMAP3430_CM_CLKSEL1_PLL), | 244 | .mult_div1_reg = OMAP_CM_REGADDR(MPU_MOD, OMAP3430_CM_CLKSEL1_PLL), |
211 | .mult_mask = OMAP3430_MPU_DPLL_MULT_MASK, | 245 | .mult_mask = OMAP3430_MPU_DPLL_MULT_MASK, |
212 | .div1_mask = OMAP3430_MPU_DPLL_DIV_MASK, | 246 | .div1_mask = OMAP3430_MPU_DPLL_DIV_MASK, |
213 | .div2_reg = OMAP_CM_REGADDR(MPU_MOD, OMAP3430_CM_CLKSEL2_PLL), | ||
214 | .div2_mask = OMAP3430_MPU_DPLL_CLKOUT_DIV_MASK, | ||
215 | .control_reg = OMAP_CM_REGADDR(MPU_MOD, OMAP3430_CM_CLKEN_PLL), | 247 | .control_reg = OMAP_CM_REGADDR(MPU_MOD, OMAP3430_CM_CLKEN_PLL), |
216 | .enable_mask = OMAP3430_EN_MPU_DPLL_MASK, | 248 | .enable_mask = OMAP3430_EN_MPU_DPLL_MASK, |
217 | .auto_recal_bit = OMAP3430_EN_MPU_DPLL_DRIFTGUARD_SHIFT, | 249 | .auto_recal_bit = OMAP3430_EN_MPU_DPLL_DRIFTGUARD_SHIFT, |
@@ -228,15 +260,37 @@ static struct clk dpll1_ck = { | |||
228 | }; | 260 | }; |
229 | 261 | ||
230 | /* | 262 | /* |
231 | * REVISIT: This clock is never specifically defined in the 3430 TRM, | 263 | * This virtual clock provides the CLKOUTX2 output from the DPLL if the |
232 | * although it is referenced - so this is a guess | 264 | * DPLL isn't bypassed. |
233 | */ | 265 | */ |
234 | static struct clk emu_mpu_alwon_ck = { | 266 | static struct clk dpll1_x2_ck = { |
235 | .name = "emu_mpu_alwon_ck", | 267 | .name = "dpll1_x2_ck", |
236 | .parent = &dpll1_ck, | 268 | .parent = &dpll1_ck, |
237 | .flags = CLOCK_IN_OMAP343X | RATE_PROPAGATES | | 269 | .flags = CLOCK_IN_OMAP343X | RATE_PROPAGATES | |
238 | PARENT_CONTROLS_CLOCK, | 270 | PARENT_CONTROLS_CLOCK, |
239 | .recalc = &followparent_recalc, | 271 | .recalc = &omap3_clkoutx2_recalc, |
272 | }; | ||
273 | |||
274 | /* On DPLL1, unlike other DPLLs, the divider is downstream from CLKOUTX2 */ | ||
275 | static const struct clksel div16_dpll1_x2m2_clksel[] = { | ||
276 | { .parent = &dpll1_x2_ck, .rates = div16_dpll_rates }, | ||
277 | { .parent = NULL } | ||
278 | }; | ||
279 | |||
280 | /* | ||
281 | * Does not exist in the TRM - needed to separate the M2 divider from | ||
282 | * bypass selection in mpu_ck | ||
283 | */ | ||
284 | static struct clk dpll1_x2m2_ck = { | ||
285 | .name = "dpll1_x2m2_ck", | ||
286 | .parent = &dpll1_x2_ck, | ||
287 | .init = &omap2_init_clksel_parent, | ||
288 | .clksel_reg = OMAP_CM_REGADDR(MPU_MOD, OMAP3430_CM_CLKSEL2_PLL), | ||
289 | .clksel_mask = OMAP3430_MPU_DPLL_CLKOUT_DIV_MASK, | ||
290 | .clksel = div16_dpll1_x2m2_clksel, | ||
291 | .flags = CLOCK_IN_OMAP343X | RATE_PROPAGATES | | ||
292 | PARENT_CONTROLS_CLOCK, | ||
293 | .recalc = &omap2_clksel_recalc, | ||
240 | }; | 294 | }; |
241 | 295 | ||
242 | /* DPLL2 */ | 296 | /* DPLL2 */ |
@@ -247,8 +301,6 @@ static const struct dpll_data dpll2_dd = { | |||
247 | .mult_div1_reg = OMAP_CM_REGADDR(OMAP3430_IVA2_MOD, OMAP3430_CM_CLKSEL1_PLL), | 301 | .mult_div1_reg = OMAP_CM_REGADDR(OMAP3430_IVA2_MOD, OMAP3430_CM_CLKSEL1_PLL), |
248 | .mult_mask = OMAP3430_IVA2_DPLL_MULT_MASK, | 302 | .mult_mask = OMAP3430_IVA2_DPLL_MULT_MASK, |
249 | .div1_mask = OMAP3430_IVA2_DPLL_DIV_MASK, | 303 | .div1_mask = OMAP3430_IVA2_DPLL_DIV_MASK, |
250 | .div2_reg = OMAP_CM_REGADDR(OMAP3430_IVA2_MOD, OMAP3430_CM_CLKSEL2_PLL), | ||
251 | .div2_mask = OMAP3430_IVA2_DPLL_CLKOUT_DIV_MASK, | ||
252 | .control_reg = OMAP_CM_REGADDR(OMAP3430_IVA2_MOD, OMAP3430_CM_CLKEN_PLL), | 304 | .control_reg = OMAP_CM_REGADDR(OMAP3430_IVA2_MOD, OMAP3430_CM_CLKEN_PLL), |
253 | .enable_mask = OMAP3430_EN_IVA2_DPLL_MASK, | 305 | .enable_mask = OMAP3430_EN_IVA2_DPLL_MASK, |
254 | .auto_recal_bit = OMAP3430_EN_IVA2_DPLL_DRIFTGUARD_SHIFT, | 306 | .auto_recal_bit = OMAP3430_EN_IVA2_DPLL_DRIFTGUARD_SHIFT, |
@@ -264,6 +316,28 @@ static struct clk dpll2_ck = { | |||
264 | .recalc = &omap3_dpll_recalc, | 316 | .recalc = &omap3_dpll_recalc, |
265 | }; | 317 | }; |
266 | 318 | ||
319 | static const struct clksel div16_dpll2_m2x2_clksel[] = { | ||
320 | { .parent = &dpll2_ck, .rates = div16_dpll_rates }, | ||
321 | { .parent = NULL } | ||
322 | }; | ||
323 | |||
324 | /* | ||
325 | * The TRM is conflicted on whether IVA2 clock comes from DPLL2 CLKOUT | ||
326 | * or CLKOUTX2. CLKOUT seems most plausible. | ||
327 | */ | ||
328 | static struct clk dpll2_m2_ck = { | ||
329 | .name = "dpll2_m2_ck", | ||
330 | .parent = &dpll2_ck, | ||
331 | .init = &omap2_init_clksel_parent, | ||
332 | .clksel_reg = OMAP_CM_REGADDR(OMAP3430_IVA2_MOD, | ||
333 | OMAP3430_CM_CLKSEL2_PLL), | ||
334 | .clksel_mask = OMAP3430_IVA2_DPLL_CLKOUT_DIV_MASK, | ||
335 | .clksel = div16_dpll2_m2x2_clksel, | ||
336 | .flags = CLOCK_IN_OMAP343X | RATE_PROPAGATES | | ||
337 | PARENT_CONTROLS_CLOCK, | ||
338 | .recalc = &omap2_clksel_recalc, | ||
339 | }; | ||
340 | |||
267 | /* DPLL3 */ | 341 | /* DPLL3 */ |
268 | /* Source clock for all interfaces and for some device fclks */ | 342 | /* Source clock for all interfaces and for some device fclks */ |
269 | /* Type: DPLL */ | 343 | /* Type: DPLL */ |
@@ -271,8 +345,6 @@ static const struct dpll_data dpll3_dd = { | |||
271 | .mult_div1_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKSEL1), | 345 | .mult_div1_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKSEL1), |
272 | .mult_mask = OMAP3430_CORE_DPLL_MULT_MASK, | 346 | .mult_mask = OMAP3430_CORE_DPLL_MULT_MASK, |
273 | .div1_mask = OMAP3430_CORE_DPLL_DIV_MASK, | 347 | .div1_mask = OMAP3430_CORE_DPLL_DIV_MASK, |
274 | .div2_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKSEL1), | ||
275 | .div2_mask = OMAP3430_CORE_DPLL_CLKOUT_DIV_MASK, | ||
276 | .control_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKEN), | 348 | .control_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKEN), |
277 | .enable_mask = OMAP3430_EN_CORE_DPLL_MASK, | 349 | .enable_mask = OMAP3430_EN_CORE_DPLL_MASK, |
278 | .auto_recal_bit = OMAP3430_EN_CORE_DPLL_DRIFTGUARD_SHIFT, | 350 | .auto_recal_bit = OMAP3430_EN_CORE_DPLL_DRIFTGUARD_SHIFT, |
@@ -288,24 +360,16 @@ static struct clk dpll3_ck = { | |||
288 | .recalc = &omap3_dpll_recalc, | 360 | .recalc = &omap3_dpll_recalc, |
289 | }; | 361 | }; |
290 | 362 | ||
291 | static const struct clksel_rate div16_dpll_rates[] = { | 363 | /* |
292 | { .div = 1, .val = 1, .flags = RATE_IN_343X | DEFAULT_RATE }, | 364 | * This virtual clock provides the CLKOUTX2 output from the DPLL if the |
293 | { .div = 2, .val = 2, .flags = RATE_IN_343X }, | 365 | * DPLL isn't bypassed |
294 | { .div = 3, .val = 3, .flags = RATE_IN_343X }, | 366 | */ |
295 | { .div = 4, .val = 4, .flags = RATE_IN_343X }, | 367 | static struct clk dpll3_x2_ck = { |
296 | { .div = 5, .val = 5, .flags = RATE_IN_343X }, | 368 | .name = "dpll3_x2_ck", |
297 | { .div = 6, .val = 6, .flags = RATE_IN_343X }, | 369 | .parent = &dpll3_ck, |
298 | { .div = 7, .val = 7, .flags = RATE_IN_343X }, | 370 | .flags = CLOCK_IN_OMAP343X | RATE_PROPAGATES | |
299 | { .div = 8, .val = 8, .flags = RATE_IN_343X }, | 371 | PARENT_CONTROLS_CLOCK, |
300 | { .div = 9, .val = 9, .flags = RATE_IN_343X }, | 372 | .recalc = &omap3_clkoutx2_recalc, |
301 | { .div = 10, .val = 10, .flags = RATE_IN_343X }, | ||
302 | { .div = 11, .val = 11, .flags = RATE_IN_343X }, | ||
303 | { .div = 12, .val = 12, .flags = RATE_IN_343X }, | ||
304 | { .div = 13, .val = 13, .flags = RATE_IN_343X }, | ||
305 | { .div = 14, .val = 14, .flags = RATE_IN_343X }, | ||
306 | { .div = 15, .val = 15, .flags = RATE_IN_343X }, | ||
307 | { .div = 16, .val = 16, .flags = RATE_IN_343X }, | ||
308 | { .div = 0 } | ||
309 | }; | 373 | }; |
310 | 374 | ||
311 | static const struct clksel_rate div31_dpll3_rates[] = { | 375 | static const struct clksel_rate div31_dpll3_rates[] = { |
@@ -349,9 +413,9 @@ static const struct clksel div31_dpll3m2_clksel[] = { | |||
349 | }; | 413 | }; |
350 | 414 | ||
351 | /* | 415 | /* |
352 | * REVISIT: Not sure what to do about clksel & these M2 divider clocks. | 416 | * DPLL3 output M2 |
353 | * Shouldn't they be changed in SRAM? | 417 | * REVISIT: This DPLL output divider must be changed in SRAM, so until |
354 | * This should probably remain a 'read-only' clksel clock. | 418 | * that code is ready, this should remain a 'read-only' clksel clock. |
355 | */ | 419 | */ |
356 | static struct clk dpll3_m2_ck = { | 420 | static struct clk dpll3_m2_ck = { |
357 | .name = "dpll3_m2_ck", | 421 | .name = "dpll3_m2_ck", |
@@ -365,58 +429,85 @@ static struct clk dpll3_m2_ck = { | |||
365 | .recalc = &omap2_clksel_recalc, | 429 | .recalc = &omap2_clksel_recalc, |
366 | }; | 430 | }; |
367 | 431 | ||
432 | static const struct clksel core_ck_clksel[] = { | ||
433 | { .parent = &sys_ck, .rates = dpll_bypass_rates }, | ||
434 | { .parent = &dpll3_m2_ck, .rates = dpll_locked_rates }, | ||
435 | { .parent = NULL } | ||
436 | }; | ||
437 | |||
368 | static struct clk core_ck = { | 438 | static struct clk core_ck = { |
369 | .name = "core_ck", | 439 | .name = "core_ck", |
370 | .parent = &dpll3_m2_ck, | 440 | .init = &omap2_init_clksel_parent, |
441 | .clksel_reg = OMAP_CM_REGADDR(PLL_MOD, CM_IDLEST), | ||
442 | .clksel_mask = OMAP3430_ST_CORE_CLK, | ||
443 | .clksel = core_ck_clksel, | ||
371 | .flags = CLOCK_IN_OMAP343X | RATE_PROPAGATES | | 444 | .flags = CLOCK_IN_OMAP343X | RATE_PROPAGATES | |
372 | PARENT_CONTROLS_CLOCK, | 445 | PARENT_CONTROLS_CLOCK, |
373 | .recalc = &followparent_recalc, | 446 | .recalc = &omap2_clksel_recalc, |
374 | }; | 447 | }; |
375 | 448 | ||
376 | /* | 449 | static const struct clksel dpll3_m2x2_ck_clksel[] = { |
377 | * This virtual clock provides the CLKOUTX2 output from the DPLL if the | 450 | { .parent = &sys_ck, .rates = dpll_bypass_rates }, |
378 | * DPLL isn't bypassed | 451 | { .parent = &dpll3_x2_ck, .rates = dpll_locked_rates }, |
379 | */ | 452 | { .parent = NULL } |
380 | static struct clk dpll3_x2_ck = { | ||
381 | .name = "dpll3_x2_ck", | ||
382 | .parent = &core_ck, | ||
383 | .flags = CLOCK_IN_OMAP343X | RATE_PROPAGATES | | ||
384 | PARENT_CONTROLS_CLOCK, | ||
385 | .recalc = &omap3_clkoutx2_recalc, | ||
386 | }; | 453 | }; |
387 | 454 | ||
388 | static struct clk dpll3_m2x2_ck = { | 455 | static struct clk dpll3_m2x2_ck = { |
389 | .name = "dpll3_m2x2_ck", | 456 | .name = "dpll3_m2x2_ck", |
390 | .parent = &dpll3_x2_ck, | 457 | .init = &omap2_init_clksel_parent, |
458 | .clksel_reg = OMAP_CM_REGADDR(PLL_MOD, CM_IDLEST), | ||
459 | .clksel_mask = OMAP3430_ST_CORE_CLK, | ||
460 | .clksel = dpll3_m2x2_ck_clksel, | ||
391 | .flags = CLOCK_IN_OMAP343X | RATE_PROPAGATES | | 461 | .flags = CLOCK_IN_OMAP343X | RATE_PROPAGATES | |
392 | PARENT_CONTROLS_CLOCK, | 462 | PARENT_CONTROLS_CLOCK, |
393 | .recalc = &followparent_recalc, | 463 | .recalc = &omap2_clksel_recalc, |
464 | }; | ||
465 | |||
466 | /* The PWRDN bit is apparently only available on 3430ES2 and above */ | ||
467 | static const struct clksel div16_dpll3_clksel[] = { | ||
468 | { .parent = &dpll3_ck, .rates = div16_dpll_rates }, | ||
469 | { .parent = NULL } | ||
470 | }; | ||
471 | |||
472 | /* This virtual clock is the source for dpll3_m3x2_ck */ | ||
473 | static struct clk dpll3_m3_ck = { | ||
474 | .name = "dpll3_m3_ck", | ||
475 | .parent = &dpll3_ck, | ||
476 | .init = &omap2_init_clksel_parent, | ||
477 | .clksel_reg = OMAP_CM_REGADDR(OMAP3430_EMU_MOD, CM_CLKSEL1), | ||
478 | .clksel_mask = OMAP3430_DIV_DPLL3_MASK, | ||
479 | .clksel = div16_dpll3_clksel, | ||
480 | .flags = CLOCK_IN_OMAP343X | RATE_PROPAGATES | | ||
481 | PARENT_CONTROLS_CLOCK, | ||
482 | .recalc = &omap2_clksel_recalc, | ||
394 | }; | 483 | }; |
395 | 484 | ||
396 | /* The PWRDN bit is apparently only available on 3430ES2 and above */ | 485 | /* The PWRDN bit is apparently only available on 3430ES2 and above */ |
397 | static struct clk dpll3_m3x2_ck = { | 486 | static struct clk dpll3_m3x2_ck = { |
398 | .name = "dpll3_m3x2_ck", | 487 | .name = "dpll3_m3x2_ck", |
399 | .parent = &dpll3_x2_ck, | 488 | .parent = &dpll3_m3_ck, |
400 | .enable_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKEN), | 489 | .enable_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKEN), |
401 | .enable_bit = OMAP3430_PWRDN_EMU_CORE_SHIFT, | 490 | .enable_bit = OMAP3430_PWRDN_EMU_CORE_SHIFT, |
402 | .flags = CLOCK_IN_OMAP343X | RATE_PROPAGATES | INVERT_ENABLE, | 491 | .flags = CLOCK_IN_OMAP343X | RATE_PROPAGATES | INVERT_ENABLE, |
403 | .recalc = &followparent_recalc, | 492 | .recalc = &omap3_clkoutx2_recalc, |
404 | }; | 493 | }; |
405 | 494 | ||
406 | static const struct clksel div16_dpll3_clksel[] = { | 495 | static const struct clksel emu_core_alwon_ck_clksel[] = { |
407 | { .parent = &dpll3_x2_ck, .rates = div16_dpll_rates }, | 496 | { .parent = &sys_ck, .rates = dpll_bypass_rates }, |
497 | { .parent = &dpll3_m3x2_ck, .rates = dpll_locked_rates }, | ||
408 | { .parent = NULL } | 498 | { .parent = NULL } |
409 | }; | 499 | }; |
410 | 500 | ||
411 | static struct clk emu_core_alwon_ck = { | 501 | static struct clk emu_core_alwon_ck = { |
412 | .name = "emu_core_alwon_ck", | 502 | .name = "emu_core_alwon_ck", |
413 | .parent = &dpll3_x2_ck, | 503 | .parent = &dpll3_m3x2_ck, |
414 | .init = &omap2_init_clksel_parent, | 504 | .init = &omap2_init_clksel_parent, |
415 | .clksel_reg = OMAP_CM_REGADDR(OMAP3430_EMU_MOD, CM_CLKSEL1), | 505 | .clksel_reg = OMAP_CM_REGADDR(PLL_MOD, CM_IDLEST), |
416 | .clksel_mask = OMAP3430_DIV_DPLL3_MASK, | 506 | .clksel_mask = OMAP3430_ST_CORE_CLK, |
417 | .clksel = div16_dpll3_clksel, | 507 | .clksel = emu_core_alwon_ck_clksel, |
418 | .flags = CLOCK_IN_OMAP343X | RATE_PROPAGATES, | 508 | .flags = CLOCK_IN_OMAP343X | RATE_PROPAGATES | |
419 | .recalc = &followparent_recalc, | 509 | PARENT_CONTROLS_CLOCK, |
510 | .recalc = &omap2_clksel_recalc, | ||
420 | }; | 511 | }; |
421 | 512 | ||
422 | /* DPLL4 */ | 513 | /* DPLL4 */ |
@@ -443,7 +534,8 @@ static struct clk dpll4_ck = { | |||
443 | 534 | ||
444 | /* | 535 | /* |
445 | * This virtual clock provides the CLKOUTX2 output from the DPLL if the | 536 | * This virtual clock provides the CLKOUTX2 output from the DPLL if the |
446 | * DPLL isn't bypassed | 537 | * DPLL isn't bypassed -- |
538 | * XXX does this serve any downstream clocks? | ||
447 | */ | 539 | */ |
448 | static struct clk dpll4_x2_ck = { | 540 | static struct clk dpll4_x2_ck = { |
449 | .name = "dpll4_x2_ck", | 541 | .name = "dpll4_x2_ck", |
@@ -454,30 +546,49 @@ static struct clk dpll4_x2_ck = { | |||
454 | }; | 546 | }; |
455 | 547 | ||
456 | static const struct clksel div16_dpll4_clksel[] = { | 548 | static const struct clksel div16_dpll4_clksel[] = { |
457 | { .parent = &dpll4_x2_ck, .rates = div16_dpll_rates }, | 549 | { .parent = &dpll4_ck, .rates = div16_dpll_rates }, |
458 | { .parent = NULL } | 550 | { .parent = NULL } |
459 | }; | 551 | }; |
460 | 552 | ||
553 | /* This virtual clock is the source for dpll4_m2x2_ck */ | ||
554 | static struct clk dpll4_m2_ck = { | ||
555 | .name = "dpll4_m2_ck", | ||
556 | .parent = &dpll4_ck, | ||
557 | .init = &omap2_init_clksel_parent, | ||
558 | .clksel_reg = OMAP_CM_REGADDR(PLL_MOD, OMAP3430_CM_CLKSEL3), | ||
559 | .clksel_mask = OMAP3430_DIV_96M_MASK, | ||
560 | .clksel = div16_dpll4_clksel, | ||
561 | .flags = CLOCK_IN_OMAP343X | RATE_PROPAGATES | | ||
562 | PARENT_CONTROLS_CLOCK, | ||
563 | .recalc = &omap2_clksel_recalc, | ||
564 | }; | ||
565 | |||
461 | /* The PWRDN bit is apparently only available on 3430ES2 and above */ | 566 | /* The PWRDN bit is apparently only available on 3430ES2 and above */ |
462 | static struct clk dpll4_m2x2_ck = { | 567 | static struct clk dpll4_m2x2_ck = { |
463 | .name = "dpll4_m2x2_ck", | 568 | .name = "dpll4_m2x2_ck", |
464 | .parent = &dpll4_x2_ck, | 569 | .parent = &dpll4_m2_ck, |
465 | .init = &omap2_init_clksel_parent, | ||
466 | .enable_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKEN), | 570 | .enable_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKEN), |
467 | .enable_bit = OMAP3430_PWRDN_96M_SHIFT, | 571 | .enable_bit = OMAP3430_PWRDN_96M_SHIFT, |
468 | .clksel_reg = OMAP_CM_REGADDR(PLL_MOD, OMAP3430_CM_CLKSEL3), | ||
469 | .clksel_mask = OMAP3430_DIV_96M_MASK, | ||
470 | .clksel = div16_dpll4_clksel, | ||
471 | .flags = CLOCK_IN_OMAP343X | RATE_PROPAGATES | INVERT_ENABLE, | 572 | .flags = CLOCK_IN_OMAP343X | RATE_PROPAGATES | INVERT_ENABLE, |
472 | .recalc = &omap2_clksel_recalc, | 573 | .recalc = &omap3_clkoutx2_recalc, |
574 | }; | ||
575 | |||
576 | static const struct clksel omap_96m_alwon_fck_clksel[] = { | ||
577 | { .parent = &sys_ck, .rates = dpll_bypass_rates }, | ||
578 | { .parent = &dpll4_m2x2_ck, .rates = dpll_locked_rates }, | ||
579 | { .parent = NULL } | ||
473 | }; | 580 | }; |
474 | 581 | ||
475 | static struct clk omap_96m_alwon_fck = { | 582 | static struct clk omap_96m_alwon_fck = { |
476 | .name = "omap_96m_alwon_fck", | 583 | .name = "omap_96m_alwon_fck", |
477 | .parent = &dpll4_m2x2_ck, | 584 | .parent = &dpll4_m2x2_ck, |
585 | .init = &omap2_init_clksel_parent, | ||
586 | .clksel_reg = OMAP_CM_REGADDR(PLL_MOD, CM_IDLEST), | ||
587 | .clksel_mask = OMAP3430_ST_PERIPH_CLK, | ||
588 | .clksel = omap_96m_alwon_fck_clksel, | ||
478 | .flags = CLOCK_IN_OMAP343X | RATE_PROPAGATES | | 589 | .flags = CLOCK_IN_OMAP343X | RATE_PROPAGATES | |
479 | PARENT_CONTROLS_CLOCK, | 590 | PARENT_CONTROLS_CLOCK, |
480 | .recalc = &followparent_recalc, | 591 | .recalc = &omap2_clksel_recalc, |
481 | }; | 592 | }; |
482 | 593 | ||
483 | static struct clk omap_96m_fck = { | 594 | static struct clk omap_96m_fck = { |
@@ -488,25 +599,63 @@ static struct clk omap_96m_fck = { | |||
488 | .recalc = &followparent_recalc, | 599 | .recalc = &followparent_recalc, |
489 | }; | 600 | }; |
490 | 601 | ||
602 | static const struct clksel cm_96m_fck_clksel[] = { | ||
603 | { .parent = &sys_ck, .rates = dpll_bypass_rates }, | ||
604 | { .parent = &dpll4_m2x2_ck, .rates = dpll_locked_rates }, | ||
605 | { .parent = NULL } | ||
606 | }; | ||
607 | |||
491 | static struct clk cm_96m_fck = { | 608 | static struct clk cm_96m_fck = { |
492 | .name = "cm_96m_fck", | 609 | .name = "cm_96m_fck", |
493 | .parent = &dpll4_m2x2_ck, | 610 | .parent = &dpll4_m2x2_ck, |
611 | .init = &omap2_init_clksel_parent, | ||
612 | .clksel_reg = OMAP_CM_REGADDR(PLL_MOD, CM_IDLEST), | ||
613 | .clksel_mask = OMAP3430_ST_PERIPH_CLK, | ||
614 | .clksel = cm_96m_fck_clksel, | ||
494 | .flags = CLOCK_IN_OMAP343X | RATE_PROPAGATES | | 615 | .flags = CLOCK_IN_OMAP343X | RATE_PROPAGATES | |
495 | PARENT_CONTROLS_CLOCK, | 616 | PARENT_CONTROLS_CLOCK, |
496 | .recalc = &followparent_recalc, | 617 | .recalc = &omap2_clksel_recalc, |
618 | }; | ||
619 | |||
620 | /* This virtual clock is the source for dpll4_m3x2_ck */ | ||
621 | static struct clk dpll4_m3_ck = { | ||
622 | .name = "dpll4_m3_ck", | ||
623 | .parent = &dpll4_ck, | ||
624 | .init = &omap2_init_clksel_parent, | ||
625 | .clksel_reg = OMAP_CM_REGADDR(OMAP3430_DSS_MOD, CM_CLKSEL), | ||
626 | .clksel_mask = OMAP3430_CLKSEL_TV_MASK, | ||
627 | .clksel = div16_dpll4_clksel, | ||
628 | .flags = CLOCK_IN_OMAP343X | RATE_PROPAGATES | | ||
629 | PARENT_CONTROLS_CLOCK, | ||
630 | .recalc = &omap2_clksel_recalc, | ||
497 | }; | 631 | }; |
498 | 632 | ||
499 | /* The PWRDN bit is apparently only available on 3430ES2 and above */ | 633 | /* The PWRDN bit is apparently only available on 3430ES2 and above */ |
500 | static struct clk dpll4_m3x2_ck = { | 634 | static struct clk dpll4_m3x2_ck = { |
501 | .name = "dpll4_m3x2_ck", | 635 | .name = "dpll4_m3x2_ck", |
502 | .parent = &dpll4_x2_ck, | 636 | .parent = &dpll4_m3_ck, |
503 | .init = &omap2_init_clksel_parent, | 637 | .init = &omap2_init_clksel_parent, |
504 | .enable_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKEN), | 638 | .enable_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKEN), |
505 | .enable_bit = OMAP3430_PWRDN_TV_SHIFT, | 639 | .enable_bit = OMAP3430_PWRDN_TV_SHIFT, |
506 | .clksel_reg = OMAP_CM_REGADDR(OMAP3430_DSS_MOD, CM_CLKSEL), | ||
507 | .clksel_mask = OMAP3430_CLKSEL_TV_MASK, | ||
508 | .clksel = div16_dpll4_clksel, | ||
509 | .flags = CLOCK_IN_OMAP343X | RATE_PROPAGATES | INVERT_ENABLE, | 640 | .flags = CLOCK_IN_OMAP343X | RATE_PROPAGATES | INVERT_ENABLE, |
641 | .recalc = &omap3_clkoutx2_recalc, | ||
642 | }; | ||
643 | |||
644 | static const struct clksel virt_omap_54m_fck_clksel[] = { | ||
645 | { .parent = &sys_ck, .rates = dpll_bypass_rates }, | ||
646 | { .parent = &dpll4_m3x2_ck, .rates = dpll_locked_rates }, | ||
647 | { .parent = NULL } | ||
648 | }; | ||
649 | |||
650 | static struct clk virt_omap_54m_fck = { | ||
651 | .name = "virt_omap_54m_fck", | ||
652 | .parent = &dpll4_m3x2_ck, | ||
653 | .init = &omap2_init_clksel_parent, | ||
654 | .clksel_reg = OMAP_CM_REGADDR(PLL_MOD, CM_IDLEST), | ||
655 | .clksel_mask = OMAP3430_ST_PERIPH_CLK, | ||
656 | .clksel = virt_omap_54m_fck_clksel, | ||
657 | .flags = CLOCK_IN_OMAP343X | RATE_PROPAGATES | | ||
658 | PARENT_CONTROLS_CLOCK, | ||
510 | .recalc = &omap2_clksel_recalc, | 659 | .recalc = &omap2_clksel_recalc, |
511 | }; | 660 | }; |
512 | 661 | ||
@@ -521,7 +670,7 @@ static const struct clksel_rate omap_54m_alt_rates[] = { | |||
521 | }; | 670 | }; |
522 | 671 | ||
523 | static const struct clksel omap_54m_clksel[] = { | 672 | static const struct clksel omap_54m_clksel[] = { |
524 | { .parent = &dpll4_m3x2_ck, .rates = omap_54m_d4m3x2_rates }, | 673 | { .parent = &virt_omap_54m_fck, .rates = omap_54m_d4m3x2_rates }, |
525 | { .parent = &sys_altclk, .rates = omap_54m_alt_rates }, | 674 | { .parent = &sys_altclk, .rates = omap_54m_alt_rates }, |
526 | { .parent = NULL } | 675 | { .parent = NULL } |
527 | }; | 676 | }; |
@@ -573,46 +722,74 @@ static struct clk omap_12m_fck = { | |||
573 | .recalc = &omap2_fixed_divisor_recalc, | 722 | .recalc = &omap2_fixed_divisor_recalc, |
574 | }; | 723 | }; |
575 | 724 | ||
725 | /* This virstual clock is the source for dpll4_m4x2_ck */ | ||
726 | static struct clk dpll4_m4_ck = { | ||
727 | .name = "dpll4_m4_ck", | ||
728 | .parent = &dpll4_ck, | ||
729 | .init = &omap2_init_clksel_parent, | ||
730 | .clksel_reg = OMAP_CM_REGADDR(OMAP3430_DSS_MOD, CM_CLKSEL), | ||
731 | .clksel_mask = OMAP3430_CLKSEL_DSS1_MASK, | ||
732 | .clksel = div16_dpll4_clksel, | ||
733 | .flags = CLOCK_IN_OMAP343X | RATE_PROPAGATES | | ||
734 | PARENT_CONTROLS_CLOCK, | ||
735 | .recalc = &omap2_clksel_recalc, | ||
736 | }; | ||
737 | |||
576 | /* The PWRDN bit is apparently only available on 3430ES2 and above */ | 738 | /* The PWRDN bit is apparently only available on 3430ES2 and above */ |
577 | static struct clk dpll4_m4x2_ck = { | 739 | static struct clk dpll4_m4x2_ck = { |
578 | .name = "dpll4_m4x2_ck", | 740 | .name = "dpll4_m4x2_ck", |
579 | .parent = &dpll4_x2_ck, | 741 | .parent = &dpll4_m4_ck, |
580 | .init = &omap2_init_clksel_parent, | ||
581 | .enable_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKEN), | 742 | .enable_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKEN), |
582 | .enable_bit = OMAP3430_PWRDN_CAM_SHIFT, | 743 | .enable_bit = OMAP3430_PWRDN_CAM_SHIFT, |
583 | .clksel_reg = OMAP_CM_REGADDR(OMAP3430_DSS_MOD, CM_CLKSEL), | ||
584 | .clksel_mask = OMAP3430_CLKSEL_DSS1_MASK, | ||
585 | .clksel = div16_dpll4_clksel, | ||
586 | .flags = CLOCK_IN_OMAP343X | RATE_PROPAGATES | INVERT_ENABLE, | 744 | .flags = CLOCK_IN_OMAP343X | RATE_PROPAGATES | INVERT_ENABLE, |
745 | .recalc = &omap3_clkoutx2_recalc, | ||
746 | }; | ||
747 | |||
748 | /* This virtual clock is the source for dpll4_m5x2_ck */ | ||
749 | static struct clk dpll4_m5_ck = { | ||
750 | .name = "dpll4_m5_ck", | ||
751 | .parent = &dpll4_ck, | ||
752 | .init = &omap2_init_clksel_parent, | ||
753 | .clksel_reg = OMAP_CM_REGADDR(OMAP3430_CAM_MOD, CM_CLKSEL), | ||
754 | .clksel_mask = OMAP3430_CLKSEL_CAM_MASK, | ||
755 | .clksel = div16_dpll4_clksel, | ||
756 | .flags = CLOCK_IN_OMAP343X | RATE_PROPAGATES | | ||
757 | PARENT_CONTROLS_CLOCK, | ||
587 | .recalc = &omap2_clksel_recalc, | 758 | .recalc = &omap2_clksel_recalc, |
588 | }; | 759 | }; |
589 | 760 | ||
590 | /* The PWRDN bit is apparently only available on 3430ES2 and above */ | 761 | /* The PWRDN bit is apparently only available on 3430ES2 and above */ |
591 | static struct clk dpll4_m5x2_ck = { | 762 | static struct clk dpll4_m5x2_ck = { |
592 | .name = "dpll4_m5x2_ck", | 763 | .name = "dpll4_m5x2_ck", |
593 | .parent = &dpll4_x2_ck, | 764 | .parent = &dpll4_m5_ck, |
594 | .init = &omap2_init_clksel_parent, | ||
595 | .enable_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKEN), | 765 | .enable_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKEN), |
596 | .enable_bit = OMAP3430_PWRDN_CAM_SHIFT, | 766 | .enable_bit = OMAP3430_PWRDN_CAM_SHIFT, |
597 | .clksel_reg = OMAP_CM_REGADDR(OMAP3430_CAM_MOD, CM_CLKSEL), | ||
598 | .clksel_mask = OMAP3430_CLKSEL_CAM_MASK, | ||
599 | .clksel = div16_dpll4_clksel, | ||
600 | .flags = CLOCK_IN_OMAP343X | RATE_PROPAGATES | INVERT_ENABLE, | 767 | .flags = CLOCK_IN_OMAP343X | RATE_PROPAGATES | INVERT_ENABLE, |
768 | .recalc = &omap3_clkoutx2_recalc, | ||
769 | }; | ||
770 | |||
771 | /* This virtual clock is the source for dpll4_m6x2_ck */ | ||
772 | static struct clk dpll4_m6_ck = { | ||
773 | .name = "dpll4_m6_ck", | ||
774 | .parent = &dpll4_ck, | ||
775 | .init = &omap2_init_clksel_parent, | ||
776 | .clksel_reg = OMAP_CM_REGADDR(OMAP3430_EMU_MOD, CM_CLKSEL1), | ||
777 | .clksel_mask = OMAP3430_DIV_DPLL4_MASK, | ||
778 | .clksel = div16_dpll4_clksel, | ||
779 | .flags = CLOCK_IN_OMAP343X | RATE_PROPAGATES | | ||
780 | PARENT_CONTROLS_CLOCK, | ||
601 | .recalc = &omap2_clksel_recalc, | 781 | .recalc = &omap2_clksel_recalc, |
602 | }; | 782 | }; |
603 | 783 | ||
604 | /* The PWRDN bit is apparently only available on 3430ES2 and above */ | 784 | /* The PWRDN bit is apparently only available on 3430ES2 and above */ |
605 | static struct clk dpll4_m6x2_ck = { | 785 | static struct clk dpll4_m6x2_ck = { |
606 | .name = "dpll4_m6x2_ck", | 786 | .name = "dpll4_m6x2_ck", |
607 | .parent = &dpll4_x2_ck, | 787 | .parent = &dpll4_m6_ck, |
608 | .init = &omap2_init_clksel_parent, | 788 | .init = &omap2_init_clksel_parent, |
609 | .enable_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKEN), | 789 | .enable_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKEN), |
610 | .enable_bit = OMAP3430_PWRDN_EMU_PERIPH_SHIFT, | 790 | .enable_bit = OMAP3430_PWRDN_EMU_PERIPH_SHIFT, |
611 | .clksel_reg = OMAP_CM_REGADDR(OMAP3430_EMU_MOD, CM_CLKSEL1), | ||
612 | .clksel_mask = OMAP3430_DIV_DPLL4_MASK, | ||
613 | .clksel = div16_dpll4_clksel, | ||
614 | .flags = CLOCK_IN_OMAP343X | RATE_PROPAGATES | INVERT_ENABLE, | 791 | .flags = CLOCK_IN_OMAP343X | RATE_PROPAGATES | INVERT_ENABLE, |
615 | .recalc = &omap2_clksel_recalc, | 792 | .recalc = &omap3_clkoutx2_recalc, |
616 | }; | 793 | }; |
617 | 794 | ||
618 | static struct clk emu_per_alwon_ck = { | 795 | static struct clk emu_per_alwon_ck = { |
@@ -647,7 +824,7 @@ static struct clk dpll5_ck = { | |||
647 | .recalc = &omap3_dpll_recalc, | 824 | .recalc = &omap3_dpll_recalc, |
648 | }; | 825 | }; |
649 | 826 | ||
650 | static const struct clksel div16_dpll5m2_clksel[] = { | 827 | static const struct clksel div16_dpll5_clksel[] = { |
651 | { .parent = &dpll5_ck, .rates = div16_dpll_rates }, | 828 | { .parent = &dpll5_ck, .rates = div16_dpll_rates }, |
652 | { .parent = NULL } | 829 | { .parent = NULL } |
653 | }; | 830 | }; |
@@ -658,16 +835,27 @@ static struct clk dpll5_m2_ck = { | |||
658 | .init = &omap2_init_clksel_parent, | 835 | .init = &omap2_init_clksel_parent, |
659 | .clksel_reg = OMAP_CM_REGADDR(PLL_MOD, OMAP3430ES2_CM_CLKSEL5), | 836 | .clksel_reg = OMAP_CM_REGADDR(PLL_MOD, OMAP3430ES2_CM_CLKSEL5), |
660 | .clksel_mask = OMAP3430ES2_DIV_120M_MASK, | 837 | .clksel_mask = OMAP3430ES2_DIV_120M_MASK, |
661 | .clksel = div16_dpll5m2_clksel, | 838 | .clksel = div16_dpll5_clksel, |
662 | .flags = CLOCK_IN_OMAP3430ES2 | RATE_PROPAGATES, | 839 | .flags = CLOCK_IN_OMAP3430ES2 | RATE_PROPAGATES, |
663 | .recalc = &omap2_clksel_recalc, | 840 | .recalc = &omap2_clksel_recalc, |
664 | }; | 841 | }; |
665 | 842 | ||
843 | static const struct clksel omap_120m_fck_clksel[] = { | ||
844 | { .parent = &sys_ck, .rates = dpll_bypass_rates }, | ||
845 | { .parent = &dpll5_m2_ck, .rates = dpll_locked_rates }, | ||
846 | { .parent = NULL } | ||
847 | }; | ||
848 | |||
666 | static struct clk omap_120m_fck = { | 849 | static struct clk omap_120m_fck = { |
667 | .name = "omap_120m_fck", | 850 | .name = "omap_120m_fck", |
668 | .parent = &dpll5_m2_ck, | 851 | .parent = &dpll5_m2_ck, |
669 | .flags = CLOCK_IN_OMAP3430ES2 | RATE_PROPAGATES, | 852 | .init = &omap2_init_clksel_parent, |
670 | .recalc = &followparent_recalc, | 853 | .clksel_reg = OMAP_CM_REGADDR(PLL_MOD, CM_IDLEST2), |
854 | .clksel_mask = OMAP3430ES2_ST_PERIPH2_CLK_MASK, | ||
855 | .clksel = omap_120m_fck_clksel, | ||
856 | .flags = CLOCK_IN_OMAP3430ES2 | RATE_PROPAGATES | | ||
857 | PARENT_CONTROLS_CLOCK, | ||
858 | .recalc = &omap2_clksel_recalc, | ||
671 | }; | 859 | }; |
672 | 860 | ||
673 | /* CM EXTERNAL CLOCK OUTPUTS */ | 861 | /* CM EXTERNAL CLOCK OUTPUTS */ |
@@ -753,10 +941,10 @@ static const struct clksel div2_core_clksel[] = { | |||
753 | { .parent = NULL } | 941 | { .parent = NULL } |
754 | }; | 942 | }; |
755 | 943 | ||
756 | /* TRM s. 4.7.7.4 lists the input for these two clocks as CORE_CK, | 944 | /* |
757 | but presuming that is an error, or at least an overgeneralization */ | 945 | * REVISIT: Are these in DPLL power domain or CM power domain? docs |
758 | /* REVISIT: Are these in DPLL power domain or CM power domain? docs | 946 | * may be inconsistent here? |
759 | may be inconsistent here? */ | 947 | */ |
760 | static struct clk dpll1_fck = { | 948 | static struct clk dpll1_fck = { |
761 | .name = "dpll1_fck", | 949 | .name = "dpll1_fck", |
762 | .parent = &core_ck, | 950 | .parent = &core_ck, |
@@ -769,6 +957,66 @@ static struct clk dpll1_fck = { | |||
769 | .recalc = &omap2_clksel_recalc, | 957 | .recalc = &omap2_clksel_recalc, |
770 | }; | 958 | }; |
771 | 959 | ||
960 | /* | ||
961 | * MPU clksel: | ||
962 | * If DPLL1 is locked, mpu_ck derives from DPLL1; otherwise, mpu_ck | ||
963 | * derives from the high-frequency bypass clock originating from DPLL3, | ||
964 | * called 'dpll1_fck' | ||
965 | */ | ||
966 | static const struct clksel mpu_clksel[] = { | ||
967 | { .parent = &dpll1_fck, .rates = dpll_bypass_rates }, | ||
968 | { .parent = &dpll1_x2m2_ck, .rates = dpll_locked_rates }, | ||
969 | { .parent = NULL } | ||
970 | }; | ||
971 | |||
972 | static struct clk mpu_ck = { | ||
973 | .name = "mpu_ck", | ||
974 | .parent = &dpll1_x2m2_ck, | ||
975 | .init = &omap2_init_clksel_parent, | ||
976 | .clksel_reg = OMAP_CM_REGADDR(MPU_MOD, OMAP3430_CM_IDLEST_PLL), | ||
977 | .clksel_mask = OMAP3430_ST_MPU_CLK_MASK, | ||
978 | .clksel = mpu_clksel, | ||
979 | .flags = CLOCK_IN_OMAP343X | RATE_PROPAGATES | | ||
980 | PARENT_CONTROLS_CLOCK, | ||
981 | .recalc = &omap2_clksel_recalc, | ||
982 | }; | ||
983 | |||
984 | /* arm_fck is divided by two when DPLL1 locked; otherwise, passthrough mpu_ck */ | ||
985 | static const struct clksel_rate arm_fck_rates[] = { | ||
986 | { .div = 1, .val = 0, .flags = RATE_IN_343X | DEFAULT_RATE }, | ||
987 | { .div = 2, .val = 1, .flags = RATE_IN_343X }, | ||
988 | { .div = 0 }, | ||
989 | }; | ||
990 | |||
991 | static const struct clksel arm_fck_clksel[] = { | ||
992 | { .parent = &mpu_ck, .rates = arm_fck_rates }, | ||
993 | { .parent = NULL } | ||
994 | }; | ||
995 | |||
996 | static struct clk arm_fck = { | ||
997 | .name = "arm_fck", | ||
998 | .parent = &mpu_ck, | ||
999 | .init = &omap2_init_clksel_parent, | ||
1000 | .clksel_reg = OMAP_CM_REGADDR(MPU_MOD, OMAP3430_CM_IDLEST_PLL), | ||
1001 | .clksel_mask = OMAP3430_ST_MPU_CLK_MASK, | ||
1002 | .clksel = arm_fck_clksel, | ||
1003 | .flags = CLOCK_IN_OMAP343X | RATE_PROPAGATES | | ||
1004 | PARENT_CONTROLS_CLOCK, | ||
1005 | .recalc = &omap2_clksel_recalc, | ||
1006 | }; | ||
1007 | |||
1008 | /* | ||
1009 | * REVISIT: This clock is never specifically defined in the 3430 TRM, | ||
1010 | * although it is referenced - so this is a guess | ||
1011 | */ | ||
1012 | static struct clk emu_mpu_alwon_ck = { | ||
1013 | .name = "emu_mpu_alwon_ck", | ||
1014 | .parent = &mpu_ck, | ||
1015 | .flags = CLOCK_IN_OMAP343X | RATE_PROPAGATES | | ||
1016 | PARENT_CONTROLS_CLOCK, | ||
1017 | .recalc = &followparent_recalc, | ||
1018 | }; | ||
1019 | |||
772 | static struct clk dpll2_fck = { | 1020 | static struct clk dpll2_fck = { |
773 | .name = "dpll2_fck", | 1021 | .name = "dpll2_fck", |
774 | .parent = &core_ck, | 1022 | .parent = &core_ck, |
@@ -781,6 +1029,32 @@ static struct clk dpll2_fck = { | |||
781 | .recalc = &omap2_clksel_recalc, | 1029 | .recalc = &omap2_clksel_recalc, |
782 | }; | 1030 | }; |
783 | 1031 | ||
1032 | /* | ||
1033 | * IVA2 clksel: | ||
1034 | * If DPLL2 is locked, iva2_ck derives from DPLL2; otherwise, iva2_ck | ||
1035 | * derives from the high-frequency bypass clock originating from DPLL3, | ||
1036 | * called 'dpll2_fck' | ||
1037 | */ | ||
1038 | |||
1039 | static const struct clksel iva2_clksel[] = { | ||
1040 | { .parent = &dpll2_fck, .rates = dpll_bypass_rates }, | ||
1041 | { .parent = &dpll2_m2_ck, .rates = dpll_locked_rates }, | ||
1042 | { .parent = NULL } | ||
1043 | }; | ||
1044 | |||
1045 | static struct clk iva2_ck = { | ||
1046 | .name = "iva2_ck", | ||
1047 | .parent = &dpll2_m2_ck, | ||
1048 | .init = &omap2_init_clksel_parent, | ||
1049 | .clksel_reg = OMAP_CM_REGADDR(OMAP3430_IVA2_MOD, | ||
1050 | OMAP3430_CM_IDLEST_PLL), | ||
1051 | .clksel_mask = OMAP3430_ST_IVA2_CLK_MASK, | ||
1052 | .clksel = iva2_clksel, | ||
1053 | .flags = CLOCK_IN_OMAP343X | RATE_PROPAGATES | | ||
1054 | PARENT_CONTROLS_CLOCK, | ||
1055 | .recalc = &omap2_clksel_recalc, | ||
1056 | }; | ||
1057 | |||
784 | /* Common interface clocks */ | 1058 | /* Common interface clocks */ |
785 | 1059 | ||
786 | static struct clk l3_ick = { | 1060 | static struct clk l3_ick = { |
@@ -831,7 +1105,7 @@ static struct clk rm_ick = { | |||
831 | 1105 | ||
832 | /* GFX power domain */ | 1106 | /* GFX power domain */ |
833 | 1107 | ||
834 | /* GFX clocks are in 3430ES1 only. 3430ES2 and later uses the SGX instead */ | 1108 | /* GFX clocks are in 3430ES1 only. 3430ES2 and later uses the SGX instead */ |
835 | 1109 | ||
836 | static const struct clksel gfx_l3_clksel[] = { | 1110 | static const struct clksel gfx_l3_clksel[] = { |
837 | { .parent = &l3_ick, .rates = gfx_l3_rates }, | 1111 | { .parent = &l3_ick, .rates = gfx_l3_rates }, |
@@ -1645,14 +1919,23 @@ static struct clk des1_ick = { | |||
1645 | }; | 1919 | }; |
1646 | 1920 | ||
1647 | /* DSS */ | 1921 | /* DSS */ |
1922 | static const struct clksel dss1_alwon_fck_clksel[] = { | ||
1923 | { .parent = &sys_ck, .rates = dpll_bypass_rates }, | ||
1924 | { .parent = &dpll4_m4x2_ck, .rates = dpll_locked_rates }, | ||
1925 | { .parent = NULL } | ||
1926 | }; | ||
1648 | 1927 | ||
1649 | static struct clk dss1_alwon_fck = { | 1928 | static struct clk dss1_alwon_fck = { |
1650 | .name = "dss1_alwon_fck", | 1929 | .name = "dss1_alwon_fck", |
1651 | .parent = &dpll4_m4x2_ck, | 1930 | .parent = &dpll4_m4x2_ck, |
1931 | .init = &omap2_init_clksel_parent, | ||
1652 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_DSS_MOD, CM_FCLKEN), | 1932 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_DSS_MOD, CM_FCLKEN), |
1653 | .enable_bit = OMAP3430_EN_DSS1_SHIFT, | 1933 | .enable_bit = OMAP3430_EN_DSS1_SHIFT, |
1934 | .clksel_reg = OMAP_CM_REGADDR(PLL_MOD, CM_IDLEST), | ||
1935 | .clksel_mask = OMAP3430_ST_PERIPH_CLK, | ||
1936 | .clksel = dss1_alwon_fck_clksel, | ||
1654 | .flags = CLOCK_IN_OMAP343X, | 1937 | .flags = CLOCK_IN_OMAP343X, |
1655 | .recalc = &followparent_recalc, | 1938 | .recalc = &omap2_clksel_recalc, |
1656 | }; | 1939 | }; |
1657 | 1940 | ||
1658 | static struct clk dss_tv_fck = { | 1941 | static struct clk dss_tv_fck = { |
@@ -1694,13 +1977,23 @@ static struct clk dss_ick = { | |||
1694 | 1977 | ||
1695 | /* CAM */ | 1978 | /* CAM */ |
1696 | 1979 | ||
1980 | static const struct clksel cam_mclk_clksel[] = { | ||
1981 | { .parent = &sys_ck, .rates = dpll_bypass_rates }, | ||
1982 | { .parent = &dpll4_m5x2_ck, .rates = dpll_locked_rates }, | ||
1983 | { .parent = NULL } | ||
1984 | }; | ||
1985 | |||
1697 | static struct clk cam_mclk = { | 1986 | static struct clk cam_mclk = { |
1698 | .name = "cam_mclk", | 1987 | .name = "cam_mclk", |
1699 | .parent = &dpll4_m5x2_ck, | 1988 | .parent = &dpll4_m5x2_ck, |
1989 | .init = &omap2_init_clksel_parent, | ||
1990 | .clksel_reg = OMAP_CM_REGADDR(PLL_MOD, CM_IDLEST), | ||
1991 | .clksel_mask = OMAP3430_ST_PERIPH_CLK, | ||
1992 | .clksel = cam_mclk_clksel, | ||
1700 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_CAM_MOD, CM_FCLKEN), | 1993 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_CAM_MOD, CM_FCLKEN), |
1701 | .enable_bit = OMAP3430_EN_CAM_SHIFT, | 1994 | .enable_bit = OMAP3430_EN_CAM_SHIFT, |
1702 | .flags = CLOCK_IN_OMAP343X, | 1995 | .flags = CLOCK_IN_OMAP343X, |
1703 | .recalc = &followparent_recalc, | 1996 | .recalc = &omap2_clksel_recalc, |
1704 | }; | 1997 | }; |
1705 | 1998 | ||
1706 | static struct clk cam_l3_ick = { | 1999 | static struct clk cam_l3_ick = { |
@@ -2497,7 +2790,6 @@ static struct clk wdt1_fck = { | |||
2497 | .recalc = &followparent_recalc, | 2790 | .recalc = &followparent_recalc, |
2498 | }; | 2791 | }; |
2499 | 2792 | ||
2500 | |||
2501 | static struct clk *onchip_34xx_clks[] __initdata = { | 2793 | static struct clk *onchip_34xx_clks[] __initdata = { |
2502 | &omap_32k_fck, | 2794 | &omap_32k_fck, |
2503 | &virt_12m_ck, | 2795 | &virt_12m_ck, |
@@ -2512,13 +2804,16 @@ static struct clk *onchip_34xx_clks[] __initdata = { | |||
2512 | &mcbsp_clks, | 2804 | &mcbsp_clks, |
2513 | &sys_clkout1, | 2805 | &sys_clkout1, |
2514 | &dpll1_ck, | 2806 | &dpll1_ck, |
2515 | &emu_mpu_alwon_ck, | 2807 | &dpll1_x2_ck, |
2808 | &dpll1_x2m2_ck, | ||
2516 | &dpll2_ck, | 2809 | &dpll2_ck, |
2810 | &dpll2_m2_ck, | ||
2517 | &dpll3_ck, | 2811 | &dpll3_ck, |
2518 | &core_ck, | 2812 | &core_ck, |
2519 | &dpll3_x2_ck, | 2813 | &dpll3_x2_ck, |
2520 | &dpll3_m2_ck, | 2814 | &dpll3_m2_ck, |
2521 | &dpll3_m2x2_ck, | 2815 | &dpll3_m2x2_ck, |
2816 | &dpll3_m3_ck, | ||
2522 | &dpll3_m3x2_ck, | 2817 | &dpll3_m3x2_ck, |
2523 | &emu_core_alwon_ck, | 2818 | &emu_core_alwon_ck, |
2524 | &dpll4_ck, | 2819 | &dpll4_ck, |
@@ -2526,13 +2821,19 @@ static struct clk *onchip_34xx_clks[] __initdata = { | |||
2526 | &omap_96m_alwon_fck, | 2821 | &omap_96m_alwon_fck, |
2527 | &omap_96m_fck, | 2822 | &omap_96m_fck, |
2528 | &cm_96m_fck, | 2823 | &cm_96m_fck, |
2824 | &virt_omap_54m_fck, | ||
2529 | &omap_54m_fck, | 2825 | &omap_54m_fck, |
2530 | &omap_48m_fck, | 2826 | &omap_48m_fck, |
2531 | &omap_12m_fck, | 2827 | &omap_12m_fck, |
2828 | &dpll4_m2_ck, | ||
2532 | &dpll4_m2x2_ck, | 2829 | &dpll4_m2x2_ck, |
2830 | &dpll4_m3_ck, | ||
2533 | &dpll4_m3x2_ck, | 2831 | &dpll4_m3x2_ck, |
2832 | &dpll4_m4_ck, | ||
2534 | &dpll4_m4x2_ck, | 2833 | &dpll4_m4x2_ck, |
2834 | &dpll4_m5_ck, | ||
2535 | &dpll4_m5x2_ck, | 2835 | &dpll4_m5x2_ck, |
2836 | &dpll4_m6_ck, | ||
2536 | &dpll4_m6x2_ck, | 2837 | &dpll4_m6x2_ck, |
2537 | &emu_per_alwon_ck, | 2838 | &emu_per_alwon_ck, |
2538 | &dpll5_ck, | 2839 | &dpll5_ck, |
@@ -2542,7 +2843,11 @@ static struct clk *onchip_34xx_clks[] __initdata = { | |||
2542 | &sys_clkout2, | 2843 | &sys_clkout2, |
2543 | &corex2_fck, | 2844 | &corex2_fck, |
2544 | &dpll1_fck, | 2845 | &dpll1_fck, |
2846 | &mpu_ck, | ||
2847 | &arm_fck, | ||
2848 | &emu_mpu_alwon_ck, | ||
2545 | &dpll2_fck, | 2849 | &dpll2_fck, |
2850 | &iva2_ck, | ||
2546 | &l3_ick, | 2851 | &l3_ick, |
2547 | &l4_ick, | 2852 | &l4_ick, |
2548 | &rm_ick, | 2853 | &rm_ick, |
diff --git a/arch/arm/mach-omap2/cm-regbits-34xx.h b/arch/arm/mach-omap2/cm-regbits-34xx.h index 317040887152..9249129a5f46 100644 --- a/arch/arm/mach-omap2/cm-regbits-34xx.h +++ b/arch/arm/mach-omap2/cm-regbits-34xx.h | |||
@@ -115,6 +115,10 @@ | |||
115 | 115 | ||
116 | /* CM_IDLEST_PLL_MPU */ | 116 | /* CM_IDLEST_PLL_MPU */ |
117 | #define OMAP3430_ST_MPU_CLK (1 << 0) | 117 | #define OMAP3430_ST_MPU_CLK (1 << 0) |
118 | #define OMAP3430_ST_IVA2_CLK_MASK (1 << 0) | ||
119 | |||
120 | /* CM_IDLEST_PLL_MPU */ | ||
121 | #define OMAP3430_ST_MPU_CLK_MASK (1 << 0) | ||
118 | 122 | ||
119 | /* CM_AUTOIDLE_PLL_MPU */ | 123 | /* CM_AUTOIDLE_PLL_MPU */ |
120 | #define OMAP3430_AUTO_MPU_DPLL_SHIFT 0 | 124 | #define OMAP3430_AUTO_MPU_DPLL_SHIFT 0 |
diff --git a/include/asm-arm/arch-omap/clock.h b/include/asm-arm/arch-omap/clock.h index 0baa79acc0b7..57523bdb642b 100644 --- a/include/asm-arm/arch-omap/clock.h +++ b/include/asm-arm/arch-omap/clock.h | |||
@@ -33,8 +33,6 @@ struct dpll_data { | |||
33 | void __iomem *mult_div1_reg; | 33 | void __iomem *mult_div1_reg; |
34 | u32 mult_mask; | 34 | u32 mult_mask; |
35 | u32 div1_mask; | 35 | u32 div1_mask; |
36 | void __iomem *div2_reg; | ||
37 | u32 div2_mask; | ||
38 | # if defined(CONFIG_ARCH_OMAP3) | 36 | # if defined(CONFIG_ARCH_OMAP3) |
39 | void __iomem *control_reg; | 37 | void __iomem *control_reg; |
40 | u32 enable_mask; | 38 | u32 enable_mask; |