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/pm24xx.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/pm24xx.c')
-rw-r--r-- | arch/arm/mach-omap2/pm24xx.c | 16 |
1 files changed, 2 insertions, 14 deletions
diff --git a/arch/arm/mach-omap2/pm24xx.c b/arch/arm/mach-omap2/pm24xx.c index aaeea49b9bdd..aea7ced9a2ff 100644 --- a/arch/arm/mach-omap2/pm24xx.c +++ b/arch/arm/mach-omap2/pm24xx.c | |||
@@ -301,14 +301,8 @@ out: | |||
301 | 301 | ||
302 | static int omap2_pm_begin(suspend_state_t state) | 302 | static int omap2_pm_begin(suspend_state_t state) |
303 | { | 303 | { |
304 | suspend_state = state; | ||
305 | return 0; | ||
306 | } | ||
307 | |||
308 | static int omap2_pm_prepare(void) | ||
309 | { | ||
310 | /* We cannot sleep in idle until we have resumed */ | ||
311 | disable_hlt(); | 304 | disable_hlt(); |
305 | suspend_state = state; | ||
312 | return 0; | 306 | return 0; |
313 | } | 307 | } |
314 | 308 | ||
@@ -349,21 +343,15 @@ static int omap2_pm_enter(suspend_state_t state) | |||
349 | return ret; | 343 | return ret; |
350 | } | 344 | } |
351 | 345 | ||
352 | static void omap2_pm_finish(void) | ||
353 | { | ||
354 | enable_hlt(); | ||
355 | } | ||
356 | |||
357 | static void omap2_pm_end(void) | 346 | static void omap2_pm_end(void) |
358 | { | 347 | { |
359 | suspend_state = PM_SUSPEND_ON; | 348 | suspend_state = PM_SUSPEND_ON; |
349 | enable_hlt(); | ||
360 | } | 350 | } |
361 | 351 | ||
362 | static struct platform_suspend_ops omap_pm_ops = { | 352 | static struct platform_suspend_ops omap_pm_ops = { |
363 | .begin = omap2_pm_begin, | 353 | .begin = omap2_pm_begin, |
364 | .prepare = omap2_pm_prepare, | ||
365 | .enter = omap2_pm_enter, | 354 | .enter = omap2_pm_enter, |
366 | .finish = omap2_pm_finish, | ||
367 | .end = omap2_pm_end, | 355 | .end = omap2_pm_end, |
368 | .valid = suspend_valid_only_mem, | 356 | .valid = suspend_valid_only_mem, |
369 | }; | 357 | }; |