diff options
-rw-r--r-- | arch/arm/mach-omap2/cm3xxx.c | 22 | ||||
-rw-r--r-- | arch/arm/mach-omap2/cm3xxx.h | 1 | ||||
-rw-r--r-- | arch/arm/mach-omap2/control.c | 43 |
3 files changed, 27 insertions, 39 deletions
diff --git a/arch/arm/mach-omap2/cm3xxx.c b/arch/arm/mach-omap2/cm3xxx.c index 9061c307d915..f6f028867bfe 100644 --- a/arch/arm/mach-omap2/cm3xxx.c +++ b/arch/arm/mach-omap2/cm3xxx.c | |||
@@ -636,6 +636,28 @@ void omap3_cm_restore_context(void) | |||
636 | OMAP3_CM_CLKOUT_CTRL_OFFSET); | 636 | OMAP3_CM_CLKOUT_CTRL_OFFSET); |
637 | } | 637 | } |
638 | 638 | ||
639 | void omap3_cm_save_scratchpad_contents(u32 *ptr) | ||
640 | { | ||
641 | *ptr++ = omap2_cm_read_mod_reg(CORE_MOD, CM_CLKSEL); | ||
642 | *ptr++ = omap2_cm_read_mod_reg(WKUP_MOD, CM_CLKSEL); | ||
643 | *ptr++ = omap2_cm_read_mod_reg(PLL_MOD, CM_CLKEN); | ||
644 | |||
645 | /* | ||
646 | * As per erratum i671, ROM code does not respect the PER DPLL | ||
647 | * programming scheme if CM_AUTOIDLE_PLL..AUTO_PERIPH_DPLL == 1. | ||
648 | * Then, in anycase, clear these bits to avoid extra latencies. | ||
649 | */ | ||
650 | *ptr++ = omap2_cm_read_mod_reg(PLL_MOD, CM_AUTOIDLE) & | ||
651 | ~OMAP3430_AUTO_PERIPH_DPLL_MASK; | ||
652 | *ptr++ = omap2_cm_read_mod_reg(PLL_MOD, OMAP3430_CM_CLKSEL1_PLL); | ||
653 | *ptr++ = omap2_cm_read_mod_reg(PLL_MOD, OMAP3430_CM_CLKSEL2_PLL); | ||
654 | *ptr++ = omap2_cm_read_mod_reg(PLL_MOD, OMAP3430_CM_CLKSEL3); | ||
655 | *ptr++ = omap2_cm_read_mod_reg(MPU_MOD, OMAP3430_CM_CLKEN_PLL); | ||
656 | *ptr++ = omap2_cm_read_mod_reg(MPU_MOD, OMAP3430_CM_AUTOIDLE_PLL); | ||
657 | *ptr++ = omap2_cm_read_mod_reg(MPU_MOD, OMAP3430_CM_CLKSEL1_PLL); | ||
658 | *ptr++ = omap2_cm_read_mod_reg(MPU_MOD, OMAP3430_CM_CLKSEL2_PLL); | ||
659 | } | ||
660 | |||
639 | /* | 661 | /* |
640 | * | 662 | * |
641 | */ | 663 | */ |
diff --git a/arch/arm/mach-omap2/cm3xxx.h b/arch/arm/mach-omap2/cm3xxx.h index e8e146f4a43f..8224c91b4d7a 100644 --- a/arch/arm/mach-omap2/cm3xxx.h +++ b/arch/arm/mach-omap2/cm3xxx.h | |||
@@ -83,6 +83,7 @@ extern int omap3xxx_cm_split_idlest_reg(void __iomem *idlest_reg, | |||
83 | 83 | ||
84 | extern void omap3_cm_save_context(void); | 84 | extern void omap3_cm_save_context(void); |
85 | extern void omap3_cm_restore_context(void); | 85 | extern void omap3_cm_restore_context(void); |
86 | extern void omap3_cm_save_scratchpad_contents(u32 *ptr); | ||
86 | 87 | ||
87 | extern int __init omap3xxx_cm_init(void); | 88 | extern int __init omap3xxx_cm_init(void); |
88 | 89 | ||
diff --git a/arch/arm/mach-omap2/control.c b/arch/arm/mach-omap2/control.c index 31e0dfe4a4ea..a59711454543 100644 --- a/arch/arm/mach-omap2/control.c +++ b/arch/arm/mach-omap2/control.c | |||
@@ -46,17 +46,7 @@ struct omap3_scratchpad { | |||
46 | struct omap3_scratchpad_prcm_block { | 46 | struct omap3_scratchpad_prcm_block { |
47 | u32 prm_clksrc_ctrl; | 47 | u32 prm_clksrc_ctrl; |
48 | u32 prm_clksel; | 48 | u32 prm_clksel; |
49 | u32 cm_clksel_core; | 49 | u32 cm_contents[11]; |
50 | u32 cm_clksel_wkup; | ||
51 | u32 cm_clken_pll; | ||
52 | u32 cm_autoidle_pll; | ||
53 | u32 cm_clksel1_pll; | ||
54 | u32 cm_clksel2_pll; | ||
55 | u32 cm_clksel3_pll; | ||
56 | u32 cm_clken_pll_mpu; | ||
57 | u32 cm_autoidle_pll_mpu; | ||
58 | u32 cm_clksel1_pll_mpu; | ||
59 | u32 cm_clksel2_pll_mpu; | ||
60 | u32 prcm_block_size; | 50 | u32 prcm_block_size; |
61 | }; | 51 | }; |
62 | 52 | ||
@@ -347,34 +337,9 @@ void omap3_save_scratchpad_contents(void) | |||
347 | prcm_block_contents.prm_clksel = | 337 | prcm_block_contents.prm_clksel = |
348 | omap2_prm_read_mod_reg(OMAP3430_CCR_MOD, | 338 | omap2_prm_read_mod_reg(OMAP3430_CCR_MOD, |
349 | OMAP3_PRM_CLKSEL_OFFSET); | 339 | OMAP3_PRM_CLKSEL_OFFSET); |
350 | prcm_block_contents.cm_clksel_core = | 340 | |
351 | omap2_cm_read_mod_reg(CORE_MOD, CM_CLKSEL); | 341 | omap3_cm_save_scratchpad_contents(prcm_block_contents.cm_contents); |
352 | prcm_block_contents.cm_clksel_wkup = | 342 | |
353 | omap2_cm_read_mod_reg(WKUP_MOD, CM_CLKSEL); | ||
354 | prcm_block_contents.cm_clken_pll = | ||
355 | omap2_cm_read_mod_reg(PLL_MOD, CM_CLKEN); | ||
356 | /* | ||
357 | * As per erratum i671, ROM code does not respect the PER DPLL | ||
358 | * programming scheme if CM_AUTOIDLE_PLL..AUTO_PERIPH_DPLL == 1. | ||
359 | * Then, in anycase, clear these bits to avoid extra latencies. | ||
360 | */ | ||
361 | prcm_block_contents.cm_autoidle_pll = | ||
362 | omap2_cm_read_mod_reg(PLL_MOD, CM_AUTOIDLE) & | ||
363 | ~OMAP3430_AUTO_PERIPH_DPLL_MASK; | ||
364 | prcm_block_contents.cm_clksel1_pll = | ||
365 | omap2_cm_read_mod_reg(PLL_MOD, OMAP3430_CM_CLKSEL1_PLL); | ||
366 | prcm_block_contents.cm_clksel2_pll = | ||
367 | omap2_cm_read_mod_reg(PLL_MOD, OMAP3430_CM_CLKSEL2_PLL); | ||
368 | prcm_block_contents.cm_clksel3_pll = | ||
369 | omap2_cm_read_mod_reg(PLL_MOD, OMAP3430_CM_CLKSEL3); | ||
370 | prcm_block_contents.cm_clken_pll_mpu = | ||
371 | omap2_cm_read_mod_reg(MPU_MOD, OMAP3430_CM_CLKEN_PLL); | ||
372 | prcm_block_contents.cm_autoidle_pll_mpu = | ||
373 | omap2_cm_read_mod_reg(MPU_MOD, OMAP3430_CM_AUTOIDLE_PLL); | ||
374 | prcm_block_contents.cm_clksel1_pll_mpu = | ||
375 | omap2_cm_read_mod_reg(MPU_MOD, OMAP3430_CM_CLKSEL1_PLL); | ||
376 | prcm_block_contents.cm_clksel2_pll_mpu = | ||
377 | omap2_cm_read_mod_reg(MPU_MOD, OMAP3430_CM_CLKSEL2_PLL); | ||
378 | prcm_block_contents.prcm_block_size = 0x0; | 343 | prcm_block_contents.prcm_block_size = 0x0; |
379 | 344 | ||
380 | /* Populate the SDRC block contents */ | 345 | /* Populate the SDRC block contents */ |