From: Jean Pihet <j-pihet@xxxxxx> Some bad interaction between the idle and the suspend paths has been noticed: the idle code is called during the suspend enter and exit sequences. This could cause corruption or lock-up of resources. The solution is to move the calls to disable_hlt at the very beginning of the suspend sequence (ex. in omap3_pm_begin instead of omap3_pm_prepare), and the call to enable_hlt at the very end of the suspend sequence (ex. in omap3_pm_end instead of omap3_pm_finish). Tested with RET and OFF on Beagle and OMAP3EVM. Signed-off-by: Jean Pihet <j-pihet@xxxxxx> Cc: Kevin Hilman <khilman@xxxxxxxxxxxxxxxxxxx> --- v1: support for OMAP3 only. Tested on board. v2: Added support for OMAP2 and OMAP4. Compile tested only for OMAP2 and OMAP4. Tested on board for OMAP3. arch/arm/mach-omap2/pm24xx.c | 16 ++++++++++++++-- arch/arm/mach-omap2/pm34xx.c | 4 ++-- arch/arm/mach-omap2/pm44xx.c | 4 ++-- 3 files changed, 18 insertions(+), 6 deletions(-) diff --git a/arch/arm/mach-omap2/pm24xx.c b/arch/arm/mach-omap2/pm24xx.c index c85923e..3820179 100644 --- a/arch/arm/mach-omap2/pm24xx.c +++ b/arch/arm/mach-omap2/pm24xx.c @@ -286,8 +286,6 @@ out: static int omap2_pm_prepare(void) { - /* We cannot sleep in idle until we have resumed */ - disable_hlt(); return 0; } @@ -330,10 +328,24 @@ static int omap2_pm_enter(suspend_state_t state) static void omap2_pm_finish(void) { +} + +static int omap2_pm_begin(suspend_state_t state) +{ + /* We cannot sleep in idle until we have resumed */ + disable_hlt(); + return 0; +} + +static void omap2_pm_end(void) +{ enable_hlt(); + return; } static struct platform_suspend_ops omap_pm_ops = { + .begin = omap2_pm_begin, + .end = omap2_pm_end, .prepare = omap2_pm_prepare, .enter = omap2_pm_enter, .finish = omap2_pm_finish, diff --git a/arch/arm/mach-omap2/pm34xx.c b/arch/arm/mach-omap2/pm34xx.c index 0ec8a04..ec80d38 100644 --- a/arch/arm/mach-omap2/pm34xx.c +++ b/arch/arm/mach-omap2/pm34xx.c @@ -518,7 +518,6 @@ static suspend_state_t suspend_state; static int omap3_pm_prepare(void) { - disable_hlt(); return 0; } @@ -586,12 +585,12 @@ static int omap3_pm_enter(suspend_state_t unused) static void omap3_pm_finish(void) { - enable_hlt(); } /* Hooks to enable / disable UART interrupts during suspend */ static int omap3_pm_begin(suspend_state_t state) { + disable_hlt(); suspend_state = state; omap_uart_enable_irqs(0); return 0; @@ -601,6 +600,7 @@ static void omap3_pm_end(void) { suspend_state = PM_SUSPEND_ON; omap_uart_enable_irqs(1); + enable_hlt(); return; } diff --git a/arch/arm/mach-omap2/pm44xx.c b/arch/arm/mach-omap2/pm44xx.c index 54544b4..f4c4fab 100644 --- a/arch/arm/mach-omap2/pm44xx.c +++ b/arch/arm/mach-omap2/pm44xx.c @@ -33,7 +33,6 @@ static LIST_HEAD(pwrst_list); #ifdef CONFIG_SUSPEND static int omap4_pm_prepare(void) { - disable_hlt(); return 0; } @@ -61,17 +60,18 @@ static int omap4_pm_enter(suspend_state_t suspend_state) static void omap4_pm_finish(void) { - enable_hlt(); return; } static int omap4_pm_begin(suspend_state_t state) { + disable_hlt(); return 0; } static void omap4_pm_end(void) { + enable_hlt(); return; } -- 1.7.1 -- To unsubscribe from this list: send the line "unsubscribe linux-omap" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html