summaryrefslogtreecommitdiff
path: root/arch/arm/mach-zynq/platsmp.c
diff options
context:
space:
mode:
authorSoren Brinkmann <soren.brinkmann@xilinx.com>2014-09-03 01:19:12 +0400
committerMichal Simek <michal.simek@xilinx.com>2014-09-16 14:55:09 +0400
commit50c7960a4517d6c93226351cd8c43c86f104c919 (patch)
tree354342e21f9dfc23fe2d0412f4df7dc3301e928e /arch/arm/mach-zynq/platsmp.c
parent18aebf116b494101841f109f07e0d6a0aad9a46e (diff)
downloadlinux-50c7960a4517d6c93226351cd8c43c86f104c919.tar.xz
ARM: zynq: Synchronise zynq_cpu_die/kill
Avoid races and add synchronisation between the arch specific kill and die routines. The same synchronisation issue was fixed on IMX platform by this commit: "ARM: imx: fix sync issue between imx_cpu_die and imx_cpu_kill" (sha1: 2f3edfd7e27ad4206acbc2ae99c9df5f46353024) Signed-off-by: Soren Brinkmann <soren.brinkmann@xilinx.com> Signed-off-by: Michal Simek <michal.simek@xilinx.com>
Diffstat (limited to 'arch/arm/mach-zynq/platsmp.c')
-rw-r--r--arch/arm/mach-zynq/platsmp.c6
1 files changed, 6 insertions, 0 deletions
diff --git a/arch/arm/mach-zynq/platsmp.c b/arch/arm/mach-zynq/platsmp.c
index 6c7843108c7f..06415eeba7e6 100644
--- a/arch/arm/mach-zynq/platsmp.c
+++ b/arch/arm/mach-zynq/platsmp.c
@@ -127,6 +127,12 @@ static void zynq_secondary_init(unsigned int cpu)
#ifdef CONFIG_HOTPLUG_CPU
static int zynq_cpu_kill(unsigned cpu)
{
+ unsigned long timeout = jiffies + msecs_to_jiffies(50);
+
+ while (zynq_slcr_cpu_state_read(cpu))
+ if (time_after(jiffies, timeout))
+ return 0;
+
zynq_slcr_cpu_stop(cpu);
return 1;
}