Merge tag 'ktest-v5.11' of git://git.kernel.org/pub/scm/linux/kernel/git/rostedt...
[linux-2.6-microblaze.git] / arch / arm / mach-omap2 / omap-hotplug.c
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 }