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);
}
Beispiel #2
0
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
Beispiel #3
0
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;
    }
}
Beispiel #4
0
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);
}