]> err.no Git - linux-2.6/blobdiff - arch/powerpc/platforms/cell/pmu.c
Pull battery into release branch
[linux-2.6] / arch / powerpc / platforms / cell / pmu.c
index f28abf2fc273a7599277c01a82ade0703262ceee..66ca4b5a1dbc6cab284962aec94ac9a38f2da189 100644 (file)
@@ -25,6 +25,7 @@
 #include <linux/interrupt.h>
 #include <linux/types.h>
 #include <asm/io.h>
+#include <asm/irq_regs.h>
 #include <asm/machdep.h>
 #include <asm/pmc.h>
 #include <asm/reg.h>
@@ -344,18 +345,12 @@ EXPORT_SYMBOL_GPL(cbe_read_trace_buffer);
  * Enabling/disabling interrupts for the entire performance monitoring unit.
  */
 
-u32 cbe_query_pm_interrupts(u32 cpu)
-{
-       return cbe_read_pm(cpu, pm_status);
-}
-EXPORT_SYMBOL_GPL(cbe_query_pm_interrupts);
-
-u32 cbe_clear_pm_interrupts(u32 cpu)
+u32 cbe_get_and_clear_pm_interrupts(u32 cpu)
 {
        /* Reading pm_status clears the interrupt bits. */
-       return cbe_query_pm_interrupts(cpu);
+       return cbe_read_pm(cpu, pm_status);
 }
-EXPORT_SYMBOL_GPL(cbe_clear_pm_interrupts);
+EXPORT_SYMBOL_GPL(cbe_get_and_clear_pm_interrupts);
 
 void cbe_enable_pm_interrupts(u32 cpu, u32 thread, u32 mask)
 {
@@ -370,22 +365,25 @@ EXPORT_SYMBOL_GPL(cbe_enable_pm_interrupts);
 
 void cbe_disable_pm_interrupts(u32 cpu)
 {
-       cbe_clear_pm_interrupts(cpu);
+       cbe_get_and_clear_pm_interrupts(cpu);
        cbe_write_pm(cpu, pm_status, 0);
 }
 EXPORT_SYMBOL_GPL(cbe_disable_pm_interrupts);
 
-static irqreturn_t cbe_pm_irq(int irq, void *dev_id, struct pt_regs *regs)
+static irqreturn_t cbe_pm_irq(int irq, void *dev_id)
 {
-       perf_irq(regs);
+       perf_irq(get_irq_regs());
        return IRQ_HANDLED;
 }
 
-int __init cbe_init_pm_irq(void)
+static int __init cbe_init_pm_irq(void)
 {
        unsigned int irq;
        int rc, node;
 
+       if (!machine_is(cell))
+               return 0;
+
        for_each_node(node) {
                irq = irq_create_mapping(NULL, IIC_IRQ_IOEX_PMI |
                                               (node << IIC_IRQ_NODE_SHIFT));
@@ -408,3 +406,21 @@ int __init cbe_init_pm_irq(void)
 }
 arch_initcall(cbe_init_pm_irq);
 
+void cbe_sync_irq(int node)
+{
+       unsigned int irq;
+
+       irq = irq_find_mapping(NULL,
+                              IIC_IRQ_IOEX_PMI
+                              | (node << IIC_IRQ_NODE_SHIFT));
+
+       if (irq == NO_IRQ) {
+               printk(KERN_WARNING "ERROR, unable to get existing irq %d " \
+               "for node %d\n", irq, node);
+               return;
+       }
+
+       synchronize_irq(irq);
+}
+EXPORT_SYMBOL_GPL(cbe_sync_irq);
+