static void trout_gpio_irq_handler(unsigned int irq, struct irq_desc *desc) { int j, m; unsigned v; int bank; int stat_reg; int int_base = TROUT_INT_START; uint8_t int_mask; for (bank = 0; bank < 2; bank++) { stat_reg = TROUT_BANK_TO_STAT_REG(bank); v = readb(TROUT_CPLD_BASE + stat_reg); int_mask = trout_int_mask[bank]; if (v & int_mask) { writeb(v & int_mask, TROUT_CPLD_BASE + stat_reg); printk(KERN_ERR "trout_gpio_irq_handler: got masked " "interrupt: %d:%02x\n", bank, v & int_mask); } v &= ~int_mask; while (v) { m = v & -v; j = fls(m) - 1; /*printk(KERN_INFO "msm_gpio_irq_handler %d:%02x %02x b" "it %d irq %d\n", bank, v, m, j, int_base + j);*/ v &= ~m; generic_handle_irq(int_base + j); } int_base += TROUT_INT_BANK0_COUNT; } desc->irq_data.chip->irq_ack(&desc->irq_data); }
static void trout_gpio_irq_ack(struct irq_data *d) { int bank = TROUT_INT_TO_BANK(d->irq); uint8_t mask = TROUT_INT_TO_MASK(d->irq); int reg = TROUT_BANK_TO_STAT_REG(bank); /*printk(KERN_INFO "trout_gpio_irq_ack irq %d\n", d->irq);*/ writeb(mask, TROUT_CPLD_BASE + reg); }
static void trout_gpio_irq_ack(struct irq_data *d) { int bank = TROUT_INT_TO_BANK(d->irq); uint8_t mask = TROUT_INT_TO_MASK(d->irq); int reg = TROUT_BANK_TO_STAT_REG(bank); writeb(mask, TROUT_CPLD_BASE + reg); }