1/* 2 * IRQ vector handles 3 * 4 * This file is subject to the terms and conditions of the GNU General Public 5 * License. See the file "COPYING" in the main directory of this archive 6 * for more details. 7 * 8 * Copyright (C) 1995, 1996, 1997, 2003 by Ralf Baechle 9 */ 10#include <linux/kernel.h> 11#include <linux/init.h> 12#include <linux/irq.h> 13#include <linux/interrupt.h> 14#include <linux/pci.h> 15 16#include <asm/i8259.h> 17#include <asm/irq_cpu.h> 18#include <asm/irq_gt641xx.h> 19#include <asm/gt64120.h> 20 21#include <irq.h> 22 23asmlinkage void plat_irq_dispatch(void) 24{ 25 unsigned pending = read_c0_status() & read_c0_cause() & ST0_IM; 26 int irq; 27 28 if (pending & CAUSEF_IP2) 29 gt641xx_irq_dispatch(); 30 else if (pending & CAUSEF_IP6) { 31 irq = i8259_irq(); 32 if (irq < 0) 33 spurious_interrupt(); 34 else 35 do_IRQ(irq); 36 } else if (pending & CAUSEF_IP3) 37 do_IRQ(MIPS_CPU_IRQ_BASE + 3); 38 else if (pending & CAUSEF_IP4) 39 do_IRQ(MIPS_CPU_IRQ_BASE + 4); 40 else if (pending & CAUSEF_IP5) 41 do_IRQ(MIPS_CPU_IRQ_BASE + 5); 42 else if (pending & CAUSEF_IP7) 43 do_IRQ(MIPS_CPU_IRQ_BASE + 7); 44 else 45 spurious_interrupt(); 46} 47 48static struct irqaction cascade = { 49 .handler = no_action, 50 .name = "cascade", 51 .flags = IRQF_NO_THREAD, 52}; 53 54void __init arch_init_irq(void) 55{ 56 mips_cpu_irq_init(); 57 gt641xx_irq_init(); 58 init_i8259_irqs(); 59 60 setup_irq(GT641XX_CASCADE_IRQ, &cascade); 61 setup_irq(I8259_CASCADE_IRQ, &cascade); 62} 63