summaryrefslogtreecommitdiff
path: root/plat/fvp/fvp_pm.c
diff options
context:
space:
mode:
authorAchin Gupta <achin.gupta@arm.com>2013-11-12 16:40:00 +0000
committerDan Handley <dan.handley@arm.com>2013-12-05 12:28:50 +0000
commitb127cdb879aed2ced388af3cd9481e80c68f3e8c (patch)
treeceb879d87b15ea26d705d87f3a4fdf06e00cb6e5 /plat/fvp/fvp_pm.c
parent4a826ddad8ea0fc5ce09709f534efb72cc33611c (diff)
clear wakeup enable bit upon resuming from suspend
The FVP specific code that gets called after a cpu has been physically powered on after having been turned off or suspended earlier does not clear the PWRC.PWKUPR.WEN bit. Not doing so causes problems if: a cpu is suspended, woken from suspend, powered down through a cpu_off call & receives a spurious interrupt. Since the WEN bit is not cleared after the cpu woke up from suspend, the spurious wakeup will power the cpu on. Since the cpu_off call clears the jump address in the mailbox this spurious wakeup will cause the cpu to crash. This patch fixes this issue by clearing the WEN bit whenever a cpu is powered up. Change-Id: Ic91f5dffe1ed01d76bc7fc807acf0ecd3e38ce5b
Diffstat (limited to 'plat/fvp/fvp_pm.c')
-rw-r--r--plat/fvp/fvp_pm.c8
1 files changed, 7 insertions, 1 deletions
diff --git a/plat/fvp/fvp_pm.c b/plat/fvp/fvp_pm.c
index fd92526d..658a2859 100644
--- a/plat/fvp/fvp_pm.c
+++ b/plat/fvp/fvp_pm.c
@@ -251,7 +251,7 @@ int fvp_affinst_suspend(unsigned long mpidr,
* Program the power controller to power this
* cpu off and enable wakeup interrupts.
*/
- fvp_pwrc_write_pwkupr(mpidr);
+ fvp_pwrc_set_wen(mpidr);
fvp_pwrc_write_ppoffr(mpidr);
}
break;
@@ -309,6 +309,12 @@ int fvp_affinst_on_finish(unsigned long mpidr,
write_cpuectlr(ectlr);
}
+ /*
+ * Clear PWKUPR.WEN bit to ensure interrupts do not interfere
+ * with a cpu power down unless the bit is set again
+ */
+ fvp_pwrc_clr_wen(mpidr);
+
/* Zero the jump address in the mailbox for this cpu */
fvp_mboxes = (mailbox *) (TZDRAM_BASE + MBOX_OFF);
linear_id = platform_get_core_pos(mpidr);