Merge branch 'smp-hotplug-for-linus' of git://git.kernel.org/pub/scm/linux/kernel...
[deliverable/linux.git] / arch / arm / mach-omap2 / pm24xx.c
index c333fa6dffa8193ec8f7b8dd8290609c8ac53c92..b59d93908341bc91f10e9fae9692e7d3c322198c 100644 (file)
@@ -54,7 +54,6 @@
 #include "powerdomain.h"
 #include "clockdomain.h"
 
-static void (*omap2_sram_idle)(void);
 static void (*omap2_sram_suspend)(u32 dllctrl, void __iomem *sdrc_dlla_ctrl,
                                  void __iomem *sdrc_power);
 
@@ -90,11 +89,7 @@ static int omap2_enter_full_retention(void)
        omap2_prm_write_mod_reg(0xffffffff, CORE_MOD, OMAP24XX_PM_WKST2);
        omap2_prm_write_mod_reg(0xffffffff, WKUP_MOD, PM_WKST);
 
-       /*
-        * Set MPU powerdomain's next power state to RETENTION;
-        * preserve logic state during retention
-        */
-       pwrdm_set_logic_retst(mpu_pwrdm, PWRDM_POWER_RET);
+       pwrdm_set_next_pwrst(core_pwrdm, PWRDM_POWER_RET);
        pwrdm_set_next_pwrst(mpu_pwrdm, PWRDM_POWER_RET);
 
        /* Workaround to kill USB */
@@ -137,15 +132,10 @@ no_sleep:
        /* Mask future PRCM-to-MPU interrupts */
        omap2_prm_write_mod_reg(0x0, OCP_MOD, OMAP2_PRCM_IRQSTATUS_MPU_OFFSET);
 
-       return 0;
-}
-
-static int omap2_i2c_active(void)
-{
-       u32 l;
+       pwrdm_set_next_pwrst(mpu_pwrdm, PWRDM_POWER_ON);
+       pwrdm_set_next_pwrst(core_pwrdm, PWRDM_POWER_ON);
 
-       l = omap2_cm_read_mod_reg(CORE_MOD, CM_FCLKEN1);
-       return l & (OMAP2420_EN_I2C2_MASK | OMAP2420_EN_I2C1_MASK);
+       return 0;
 }
 
 static int sti_console_enabled;
@@ -172,10 +162,7 @@ static int omap2_allow_mpu_retention(void)
 
 static void omap2_enter_mpu_retention(void)
 {
-       /* Putting MPU into the WFI state while a transfer is active
-        * seems to cause the I2C block to timeout. Why? Good question. */
-       if (omap2_i2c_active())
-               return;
+       const int zero = 0;
 
        /* The peripherals seem not to be able to wake up the MPU when
         * it is in retention mode. */
@@ -186,17 +173,17 @@ static void omap2_enter_mpu_retention(void)
                omap2_prm_write_mod_reg(0xffffffff, WKUP_MOD, PM_WKST);
 
                /* Try to enter MPU retention */
-               omap2_prm_write_mod_reg((0x01 << OMAP_POWERSTATE_SHIFT) |
-                                 OMAP_LOGICRETSTATE_MASK,
-                                 MPU_MOD, OMAP2_PM_PWSTCTRL);
+               pwrdm_set_next_pwrst(mpu_pwrdm, PWRDM_POWER_RET);
+
        } else {
                /* Block MPU retention */
-
-               omap2_prm_write_mod_reg(OMAP_LOGICRETSTATE_MASK, MPU_MOD,
-                                                OMAP2_PM_PWSTCTRL);
+               pwrdm_set_next_pwrst(mpu_pwrdm, PWRDM_POWER_ON);
        }
 
-       omap2_sram_idle();
+       /* WFI */
+       asm("mcr p15, 0, %0, c7, c0, 4" : : "r" (zero) : "memory", "cc");
+
+       pwrdm_set_next_pwrst(mpu_pwrdm, PWRDM_POWER_ON);
 }
 
 static int omap2_can_sleep(void)
@@ -251,25 +238,17 @@ static void __init prcm_setup_regs(void)
        for (i = 0; i < num_mem_banks; i++)
                pwrdm_set_mem_retst(core_pwrdm, i, PWRDM_POWER_RET);
 
-       /* Set CORE powerdomain's next power state to RETENTION */
-       pwrdm_set_next_pwrst(core_pwrdm, PWRDM_POWER_RET);
+       pwrdm_set_logic_retst(core_pwrdm, PWRDM_POWER_RET);
 
-       /*
-        * Set MPU powerdomain's next power state to RETENTION;
-        * preserve logic state during retention
-        */
        pwrdm_set_logic_retst(mpu_pwrdm, PWRDM_POWER_RET);
-       pwrdm_set_next_pwrst(mpu_pwrdm, PWRDM_POWER_RET);
 
        /* Force-power down DSP, GFX powerdomains */
 
        pwrdm = clkdm_get_pwrdm(dsp_clkdm);
        pwrdm_set_next_pwrst(pwrdm, PWRDM_POWER_OFF);
-       clkdm_sleep(dsp_clkdm);
 
        pwrdm = clkdm_get_pwrdm(gfx_clkdm);
        pwrdm_set_next_pwrst(pwrdm, PWRDM_POWER_OFF);
-       clkdm_sleep(gfx_clkdm);
 
        /* Enable hardware-supervised idle for all clkdms */
        clkdm_for_each(omap_pm_clkdms_setup, NULL);
@@ -356,11 +335,9 @@ int __init omap2_pm_init(void)
        /*
         * We copy the assembler sleep/wakeup routines to SRAM.
         * These routines need to be in SRAM as that's the only
-        * memory the MPU can see when it wakes up.
+        * memory the MPU can see when it wakes up after the entire
+        * chip enters idle.
         */
-       omap2_sram_idle = omap_sram_push(omap24xx_idle_loop_suspend,
-                                        omap24xx_idle_loop_suspend_sz);
-
        omap2_sram_suspend = omap_sram_push(omap24xx_cpu_suspend,
                                            omap24xx_cpu_suspend_sz);
 
This page took 0.029638 seconds and 5 git commands to generate.