summaryrefslogtreecommitdiff
path: root/arch/arm/mach-vexpress/tc2_pm.c
diff options
context:
space:
mode:
authorLorenzo Pieralisi <lorenzo.pieralisi@arm.com>2013-07-24 12:05:01 +0100
committerOlof Johansson <olof@lixom.net>2013-08-28 11:28:47 -0700
commit9ee2ee0f0576fc070b02e5d31a2c4d09c39f439a (patch)
treeb5f5c9439d616d91f9ccb65f4527bc28cfe75b8d /arch/arm/mach-vexpress/tc2_pm.c
parent10d9eb8a17cfb697967928bde06f3e7e530b03ac (diff)
ARM: vexpress: tc2: disable GIC CPU IF in tc2_pm_suspend
To prevent cores from exiting wfi when they are about to be shut down the GIC CPU IF must be disabled so that the GIC CPU IF IRQ output line is not asserted to the cores. wfi completion must be prevented since, in absence of coordinating HW logic, if the power controller receives a standbywfi signal but in the meantime the processor restarts executing owing to a pending IRQ, the core might be reset when running in a non-quiescent state (eg with pending load/store transactions) Raw GIC distributor IRQ signals are routed to the power controller, that is capable of taking core out of reset on pending IRQs even if their GIC CPU IF is disabled, thus keeping the normal wfi behaviour. GIC CPU IF is restored upon CPU wake-up by the respective MCPM API consumers (ie CPU idle driver and suspend to RAM thread). Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com> Signed-off-by: Olof Johansson <olof@lixom.net>
Diffstat (limited to 'arch/arm/mach-vexpress/tc2_pm.c')
-rw-r--r--arch/arm/mach-vexpress/tc2_pm.c2
1 files changed, 2 insertions, 0 deletions
diff --git a/arch/arm/mach-vexpress/tc2_pm.c b/arch/arm/mach-vexpress/tc2_pm.c
index ddd97dd4e9b7..68adb40d2c71 100644
--- a/arch/arm/mach-vexpress/tc2_pm.c
+++ b/arch/arm/mach-vexpress/tc2_pm.c
@@ -18,6 +18,7 @@
#include <linux/of_address.h>
#include <linux/spinlock.h>
#include <linux/errno.h>
+#include <linux/irqchip/arm-gic.h>
#include <asm/mcpm.h>
#include <asm/proc-fns.h>
@@ -222,6 +223,7 @@ static void tc2_pm_suspend(u64 residency)
cpu = MPIDR_AFFINITY_LEVEL(mpidr, 0);
cluster = MPIDR_AFFINITY_LEVEL(mpidr, 1);
ve_spc_set_resume_addr(cluster, cpu, virt_to_phys(mcpm_entry_point));
+ gic_cpu_if_down();
tc2_pm_down(residency);
}