2005-04-17 02:20:36 +04:00
/*
* Copyright ( C ) 2003 Ralf Baechle
*
* 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
* option ) any later version .
*
* Handler for RM7000 extended interrupts . These are a non - standard
* feature so we handle them separately from standard interrupts .
*/
# include <linux/init.h>
# include <linux/interrupt.h>
# include <linux/kernel.h>
# include <asm/irq_cpu.h>
# include <asm/mipsregs.h>
# include <asm/system.h>
static inline void unmask_rm7k_irq ( unsigned int irq )
{
2007-01-07 20:14:29 +03:00
set_c0_intcontrol ( 0x100 < < ( irq - RM7K_CPU_IRQ_BASE ) ) ;
2005-04-17 02:20:36 +04:00
}
static inline void mask_rm7k_irq ( unsigned int irq )
{
2007-01-07 20:14:29 +03:00
clear_c0_intcontrol ( 0x100 < < ( irq - RM7K_CPU_IRQ_BASE ) ) ;
2005-04-17 02:20:36 +04:00
}
2006-07-02 17:41:42 +04:00
static struct irq_chip rm7k_irq_controller = {
2007-01-14 18:07:25 +03:00
. name = " RM7000 " ,
2006-11-01 20:08:36 +03:00
. ack = mask_rm7k_irq ,
. mask = mask_rm7k_irq ,
. mask_ack = mask_rm7k_irq ,
. unmask = unmask_rm7k_irq ,
2005-04-17 02:20:36 +04:00
} ;
2007-01-07 20:14:29 +03:00
void __init rm7k_cpu_irq_init ( void )
2005-04-17 02:20:36 +04:00
{
2007-01-07 20:14:29 +03:00
int base = RM7K_CPU_IRQ_BASE ;
2005-04-17 02:20:36 +04:00
int i ;
clear_c0_intcontrol ( 0x00000f00 ) ; /* Mask all */
2006-11-01 20:08:36 +03:00
for ( i = base ; i < base + 4 ; i + + )
2006-11-13 19:13:18 +03:00
set_irq_chip_and_handler ( i , & rm7k_irq_controller ,
handle_level_irq ) ;
2005-04-17 02:20:36 +04:00
}