diff options
Diffstat (limited to 'arch/arm/mach-imx/hotplug.c')
| -rw-r--r-- | arch/arm/mach-imx/hotplug.c | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/arch/arm/mach-imx/hotplug.c b/arch/arm/mach-imx/hotplug.c index 7bc5fe15dda2..361a253e2b63 100644 --- a/arch/arm/mach-imx/hotplug.c +++ b/arch/arm/mach-imx/hotplug.c | |||
| @@ -46,11 +46,23 @@ static inline void cpu_enter_lowpower(void) | |||
| 46 | void imx_cpu_die(unsigned int cpu) | 46 | void imx_cpu_die(unsigned int cpu) |
| 47 | { | 47 | { |
| 48 | cpu_enter_lowpower(); | 48 | cpu_enter_lowpower(); |
| 49 | /* | ||
| 50 | * We use the cpu jumping argument register to sync with | ||
| 51 | * imx_cpu_kill() which is running on cpu0 and waiting for | ||
| 52 | * the register being cleared to kill the cpu. | ||
| 53 | */ | ||
| 54 | imx_set_cpu_arg(cpu, ~0); | ||
| 49 | cpu_do_idle(); | 55 | cpu_do_idle(); |
| 50 | } | 56 | } |
| 51 | 57 | ||
| 52 | int imx_cpu_kill(unsigned int cpu) | 58 | int imx_cpu_kill(unsigned int cpu) |
| 53 | { | 59 | { |
| 60 | unsigned long timeout = jiffies + msecs_to_jiffies(50); | ||
| 61 | |||
| 62 | while (imx_get_cpu_arg(cpu) == 0) | ||
| 63 | if (time_after(jiffies, timeout)) | ||
| 64 | return 0; | ||
| 54 | imx_enable_cpu(cpu, false); | 65 | imx_enable_cpu(cpu, false); |
| 66 | imx_set_cpu_arg(cpu, 0); | ||
| 55 | return 1; | 67 | return 1; |
| 56 | } | 68 | } |
