static void ixdp2x01_irq_handler(unsigned int irq, struct irqdesc *desc, struct pt_regs *regs) { u32 ex_interrupt; int i; desc->chip->mask(irq); ex_interrupt = *IXDP2X01_INT_STAT_REG & valid_irq_mask; if (!ex_interrupt) { printk(KERN_ERR "Spurious IXDP2X01 CPLD interrupt!\n"); return; } for (i = 0; i < IXP2000_BOARD_IRQS; i++) { if (ex_interrupt & (1 << i)) { struct irqdesc *cpld_desc; int cpld_irq = IXP2000_BOARD_IRQ(0) + i; cpld_desc = irq_desc + cpld_irq; cpld_desc->handle(cpld_irq, cpld_desc, regs); } } desc->chip->unmask(irq); }
static void ixdp2x00_irq_handler(unsigned int irq, struct irq_desc *desc) { volatile u32 ex_interrupt = 0; static struct slowport_cfg old_cfg; int i; desc->irq_data.chip->irq_mask(&desc->irq_data); #ifdef CONFIG_ARCH_IXDP2400 if (machine_is_ixdp2400()) ixp2000_acquire_slowport(&slowport_cpld_cfg, &old_cfg); #endif ex_interrupt = *board_irq_stat & 0xff; if (machine_is_ixdp2400()) ixp2000_release_slowport(&old_cfg); if(!ex_interrupt) { printk(KERN_ERR "Spurious IXDP2x00 CPLD interrupt!\n"); return; } for(i = 0; i < board_irq_count; i++) { if(ex_interrupt & (1 << i)) { int cpld_irq = IXP2000_BOARD_IRQ(0) + i; generic_handle_irq(cpld_irq); } } desc->irq_data.chip->irq_unmask(&desc->irq_data); }
void __init ixdp2x00_init_irq(volatile unsigned long *stat_reg, volatile unsigned long *mask_reg, unsigned long nr_of_irqs) { unsigned int irq; ixp2000_init_irq(); if (!ixdp2x00_master_npu()) return; board_irq_stat = stat_reg; board_irq_mask = mask_reg; board_irq_count = nr_of_irqs; *board_irq_mask = 0xffffffff; for(irq = IXP2000_BOARD_IRQ(0); irq < IXP2000_BOARD_IRQ(board_irq_count); irq++) { irq_set_chip_and_handler(irq, &ixdp2x00_cpld_irq_chip, handle_level_irq); set_irq_flags(irq, IRQF_VALID); } /* Hook into PCI interrupt */ irq_set_chained_handler(IRQ_IXP2000_PCIB, ixdp2x00_irq_handler); }
static void ixdp2x01_irq_handler(unsigned int irq, struct irq_desc *desc) { u32 ex_interrupt; int i; desc->irq_data.chip->irq_mask(&desc->irq_data); ex_interrupt = *IXDP2X01_INT_STAT_REG & valid_irq_mask; if (!ex_interrupt) { printk(KERN_ERR "Spurious IXDP2X01 CPLD interrupt!\n"); return; } for (i = 0; i < IXP2000_BOARD_IRQS; i++) { if (ex_interrupt & (1 << i)) { int cpld_irq = IXP2000_BOARD_IRQ(0) + i; generic_handle_irq(cpld_irq); } } desc->irq_data.chip->irq_unmask(&desc->irq_data); }