aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/mach-omap2/pm34xx.c
diff options
context:
space:
mode:
authorJean Pihet <j-pihet@ti.com>2010-12-09 12:39:58 -0500
committerKevin Hilman <khilman@deeprootsystems.com>2010-12-21 17:29:34 -0500
commitc166381d4013fd32512f124c237f4213ae9888e9 (patch)
treeaf6328f75dfe7099f7b92acf2cc6ef8a2edeec43 /arch/arm/mach-omap2/pm34xx.c
parent90a8a73c06cc32b609a880d48449d7083327e11a (diff)
OMAP2+: disable idle early in the suspend sequence
Some bad interaction between the idle and the suspend paths has been identified: 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@ti.com> Cc: Kevin Hilman <khilman@deeprootsystems.com> Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
Diffstat (limited to 'arch/arm/mach-omap2/pm34xx.c')
-rw-r--r--arch/arm/mach-omap2/pm34xx.c15
1 files changed, 2 insertions, 13 deletions
diff --git a/arch/arm/mach-omap2/pm34xx.c b/arch/arm/mach-omap2/pm34xx.c
index 648b8c50d024..5bf344a3fcf5 100644
--- a/arch/arm/mach-omap2/pm34xx.c
+++ b/arch/arm/mach-omap2/pm34xx.c
@@ -529,12 +529,6 @@ out:
529} 529}
530 530
531#ifdef CONFIG_SUSPEND 531#ifdef CONFIG_SUSPEND
532static int omap3_pm_prepare(void)
533{
534 disable_hlt();
535 return 0;
536}
537
538static int omap3_pm_suspend(void) 532static int omap3_pm_suspend(void)
539{ 533{
540 struct power_state *pwrst; 534 struct power_state *pwrst;
@@ -597,14 +591,10 @@ static int omap3_pm_enter(suspend_state_t unused)
597 return ret; 591 return ret;
598} 592}
599 593
600static void omap3_pm_finish(void)
601{
602 enable_hlt();
603}
604
605/* Hooks to enable / disable UART interrupts during suspend */ 594/* Hooks to enable / disable UART interrupts during suspend */
606static int omap3_pm_begin(suspend_state_t state) 595static int omap3_pm_begin(suspend_state_t state)
607{ 596{
597 disable_hlt();
608 suspend_state = state; 598 suspend_state = state;
609 omap_uart_enable_irqs(0); 599 omap_uart_enable_irqs(0);
610 return 0; 600 return 0;
@@ -614,15 +604,14 @@ static void omap3_pm_end(void)
614{ 604{
615 suspend_state = PM_SUSPEND_ON; 605 suspend_state = PM_SUSPEND_ON;
616 omap_uart_enable_irqs(1); 606 omap_uart_enable_irqs(1);
607 enable_hlt();
617 return; 608 return;
618} 609}
619 610
620static struct platform_suspend_ops omap_pm_ops = { 611static struct platform_suspend_ops omap_pm_ops = {
621 .begin = omap3_pm_begin, 612 .begin = omap3_pm_begin,
622 .end = omap3_pm_end, 613 .end = omap3_pm_end,
623 .prepare = omap3_pm_prepare,
624 .enter = omap3_pm_enter, 614 .enter = omap3_pm_enter,
625 .finish = omap3_pm_finish,
626 .valid = suspend_valid_only_mem, 615 .valid = suspend_valid_only_mem,
627}; 616};
628#endif /* CONFIG_SUSPEND */ 617#endif /* CONFIG_SUSPEND */