2007-06-06 10:52:38 +04:00
/*
* Copyright ( C ) 2007 Lemote Inc . & Insititute of Computing Technology
* Author : Fuxin Zhang , zhangfx @ lemote . com
*
2013-01-22 15:59:30 +04:00
* This program is free software ; you can redistribute it and / or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation ; either version 2 of the License , or ( at your
2007-06-06 10:52:38 +04:00
* option ) any later version .
*/
# include <linux/interrupt.h>
# include <asm/irq_cpu.h>
# include <asm/i8259.h>
2009-07-02 19:23:03 +04:00
# include <loongson.h>
2007-06-06 10:52:38 +04:00
static void i8259_irqdispatch ( void )
{
int irq ;
irq = i8259_irq ( ) ;
2009-07-02 19:23:03 +04:00
if ( irq > = 0 )
2007-06-06 10:52:38 +04:00
do_IRQ ( irq ) ;
2009-07-02 19:23:03 +04:00
else
2007-06-06 10:52:38 +04:00
spurious_interrupt ( ) ;
}
2009-07-02 19:26:45 +04:00
asmlinkage void mach_irq_dispatch ( unsigned int pending )
2007-06-06 10:52:38 +04:00
{
2009-07-02 19:23:03 +04:00
if ( pending & CAUSEF_IP7 )
2007-06-06 10:52:38 +04:00
do_IRQ ( MIPS_CPU_IRQ_BASE + 7 ) ;
2009-07-02 19:25:46 +04:00
else if ( pending & CAUSEF_IP6 ) /* perf counter loverflow */
2010-07-24 05:22:14 +04:00
do_perfcnt_IRQ ( ) ;
2009-07-02 19:23:03 +04:00
else if ( pending & CAUSEF_IP5 )
2007-06-06 10:52:38 +04:00
i8259_irqdispatch ( ) ;
2009-07-02 19:23:03 +04:00
else if ( pending & CAUSEF_IP2 )
2007-06-06 10:52:38 +04:00
bonito_irqdispatch ( ) ;
2009-07-02 19:23:03 +04:00
else
2007-06-06 10:52:38 +04:00
spurious_interrupt ( ) ;
}
static struct irqaction cascade_irqaction = {
. handler = no_action ,
. name = " cascade " ,
2011-07-23 16:41:24 +04:00
. flags = IRQF_NO_THREAD ,
2007-06-06 10:52:38 +04:00
} ;
2009-07-02 19:26:45 +04:00
void __init mach_init_irq ( void )
{
2007-06-06 10:52:38 +04:00
/* init all controller
2013-01-22 15:59:30 +04:00
* 0 - 15 - - - - - - > i8259 interrupt
* 16 - 23 - - - - - - > mips cpu interrupt
* 32 - 63 - - - - - - > bonito irq
2007-06-06 10:52:38 +04:00
*/
2010-07-24 05:22:13 +04:00
/* most bonito irq should be level triggered */
LOONGSON_INTEDGE = LOONGSON_ICU_SYSTEMERR | LOONGSON_ICU_MASTERERR |
LOONGSON_ICU_RETRYERR | LOONGSON_ICU_MBOXES ;
2007-06-06 10:52:38 +04:00
/* Sets the first-level interrupt dispatcher. */
mips_cpu_irq_init ( ) ;
init_i8259_irqs ( ) ;
bonito_irq_init ( ) ;
/* bonito irq at IP2 */
setup_irq ( MIPS_CPU_IRQ_BASE + 2 , & cascade_irqaction ) ;
/* 8259 irq at IP5 */
setup_irq ( MIPS_CPU_IRQ_BASE + 5 , & cascade_irqaction ) ;
}