diff options
Diffstat (limited to 'arch/arm/mach-omap2/omap-hotplug.c')
| -rw-r--r-- | arch/arm/mach-omap2/omap-hotplug.c | 59 |
1 files changed, 23 insertions, 36 deletions
diff --git a/arch/arm/mach-omap2/omap-hotplug.c b/arch/arm/mach-omap2/omap-hotplug.c index 6cee456ca54..971791fe9a3 100644 --- a/arch/arm/mach-omap2/omap-hotplug.c +++ b/arch/arm/mach-omap2/omap-hotplug.c @@ -17,49 +17,45 @@ #include <linux/kernel.h> #include <linux/errno.h> #include <linux/smp.h> -#include <linux/completion.h> +#include <linux/io.h> -#include <asm/cacheflush.h> -#include <mach/omap4-common.h> - -static DECLARE_COMPLETION(cpu_killed); - -int platform_cpu_kill(unsigned int cpu) -{ - return wait_for_completion_timeout(&cpu_killed, 5000); -} +#include "omap-wakeupgen.h" +#include "common.h" +#include "powerdomain.h" /* * platform-specific code to shutdown a CPU * Called with IRQs disabled */ -void platform_cpu_die(unsigned int cpu) +void __ref omap4_cpu_die(unsigned int cpu) { - unsigned int this_cpu = hard_smp_processor_id(); - - if (cpu != this_cpu) { - pr_crit("platform_cpu_die running on %u, should be %u\n", - this_cpu, cpu); - BUG(); - } - pr_notice("CPU%u: shutdown\n", cpu); - complete(&cpu_killed); - flush_cache_all(); - dsb(); + unsigned int boot_cpu = 0; + void __iomem *base = omap_get_wakeupgen_base(); /* * we're ready for shutdown now, so do it */ - if (omap_modify_auxcoreboot0(0x0, 0x200) != 0x0) - printk(KERN_CRIT "Secure clear status failed\n"); + if (omap_secure_apis_support()) { + if (omap_modify_auxcoreboot0(0x0, 0x200) != 0x0) + pr_err("Secure clear status failed\n"); + } else { + writel_relaxed(0, base + OMAP_AUX_CORE_BOOT_0); + } + for (;;) { /* - * Execute WFI + * Enter into low power state */ - do_wfi(); + omap4_hotplug_cpu(cpu, PWRDM_POWER_OFF); + + if (omap_secure_apis_support()) + boot_cpu = omap_read_auxcoreboot0(); + else + boot_cpu = + readl_relaxed(base + OMAP_AUX_CORE_BOOT_0) >> 5; - if (omap_read_auxcoreboot0() == cpu) { + if (boot_cpu == smp_processor_id()) { /* * OK, proper wakeup, we're done */ @@ -68,12 +64,3 @@ void platform_cpu_die(unsigned int cpu) pr_debug("CPU%u: spurious wakeup call\n", cpu); } } - -int platform_cpu_disable(unsigned int cpu) -{ - /* - * we don't allow CPU 0 to be shutdown (it is still too special - * e.g. clock tick interrupts) - */ - return cpu == 0 ? -EPERM : 0; -} |
