diff options
Diffstat (limited to 'arch/arm/mach-omap2/pm44xx.c')
-rw-r--r-- | arch/arm/mach-omap2/pm44xx.c | 29 |
1 files changed, 21 insertions, 8 deletions
diff --git a/arch/arm/mach-omap2/pm44xx.c b/arch/arm/mach-omap2/pm44xx.c index 104ca5e..130bc6b 100644 --- a/arch/arm/mach-omap2/pm44xx.c +++ b/arch/arm/mach-omap2/pm44xx.c @@ -85,7 +85,8 @@ void omap4_trigger_ioctrl(void) /* This is a common low power function called from suspend and * cpuidle */ -void omap4_enter_sleep(unsigned int cpu, unsigned int power_state) + +void omap4_enter_sleep(unsigned int cpu, unsigned int power_state, bool suspend) { int cpu0_next_state = PWRDM_POWER_ON; int per_next_state = PWRDM_POWER_ON; @@ -107,7 +108,8 @@ void omap4_enter_sleep(unsigned int cpu, unsigned int power_state) mpu_next_state = PWRDM_POWER_INACTIVE; pwrdm_set_next_pwrst(mpu_pwrdm, mpu_next_state); } else { - omap_sr_disable_reset_volt(mpu_voltdm); + if (!suspend) + omap_sr_disable_reset_volt(mpu_voltdm); omap_vc_set_auto_trans(mpu_voltdm, OMAP_VC_CHANNEL_AUTO_TRANSITION_RETENTION); } @@ -125,8 +127,10 @@ void omap4_enter_sleep(unsigned int cpu, unsigned int power_state) core_next_state = PWRDM_POWER_ON; pwrdm_set_next_pwrst(core_pwrdm, core_next_state); } else { - omap_sr_disable_reset_volt(iva_voltdm); - omap_sr_disable_reset_volt(core_voltdm); + if (!suspend) { + omap_sr_disable_reset_volt(iva_voltdm); + omap_sr_disable_reset_volt(core_voltdm); + } omap_vc_set_auto_trans(core_voltdm, OMAP_VC_CHANNEL_AUTO_TRANSITION_RETENTION); omap_vc_set_auto_trans(iva_voltdm, @@ -137,6 +141,9 @@ void omap4_enter_sleep(unsigned int cpu, unsigned int power_state) } } + if (suspend && cpu_is_omap44xx()) + omap4_pm_suspend_save_regs(); + omap4_enter_lowpower(cpu, power_state); if (core_next_state < PWRDM_POWER_ON) { @@ -146,14 +153,17 @@ void omap4_enter_sleep(unsigned int cpu, unsigned int power_state) omap_vc_set_auto_trans(iva_voltdm, OMAP_VC_CHANNEL_AUTO_TRANSITION_DISABLE); omap2_gpio_resume_after_idle(); - omap_sr_enable(iva_voltdm); - omap_sr_enable(core_voltdm); + if (!suspend) { + omap_sr_enable(iva_voltdm); + omap_sr_enable(core_voltdm); + } } if (mpu_next_state < PWRDM_POWER_INACTIVE) { omap_vc_set_auto_trans(mpu_voltdm, OMAP_VC_CHANNEL_AUTO_TRANSITION_DISABLE); - omap_sr_enable(mpu_voltdm); + if (!suspend) + omap_sr_enable(mpu_voltdm); } return; @@ -240,7 +250,7 @@ static int omap4_pm_suspend(void) * domain CSWR is not supported by hardware. * More details can be found in OMAP4430 TRM section 4.3.4.2. */ - omap4_enter_sleep(0, PWRDM_POWER_OFF); + omap4_enter_sleep(0, PWRDM_POWER_OFF, true); omap4_print_wakeirq(); /* Disable wake-up irq's */ @@ -532,6 +542,9 @@ static int __init omap4_pm_init(void) core_pwrdm = pwrdm_lookup("core_pwrdm"); per_pwrdm = pwrdm_lookup("l4per_pwrdm"); + /* Enable wakeup for PRCM IRQ for system wide suspend */ + enable_irq_wake(OMAP44XX_IRQ_PRCM); + omap4_idle_init(); err2: |