xref: /linux/arch/arm/mach-omap2/omap-hotplug.c (revision a4eb44a6435d6d8f9e642407a4a06f65eb90ca04)
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * OMAP4 SMP cpu-hotplug support
4  *
5  * Copyright (C) 2010 Texas Instruments, Inc.
6  * Author:
7  *      Santosh Shilimkar <santosh.shilimkar@ti.com>
8  *
9  * Platform file needed for the OMAP4 SMP. This file is based on arm
10  * realview smp platform.
11  * Copyright (c) 2002 ARM Limited.
12  */
13 
14 #include <linux/kernel.h>
15 #include <linux/errno.h>
16 #include <linux/smp.h>
17 #include <linux/io.h>
18 
19 #include "omap-wakeupgen.h"
20 #include "common.h"
21 #include "powerdomain.h"
22 
23 /*
24  * platform-specific code to shutdown a CPU
25  * Called with IRQs disabled
26  */
27 void omap4_cpu_die(unsigned int cpu)
28 {
29 	unsigned int boot_cpu = 0;
30 	void __iomem *base = omap_get_wakeupgen_base();
31 
32 	/*
33 	 * we're ready for shutdown now, so do it
34 	 */
35 	if (omap_secure_apis_support()) {
36 		if (omap_modify_auxcoreboot0(0x0, 0x200) != 0x0)
37 			pr_err("Secure clear status failed\n");
38 	} else {
39 		writel_relaxed(0, base + OMAP_AUX_CORE_BOOT_0);
40 	}
41 
42 
43 	for (;;) {
44 		/*
45 		 * Enter into low power state
46 		 */
47 		omap4_hotplug_cpu(cpu, PWRDM_POWER_OFF);
48 
49 		if (omap_secure_apis_support())
50 			boot_cpu = omap_read_auxcoreboot0() >> 9;
51 		else
52 			boot_cpu =
53 				readl_relaxed(base + OMAP_AUX_CORE_BOOT_0) >> 5;
54 
55 		if (boot_cpu == smp_processor_id()) {
56 			/*
57 			 * OK, proper wakeup, we're done
58 			 */
59 			break;
60 		}
61 		pr_debug("CPU%u: spurious wakeup call\n", cpu);
62 	}
63 }
64 
65 /* Needed by kexec and platform_can_cpu_hotplug() */
66 int omap4_cpu_kill(unsigned int cpu)
67 {
68 	return 1;
69 }
70