diff options
Diffstat (limited to 'arch/arm/mach-omap2/control.c')
-rw-r--r-- | arch/arm/mach-omap2/control.c | 111 |
1 files changed, 90 insertions, 21 deletions
diff --git a/arch/arm/mach-omap2/control.c b/arch/arm/mach-omap2/control.c index 0269bb055b69..695279419020 100644 --- a/arch/arm/mach-omap2/control.c +++ b/arch/arm/mach-omap2/control.c | |||
@@ -20,12 +20,16 @@ | |||
20 | 20 | ||
21 | #include "cm-regbits-34xx.h" | 21 | #include "cm-regbits-34xx.h" |
22 | #include "prm-regbits-34xx.h" | 22 | #include "prm-regbits-34xx.h" |
23 | #include "cm.h" | 23 | #include "prm2xxx_3xxx.h" |
24 | #include "prm.h" | 24 | #include "cm2xxx_3xxx.h" |
25 | #include "sdrc.h" | 25 | #include "sdrc.h" |
26 | #include "pm.h" | 26 | #include "pm.h" |
27 | #include "control.h" | 27 | #include "control.h" |
28 | 28 | ||
29 | /* Used by omap3_ctrl_save_padconf() */ | ||
30 | #define START_PADCONF_SAVE 0x2 | ||
31 | #define PADCONF_SAVE_DONE 0x1 | ||
32 | |||
29 | static void __iomem *omap2_ctrl_base; | 33 | static void __iomem *omap2_ctrl_base; |
30 | static void __iomem *omap4_ctrl_pad_base; | 34 | static void __iomem *omap4_ctrl_pad_base; |
31 | 35 | ||
@@ -134,6 +138,7 @@ struct omap3_control_regs { | |||
134 | u32 sramldo4; | 138 | u32 sramldo4; |
135 | u32 sramldo5; | 139 | u32 sramldo5; |
136 | u32 csi; | 140 | u32 csi; |
141 | u32 padconf_sys_nirq; | ||
137 | }; | 142 | }; |
138 | 143 | ||
139 | static struct omap3_control_regs control_context; | 144 | static struct omap3_control_regs control_context; |
@@ -209,6 +214,37 @@ void omap4_ctrl_pad_writel(u32 val, u16 offset) | |||
209 | __raw_writel(val, OMAP4_CTRL_PAD_REGADDR(offset)); | 214 | __raw_writel(val, OMAP4_CTRL_PAD_REGADDR(offset)); |
210 | } | 215 | } |
211 | 216 | ||
217 | #ifdef CONFIG_ARCH_OMAP3 | ||
218 | |||
219 | /** | ||
220 | * omap3_ctrl_write_boot_mode - set scratchpad boot mode for the next boot | ||
221 | * @bootmode: 8-bit value to pass to some boot code | ||
222 | * | ||
223 | * Set the bootmode in the scratchpad RAM. This is used after the | ||
224 | * system restarts. Not sure what actually uses this - it may be the | ||
225 | * bootloader, rather than the boot ROM - contrary to the preserved | ||
226 | * comment below. No return value. | ||
227 | */ | ||
228 | void omap3_ctrl_write_boot_mode(u8 bootmode) | ||
229 | { | ||
230 | u32 l; | ||
231 | |||
232 | l = ('B' << 24) | ('M' << 16) | bootmode; | ||
233 | |||
234 | /* | ||
235 | * Reserve the first word in scratchpad for communicating | ||
236 | * with the boot ROM. A pointer to a data structure | ||
237 | * describing the boot process can be stored there, | ||
238 | * cf. OMAP34xx TRM, Initialization / Software Booting | ||
239 | * Configuration. | ||
240 | * | ||
241 | * XXX This should use some omap_ctrl_writel()-type function | ||
242 | */ | ||
243 | __raw_writel(l, OMAP2_L4_IO_ADDRESS(OMAP343X_SCRATCHPAD + 4)); | ||
244 | } | ||
245 | |||
246 | #endif | ||
247 | |||
212 | #if defined(CONFIG_ARCH_OMAP3) && defined(CONFIG_PM) | 248 | #if defined(CONFIG_ARCH_OMAP3) && defined(CONFIG_PM) |
213 | /* | 249 | /* |
214 | * Clears the scratchpad contents in case of cold boot- | 250 | * Clears the scratchpad contents in case of cold boot- |
@@ -220,13 +256,13 @@ void omap3_clear_scratchpad_contents(void) | |||
220 | void __iomem *v_addr; | 256 | void __iomem *v_addr; |
221 | u32 offset = 0; | 257 | u32 offset = 0; |
222 | v_addr = OMAP2_L4_IO_ADDRESS(OMAP343X_SCRATCHPAD_ROM); | 258 | v_addr = OMAP2_L4_IO_ADDRESS(OMAP343X_SCRATCHPAD_ROM); |
223 | if (prm_read_mod_reg(OMAP3430_GR_MOD, OMAP3_PRM_RSTST_OFFSET) & | 259 | if (omap2_prm_read_mod_reg(OMAP3430_GR_MOD, OMAP3_PRM_RSTST_OFFSET) & |
224 | OMAP3430_GLOBAL_COLD_RST_MASK) { | 260 | OMAP3430_GLOBAL_COLD_RST_MASK) { |
225 | for ( ; offset <= max_offset; offset += 0x4) | 261 | for ( ; offset <= max_offset; offset += 0x4) |
226 | __raw_writel(0x0, (v_addr + offset)); | 262 | __raw_writel(0x0, (v_addr + offset)); |
227 | prm_set_mod_reg_bits(OMAP3430_GLOBAL_COLD_RST_MASK, | 263 | omap2_prm_set_mod_reg_bits(OMAP3430_GLOBAL_COLD_RST_MASK, |
228 | OMAP3430_GR_MOD, | 264 | OMAP3430_GR_MOD, |
229 | OMAP3_PRM_RSTST_OFFSET); | 265 | OMAP3_PRM_RSTST_OFFSET); |
230 | } | 266 | } |
231 | } | 267 | } |
232 | 268 | ||
@@ -268,32 +304,34 @@ void omap3_save_scratchpad_contents(void) | |||
268 | scratchpad_contents.sdrc_block_offset = 0x64; | 304 | scratchpad_contents.sdrc_block_offset = 0x64; |
269 | 305 | ||
270 | /* Populate the PRCM block contents */ | 306 | /* Populate the PRCM block contents */ |
271 | prcm_block_contents.prm_clksrc_ctrl = prm_read_mod_reg(OMAP3430_GR_MOD, | 307 | prcm_block_contents.prm_clksrc_ctrl = |
272 | OMAP3_PRM_CLKSRC_CTRL_OFFSET); | 308 | omap2_prm_read_mod_reg(OMAP3430_GR_MOD, |
273 | prcm_block_contents.prm_clksel = prm_read_mod_reg(OMAP3430_CCR_MOD, | 309 | OMAP3_PRM_CLKSRC_CTRL_OFFSET); |
274 | OMAP3_PRM_CLKSEL_OFFSET); | 310 | prcm_block_contents.prm_clksel = |
311 | omap2_prm_read_mod_reg(OMAP3430_CCR_MOD, | ||
312 | OMAP3_PRM_CLKSEL_OFFSET); | ||
275 | prcm_block_contents.cm_clksel_core = | 313 | prcm_block_contents.cm_clksel_core = |
276 | cm_read_mod_reg(CORE_MOD, CM_CLKSEL); | 314 | omap2_cm_read_mod_reg(CORE_MOD, CM_CLKSEL); |
277 | prcm_block_contents.cm_clksel_wkup = | 315 | prcm_block_contents.cm_clksel_wkup = |
278 | cm_read_mod_reg(WKUP_MOD, CM_CLKSEL); | 316 | omap2_cm_read_mod_reg(WKUP_MOD, CM_CLKSEL); |
279 | prcm_block_contents.cm_clken_pll = | 317 | prcm_block_contents.cm_clken_pll = |
280 | cm_read_mod_reg(PLL_MOD, CM_CLKEN); | 318 | omap2_cm_read_mod_reg(PLL_MOD, CM_CLKEN); |
281 | prcm_block_contents.cm_autoidle_pll = | 319 | prcm_block_contents.cm_autoidle_pll = |
282 | cm_read_mod_reg(PLL_MOD, OMAP3430_CM_AUTOIDLE_PLL); | 320 | omap2_cm_read_mod_reg(PLL_MOD, OMAP3430_CM_AUTOIDLE_PLL); |
283 | prcm_block_contents.cm_clksel1_pll = | 321 | prcm_block_contents.cm_clksel1_pll = |
284 | cm_read_mod_reg(PLL_MOD, OMAP3430_CM_CLKSEL1_PLL); | 322 | omap2_cm_read_mod_reg(PLL_MOD, OMAP3430_CM_CLKSEL1_PLL); |
285 | prcm_block_contents.cm_clksel2_pll = | 323 | prcm_block_contents.cm_clksel2_pll = |
286 | cm_read_mod_reg(PLL_MOD, OMAP3430_CM_CLKSEL2_PLL); | 324 | omap2_cm_read_mod_reg(PLL_MOD, OMAP3430_CM_CLKSEL2_PLL); |
287 | prcm_block_contents.cm_clksel3_pll = | 325 | prcm_block_contents.cm_clksel3_pll = |
288 | cm_read_mod_reg(PLL_MOD, OMAP3430_CM_CLKSEL3); | 326 | omap2_cm_read_mod_reg(PLL_MOD, OMAP3430_CM_CLKSEL3); |
289 | prcm_block_contents.cm_clken_pll_mpu = | 327 | prcm_block_contents.cm_clken_pll_mpu = |
290 | cm_read_mod_reg(MPU_MOD, OMAP3430_CM_CLKEN_PLL); | 328 | omap2_cm_read_mod_reg(MPU_MOD, OMAP3430_CM_CLKEN_PLL); |
291 | prcm_block_contents.cm_autoidle_pll_mpu = | 329 | prcm_block_contents.cm_autoidle_pll_mpu = |
292 | cm_read_mod_reg(MPU_MOD, OMAP3430_CM_AUTOIDLE_PLL); | 330 | omap2_cm_read_mod_reg(MPU_MOD, OMAP3430_CM_AUTOIDLE_PLL); |
293 | prcm_block_contents.cm_clksel1_pll_mpu = | 331 | prcm_block_contents.cm_clksel1_pll_mpu = |
294 | cm_read_mod_reg(MPU_MOD, OMAP3430_CM_CLKSEL1_PLL); | 332 | omap2_cm_read_mod_reg(MPU_MOD, OMAP3430_CM_CLKSEL1_PLL); |
295 | prcm_block_contents.cm_clksel2_pll_mpu = | 333 | prcm_block_contents.cm_clksel2_pll_mpu = |
296 | cm_read_mod_reg(MPU_MOD, OMAP3430_CM_CLKSEL2_PLL); | 334 | omap2_cm_read_mod_reg(MPU_MOD, OMAP3430_CM_CLKSEL2_PLL); |
297 | prcm_block_contents.prcm_block_size = 0x0; | 335 | prcm_block_contents.prcm_block_size = 0x0; |
298 | 336 | ||
299 | /* Populate the SDRC block contents */ | 337 | /* Populate the SDRC block contents */ |
@@ -426,6 +464,8 @@ void omap3_control_save_context(void) | |||
426 | control_context.sramldo4 = omap_ctrl_readl(OMAP343X_CONTROL_SRAMLDO4); | 464 | control_context.sramldo4 = omap_ctrl_readl(OMAP343X_CONTROL_SRAMLDO4); |
427 | control_context.sramldo5 = omap_ctrl_readl(OMAP343X_CONTROL_SRAMLDO5); | 465 | control_context.sramldo5 = omap_ctrl_readl(OMAP343X_CONTROL_SRAMLDO5); |
428 | control_context.csi = omap_ctrl_readl(OMAP343X_CONTROL_CSI); | 466 | control_context.csi = omap_ctrl_readl(OMAP343X_CONTROL_CSI); |
467 | control_context.padconf_sys_nirq = | ||
468 | omap_ctrl_readl(OMAP343X_CONTROL_PADCONF_SYSNIRQ); | ||
429 | return; | 469 | return; |
430 | } | 470 | } |
431 | 471 | ||
@@ -482,6 +522,8 @@ void omap3_control_restore_context(void) | |||
482 | omap_ctrl_writel(control_context.sramldo4, OMAP343X_CONTROL_SRAMLDO4); | 522 | omap_ctrl_writel(control_context.sramldo4, OMAP343X_CONTROL_SRAMLDO4); |
483 | omap_ctrl_writel(control_context.sramldo5, OMAP343X_CONTROL_SRAMLDO5); | 523 | omap_ctrl_writel(control_context.sramldo5, OMAP343X_CONTROL_SRAMLDO5); |
484 | omap_ctrl_writel(control_context.csi, OMAP343X_CONTROL_CSI); | 524 | omap_ctrl_writel(control_context.csi, OMAP343X_CONTROL_CSI); |
525 | omap_ctrl_writel(control_context.padconf_sys_nirq, | ||
526 | OMAP343X_CONTROL_PADCONF_SYSNIRQ); | ||
485 | return; | 527 | return; |
486 | } | 528 | } |
487 | 529 | ||
@@ -492,4 +534,31 @@ void omap3630_ctrl_disable_rta(void) | |||
492 | omap_ctrl_writel(OMAP36XX_RTA_DISABLE, OMAP36XX_CONTROL_MEM_RTA_CTRL); | 534 | omap_ctrl_writel(OMAP36XX_RTA_DISABLE, OMAP36XX_CONTROL_MEM_RTA_CTRL); |
493 | } | 535 | } |
494 | 536 | ||
537 | /** | ||
538 | * omap3_ctrl_save_padconf - save padconf registers to scratchpad RAM | ||
539 | * | ||
540 | * Tell the SCM to start saving the padconf registers, then wait for | ||
541 | * the process to complete. Returns 0 unconditionally, although it | ||
542 | * should also eventually be able to return -ETIMEDOUT, if the save | ||
543 | * does not complete. | ||
544 | * | ||
545 | * XXX This function is missing a timeout. What should it be? | ||
546 | */ | ||
547 | int omap3_ctrl_save_padconf(void) | ||
548 | { | ||
549 | u32 cpo; | ||
550 | |||
551 | /* Save the padconf registers */ | ||
552 | cpo = omap_ctrl_readl(OMAP343X_CONTROL_PADCONF_OFF); | ||
553 | cpo |= START_PADCONF_SAVE; | ||
554 | omap_ctrl_writel(cpo, OMAP343X_CONTROL_PADCONF_OFF); | ||
555 | |||
556 | /* wait for the save to complete */ | ||
557 | while (!(omap_ctrl_readl(OMAP343X_CONTROL_GENERAL_PURPOSE_STATUS) | ||
558 | & PADCONF_SAVE_DONE)) | ||
559 | udelay(1); | ||
560 | |||
561 | return 0; | ||
562 | } | ||
563 | |||
495 | #endif /* CONFIG_ARCH_OMAP3 && CONFIG_PM */ | 564 | #endif /* CONFIG_ARCH_OMAP3 && CONFIG_PM */ |