summaryrefslogtreecommitdiffstats
path: root/arch/arm/kernel/sleep.S
diff options
context:
space:
mode:
authorRussell King <rmk+kernel@arm.linux.org.uk>2011-06-13 16:58:34 +0200
committerRussell King <rmk+kernel@arm.linux.org.uk>2011-06-24 09:48:43 +0200
commite8856a8797e76e6883ae81f8f9ecbb231cc535df (patch)
treef256d1100f2458e01ca2680052466b24bbabe664 /arch/arm/kernel/sleep.S
parentARM: pm: move sa1100 to use proper suspend func arg0 (diff)
downloadlinux-e8856a8797e76e6883ae81f8f9ecbb231cc535df.tar.xz
linux-e8856a8797e76e6883ae81f8f9ecbb231cc535df.zip
ARM: pm: convert cpu_suspend() to a normal function
cpu_suspend() has a weird calling method which makes it only possible to call from assembly code: it returns with a modified stack pointer to finish the suspend, but on resume, it 'returns' via a provided pointer. We can make cpu_suspend() appear to be a normal function merely by swapping the resume pointer argument and the link register. Do so, and update all callers to take account of this more traditional behaviour. Acked-by: Frank Hofmann <frank.hofmann@tomtom.com> Tested-by: Kevin Hilman <khilman@ti.com> Acked-by: Jean Pihet <j-pihet@ti.com> Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
Diffstat (limited to 'arch/arm/kernel/sleep.S')
-rw-r--r--arch/arm/kernel/sleep.S10
1 files changed, 4 insertions, 6 deletions
diff --git a/arch/arm/kernel/sleep.S b/arch/arm/kernel/sleep.S
index b924bcc32dcd..e0626779fe92 100644
--- a/arch/arm/kernel/sleep.S
+++ b/arch/arm/kernel/sleep.S
@@ -11,13 +11,11 @@
* Save CPU state for a suspend
* r1 = v:p offset
* r2 = suspend function arg0
- * r3 = virtual return function
- * Note: sp is decremented to allocate space for CPU state on stack
- * r0-r3,ip,lr corrupted
+ * r3 = suspend function
+ * Note: does not return until system resumes
*/
ENTRY(cpu_suspend)
- stmfd sp!, {r3}
- stmfd sp!, {r4 - r11}
+ stmfd sp!, {r4 - r11, lr}
#ifdef MULTI_CPU
ldr r10, =processor
ldr r5, [r10, #CPU_SLEEP_SIZE] @ size of CPU sleep state
@@ -33,7 +31,7 @@ ENTRY(cpu_suspend)
stmfd sp!, {r1, r6, ip} @ save v:p, virt SP, phys resume fn
ldr r5, =sleep_save_sp
add r6, sp, r1 @ convert SP to phys
- stmfd sp!, {r2, lr} @ save suspend func arg and pointer
+ stmfd sp!, {r2, r3} @ save suspend func arg and pointer
#ifdef CONFIG_SMP
ALT_SMP(mrc p15, 0, lr, c0, c0, 5)
ALT_UP(mov lr, #0)