summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStefan Agner <stefan.agner@toradex.com>2015-08-13 11:04:28 +0200
committerStefan Agner <stefan.agner@toradex.com>2015-08-13 11:04:28 +0200
commit9ea23a6a53311a6f93dc905a9c2c35c34646eaa5 (patch)
treecaf84e0fbb7360921c0df4f4259f8770d7618d29
parent9658f3e87a966320ddf5d8e6e156109d5272db9a (diff)
ARM: vf610: PM: flush cache before entering STOP mode
Flush caches before entering stop mode. This fixes a stack trace which have been observed every ~3rd time entering Vybrid's STOP mode (standby): [ 103.630698] Unable to handle kernel NULL pointer dereference at virtual address 00000000 [ 103.630698] pgd = 8e3cc000 [ 103.630698] [00000000] *pgd=8dae6831, *pte=00000000, *ppte=00000000 [ 103.630698] Internal error: Oops: 817 [#1] ARM [ 103.630698] Modules linked in: [ 103.630698] CPU: 0 PID: 164 Comm: sh Not tainted 4.1.5-00149-g9658f3e-dirty #391 [ 103.630698] Hardware name: Freescale Vybrid VF5xx/VF6xx (Device Tree) [ 103.630698] task: 8d8d2140 ti: 8d866000 task.ti: 8d866000 [ 103.630698] PC is at cpu_ca8_dcache_clean_area+0x1c/0x34 [ 103.630698] LR is at vf610_pm_enter+0x74/0x84 [ 103.630698] pc : [<8001d648>] lr : [<80020a0c>] psr: a00f0093 [ 103.630698] sp : 8d867dd8 ip : 8d867da8 fp : 8d867de4 [ 103.630698] r10: 00000000 r9 : 807a6ad2 r8 : 807a60d4 [ 103.630698] r7 : 807d8f8c r6 : 00000002 r5 : 807d8f8c r4 : 00000000 [ 103.630698] r3 : 8001d620 r2 : 00000000 r1 : 00000000 r0 : 00000000 [ 103.630698] Flags: NzCv IRQs off FIQs on Mode SVC_32 ISA ARM Segment user [ 103.630698] Control: 10c5387d Table: 8e3cc059 DAC: 00000015 [ 103.630698] Process sh (pid: 164, stack limit = 0x8d866208)
-rw-r--r--arch/arm/mach-imx/pm-vf610.c1
1 files changed, 1 insertions, 0 deletions
diff --git a/arch/arm/mach-imx/pm-vf610.c b/arch/arm/mach-imx/pm-vf610.c
index 4af521bec760..7192924e009f 100644
--- a/arch/arm/mach-imx/pm-vf610.c
+++ b/arch/arm/mach-imx/pm-vf610.c
@@ -366,6 +366,7 @@ static int vf610_pm_enter(suspend_state_t state)
switch (state) {
case PM_SUSPEND_STANDBY:
vf610_set_lpm(VF610_STOP);
+ flush_cache_all();
/* zzZZZzzz */
cpu_do_idle();