diff options
Diffstat (limited to 'arch/mips/txx9/generic/irq_tx4938.c')
| -rw-r--r-- | arch/mips/txx9/generic/irq_tx4938.c | 48 | 
1 files changed, 48 insertions, 0 deletions
diff --git a/arch/mips/txx9/generic/irq_tx4938.c b/arch/mips/txx9/generic/irq_tx4938.c new file mode 100644 index 00000000000..0886d913881 --- /dev/null +++ b/arch/mips/txx9/generic/irq_tx4938.c @@ -0,0 +1,48 @@ +/* + * linux/arch/mips/tx4938/common/irq.c + * + * Common tx4938 irq handler + * Copyright (C) 2000-2001 Toshiba Corporation + * + * 2003-2005 (c) MontaVista Software, Inc. This file is licensed under the + * terms of the GNU General Public License version 2. This program is + * licensed "as is" without any warranty of any kind, whether express + * or implied. + * + * Support for TX4938 in 2.6 - Manish Lachwani (mlachwani@mvista.com) + */ +#include <linux/init.h> +#include <linux/interrupt.h> +#include <asm/irq_cpu.h> +#include <asm/mipsregs.h> +#include <asm/txx9/rbtx4938.h> + +void __init +tx4938_irq_init(void) +{ +	mips_cpu_irq_init(); +	txx9_irq_init(TX4938_IRC_REG); +	set_irq_chained_handler(TX4938_IRQ_NEST_PIC_ON_CP0, handle_simple_irq); +} + +int toshiba_rbtx4938_irq_nested(int irq); + +asmlinkage void plat_irq_dispatch(void) +{ +	unsigned int pending = read_c0_cause() & read_c0_status(); + +	if (pending & STATUSF_IP7) +		do_IRQ(TX4938_IRQ_CPU_TIMER); +	else if (pending & STATUSF_IP2) { +		int irq = txx9_irq(); +		if (irq == TX4938_IRQ_PIC_BEG + TX4938_IR_INT(0)) +			irq = toshiba_rbtx4938_irq_nested(irq); +		if (irq >= 0) +			do_IRQ(irq); +		else +			spurious_interrupt(); +	} else if (pending & STATUSF_IP1) +		do_IRQ(TX4938_IRQ_USER1); +	else if (pending & STATUSF_IP0) +		do_IRQ(TX4938_IRQ_USER0); +}  |