Merge branch 'core/softlockup-for-linus' of git://git.kernel.org/pub/scm/linux/kernel...
[pandora-kernel.git] / arch / powerpc / platforms / ps3 / smp.c
index 8729348..a0927a3 100644 (file)
@@ -27,9 +27,9 @@
 #include "platform.h"
 
 #if defined(DEBUG)
-#define DBG(fmt...) udbg_printf(fmt)
+#define DBG udbg_printf
 #else
-#define DBG(fmt...) do{if(0)printk(fmt);}while(0)
+#define DBG pr_debug
 #endif
 
 static irqreturn_t ipi_function_handler(int irq, void *msg)
@@ -39,11 +39,11 @@ static irqreturn_t ipi_function_handler(int irq, void *msg)
 }
 
 /**
-  * virqs - a per cpu array of virqs for ipi use
+  * ps3_ipi_virqs - a per cpu array of virqs for ipi use
   */
 
 #define MSG_COUNT 4
-static DEFINE_PER_CPU(unsigned int, virqs[MSG_COUNT]);
+static DEFINE_PER_CPU(unsigned int, ps3_ipi_virqs[MSG_COUNT]);
 
 static const char *names[MSG_COUNT] = {
        "ipi call",
@@ -62,7 +62,7 @@ static void do_message_pass(int target, int msg)
                return;
        }
 
-       virq = per_cpu(virqs, target)[msg];
+       virq = per_cpu(ps3_ipi_virqs, target)[msg];
        result = ps3_send_event_locally(virq);
 
        if (result)
@@ -94,20 +94,21 @@ static int ps3_smp_probe(void)
 static void __init ps3_smp_setup_cpu(int cpu)
 {
        int result;
-       unsigned int *virqs = per_cpu(virqs, cpu);
+       unsigned int *virqs = per_cpu(ps3_ipi_virqs, cpu);
        int i;
 
        DBG(" -> %s:%d: (%d)\n", __func__, __LINE__, cpu);
 
        /*
-        * Check assumptions on virqs[] indexing. If this
+        * Check assumptions on ps3_ipi_virqs[] indexing. If this
         * check fails, then a different mapping of PPC_MSG_
         * to index needs to be setup.
         */
 
-       BUILD_BUG_ON(PPC_MSG_CALL_FUNCTION  != 0);
-       BUILD_BUG_ON(PPC_MSG_RESCHEDULE     != 1);
-       BUILD_BUG_ON(PPC_MSG_DEBUGGER_BREAK != 3);
+       BUILD_BUG_ON(PPC_MSG_CALL_FUNCTION    != 0);
+       BUILD_BUG_ON(PPC_MSG_RESCHEDULE       != 1);
+       BUILD_BUG_ON(PPC_MSG_CALL_FUNC_SINGLE != 2);
+       BUILD_BUG_ON(PPC_MSG_DEBUGGER_BREAK   != 3);
 
        for (i = 0; i < MSG_COUNT; i++) {
                result = ps3_event_receive_port_setup(cpu, &virqs[i]);
@@ -118,9 +119,11 @@ static void __init ps3_smp_setup_cpu(int cpu)
                DBG("%s:%d: (%d, %d) => virq %u\n",
                        __func__, __LINE__, cpu, i, virqs[i]);
 
+               result = request_irq(virqs[i], ipi_function_handler,
+                       IRQF_DISABLED, names[i], (void*)(long)i);
 
-               request_irq(virqs[i], ipi_function_handler, IRQF_DISABLED,
-                       names[i], (void*)(long)i);
+               if (result)
+                       virqs[i] = NO_IRQ;
        }
 
        ps3_register_ipi_debug_brk(cpu, virqs[PPC_MSG_DEBUGGER_BREAK]);
@@ -130,13 +133,13 @@ static void __init ps3_smp_setup_cpu(int cpu)
 
 void ps3_smp_cleanup_cpu(int cpu)
 {
-       unsigned int *virqs = per_cpu(virqs, cpu);
+       unsigned int *virqs = per_cpu(ps3_ipi_virqs, cpu);
        int i;
 
        DBG(" -> %s:%d: (%d)\n", __func__, __LINE__, cpu);
 
        for (i = 0; i < MSG_COUNT; i++) {
-               free_irq(virqs[i], (void*)(long)i);
+               /* Can't call free_irq from interrupt context. */
                ps3_event_receive_port_destroy(virqs[i]);
                virqs[i] = NO_IRQ;
        }