handle_edge_irq is now special cased for the cell EOI requirements. Use it and remove the duplicate code. Signed-off-by: Thomas Gleixner Cc: Benjamin Herrenschmidt Cc: Jeremy Kerr Cc: Arnd Bergmann --- arch/powerpc/platforms/cell/interrupt.c | 52 ++------------------------------ 1 file changed, 4 insertions(+), 48 deletions(-) Index: linux-2.6-tip/arch/powerpc/platforms/cell/interrupt.c =================================================================== --- linux-2.6-tip.orig/arch/powerpc/platforms/cell/interrupt.c +++ linux-2.6-tip/arch/powerpc/platforms/cell/interrupt.c @@ -233,52 +233,6 @@ static int iic_host_match(struct irq_hos "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) { @@ -287,11 +241,13 @@ static int iic_host_map(struct irq_host set_irq_chip_and_handler(virq, &iic_chip, handle_percpu_irq); break; case IIC_IRQ_TYPE_IOEXC: + irq_set_status_flags(i, IRQ_EDGE_EOI); set_irq_chip_and_handler(virq, &iic_ioexc_chip, - handle_iic_irq); + handle_edge_irq); break; default: - set_irq_chip_and_handler(virq, &iic_chip, handle_iic_irq); + irq_set_status_flags(i, IRQ_EDGE_EOI); + set_irq_chip_and_handler(virq, &iic_chip, handle_edge_irq); } return 0; } -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/