2005-04-17 02:20:36 +04:00
/*
* IRQ vector handles
*
* This file is subject to the terms and conditions of the GNU General Public
* License . See the file " COPYING " in the main directory of this archive
* for more details .
*
* Copyright ( C ) 1995 , 1996 , 1997 , 2003 by Ralf Baechle
*/
# include <linux/kernel.h>
# include <linux/init.h>
# include <linux/irq.h>
2005-02-21 19:18:36 +03:00
# include <linux/interrupt.h>
# include <linux/pci.h>
2005-04-17 02:20:36 +04:00
# include <asm/i8259.h>
# include <asm/irq_cpu.h>
2007-09-13 18:51:26 +04:00
# include <asm/irq_gt641xx.h>
2005-04-17 02:20:36 +04:00
# include <asm/gt64120.h>
2007-09-13 18:51:26 +04:00
# include <irq.h>
2005-02-21 19:18:36 +03:00
2006-10-07 22:44:33 +04:00
asmlinkage void plat_irq_dispatch ( void )
2005-02-21 19:18:36 +03:00
{
2007-09-13 18:51:26 +04:00
unsigned pending = read_c0_status ( ) & read_c0_cause ( ) & ST0_IM ;
int irq ;
2006-10-07 22:44:33 +04:00
2007-09-13 18:51:26 +04:00
if ( pending & CAUSEF_IP2 )
gt641xx_irq_dispatch ( ) ;
else if ( pending & CAUSEF_IP6 ) {
irq = i8259_irq ( ) ;
if ( irq < 0 )
spurious_interrupt ( ) ;
else
do_IRQ ( irq ) ;
} else if ( pending & CAUSEF_IP3 )
do_IRQ ( MIPS_CPU_IRQ_BASE + 3 ) ;
else if ( pending & CAUSEF_IP4 )
do_IRQ ( MIPS_CPU_IRQ_BASE + 4 ) ;
else if ( pending & CAUSEF_IP5 )
do_IRQ ( MIPS_CPU_IRQ_BASE + 5 ) ;
else if ( pending & CAUSEF_IP7 )
do_IRQ ( MIPS_CPU_IRQ_BASE + 7 ) ;
else
spurious_interrupt ( ) ;
2005-02-21 19:18:36 +03:00
}
2007-09-13 18:51:26 +04:00
static struct irqaction cascade = {
. handler = no_action ,
. name = " cascade " ,
2011-07-23 16:41:24 +04:00
. flags = IRQF_NO_THREAD ,
2005-02-21 19:18:36 +03:00
} ;
2005-04-17 02:20:36 +04:00
void __init arch_init_irq ( void )
{
2007-09-13 18:51:26 +04:00
mips_cpu_irq_init ( ) ;
gt641xx_irq_init ( ) ;
init_i8259_irqs ( ) ;
2005-02-21 19:18:36 +03:00
2007-09-13 18:51:26 +04:00
setup_irq ( GT641XX_CASCADE_IRQ , & cascade ) ;
setup_irq ( I8259_CASCADE_IRQ , & cascade ) ;
2005-04-17 02:20:36 +04:00
}