asmlinkage void 
vrc5476_irq_dispatch(struct pt_regs *regs)
{
	extern unsigned int do_IRQ(int irq, struct pt_regs *regs);
	extern void spurious_interrupt(void);

	u32 mask;
	int nile4_irq;

	mask = nile4_get_irq_stat(0);

	/* quick check for possible time interrupt */
	if (mask & (1 << VRC5476_IRQ_GPT)) {
		do_IRQ(VRC5476_IRQ_BASE + VRC5476_IRQ_GPT, regs);
		return;
	}

	/* check for i8259 interrupts */
	if (mask & (1 << VRC5476_I8259_CASCADE)) {
		int i8259_irq = nile4_i8259_iack();
		do_IRQ(I8259_IRQ_BASE + i8259_irq, regs);
		return;
	}

	/* regular nile4 interrupts (we should not really have any */
	for (nile4_irq = 0; mask; nile4_irq++, mask >>= 1) {
		if (mask & 1) {
			do_IRQ(VRC5476_IRQ_BASE + nile4_irq, regs);
			return;
		}
	}
	spurious_interrupt();
}
Esempio n. 2
0
void ddb_local0_irqdispatch(struct pt_regs *regs)
{
    u32 mask;
    int nile4_irq;

    mask = nile4_get_irq_stat(0);

    /* Handle the timer interrupt first */
#if 0
    if (mask & (1 << NILE4_INT_GPT)) {
        do_IRQ(nile4_to_irq(NILE4_INT_GPT), regs);
        mask &= ~(1 << NILE4_INT_GPT);
    }
#endif
    for (nile4_irq = 0; mask; nile4_irq++, mask >>= 1)
        if (mask & 1) {
            if (nile4_irq == NILE4_INT_INTE) {
                int i8259_irq;

                nile4_clear_irq(NILE4_INT_INTE);
                i8259_irq = nile4_i8259_iack();
                do_IRQ(i8259_irq, regs);
            } else
                do_IRQ(nile4_to_irq(nile4_irq), regs);

        }
}
Esempio n. 3
0
void ddb_local0_irqdispatch(struct pt_regs *regs)
{
	u32 mask;
	int nile4_irq;
#if 1
	volatile static int nesting = 0;
	if (nesting++ == 0)
		ddb5074_led_d3(1);
	ddb5074_led_hex(nesting < 16 ? nesting : 15);
#endif

	mask = nile4_get_irq_stat(0);
	nile4_clear_irq_mask(mask);

	/* Handle the timer interrupt first */
	if (mask & (1 << NILE4_INT_GPT)) {
		nile4_disable_irq(NILE4_INT_GPT);
		do_IRQ(nile4_to_irq(NILE4_INT_GPT), regs);
		nile4_enable_irq(NILE4_INT_GPT);
		mask &= ~(1 << NILE4_INT_GPT);
	}
	for (nile4_irq = 0; mask; nile4_irq++, mask >>= 1)
		if (mask & 1) {
			nile4_disable_irq(nile4_irq);
			if (nile4_irq == NILE4_INT_INTE) {
				int i8259_irq = nile4_i8259_iack();
				i8259_do_irq(i8259_irq, regs);
			} else
				do_IRQ(nile4_to_irq(nile4_irq), regs);
			nile4_enable_irq(nile4_irq);
		}
#if 1
	if (--nesting == 0)
		ddb5074_led_d3(0);
	ddb5074_led_hex(nesting < 16 ? nesting : 15);
#endif
}