Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e8856a87 authored by Russell King's avatar Russell King
Browse files

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: default avatarFrank Hofmann <frank.hofmann@tomtom.com>
Tested-by: default avatarKevin Hilman <khilman@ti.com>
Acked-by: default avatarJean Pihet <j-pihet@ti.com>
Signed-off-by: default avatarRussell King <rmk+kernel@arm.linux.org.uk>
parent dbc12516
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -106,6 +106,8 @@ extern void __show_regs(struct pt_regs *);

extern int cpu_architecture(void);
extern void cpu_init(void);
extern void cpu_suspend(int, long, unsigned long, void (*)(unsigned long));
extern void cpu_resume(void);

void arm_machine_restart(char mode, const char *cmd);
extern void (*arm_pm_restart)(char str, const char *cmd);
+4 −6
Original line number Diff line number Diff line
@@ -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)
+3 −4
Original line number Diff line number Diff line
@@ -42,16 +42,15 @@
ENTRY(s3c_cpu_save)

	stmfd	sp!, { r3 - r12, lr }
	ldr	r3, =resume_with_mmu
	adr	r3, BSYM(exynos4_finish_suspend)
	bl	cpu_suspend
	ldmfd	sp!, { r3 - r12, pc }

exynos4_finish_suspend:
	ldr	r0, =pm_cpu_sleep
	ldr	r0, [ r0 ]
	mov	pc, r0

resume_with_mmu:
	ldmfd	sp!, { r3 - r12, pc }

	.ltorg

	/*
+10 −3
Original line number Diff line number Diff line
@@ -35,9 +35,11 @@ ENTRY(pxa3xx_cpu_suspend)
#endif
	stmfd	sp!, {r2 - r12, lr}	@ save registers on stack
	mov	r1, r0
	ldr	r3, =pxa_cpu_resume	@ resume function
	adr	r3, BSYM(pxa3xx_finish_suspend)
	bl	cpu_suspend
	b	pxa_cpu_resume

pxa3xx_finish_suspend:
	mov	r0, #0x06		@ S2D3C4 mode
	mcr	p14, 0, r0, c7, c0, 0	@ enter sleep

@@ -60,9 +62,11 @@ ENTRY(pxa27x_cpu_suspend)
#endif
	stmfd	sp!, {r2 - r12, lr}		@ save registers on stack
	mov	r2, r0				@ save sleep mode
	ldr	r3, =pxa_cpu_resume		@ resume function
	adr	r3, BSYM(pxa27x_finish_suspend)
	bl	cpu_suspend
	b	pxa_cpu_resume

pxa27x_finish_suspend:
	@ Put the processor to sleep
	@ (also workaround for sighting 28071)

@@ -110,8 +114,11 @@ ENTRY(pxa27x_cpu_suspend)
ENTRY(pxa25x_cpu_suspend)
	stmfd	sp!, {r2 - r12, lr}		@ save registers on stack
	mov	r2, r0				@ save sleep mode
	ldr	r3, =pxa_cpu_resume		@ resume function
	adr	r3, BSYM(pxa25x_finish_suspend)
	bl	cpu_suspend
	b	pxa_cpu_resume

pxa25x_finish_suspend:
	@ prepare value for sleep mode
	mov	r1, r0				@ sleep mode

+3 −6
Original line number Diff line number Diff line
@@ -36,18 +36,15 @@

ENTRY(s3c_cpu_save)
	stmfd	sp!, { r4 - r12, lr }
	ldr	r3, =resume_with_mmu
	adr	r3, BSYM(s3c64xx_finish_suspend)
	bl	cpu_suspend
	ldmfd	sp!, { r4 - r12, pc }

s3c64xx_finish_suspend:
	@@ call final suspend code
	ldr	r0, =pm_cpu_sleep
	ldr	pc, [r0]
	
	@@ return to the caller, after the MMU is turned on.
	@@ restore the last bits of the stack and return.
resume_with_mmu:
	ldmfd	sp!, { r4 - r12, pc }	@ return, from sp from s3c_cpu_save

	/* Sleep magic, the word before the resume entry point so that the
	 * bootloader can check for a resumeable image. */

Loading