Merge branch 'pm-next' of git://git.kernel.org/pub/scm/linux/kernel/git/khilman/linux...
[pandora-kernel.git] / arch / arm / mach-omap2 / pm34xx.c
index e76af5b..24c1966 100644 (file)
@@ -379,12 +379,19 @@ void omap_sram_idle(void)
        if (pwrdm_read_pwrst(neon_pwrdm) == PWRDM_POWER_ON)
                pwrdm_set_next_pwrst(neon_pwrdm, mpu_next_state);
 
-       /* PER */
+       /* Enable IO-PAD and IO-CHAIN wakeups */
        per_next_state = pwrdm_read_next_pwrst(per_pwrdm);
        core_next_state = pwrdm_read_next_pwrst(core_pwrdm);
+       if (per_next_state < PWRDM_POWER_ON ||
+                       core_next_state < PWRDM_POWER_ON) {
+               prm_set_mod_reg_bits(OMAP3430_EN_IO, WKUP_MOD, PM_WKEN);
+               omap3_enable_io_chain();
+       }
+
+       /* PER */
        if (per_next_state < PWRDM_POWER_ON) {
                omap_uart_prepare_idle(2);
-               omap2_gpio_prepare_for_retention();
+               omap2_gpio_prepare_for_idle(per_next_state);
                if (per_next_state == PWRDM_POWER_OFF) {
                        if (core_next_state == PWRDM_POWER_ON) {
                                per_next_state = PWRDM_POWER_RET;
@@ -406,10 +413,8 @@ void omap_sram_idle(void)
                        omap3_core_save_context();
                        omap3_prcm_save_context();
                }
-               /* Enable IO-PAD and IO-CHAIN wakeups */
-               prm_set_mod_reg_bits(OMAP3430_EN_IO, WKUP_MOD, PM_WKEN);
-               omap3_enable_io_chain();
        }
+
        omap3_intc_prepare_idle();
 
        /*
@@ -462,16 +467,17 @@ void omap_sram_idle(void)
        /* PER */
        if (per_next_state < PWRDM_POWER_ON) {
                per_prev_state = pwrdm_read_prev_pwrst(per_pwrdm);
+               omap2_gpio_resume_after_idle();
                if (per_prev_state == PWRDM_POWER_OFF)
                        omap3_per_restore_context();
-               omap2_gpio_resume_after_retention();
                omap_uart_resume_idle(2);
                if (per_state_modified)
                        pwrdm_set_next_pwrst(per_pwrdm, PWRDM_POWER_OFF);
        }
 
        /* Disable IO-PAD and IO-CHAIN wakeup */
-       if (core_next_state < PWRDM_POWER_ON) {
+       if (per_next_state < PWRDM_POWER_ON ||
+                       core_next_state < PWRDM_POWER_ON) {
                prm_clear_mod_reg_bits(OMAP3430_EN_IO, WKUP_MOD, PM_WKEN);
                omap3_disable_io_chain();
        }
@@ -1090,14 +1096,6 @@ static int __init omap3_pm_init(void)
        omap3_idle_init();
 
        clkdm_add_wkdep(neon_clkdm, mpu_clkdm);
-       /*
-        * REVISIT: This wkdep is only necessary when GPIO2-6 are enabled for
-        * IO-pad wakeup.  Otherwise it will unnecessarily waste power
-        * waking up PER with every CORE wakeup - see
-        * http://marc.info/?l=linux-omap&m=121852150710062&w=2
-       */
-       clkdm_add_wkdep(per_clkdm, core_clkdm);
-
        if (omap_type() != OMAP2_DEVICE_TYPE_GP) {
                omap3_secure_ram_storage =
                        kmalloc(0x803F, GFP_KERNEL);