static void __init zeus_init_irq(void) { int level; int isa_irq; pxa27x_init_irq(); /* Peripheral IRQs. It would be nice to move those inside driver configuration, but it is not supported at the moment. */ set_irq_type(gpio_to_irq(ZEUS_AC97_GPIO), IRQ_TYPE_EDGE_RISING); set_irq_type(gpio_to_irq(ZEUS_WAKEUP_GPIO), IRQ_TYPE_EDGE_RISING); set_irq_type(gpio_to_irq(ZEUS_PTT_GPIO), IRQ_TYPE_EDGE_RISING); set_irq_type(gpio_to_irq(ZEUS_EXTGPIO_GPIO), IRQ_TYPE_EDGE_FALLING); set_irq_type(gpio_to_irq(ZEUS_CAN_GPIO), IRQ_TYPE_EDGE_FALLING); /* Setup ISA IRQs */ for (level = 0; level < ARRAY_SIZE(zeus_isa_irqs); level++) { isa_irq = zeus_bit_to_irq(level); set_irq_chip(isa_irq, &zeus_irq_chip); set_irq_handler(isa_irq, handle_edge_irq); set_irq_flags(isa_irq, IRQF_VALID | IRQF_PROBE); } set_irq_type(gpio_to_irq(ZEUS_ISA_GPIO), IRQ_TYPE_EDGE_RISING); set_irq_chained_handler(gpio_to_irq(ZEUS_ISA_GPIO), zeus_irq_handler); }
static void zeus_irq_handler(unsigned int irq, struct irq_desc *desc) { unsigned long pending; pending = zeus_irq_pending(); do { /* we're in a chained irq handler, * so ack the interrupt by hand */ desc->chip->ack(gpio_to_irq(ZEUS_ISA_GPIO)); if (likely(pending)) { irq = zeus_bit_to_irq(__ffs(pending)); generic_handle_irq(irq); } pending = zeus_irq_pending(); } while (pending); }
static void zeus_irq_handler(struct irq_desc *desc) { unsigned int irq; unsigned long pending; pending = zeus_irq_pending(); do { /* we're in a chained irq handler, * so ack the interrupt by hand */ desc->irq_data.chip->irq_ack(&desc->irq_data); if (likely(pending)) { irq = zeus_bit_to_irq(__ffs(pending)); generic_handle_irq(irq); } pending = zeus_irq_pending(); } while (pending); }