static void combiner_handle_cascade_irq(unsigned int irq, struct irq_desc *desc) { struct combiner_chip_data *chip_data = irq_get_handler_data(irq); struct irq_chip *chip = irq_get_chip(irq); unsigned int cascade_irq, combiner_irq; unsigned long status; chained_irq_enter(chip, desc); spin_lock(&irq_controller_lock); status = __raw_readl(chip_data->base + COMBINER_INT_STATUS); spin_unlock(&irq_controller_lock); status &= chip_data->irq_mask; if (status == 0) goto out; combiner_irq = chip_data->hwirq_offset + __ffs(status); cascade_irq = irq_find_mapping(combiner_irq_domain, combiner_irq); if (unlikely(!cascade_irq)) handle_bad_irq(irq, desc); else generic_handle_irq(cascade_irq); out: chained_irq_exit(chip, desc); }
static void rps_handle_cascade_irq(struct irq_desc *desc) #endif { struct rps_chip_data *chip_data = irq_desc_get_handler_data(desc); struct irq_chip *chip = irq_desc_get_chip(desc); unsigned int cascade_irq, rps_irq; u32 status; chained_irq_enter(chip, desc); status = ioread32(chip_data->base + RPS_STATUS); rps_irq = __ffs(status); cascade_irq = irq_find_mapping(chip_data->domain, rps_irq); if (unlikely(rps_irq >= RPS_IRQ_COUNT)) #if LINUX_VERSION_CODE < KERNEL_VERSION(4,2,0) handle_bad_irq(cascade_irq, desc); #else handle_bad_irq(desc); #endif else
void __ipipe_ack_bad_irq(unsigned irq, struct irq_desc *desc) { static int done; handle_bad_irq(irq, desc); if (!done) { printk(KERN_WARNING "%s: unknown flow handler for IRQ %d\n", __FUNCTION__, irq); done = 1; } }
asmlinkage void asm_do_IRQ(unsigned int irq, struct pt_regs *regs) { struct pt_regs *old_regs = set_irq_regs(regs); irq_enter(); check_stack_overflow(irq); /* * Some hardware gives randomly wrong interrupts. Rather * than crashing, do something sensible. */ if (irq >= NR_IRQS) handle_bad_irq(&bad_irq_desc); else generic_handle_irq(irq); maybe_lower_to_irq14(); irq_exit(); set_irq_regs(old_regs); }