Merge branch '4.7-fixes' into mips-for-linux-next
[deliverable/linux.git] / arch / arc / kernel / smp.c
index 4cb3add77c75cc8da0600f385c8851fa12559240..f183cc648851e53d0db2736925cdf466d900946a 100644 (file)
@@ -126,11 +126,6 @@ void start_kernel_secondary(void)
        current->active_mm = mm;
        cpumask_set_cpu(cpu, mm_cpumask(mm));
 
-       notify_cpu_starting(cpu);
-       set_cpu_online(cpu, true);
-
-       pr_info("## CPU%u LIVE ##: Executing Code...\n", cpu);
-
        /* Some SMP H/w setup - for each cpu */
        if (plat_smp_ops.init_per_cpu)
                plat_smp_ops.init_per_cpu(cpu);
@@ -138,7 +133,10 @@ void start_kernel_secondary(void)
        if (machine_desc->init_per_cpu)
                machine_desc->init_per_cpu(cpu);
 
-       arc_local_timer_setup();
+       notify_cpu_starting(cpu);
+       set_cpu_online(cpu, true);
+
+       pr_info("## CPU%u LIVE ##: Executing Code...\n", cpu);
 
        local_irq_enable();
        preempt_disable();
@@ -346,6 +344,10 @@ irqreturn_t do_IPI(int irq, void *dev_id)
 
 /*
  * API called by platform code to hookup arch-common ISR to their IPI IRQ
+ *
+ * Note: If IPI is provided by platform (vs. say ARC MCIP), their intc setup/map
+ * function needs to call call irq_set_percpu_devid() for IPI IRQ, otherwise
+ * request_percpu_irq() below will fail
  */
 static DEFINE_PER_CPU(int, ipi_dev);
 
@@ -353,7 +355,16 @@ int smp_ipi_irq_setup(int cpu, int irq)
 {
        int *dev = per_cpu_ptr(&ipi_dev, cpu);
 
-       arc_request_percpu_irq(irq, cpu, do_IPI, "IPI Interrupt", dev);
+       /* Boot cpu calls request, all call enable */
+       if (!cpu) {
+               int rc;
+
+               rc = request_percpu_irq(irq, do_IPI, "IPI Interrupt", dev);
+               if (rc)
+                       panic("Percpu IRQ request failed for %d\n", irq);
+       }
+
+       enable_percpu_irq(irq, 0);
 
        return 0;
 }
This page took 0.027457 seconds and 5 git commands to generate.