ARM: SoC: convert Exynos4 to SMP operations
authorMarc Zyngier <marc.zyngier@arm.com>
Thu, 8 Sep 2011 12:15:22 +0000 (13:15 +0100)
committerArnd Bergmann <arnd@arndb.de>
Fri, 14 Sep 2012 09:14:50 +0000 (11:14 +0200)
Convert Exynos4 to use struct smp_operations to provide its SMP
and CPU hotplug operations.

Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
Acked-by: Nicolas Pitre <nico@linaro.org>
Tested-by: Kyungmin Park <kyungmin.park@samsung.com>
Acked-by: Kyungmin Park <kyungmin.park@samsung.com>
Acked-by: Kukjin Kim <kgene.kim@samsung.com>
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
arch/arm/mach-exynos/common.h
arch/arm/mach-exynos/hotplug.c
arch/arm/mach-exynos/mach-armlex4210.c
arch/arm/mach-exynos/mach-exynos5-dt.c
arch/arm/mach-exynos/mach-nuri.c
arch/arm/mach-exynos/mach-origen.c
arch/arm/mach-exynos/mach-smdk4x12.c
arch/arm/mach-exynos/mach-smdkv310.c
arch/arm/mach-exynos/mach-universal_c210.c
arch/arm/mach-exynos/platsmp.c

index aed2eeb065179f46f5d9b374974020b96e0a05a2..dac146df79ac870fc02bb1d014d920ff9b2b1d60 100644 (file)
@@ -14,6 +14,7 @@
 
 extern struct sys_timer exynos4_timer;
 
+struct map_desc;
 void exynos_init_io(struct map_desc *mach_desc, int size);
 void exynos4_init_irq(void);
 void exynos5_init_irq(void);
@@ -59,4 +60,8 @@ void exynos4212_register_clocks(void);
 #define exynos4212_register_clocks()
 #endif
 
+extern struct smp_operations exynos_smp_ops;
+
+extern void exynos_cpu_die(unsigned int cpu);
+
 #endif /* __ARCH_ARM_MACH_EXYNOS_COMMON_H */
index 9c17a0a43858d84df39cab4ddc8d417ba1b644a5..edccc36dd692876fad2d4cdb3a198ef3ccadc298 100644 (file)
@@ -21,6 +21,8 @@
 
 #include <mach/regs-pmu.h>
 
+#include "common.h"
+
 extern volatile int pen_release;
 
 static inline void cpu_enter_lowpower(void)
@@ -95,17 +97,12 @@ static inline void platform_do_lowpower(unsigned int cpu, int *spurious)
        }
 }
 
-int platform_cpu_kill(unsigned int cpu)
-{
-       return 1;
-}
-
 /*
  * platform-specific code to shutdown a CPU
  *
  * Called with IRQs disabled
  */
-void platform_cpu_die(unsigned int cpu)
+void __ref exynos_cpu_die(unsigned int cpu)
 {
        int spurious = 0;
 
@@ -124,12 +121,3 @@ void platform_cpu_die(unsigned int cpu)
        if (spurious)
                pr_warn("CPU%u: %u spurious wakeup calls\n", cpu, spurious);
 }
-
-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;
-}
index 5a3daa0168d85450b0aa3777fb965249d79ba735..3f37a5e8a1f450d4d4e6797d0570c51df5b2805c 100644 (file)
@@ -199,6 +199,7 @@ static void __init armlex4210_machine_init(void)
 MACHINE_START(ARMLEX4210, "ARMLEX4210")
        /* Maintainer: Alim Akhtar <alim.akhtar@samsung.com> */
        .atag_offset    = 0x100,
+       .smp            = smp_ops(exynos_smp_ops),
        .init_irq       = exynos4_init_irq,
        .map_io         = armlex4210_map_io,
        .handle_irq     = gic_handle_irq,
index ef770bc2318fcbd074387a6c5278a007f169773d..8833060f77e983d947acedf3d9fd3e70dc60dcb1 100644 (file)
@@ -79,6 +79,7 @@ static char const *exynos5250_dt_compat[] __initdata = {
 DT_MACHINE_START(EXYNOS5_DT, "SAMSUNG EXYNOS5 (Flattened Device Tree)")
        /* Maintainer: Kukjin Kim <kgene.kim@samsung.com> */
        .init_irq       = exynos5_init_irq,
+       .smp            = smp_ops(exynos_smp_ops),
        .map_io         = exynos5250_dt_map_io,
        .handle_irq     = gic_handle_irq,
        .init_machine   = exynos5250_dt_machine_init,
index ea785fcaf6c3262892f26dc6a3a7264d22a2e3d3..ffaa355c1bdeddb4544db055d1b32efe5dd6daee 100644 (file)
@@ -1383,6 +1383,7 @@ static void __init nuri_machine_init(void)
 MACHINE_START(NURI, "NURI")
        /* Maintainer: Kyungmin Park <kyungmin.park@samsung.com> */
        .atag_offset    = 0x100,
+       .smp            = smp_ops(exynos_smp_ops),
        .init_irq       = exynos4_init_irq,
        .map_io         = nuri_map_io,
        .handle_irq     = gic_handle_irq,
index 4e574c24581ca2869fa37f96d487879ffe0c016a..abd0e6059ab3a00a83f9215fa09ea7bad0a09e14 100644 (file)
@@ -806,6 +806,7 @@ static void __init origen_machine_init(void)
 MACHINE_START(ORIGEN, "ORIGEN")
        /* Maintainer: JeongHyeon Kim <jhkim@insignal.co.kr> */
        .atag_offset    = 0x100,
+       .smp            = smp_ops(exynos_smp_ops),
        .init_irq       = exynos4_init_irq,
        .map_io         = origen_map_io,
        .handle_irq     = gic_handle_irq,
index b26beb13ebef40ff03bb524a6a8a9e8733e7efe9..964693bdc2425686b930de5a70529a729b198a54 100644 (file)
@@ -370,6 +370,7 @@ static void __init smdk4x12_machine_init(void)
 MACHINE_START(SMDK4212, "SMDK4212")
        /* Maintainer: Kukjin Kim <kgene.kim@samsung.com> */
        .atag_offset    = 0x100,
+       .smp            = smp_ops(exynos_smp_ops),
        .init_irq       = exynos4_init_irq,
        .map_io         = smdk4x12_map_io,
        .handle_irq     = gic_handle_irq,
@@ -383,6 +384,7 @@ MACHINE_START(SMDK4412, "SMDK4412")
        /* Maintainer: Kukjin Kim <kgene.kim@samsung.com> */
        /* Maintainer: Changhwan Youn <chaos.youn@samsung.com> */
        .atag_offset    = 0x100,
+       .smp            = smp_ops(exynos_smp_ops),
        .init_irq       = exynos4_init_irq,
        .map_io         = smdk4x12_map_io,
        .handle_irq     = gic_handle_irq,
index 73f2bce097e179822d9a08d4dc14bba6f104888c..69b858ceefc55410ca6059f5e69ef56b3cf05578 100644 (file)
@@ -417,6 +417,7 @@ MACHINE_START(SMDKV310, "SMDKV310")
        /* Maintainer: Kukjin Kim <kgene.kim@samsung.com> */
        /* Maintainer: Changhwan Youn <chaos.youn@samsung.com> */
        .atag_offset    = 0x100,
+       .smp            = smp_ops(exynos_smp_ops),
        .init_irq       = exynos4_init_irq,
        .map_io         = smdkv310_map_io,
        .handle_irq     = gic_handle_irq,
@@ -429,6 +430,7 @@ MACHINE_END
 MACHINE_START(SMDKC210, "SMDKC210")
        /* Maintainer: Kukjin Kim <kgene.kim@samsung.com> */
        .atag_offset    = 0x100,
+       .smp            = smp_ops(exynos_smp_ops),
        .init_irq       = exynos4_init_irq,
        .map_io         = smdkv310_map_io,
        .handle_irq     = gic_handle_irq,
index 4d1f40d44ed19686f129113e5903a9f137e139e6..922ca0f1179528b0dd5ace14c765882353c30193 100644 (file)
@@ -1155,6 +1155,7 @@ static void __init universal_machine_init(void)
 MACHINE_START(UNIVERSAL_C210, "UNIVERSAL_C210")
        /* Maintainer: Kyungmin Park <kyungmin.park@samsung.com> */
        .atag_offset    = 0x100,
+       .smp            = smp_ops(exynos_smp_ops),
        .init_irq       = exynos4_init_irq,
        .map_io         = universal_map_io,
        .handle_irq     = gic_handle_irq,
index 36c3984aaa47909e5e02b12a317cbe1f373897e2..3fad8ad3f92c2c5d1bcc98e4428b70db82d2d67a 100644 (file)
@@ -32,6 +32,8 @@
 
 #include <plat/cpu.h>
 
+#include "common.h"
+
 extern void exynos4_secondary_startup(void);
 
 #define CPU1_BOOT_REG          (samsung_rev() == EXYNOS4210_REV_1_1 ? \
@@ -64,7 +66,7 @@ static void __iomem *scu_base_addr(void)
 
 static DEFINE_SPINLOCK(boot_lock);
 
-void __cpuinit platform_secondary_init(unsigned int cpu)
+static void __cpuinit exynos_secondary_init(unsigned int cpu)
 {
        /*
         * if any interrupts are already enabled for the primary
@@ -86,7 +88,7 @@ void __cpuinit platform_secondary_init(unsigned int cpu)
        spin_unlock(&boot_lock);
 }
 
-int __cpuinit boot_secondary(unsigned int cpu, struct task_struct *idle)
+static int __cpuinit exynos_boot_secondary(unsigned int cpu, struct task_struct *idle)
 {
        unsigned long timeout;
 
@@ -161,7 +163,7 @@ int __cpuinit boot_secondary(unsigned int cpu, struct task_struct *idle)
  * which may be present or become present in the system.
  */
 
-void __init smp_init_cpus(void)
+static void __init exynos_smp_init_cpus(void)
 {
        void __iomem *scu_base = scu_base_addr();
        unsigned int i, ncores;
@@ -184,7 +186,7 @@ void __init smp_init_cpus(void)
        set_smp_cross_call(gic_raise_softirq);
 }
 
-void __init platform_smp_prepare_cpus(unsigned int max_cpus)
+static void __init exynos_smp_prepare_cpus(unsigned int max_cpus)
 {
        if (!soc_is_exynos5250())
                scu_enable(scu_base_addr());
@@ -198,3 +200,13 @@ void __init platform_smp_prepare_cpus(unsigned int max_cpus)
        __raw_writel(virt_to_phys(exynos4_secondary_startup),
                        CPU1_BOOT_REG);
 }
+
+struct smp_operations exynos_smp_ops __initdata = {
+       .smp_init_cpus          = exynos_smp_init_cpus,
+       .smp_prepare_cpus       = exynos_smp_prepare_cpus,
+       .smp_secondary_init     = exynos_secondary_init,
+       .smp_boot_secondary     = exynos_boot_secondary,
+#ifdef CONFIG_HOTPLUG_CPU
+       .cpu_die                = exynos_cpu_die,
+#endif
+};
This page took 0.029693 seconds and 5 git commands to generate.