aboutsummaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
authorTony Lindgren <tony@atomide.com>2010-01-19 17:01:33 +0100
committerRussell King <rmk+kernel@arm.linux.org.uk>2010-01-19 20:23:17 +0000
commit1f667c690be3ab71036c436d8391105eee23f65b (patch)
tree6ae1c21bc08853412c4c7b384a3485da9c21ec70 /arch
parentad3e6c0b1fad31282a8384903ed811671d840a9c (diff)
downloadkernel_samsung_smdk4412-1f667c690be3ab71036c436d8391105eee23f65b.zip
kernel_samsung_smdk4412-1f667c690be3ab71036c436d8391105eee23f65b.tar.gz
kernel_samsung_smdk4412-1f667c690be3ab71036c436d8391105eee23f65b.tar.bz2
ARM: 5886/1: arm: Fix cpu_proc_fin() for proc-v7.S and make kexec work
The comments in arm_machine_restart() suggest that cpu_proc_fin() will clean and disable cache and turn off interrupts. This does not seem to be implemented for proc-v7.S, implement it the same way as for proc-v6.S. This also makes kexec work for v7. Note that a related TLB and branch traget flush patch is also needed to avoid kexec "crc error". Note that there are still some issues that seem to be related to L2 cache being on and causing occasional uncompress "crc error" with kexec. Anyways, this gets kexec mostly working on V7 for now. Signed-off-by: Tony Lindgren <tony@atomide.com> Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
Diffstat (limited to 'arch')
-rw-r--r--arch/arm/mm/proc-v7.S9
1 files changed, 8 insertions, 1 deletions
diff --git a/arch/arm/mm/proc-v7.S b/arch/arm/mm/proc-v7.S
index 3a28521..d2a8074 100644
--- a/arch/arm/mm/proc-v7.S
+++ b/arch/arm/mm/proc-v7.S
@@ -45,7 +45,14 @@ ENTRY(cpu_v7_proc_init)
ENDPROC(cpu_v7_proc_init)
ENTRY(cpu_v7_proc_fin)
- mov pc, lr
+ stmfd sp!, {lr}
+ cpsid if @ disable interrupts
+ bl v7_flush_kern_cache_all
+ mrc p15, 0, r0, c1, c0, 0 @ ctrl register
+ bic r0, r0, #0x1000 @ ...i............
+ bic r0, r0, #0x0006 @ .............ca.
+ mcr p15, 0, r0, c1, c0, 0 @ disable caches
+ ldmfd sp!, {pc}
ENDPROC(cpu_v7_proc_fin)
/*