|
@@ -46,11 +46,23 @@ static inline void cpu_enter_lowpower(void)
|
|
|
void imx_cpu_die(unsigned int cpu)
|
|
|
{
|
|
|
cpu_enter_lowpower();
|
|
|
+ /*
|
|
|
+ * We use the cpu jumping argument register to sync with
|
|
|
+ * imx_cpu_kill() which is running on cpu0 and waiting for
|
|
|
+ * the register being cleared to kill the cpu.
|
|
|
+ */
|
|
|
+ imx_set_cpu_arg(cpu, ~0);
|
|
|
cpu_do_idle();
|
|
|
}
|
|
|
|
|
|
int imx_cpu_kill(unsigned int cpu)
|
|
|
{
|
|
|
+ unsigned long timeout = jiffies + msecs_to_jiffies(50);
|
|
|
+
|
|
|
+ while (imx_get_cpu_arg(cpu) == 0)
|
|
|
+ if (time_after(jiffies, timeout))
|
|
|
+ return 0;
|
|
|
imx_enable_cpu(cpu, false);
|
|
|
+ imx_set_cpu_arg(cpu, 0);
|
|
|
return 1;
|
|
|
}
|