Commit | Line | Data |
---|---|---|
7d35b8d0 SS |
1 | /* |
2 | * OMAP4 SMP cpu-hotplug support | |
3 | * | |
4 | * Copyright (C) 2010 Texas Instruments, Inc. | |
5 | * Author: | |
6 | * Santosh Shilimkar <santosh.shilimkar@ti.com> | |
7 | * | |
8 | * Platform file needed for the OMAP4 SMP. This file is based on arm | |
9 | * realview smp platform. | |
10 | * Copyright (c) 2002 ARM Limited. | |
11 | * | |
12 | * This program is free software; you can redistribute it and/or modify | |
13 | * it under the terms of the GNU General Public License version 2 as | |
14 | * published by the Free Software Foundation. | |
15 | */ | |
16 | ||
17 | #include <linux/kernel.h> | |
18 | #include <linux/errno.h> | |
19 | #include <linux/smp.h> | |
247c445c | 20 | #include <linux/io.h> |
7d35b8d0 | 21 | |
732231a7 | 22 | #include "omap-wakeupgen.h" |
4e65331c | 23 | #include "common.h" |
b5b4f288 SS |
24 | #include "powerdomain.h" |
25 | ||
7d35b8d0 SS |
26 | /* |
27 | * platform-specific code to shutdown a CPU | |
28 | * Called with IRQs disabled | |
29 | */ | |
b96fc2f3 | 30 | void omap4_cpu_die(unsigned int cpu) |
7d35b8d0 | 31 | { |
247c445c SS |
32 | unsigned int boot_cpu = 0; |
33 | void __iomem *base = omap_get_wakeupgen_base(); | |
b5b4f288 | 34 | |
7d35b8d0 SS |
35 | /* |
36 | * we're ready for shutdown now, so do it | |
37 | */ | |
247c445c SS |
38 | if (omap_secure_apis_support()) { |
39 | if (omap_modify_auxcoreboot0(0x0, 0x200) != 0x0) | |
40 | pr_err("Secure clear status failed\n"); | |
41 | } else { | |
edfaf05c | 42 | writel_relaxed(0, base + OMAP_AUX_CORE_BOOT_0); |
247c445c SS |
43 | } |
44 | ||
7d35b8d0 SS |
45 | |
46 | for (;;) { | |
47 | /* | |
b5b4f288 | 48 | * Enter into low power state |
7d35b8d0 | 49 | */ |
b5b4f288 | 50 | omap4_hotplug_cpu(cpu, PWRDM_POWER_OFF); |
247c445c SS |
51 | |
52 | if (omap_secure_apis_support()) | |
53 | boot_cpu = omap_read_auxcoreboot0(); | |
54 | else | |
55 | boot_cpu = | |
edfaf05c | 56 | readl_relaxed(base + OMAP_AUX_CORE_BOOT_0) >> 5; |
247c445c SS |
57 | |
58 | if (boot_cpu == smp_processor_id()) { | |
7d35b8d0 SS |
59 | /* |
60 | * OK, proper wakeup, we're done | |
61 | */ | |
62 | break; | |
63 | } | |
64 | pr_debug("CPU%u: spurious wakeup call\n", cpu); | |
65 | } | |
66 | } |