diff options
author | Olof Johansson <olof@lixom.net> | 2012-09-22 03:06:21 -0400 |
---|---|---|
committer | Olof Johansson <olof@lixom.net> | 2012-09-22 03:16:04 -0400 |
commit | 25468fe89f88c4ceeef94526e94ae0db176f6999 (patch) | |
tree | d70a713525281276b5063c814413bb3141e6056c /arch/arm/mach-ux500 | |
parent | a283580c52d3aa24305985e945dfccfbcfc6f4f9 (diff) | |
parent | 28e8e29c616f947348cc66bea684d0035c76021a (diff) |
Merge branch 'multiplatform/smp_ops' into next/multiplatform
* multiplatform/smp_ops:
ARM: consolidate pen_release instead of having per platform definitions
ARM: smp: Make SMP operations mandatory
ARM: SoC: convert spear13xx to SMP operations
ARM: SoC: convert imx6q to SMP operations
ARM: SoC: convert highbank to SMP operations
ARM: SoC: convert shmobile SMP to SMP operations
ARM: SoC: convert ux500 to SMP operations
ARM: SoC: convert MSM to SMP operations
ARM: SoC: convert Exynos4 to SMP operations
ARM: SoC: convert Tegra to SMP operations
ARM: SoC: convert OMAP4 to SMP operations
ARM: SoC: convert VExpress/RealView to SMP operations
ARM: SoC: add per-platform SMP operations
Conflicts due to file moves or removals in:
arch/arm/mach-msm/board-msm8960.c
arch/arm/mach-msm/board-msm8x60.c
arch/arm/mach-tegra/board-harmony.c
arch/arm/mach-tegra/board-trimslice.c
Conflicts due to board file cleanup:
arch/arm/mach-tegra/board-paz00.c
Conflicts due to cpu hotplug addition:
arch/arm/mach-tegra/hotplug.c
Signed-off-by: Olof Johansson <olof@lixom.net>
Diffstat (limited to 'arch/arm/mach-ux500')
-rw-r--r-- | arch/arm/mach-ux500/board-mop500.c | 4 | ||||
-rw-r--r-- | arch/arm/mach-ux500/hotplug.c | 36 | ||||
-rw-r--r-- | arch/arm/mach-ux500/include/mach/setup.h | 3 | ||||
-rw-r--r-- | arch/arm/mach-ux500/platsmp.c | 24 |
4 files changed, 29 insertions, 38 deletions
diff --git a/arch/arm/mach-ux500/board-mop500.c b/arch/arm/mach-ux500/board-mop500.c index 1d2e3c6f8b59..e783790c79cd 100644 --- a/arch/arm/mach-ux500/board-mop500.c +++ b/arch/arm/mach-ux500/board-mop500.c | |||
@@ -673,6 +673,7 @@ static void __init hrefv60_init_machine(void) | |||
673 | MACHINE_START(U8500, "ST-Ericsson MOP500 platform") | 673 | MACHINE_START(U8500, "ST-Ericsson MOP500 platform") |
674 | /* Maintainer: Srinidhi Kasagar <srinidhi.kasagar@stericsson.com> */ | 674 | /* Maintainer: Srinidhi Kasagar <srinidhi.kasagar@stericsson.com> */ |
675 | .atag_offset = 0x100, | 675 | .atag_offset = 0x100, |
676 | .smp = smp_ops(ux500_smp_ops), | ||
676 | .map_io = u8500_map_io, | 677 | .map_io = u8500_map_io, |
677 | .init_irq = ux500_init_irq, | 678 | .init_irq = ux500_init_irq, |
678 | /* we re-use nomadik timer here */ | 679 | /* we re-use nomadik timer here */ |
@@ -684,6 +685,7 @@ MACHINE_END | |||
684 | 685 | ||
685 | MACHINE_START(HREFV60, "ST-Ericsson U8500 Platform HREFv60+") | 686 | MACHINE_START(HREFV60, "ST-Ericsson U8500 Platform HREFv60+") |
686 | .atag_offset = 0x100, | 687 | .atag_offset = 0x100, |
688 | .smp = smp_ops(ux500_smp_ops), | ||
687 | .map_io = u8500_map_io, | 689 | .map_io = u8500_map_io, |
688 | .init_irq = ux500_init_irq, | 690 | .init_irq = ux500_init_irq, |
689 | .timer = &ux500_timer, | 691 | .timer = &ux500_timer, |
@@ -694,6 +696,7 @@ MACHINE_END | |||
694 | 696 | ||
695 | MACHINE_START(SNOWBALL, "Calao Systems Snowball platform") | 697 | MACHINE_START(SNOWBALL, "Calao Systems Snowball platform") |
696 | .atag_offset = 0x100, | 698 | .atag_offset = 0x100, |
699 | .smp = smp_ops(ux500_smp_ops), | ||
697 | .map_io = u8500_map_io, | 700 | .map_io = u8500_map_io, |
698 | .init_irq = ux500_init_irq, | 701 | .init_irq = ux500_init_irq, |
699 | /* we re-use nomadik timer here */ | 702 | /* we re-use nomadik timer here */ |
@@ -823,6 +826,7 @@ static const char * u8500_dt_board_compat[] = { | |||
823 | 826 | ||
824 | 827 | ||
825 | DT_MACHINE_START(U8500_DT, "ST-Ericsson U8500 platform (Device Tree Support)") | 828 | DT_MACHINE_START(U8500_DT, "ST-Ericsson U8500 platform (Device Tree Support)") |
829 | .smp = smp_ops(ux500_smp_ops), | ||
826 | .map_io = u8500_map_io, | 830 | .map_io = u8500_map_io, |
827 | .init_irq = ux500_init_irq, | 831 | .init_irq = ux500_init_irq, |
828 | /* we re-use nomadik timer here */ | 832 | /* we re-use nomadik timer here */ |
diff --git a/arch/arm/mach-ux500/hotplug.c b/arch/arm/mach-ux500/hotplug.c index c76f0f456f04..2f6af259015d 100644 --- a/arch/arm/mach-ux500/hotplug.c +++ b/arch/arm/mach-ux500/hotplug.c | |||
@@ -15,13 +15,18 @@ | |||
15 | #include <asm/cacheflush.h> | 15 | #include <asm/cacheflush.h> |
16 | #include <asm/smp_plat.h> | 16 | #include <asm/smp_plat.h> |
17 | 17 | ||
18 | extern volatile int pen_release; | 18 | #include <mach/setup.h> |
19 | 19 | ||
20 | static inline void platform_do_lowpower(unsigned int cpu) | 20 | /* |
21 | * platform-specific code to shutdown a CPU | ||
22 | * | ||
23 | * Called with IRQs disabled | ||
24 | */ | ||
25 | void __ref ux500_cpu_die(unsigned int cpu) | ||
21 | { | 26 | { |
22 | flush_cache_all(); | 27 | flush_cache_all(); |
23 | 28 | ||
24 | /* we put the platform to just WFI */ | 29 | /* directly enter low power state, skipping secure registers */ |
25 | for (;;) { | 30 | for (;;) { |
26 | __asm__ __volatile__("dsb\n\t" "wfi\n\t" | 31 | __asm__ __volatile__("dsb\n\t" "wfi\n\t" |
27 | : : : "memory"); | 32 | : : : "memory"); |
@@ -33,28 +38,3 @@ static inline void platform_do_lowpower(unsigned int cpu) | |||
33 | } | 38 | } |
34 | } | 39 | } |
35 | } | 40 | } |
36 | |||
37 | int platform_cpu_kill(unsigned int cpu) | ||
38 | { | ||
39 | return 1; | ||
40 | } | ||
41 | |||
42 | /* | ||
43 | * platform-specific code to shutdown a CPU | ||
44 | * | ||
45 | * Called with IRQs disabled | ||
46 | */ | ||
47 | void platform_cpu_die(unsigned int cpu) | ||
48 | { | ||
49 | /* directly enter low power state, skipping secure registers */ | ||
50 | platform_do_lowpower(cpu); | ||
51 | } | ||
52 | |||
53 | int platform_cpu_disable(unsigned int cpu) | ||
54 | { | ||
55 | /* | ||
56 | * we don't allow CPU 0 to be shutdown (it is still too special | ||
57 | * e.g. clock tick interrupts) | ||
58 | */ | ||
59 | return cpu == 0 ? -EPERM : 0; | ||
60 | } | ||
diff --git a/arch/arm/mach-ux500/include/mach/setup.h b/arch/arm/mach-ux500/include/mach/setup.h index 7914e5eaa9c7..6be4c4d2ab88 100644 --- a/arch/arm/mach-ux500/include/mach/setup.h +++ b/arch/arm/mach-ux500/include/mach/setup.h | |||
@@ -45,4 +45,7 @@ extern struct sys_timer ux500_timer; | |||
45 | .type = MT_MEMORY, \ | 45 | .type = MT_MEMORY, \ |
46 | } | 46 | } |
47 | 47 | ||
48 | extern struct smp_operations ux500_smp_ops; | ||
49 | extern void ux500_cpu_die(unsigned int cpu); | ||
50 | |||
48 | #endif /* __ASM_ARCH_SETUP_H */ | 51 | #endif /* __ASM_ARCH_SETUP_H */ |
diff --git a/arch/arm/mach-ux500/platsmp.c b/arch/arm/mach-ux500/platsmp.c index a5dda68444db..3db7782f3afb 100644 --- a/arch/arm/mach-ux500/platsmp.c +++ b/arch/arm/mach-ux500/platsmp.c | |||
@@ -28,12 +28,6 @@ | |||
28 | extern void u8500_secondary_startup(void); | 28 | extern void u8500_secondary_startup(void); |
29 | 29 | ||
30 | /* | 30 | /* |
31 | * control for which core is the next to come out of the secondary | ||
32 | * boot "holding pen" | ||
33 | */ | ||
34 | volatile int pen_release = -1; | ||
35 | |||
36 | /* | ||
37 | * Write pen_release in a way that is guaranteed to be visible to all | 31 | * Write pen_release in a way that is guaranteed to be visible to all |
38 | * observers, irrespective of whether they're taking part in coherency | 32 | * observers, irrespective of whether they're taking part in coherency |
39 | * or not. This is necessary for the hotplug code to work reliably. | 33 | * or not. This is necessary for the hotplug code to work reliably. |
@@ -58,7 +52,7 @@ static void __iomem *scu_base_addr(void) | |||
58 | 52 | ||
59 | static DEFINE_SPINLOCK(boot_lock); | 53 | static DEFINE_SPINLOCK(boot_lock); |
60 | 54 | ||
61 | void __cpuinit platform_secondary_init(unsigned int cpu) | 55 | static void __cpuinit ux500_secondary_init(unsigned int cpu) |
62 | { | 56 | { |
63 | /* | 57 | /* |
64 | * if any interrupts are already enabled for the primary | 58 | * if any interrupts are already enabled for the primary |
@@ -80,7 +74,7 @@ void __cpuinit platform_secondary_init(unsigned int cpu) | |||
80 | spin_unlock(&boot_lock); | 74 | spin_unlock(&boot_lock); |
81 | } | 75 | } |
82 | 76 | ||
83 | int __cpuinit boot_secondary(unsigned int cpu, struct task_struct *idle) | 77 | static int __cpuinit ux500_boot_secondary(unsigned int cpu, struct task_struct *idle) |
84 | { | 78 | { |
85 | unsigned long timeout; | 79 | unsigned long timeout; |
86 | 80 | ||
@@ -145,7 +139,7 @@ static void __init wakeup_secondary(void) | |||
145 | * Initialise the CPU possible map early - this describes the CPUs | 139 | * Initialise the CPU possible map early - this describes the CPUs |
146 | * which may be present or become present in the system. | 140 | * which may be present or become present in the system. |
147 | */ | 141 | */ |
148 | void __init smp_init_cpus(void) | 142 | static void __init ux500_smp_init_cpus(void) |
149 | { | 143 | { |
150 | void __iomem *scu_base = scu_base_addr(); | 144 | void __iomem *scu_base = scu_base_addr(); |
151 | unsigned int i, ncores; | 145 | unsigned int i, ncores; |
@@ -165,9 +159,19 @@ void __init smp_init_cpus(void) | |||
165 | set_smp_cross_call(gic_raise_softirq); | 159 | set_smp_cross_call(gic_raise_softirq); |
166 | } | 160 | } |
167 | 161 | ||
168 | void __init platform_smp_prepare_cpus(unsigned int max_cpus) | 162 | static void __init ux500_smp_prepare_cpus(unsigned int max_cpus) |
169 | { | 163 | { |
170 | 164 | ||
171 | scu_enable(scu_base_addr()); | 165 | scu_enable(scu_base_addr()); |
172 | wakeup_secondary(); | 166 | wakeup_secondary(); |
173 | } | 167 | } |
168 | |||
169 | struct smp_operations ux500_smp_ops __initdata = { | ||
170 | .smp_init_cpus = ux500_smp_init_cpus, | ||
171 | .smp_prepare_cpus = ux500_smp_prepare_cpus, | ||
172 | .smp_secondary_init = ux500_secondary_init, | ||
173 | .smp_boot_secondary = ux500_boot_secondary, | ||
174 | #ifdef CONFIG_HOTPLUG_CPU | ||
175 | .cpu_die = ux500_cpu_die, | ||
176 | #endif | ||
177 | }; | ||