diff options
author | Jean Pihet <j-pihet@ti.com> | 2010-12-09 12:39:58 -0500 |
---|---|---|
committer | Kevin Hilman <khilman@deeprootsystems.com> | 2010-12-21 17:29:34 -0500 |
commit | c166381d4013fd32512f124c237f4213ae9888e9 (patch) | |
tree | af6328f75dfe7099f7b92acf2cc6ef8a2edeec43 /arch/arm/mach-omap2/pm34xx.c | |
parent | 90a8a73c06cc32b609a880d48449d7083327e11a (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.c | 15 |
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 |
532 | static int omap3_pm_prepare(void) | ||
533 | { | ||
534 | disable_hlt(); | ||
535 | return 0; | ||
536 | } | ||
537 | |||
538 | static int omap3_pm_suspend(void) | 532 | static 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 | ||
600 | static 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 */ |
606 | static int omap3_pm_begin(suspend_state_t state) | 595 | static 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 | ||
620 | static struct platform_suspend_ops omap_pm_ops = { | 611 | static 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 */ |