aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/mach-omap2/pm44xx.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/arm/mach-omap2/pm44xx.c')
-rw-r--r--arch/arm/mach-omap2/pm44xx.c29
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: