]> git.kernelconcepts.de Git - karo-tx-linux.git/blobdiff - arch/powerpc/platforms/cell/interrupt.c
powerpc/cell: fixup for removal of handle_iic_irq
[karo-tx-linux.git] / arch / powerpc / platforms / cell / interrupt.c
index 10eb1a443626b2b4411e0c488ad6386e3f2e8976..44cfd1bef89b319609ffc32b308f3d6f03ba3dfa 100644 (file)
@@ -72,15 +72,15 @@ static irq_hw_number_t iic_pending_to_hwnum(struct cbe_iic_pending_bits bits)
                return (node << IIC_IRQ_NODE_SHIFT) | (class << 4) | unit;
 }
 
-static void iic_mask(unsigned int irq)
+static void iic_mask(struct irq_data *d)
 {
 }
 
-static void iic_unmask(unsigned int irq)
+static void iic_unmask(struct irq_data *d)
 {
 }
 
-static void iic_eoi(unsigned int irq)
+static void iic_eoi(struct irq_data *d)
 {
        struct iic *iic = &__get_cpu_var(cpu_iic);
        out_be64(&iic->regs->prio, iic->eoi_stack[--iic->eoi_ptr]);
@@ -89,19 +89,21 @@ static void iic_eoi(unsigned int irq)
 
 static struct irq_chip iic_chip = {
        .name = "CELL-IIC",
-       .mask = iic_mask,
-       .unmask = iic_unmask,
-       .eoi = iic_eoi,
+       .irq_mask = iic_mask,
+       .irq_unmask = iic_unmask,
+       .irq_eoi = iic_eoi,
 };
 
 
-static void iic_ioexc_eoi(unsigned int irq)
+static void iic_ioexc_eoi(struct irq_data *d)
 {
 }
 
 static void iic_ioexc_cascade(unsigned int irq, struct irq_desc *desc)
 {
-       struct cbe_iic_regs __iomem *node_iic = (void __iomem *)desc->handler_data;
+       struct irq_chip *chip = irq_desc_get_chip(desc);
+       struct cbe_iic_regs __iomem *node_iic =
+               (void __iomem *)irq_desc_get_handler_data(desc);
        unsigned int base = (irq & 0xffffff00) | IIC_IRQ_TYPE_IOEXC;
        unsigned long bits, ack;
        int cascade;
@@ -128,15 +130,15 @@ static void iic_ioexc_cascade(unsigned int irq, struct irq_desc *desc)
                if (ack)
                        out_be64(&node_iic->iic_is, ack);
        }
-       desc->chip->eoi(irq);
+       chip->irq_eoi(&desc->irq_data);
 }
 
 
 static struct irq_chip iic_ioexc_chip = {
        .name = "CELL-IOEX",
-       .mask = iic_mask,
-       .unmask = iic_unmask,
-       .eoi = iic_ioexc_eoi,
+       .irq_mask = iic_mask,
+       .irq_unmask = iic_unmask,
+       .irq_eoi = iic_ioexc_eoi,
 };
 
 /* Get an IRQ number from the pending state register of the IIC */
@@ -233,65 +235,19 @@ static int iic_host_match(struct irq_host *h, struct device_node *node)
                                    "IBM,CBEA-Internal-Interrupt-Controller");
 }
 
-extern int noirqdebug;
-
-static void handle_iic_irq(unsigned int irq, struct irq_desc *desc)
-{
-       raw_spin_lock(&desc->lock);
-
-       desc->status &= ~(IRQ_REPLAY | IRQ_WAITING);
-
-       /*
-        * If we're currently running this IRQ, or its disabled,
-        * we shouldn't process the IRQ. Mark it pending, handle
-        * the necessary masking and go out
-        */
-       if (unlikely((desc->status & (IRQ_INPROGRESS | IRQ_DISABLED)) ||
-                   !desc->action)) {
-               desc->status |= IRQ_PENDING;
-               goto out_eoi;
-       }
-
-       kstat_incr_irqs_this_cpu(irq, desc);
-
-       /* Mark the IRQ currently in progress.*/
-       desc->status |= IRQ_INPROGRESS;
-
-       do {
-               struct irqaction *action = desc->action;
-               irqreturn_t action_ret;
-
-               if (unlikely(!action))
-                       goto out_eoi;
-
-               desc->status &= ~IRQ_PENDING;
-               raw_spin_unlock(&desc->lock);
-               action_ret = handle_IRQ_event(irq, action);
-               if (!noirqdebug)
-                       note_interrupt(irq, desc, action_ret);
-               raw_spin_lock(&desc->lock);
-
-       } while ((desc->status & (IRQ_PENDING | IRQ_DISABLED)) == IRQ_PENDING);
-
-       desc->status &= ~IRQ_INPROGRESS;
-out_eoi:
-       desc->chip->eoi(irq);
-       raw_spin_unlock(&desc->lock);
-}
-
 static int iic_host_map(struct irq_host *h, unsigned int virq,
                        irq_hw_number_t hw)
 {
        switch (hw & IIC_IRQ_TYPE_MASK) {
        case IIC_IRQ_TYPE_IPI:
-               set_irq_chip_and_handler(virq, &iic_chip, handle_percpu_irq);
+               irq_set_chip_and_handler(virq, &iic_chip, handle_percpu_irq);
                break;
        case IIC_IRQ_TYPE_IOEXC:
-               set_irq_chip_and_handler(virq, &iic_ioexc_chip,
-                                        handle_iic_irq);
+               irq_set_chip_and_handler(virq, &iic_ioexc_chip,
+                                        handle_edge_eoi_irq);
                break;
        default:
-               set_irq_chip_and_handler(virq, &iic_chip, handle_iic_irq);
+               irq_set_chip_and_handler(virq, &iic_chip, handle_edge_eoi_irq);
        }
        return 0;
 }
@@ -408,8 +364,8 @@ static int __init setup_iic(void)
                 * irq_data is a generic pointer that gets passed back
                 * to us later, so the forced cast is fine.
                 */
-               set_irq_data(cascade, (void __force *)node_iic);
-               set_irq_chained_handler(cascade , iic_ioexc_cascade);
+               irq_set_handler_data(cascade, (void __force *)node_iic);
+               irq_set_chained_handler(cascade, iic_ioexc_cascade);
                out_be64(&node_iic->iic_ir,
                         (1 << 12)              /* priority */ |
                         (node << 4)            /* dest node */ |