*/
 extern void smp_init_cpus(void);
 
-/*
- * Move global data into per-processor storage.
- */
-extern void smp_store_cpu_info(unsigned int cpuid);
 
 /*
  * Raise an IPI cross call on CPUs in callmap.
  */
 extern void platform_secondary_init(unsigned int cpu);
 
+/*
+ * Initialize cpu_possible map, and enable coherency
+ */
+extern void platform_smp_prepare_cpus(unsigned int);
+
 /*
  * Initial data for bringing up a secondary CPU.
  */
 
 }
 #endif /* CONFIG_HOTPLUG_CPU */
 
+/*
+ * Called by both boot and secondaries to move global data into
+ * per-processor storage.
+ */
+static void __cpuinit smp_store_cpu_info(unsigned int cpuid)
+{
+       struct cpuinfo_arm *cpu_info = &per_cpu(cpu_data, cpuid);
+
+       cpu_info->loops_per_jiffy = loops_per_jiffy;
+}
+
 /*
  * This is the secondary CPU boot entry.  We're using this CPUs
  * idle thread stack, but a set of temporary page tables.
        cpu_idle();
 }
 
-/*
- * Called by both boot and secondaries to move global data into
- * per-processor storage.
- */
-void __cpuinit smp_store_cpu_info(unsigned int cpuid)
-{
-       struct cpuinfo_arm *cpu_info = &per_cpu(cpu_data, cpuid);
-
-       cpu_info->loops_per_jiffy = loops_per_jiffy;
-}
-
 void __init smp_cpus_done(unsigned int max_cpus)
 {
        int cpu;
        per_cpu(cpu_data, cpu).idle = current;
 }
 
+void __init smp_prepare_cpus(unsigned int max_cpus)
+{
+       unsigned int ncores = num_possible_cpus();
+
+       smp_store_cpu_info(smp_processor_id());
+
+       /*
+        * are we trying to boot more cores than exist?
+        */
+       if (max_cpus > ncores)
+               max_cpus = ncores;
+
+       if (max_cpus > 1) {
+               /*
+                * Enable the local timer or broadcast device for the
+                * boot CPU, but only if we have more than one CPU.
+                */
+               percpu_timer_setup();
+
+               /*
+                * Initialise the SCU if there are more than one CPU
+                * and let them know where to start.
+                */
+               platform_smp_prepare_cpus(max_cpus);
+       }
+}
+
 void arch_send_call_function_ipi_mask(const struct cpumask *mask)
 {
        smp_cross_call(mask, IPI_CALL_FUNC);
 
 #include <linux/io.h>
 
 #include <asm/cacheflush.h>
-#include <asm/localtimer.h>
 #include <asm/smp_scu.h>
 #include <mach/hardware.h>
 #include <mach/omap4-common.h>
                set_cpu_possible(i, true);
 }
 
-void __init smp_prepare_cpus(unsigned int max_cpus)
+void __init platform_smp_prepare_cpus(unsigned int max_cpus)
 {
-       unsigned int ncores = num_possible_cpus();
-       unsigned int cpu = smp_processor_id();
        int i;
 
-       smp_store_cpu_info(cpu);
-
-       /*
-        * are we trying to boot more cores than exist?
-        */
-       if (max_cpus > ncores)
-               max_cpus = ncores;
-
        /*
         * Initialise the present map, which describes the set of CPUs
         * actually populated at the present time.
        for (i = 0; i < max_cpus; i++)
                set_cpu_present(i, true);
 
-       if (max_cpus > 1) {
-               /*
-                * Enable the local timer or broadcast device for the
-                * boot CPU, but only if we have more than one CPU.
-                */
-               percpu_timer_setup();
-
-               /*
-                * Initialise the SCU and wake up the secondary core using
-                * wakeup_secondary().
-                */
-               scu_enable(scu_base);
-               wakeup_secondary();
-       }
+       /*
+        * Initialise the SCU and wake up the secondary core using
+        * wakeup_secondary().
+        */
+       scu_enable(scu_base);
+       wakeup_secondary();
 }
 
 #include <asm/cacheflush.h>
 #include <mach/hardware.h>
 #include <asm/mach-types.h>
-#include <asm/localtimer.h>
 #include <asm/unified.h>
 
 #include <mach/board-eb.h>
                set_cpu_possible(i, true);
 }
 
-void __init smp_prepare_cpus(unsigned int max_cpus)
+void __init platform_smp_prepare_cpus(unsigned int max_cpus)
 {
-       unsigned int ncores = num_possible_cpus();
-       unsigned int cpu = smp_processor_id();
        int i;
 
-       smp_store_cpu_info(cpu);
-
-       /*
-        * are we trying to boot more cores than exist?
-        */
-       if (max_cpus > ncores)
-               max_cpus = ncores;
-
        /*
         * Initialise the present map, which describes the set of CPUs
         * actually populated at the present time.
        for (i = 0; i < max_cpus; i++)
                set_cpu_present(i, true);
 
-       if (max_cpus > 1) {
-               /*
-                * Enable the local timer or broadcast device for the
-                * boot CPU, but only if we have more than one CPU.
-                */
-               percpu_timer_setup();
-
-               scu_enable(scu_base_addr());
-
-               /*
-                * Write the address of secondary startup into the
-                * system-wide flags register. The BootMonitor waits
-                * until it receives a soft interrupt, and then the
-                * secondary CPU branches to this address.
-                */
-               __raw_writel(BSYM(virt_to_phys(realview_secondary_startup)),
-                            __io_address(REALVIEW_SYS_FLAGSSET));
-       }
+       scu_enable(scu_base_addr());
+
+       /*
+        * Write the address of secondary startup into the
+        * system-wide flags register. The BootMonitor waits
+        * until it receives a soft interrupt, and then the
+        * secondary CPU branches to this address.
+        */
+       __raw_writel(BSYM(virt_to_phys(realview_secondary_startup)),
+                    __io_address(REALVIEW_SYS_FLAGSSET));
 }
 
 #include <linux/io.h>
 
 #include <asm/cacheflush.h>
-#include <asm/localtimer.h>
 #include <asm/smp_scu.h>
 #include <asm/unified.h>
 
                set_cpu_possible(i, true);
 }
 
-void __init smp_prepare_cpus(unsigned int max_cpus)
+void __init platform_smp_prepare_cpus(unsigned int max_cpus)
 {
-       unsigned int ncores = num_possible_cpus();
-       unsigned int cpu = smp_processor_id();
        int i;
 
-       smp_store_cpu_info(cpu);
-
-       /* are we trying to boot more cores than exist? */
-       if (max_cpus > ncores)
-               max_cpus = ncores;
-
        /*
         * Initialise the present map, which describes the set of CPUs
         * actually populated at the present time.
        for (i = 0; i < max_cpus; i++)
                set_cpu_present(i, true);
 
+       scu_enable(scu_base_addr());
+
        /*
-        * Initialise the SCU if there are more than one CPU and let
-        * them know where to start.
+        * Write the address of secondary startup into the
+        * system-wide flags register. The boot monitor waits
+        * until it receives a soft interrupt, and then the
+        * secondary CPU branches to this address.
         */
-       if (max_cpus > 1) {
-               /*
-                * Enable the local timer or broadcast device for the
-                * boot CPU, but only if we have more than one CPU.
-                */
-               percpu_timer_setup();
-
-               scu_enable(scu_base_addr());
-
-               /*
-                * Write the address of secondary startup into the
-                * system-wide flags register. The boot monitor waits
-                * until it receives a soft interrupt, and then the
-                * secondary CPU branches to this address.
-                */
        __raw_writel(BSYM(virt_to_phys(s5pv310_secondary_startup)), S5P_VA_SYSRAM);
-       }
 }
 
 #include <asm/cacheflush.h>
 #include <mach/hardware.h>
 #include <asm/mach-types.h>
-#include <asm/localtimer.h>
 #include <asm/smp_scu.h>
 
 #include <mach/iomap.h>
                cpu_set(i, cpu_possible_map);
 }
 
-void __init smp_prepare_cpus(unsigned int max_cpus)
+void __init platform_smp_prepare_cpus(unsigned int max_cpus)
 {
-       unsigned int ncores = scu_get_core_count(scu_base);
-       unsigned int cpu = smp_processor_id();
        int i;
 
-       smp_store_cpu_info(cpu);
-
-       /*
-        * are we trying to boot more cores than exist?
-        */
-       if (max_cpus > ncores)
-               max_cpus = ncores;
-
        /*
         * Initialise the present map, which describes the set of CPUs
         * actually populated at the present time.
        for (i = 0; i < max_cpus; i++)
                set_cpu_present(i, true);
 
-       if (max_cpus > 1) {
-               percpu_timer_setup();
-               scu_enable(scu_base);
-       }
+       scu_enable(scu_base);
 }
 
 #include <linux/io.h>
 
 #include <asm/cacheflush.h>
-#include <asm/localtimer.h>
 #include <asm/smp_scu.h>
 #include <mach/hardware.h>
 
                set_cpu_possible(i, true);
 }
 
-void __init smp_prepare_cpus(unsigned int max_cpus)
+void __init platform_smp_prepare_cpus(unsigned int max_cpus)
 {
-       unsigned int ncores = num_possible_cpus();
-       unsigned int cpu = smp_processor_id();
        int i;
 
-       smp_store_cpu_info(cpu);
-
-       /*
-        * are we trying to boot more cores than exist?
-        */
-       if (max_cpus > ncores)
-               max_cpus = ncores;
-
        /*
         * Initialise the present map, which describes the set of CPUs
         * actually populated at the present time.
        for (i = 0; i < max_cpus; i++)
                set_cpu_present(i, true);
 
-       if (max_cpus > 1) {
-               /*
-                * Enable the local timer or broadcast device for the
-                * boot CPU, but only if we have more than one CPU.
-                */
-               percpu_timer_setup();
-               scu_enable(__io_address(UX500_SCU_BASE));
-               wakeup_secondary();
-       }
+       scu_enable(__io_address(UX500_SCU_BASE));
+       wakeup_secondary();
 }
 
 #include <linux/io.h>
 
 #include <asm/cacheflush.h>
-#include <asm/localtimer.h>
 #include <asm/smp_scu.h>
 #include <asm/unified.h>
 
                set_cpu_possible(i, true);
 }
 
-void __init smp_prepare_cpus(unsigned int max_cpus)
+void __init platform_smp_prepare_cpus(unsigned int max_cpus)
 {
-       unsigned int ncores = num_possible_cpus();
-       unsigned int cpu = smp_processor_id();
        int i;
 
-       smp_store_cpu_info(cpu);
-
-       /*
-        * are we trying to boot more cores than exist?
-        */
-       if (max_cpus > ncores)
-               max_cpus = ncores;
-
        /*
         * Initialise the present map, which describes the set of CPUs
         * actually populated at the present time.
        for (i = 0; i < max_cpus; i++)
                set_cpu_present(i, true);
 
+       scu_enable(scu_base_addr());
+
        /*
-        * Initialise the SCU if there are more than one CPU and let
-        * them know where to start.
+        * Write the address of secondary startup into the
+        * system-wide flags register. The boot monitor waits
+        * until it receives a soft interrupt, and then the
+        * secondary CPU branches to this address.
         */
-       if (max_cpus > 1) {
-               /*
-                * Enable the local timer or broadcast device for the
-                * boot CPU, but only if we have more than one CPU.
-                */
-               percpu_timer_setup();
-
-               scu_enable(scu_base_addr());
-
-               /*
-                * Write the address of secondary startup into the
-                * system-wide flags register. The boot monitor waits
-                * until it receives a soft interrupt, and then the
-                * secondary CPU branches to this address.
-                */
-               writel(~0, MMIO_P2V(V2M_SYS_FLAGSCLR));
-               writel(BSYM(virt_to_phys(vexpress_secondary_startup)),
-                       MMIO_P2V(V2M_SYS_FLAGSSET));
-       }
+       writel(~0, MMIO_P2V(V2M_SYS_FLAGSCLR));
+       writel(BSYM(virt_to_phys(vexpress_secondary_startup)),
+               MMIO_P2V(V2M_SYS_FLAGSSET));
 }