void __init ixdp2351_init_irq(void) { int irq; /* Mask all interrupts from CPLD, disable simulation */ *IXDP2351_CPLD_INTA_MASK_SET_REG = (u16) -1; *IXDP2351_CPLD_INTB_MASK_SET_REG = (u16) -1; *IXDP2351_CPLD_INTA_SIM_REG = 0; *IXDP2351_CPLD_INTB_SIM_REG = 0; ixp23xx_init_irq(); for (irq = IXP23XX_MACH_IRQ(IXDP2351_INTA_IRQ_BASE); irq < IXP23XX_MACH_IRQ(IXDP2351_INTA_IRQ_BASE + IXDP2351_INTA_IRQ_NUM); irq++) { if (IXDP2351_INTA_IRQ_MASK(irq) & IXDP2351_INTA_IRQ_VALID) { set_irq_flags(irq, IRQF_VALID); set_irq_handler(irq, handle_level_irq); set_irq_chip(irq, &ixdp2351_inta_chip); } } for (irq = IXP23XX_MACH_IRQ(IXDP2351_INTB_IRQ_BASE); irq < IXP23XX_MACH_IRQ(IXDP2351_INTB_IRQ_BASE + IXDP2351_INTB_IRQ_NUM); irq++) { if (IXDP2351_INTB_IRQ_MASK(irq) & IXDP2351_INTB_IRQ_VALID) { set_irq_flags(irq, IRQF_VALID); set_irq_handler(irq, handle_level_irq); set_irq_chip(irq, &ixdp2351_intb_chip); } } set_irq_chained_handler(IRQ_IXP23XX_INTA, ixdp2351_inta_handler); set_irq_chained_handler(IRQ_IXP23XX_INTB, ixdp2351_intb_handler); }
void __init ixdp2351_init_irq(void) { int irq; /* */ *IXDP2351_CPLD_INTA_MASK_SET_REG = (u16) -1; *IXDP2351_CPLD_INTB_MASK_SET_REG = (u16) -1; *IXDP2351_CPLD_INTA_SIM_REG = 0; *IXDP2351_CPLD_INTB_SIM_REG = 0; ixp23xx_init_irq(); for (irq = IXP23XX_MACH_IRQ(IXDP2351_INTA_IRQ_BASE); irq < IXP23XX_MACH_IRQ(IXDP2351_INTA_IRQ_BASE + IXDP2351_INTA_IRQ_NUM); irq++) { if (IXDP2351_INTA_IRQ_MASK(irq) & IXDP2351_INTA_IRQ_VALID) { set_irq_flags(irq, IRQF_VALID); irq_set_chip_and_handler(irq, &ixdp2351_inta_chip, handle_level_irq); } } for (irq = IXP23XX_MACH_IRQ(IXDP2351_INTB_IRQ_BASE); irq < IXP23XX_MACH_IRQ(IXDP2351_INTB_IRQ_BASE + IXDP2351_INTB_IRQ_NUM); irq++) { if (IXDP2351_INTB_IRQ_MASK(irq) & IXDP2351_INTB_IRQ_VALID) { set_irq_flags(irq, IRQF_VALID); irq_set_chip_and_handler(irq, &ixdp2351_intb_chip, handle_level_irq); } } irq_set_chained_handler(IRQ_IXP23XX_INTA, ixdp2351_inta_handler); irq_set_chained_handler(IRQ_IXP23XX_INTB, ixdp2351_intb_handler); }
static void ixdp2351_intb_handler(unsigned int irq, struct irq_desc *desc) { u16 ex_interrupt = *IXDP2351_CPLD_INTB_STAT_REG & IXDP2351_INTB_IRQ_VALID; int i; desc->chip->ack(irq); for (i = 0; i < IXDP2351_INTB_IRQ_NUM; i++) { if (ex_interrupt & (1 << i)) { int cpld_irq = IXP23XX_MACH_IRQ(IXDP2351_INTB_IRQ_BASE + i); generic_handle_irq(cpld_irq); } } desc->chip->unmask(irq); }