|
@@ -312,3 +312,97 @@ void omap1_pm_suspend(void)
|
|
|
|
|
|
/* Stop all DSP domain clocks */
|
|
/* Stop all DSP domain clocks */
|
|
__raw_writew(0, DSP_IDLECT2);
|
|
__raw_writew(0, DSP_IDLECT2);
|
|
|
|
+
|
|
|
|
+ /*
|
|
|
|
+ * Step 5: Wakeup Event Setup
|
|
|
|
+ */
|
|
|
|
+
|
|
|
|
+ omap_pm_wakeup_setup();
|
|
|
|
+
|
|
|
|
+ /*
|
|
|
|
+ * Step 6: ARM and Traffic controller shutdown
|
|
|
|
+ */
|
|
|
|
+
|
|
|
|
+ /* disable ARM watchdog */
|
|
|
|
+ omap_writel(0x00F5, OMAP_WDT_TIMER_MODE);
|
|
|
|
+ omap_writel(0x00A0, OMAP_WDT_TIMER_MODE);
|
|
|
|
+
|
|
|
|
+ /*
|
|
|
|
+ * Step 6b: ARM and Traffic controller shutdown
|
|
|
|
+ *
|
|
|
|
+ * Step 6 continues here. Prepare jump to power management
|
|
|
|
+ * assembly code in internal SRAM.
|
|
|
|
+ *
|
|
|
|
+ * Since the omap_cpu_suspend routine has been copied to
|
|
|
|
+ * SRAM, we'll do an indirect procedure call to it and pass the
|
|
|
|
+ * contents of arm_idlect1 and arm_idlect2 so it can restore
|
|
|
|
+ * them when it wakes up and it will return.
|
|
|
|
+ */
|
|
|
|
+
|
|
|
|
+ arg0 = arm_sleep_save[ARM_SLEEP_SAVE_ARM_IDLECT1];
|
|
|
|
+ arg1 = arm_sleep_save[ARM_SLEEP_SAVE_ARM_IDLECT2];
|
|
|
|
+
|
|
|
|
+ /*
|
|
|
|
+ * Step 6c: ARM and Traffic controller shutdown
|
|
|
|
+ *
|
|
|
|
+ * Jump to assembly code. The processor will stay there
|
|
|
|
+ * until wake up.
|
|
|
|
+ */
|
|
|
|
+ omap_sram_suspend(arg0, arg1);
|
|
|
|
+
|
|
|
|
+ /*
|
|
|
|
+ * If we are here, processor is woken up!
|
|
|
|
+ */
|
|
|
|
+
|
|
|
|
+ /*
|
|
|
|
+ * Restore DSP clocks
|
|
|
|
+ */
|
|
|
|
+
|
|
|
|
+ /* again temporarily enabling api_ck to access DSP registers */
|
|
|
|
+ omap_writew(omap_readw(ARM_IDLECT2) | 1 << EN_APICK, ARM_IDLECT2);
|
|
|
|
+
|
|
|
|
+ /* Restore DSP domain clocks */
|
|
|
|
+ DSP_RESTORE(DSP_IDLECT2);
|
|
|
|
+
|
|
|
|
+ /*
|
|
|
|
+ * Restore ARM state, except ARM_IDLECT1/2 which omap_cpu_suspend did
|
|
|
|
+ */
|
|
|
|
+
|
|
|
|
+ if (!(cpu_is_omap15xx()))
|
|
|
|
+ ARM_RESTORE(ARM_IDLECT3);
|
|
|
|
+ ARM_RESTORE(ARM_CKCTL);
|
|
|
|
+ ARM_RESTORE(ARM_EWUPCT);
|
|
|
|
+ ARM_RESTORE(ARM_RSTCT1);
|
|
|
|
+ ARM_RESTORE(ARM_RSTCT2);
|
|
|
|
+ ARM_RESTORE(ARM_SYSST);
|
|
|
|
+ ULPD_RESTORE(ULPD_CLOCK_CTRL);
|
|
|
|
+ ULPD_RESTORE(ULPD_STATUS_REQ);
|
|
|
|
+
|
|
|
|
+ if (cpu_is_omap7xx()) {
|
|
|
|
+ MPUI7XX_RESTORE(EMIFS_CONFIG);
|
|
|
|
+ MPUI7XX_RESTORE(EMIFF_SDRAM_CONFIG);
|
|
|
|
+ MPUI7XX_RESTORE(OMAP_IH1_MIR);
|
|
|
|
+ MPUI7XX_RESTORE(OMAP_IH2_0_MIR);
|
|
|
|
+ MPUI7XX_RESTORE(OMAP_IH2_1_MIR);
|
|
|
|
+ } else if (cpu_is_omap15xx()) {
|
|
|
|
+ MPUI1510_RESTORE(MPUI_CTRL);
|
|
|
|
+ MPUI1510_RESTORE(MPUI_DSP_BOOT_CONFIG);
|
|
|
|
+ MPUI1510_RESTORE(MPUI_DSP_API_CONFIG);
|
|
|
|
+ MPUI1510_RESTORE(EMIFS_CONFIG);
|
|
|
|
+ MPUI1510_RESTORE(EMIFF_SDRAM_CONFIG);
|
|
|
|
+ MPUI1510_RESTORE(OMAP_IH1_MIR);
|
|
|
|
+ MPUI1510_RESTORE(OMAP_IH2_MIR);
|
|
|
|
+ } else if (cpu_is_omap16xx()) {
|
|
|
|
+ MPUI1610_RESTORE(MPUI_CTRL);
|
|
|
|
+ MPUI1610_RESTORE(MPUI_DSP_BOOT_CONFIG);
|
|
|
|
+ MPUI1610_RESTORE(MPUI_DSP_API_CONFIG);
|
|
|
|
+ MPUI1610_RESTORE(EMIFS_CONFIG);
|
|
|
|
+ MPUI1610_RESTORE(EMIFF_SDRAM_CONFIG);
|
|
|
|
+
|
|
|
|
+ MPUI1610_RESTORE(OMAP_IH1_MIR);
|
|
|
|
+ MPUI1610_RESTORE(OMAP_IH2_0_MIR);
|
|
|
|
+ MPUI1610_RESTORE(OMAP_IH2_1_MIR);
|
|
|
|
+ MPUI1610_RESTORE(OMAP_IH2_2_MIR);
|
|
|
|
+ MPUI1610_RESTORE(OMAP_IH2_3_MIR);
|
|
|
|
+ }
|
|
|
|
+
|