diff options
author | eric miao <eric.miao@marvell.com> | 2008-01-14 02:50:54 -0500 |
---|---|---|
committer | Russell King <rmk+kernel@arm.linux.org.uk> | 2008-01-26 10:07:57 -0500 |
commit | 512f03fdae58b96568bac1beee4d3d3b34d4ead4 (patch) | |
tree | d868586a688e5b34c964f0eee3e191e2a5ee3291 | |
parent | dd01b2fc79a567ae03d0c96ddf61eb4de729d36d (diff) |
[ARM] pxa: skip registers saving/restoring if entering standby mode
registers are retained during standby mode, thus it's not necessary
to save/restore and checksum
Signed-off-by: eric miao <eric.miao@marvell.com>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
-rw-r--r-- | arch/arm/mach-pxa/pm.c | 33 |
1 files changed, 18 insertions, 15 deletions
diff --git a/arch/arm/mach-pxa/pm.c b/arch/arm/mach-pxa/pm.c index a941c71c7d06..039194cbe477 100644 --- a/arch/arm/mach-pxa/pm.c +++ b/arch/arm/mach-pxa/pm.c | |||
@@ -38,34 +38,37 @@ int pxa_pm_enter(suspend_state_t state) | |||
38 | iwmmxt_task_disable(NULL); | 38 | iwmmxt_task_disable(NULL); |
39 | #endif | 39 | #endif |
40 | 40 | ||
41 | pxa_cpu_pm_fns->save(sleep_save); | 41 | /* skip registers saving for standby */ |
42 | if (state != PM_SUSPEND_STANDBY) { | ||
43 | pxa_cpu_pm_fns->save(sleep_save); | ||
44 | /* before sleeping, calculate and save a checksum */ | ||
45 | for (i = 0; i < pxa_cpu_pm_fns->save_size - 1; i++) | ||
46 | sleep_save_checksum += sleep_save[i]; | ||
47 | } | ||
42 | 48 | ||
43 | /* Clear sleep reset status */ | 49 | /* Clear sleep reset status */ |
44 | RCSR = RCSR_SMR; | 50 | RCSR = RCSR_SMR; |
45 | 51 | ||
46 | /* before sleeping, calculate and save a checksum */ | ||
47 | for (i = 0; i < pxa_cpu_pm_fns->save_size - 1; i++) | ||
48 | sleep_save_checksum += sleep_save[i]; | ||
49 | |||
50 | /* *** go zzz *** */ | 52 | /* *** go zzz *** */ |
51 | pxa_cpu_pm_fns->enter(state); | 53 | pxa_cpu_pm_fns->enter(state); |
52 | cpu_init(); | 54 | cpu_init(); |
53 | 55 | ||
54 | /* after sleeping, validate the checksum */ | 56 | if (state != PM_SUSPEND_STANDBY) { |
55 | for (i = 0; i < pxa_cpu_pm_fns->save_size - 1; i++) | 57 | /* after sleeping, validate the checksum */ |
56 | checksum += sleep_save[i]; | 58 | for (i = 0; i < pxa_cpu_pm_fns->save_size - 1; i++) |
59 | checksum += sleep_save[i]; | ||
57 | 60 | ||
58 | /* if invalid, display message and wait for a hardware reset */ | 61 | /* if invalid, display message and wait for a hardware reset */ |
59 | if (checksum != sleep_save_checksum) { | 62 | if (checksum != sleep_save_checksum) { |
60 | #ifdef CONFIG_ARCH_LUBBOCK | 63 | #ifdef CONFIG_ARCH_LUBBOCK |
61 | LUB_HEXLED = 0xbadbadc5; | 64 | LUB_HEXLED = 0xbadbadc5; |
62 | #endif | 65 | #endif |
63 | while (1) | 66 | while (1) |
64 | pxa_cpu_pm_fns->enter(state); | 67 | pxa_cpu_pm_fns->enter(state); |
68 | } | ||
69 | pxa_cpu_pm_fns->restore(sleep_save); | ||
65 | } | 70 | } |
66 | 71 | ||
67 | pxa_cpu_pm_fns->restore(sleep_save); | ||
68 | |||
69 | pr_debug("*** made it back from resume\n"); | 72 | pr_debug("*** made it back from resume\n"); |
70 | 73 | ||
71 | return 0; | 74 | return 0; |