2005-04-17 02:20:36 +04:00
/*
* 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 ) 1994 by Waldorf GMBH , written by Ralf Baechle
* Copyright ( C ) 1995 , 96 , 97 , 98 , 99 , 2000 , 01 , 02 , 03 by Ralf Baechle
*/
# ifndef _ASM_IRQ_H
# define _ASM_IRQ_H
# include <linux/linkage.h>
2006-04-05 12:45:45 +04:00
# include <asm/mipsmtregs.h>
2005-04-17 02:20:36 +04:00
# include <irq.h>
# ifdef CONFIG_I8259
static inline int irq_canonicalize ( int irq )
{
2007-01-14 17:41:42 +03:00
return ( ( irq = = I8259A_IRQ_BASE + 2 ) ? I8259A_IRQ_BASE + 9 : irq ) ;
2005-04-17 02:20:36 +04:00
}
# else
# define irq_canonicalize(irq) (irq) /* Sane hardware, sane code ... */
# endif
2007-07-12 19:21:08 +04:00
# ifdef CONFIG_MIPS_MT_SMTC_IM_BACKSTOP
2006-04-05 12:45:45 +04:00
/*
* Clear interrupt mask handling " backstop " if irq_hwmask
* entry so indicates . This implies that the ack ( ) or end ( )
* functions will take over re - enabling the low - level mask .
* Otherwise it will be done on return from exception .
*/
2007-01-07 18:50:34 +03:00
# define __DO_IRQ_SMTC_HOOK(irq) \
2006-04-05 12:45:45 +04:00
do { \
if ( irq_hwmask [ irq ] & 0x0000ff00 ) \
write_c0_tccontext ( read_c0_tccontext ( ) & \
~ ( irq_hwmask [ irq ] & 0x0000ff00 ) ) ; \
} while ( 0 )
# else
2007-01-07 18:50:34 +03:00
# define __DO_IRQ_SMTC_HOOK(irq) do { } while (0)
2006-04-05 12:45:45 +04:00
# endif
2005-04-17 02:20:36 +04:00
/*
* do_IRQ handles all normal device IRQ ' s ( the special
* SMP cross - CPU interrupts have their own specific
* handlers ) .
*
* Ideally there should be away to get this into kernel / irq / handle . c to
* avoid the overhead of a call for just a tiny function . . .
*/
2006-10-07 22:44:33 +04:00
# define do_IRQ(irq) \
2005-04-17 02:20:36 +04:00
do { \
irq_enter ( ) ; \
2007-01-07 18:50:34 +03:00
__DO_IRQ_SMTC_HOOK ( irq ) ; \
2006-11-13 19:13:18 +03:00
generic_handle_irq ( irq ) ; \
2005-04-17 02:20:36 +04:00
irq_exit ( ) ; \
} while ( 0 )
extern void arch_init_irq ( void ) ;
2006-10-07 22:44:33 +04:00
extern void spurious_interrupt ( void ) ;
2005-04-17 02:20:36 +04:00
2006-04-05 12:45:45 +04:00
# ifdef CONFIG_MIPS_MT_SMTC
struct irqaction ;
extern unsigned long irq_hwmask [ ] ;
extern int setup_irq_smtc ( unsigned int irq , struct irqaction * new ,
unsigned long hwmask ) ;
# endif /* CONFIG_MIPS_MT_SMTC */
2006-11-06 20:41:06 +03:00
extern int allocate_irqno ( void ) ;
extern void alloc_legacy_irqno ( void ) ;
extern void free_irqno ( unsigned int irq ) ;
2007-06-21 01:27:10 +04:00
/*
* Before R2 the timer and performance counter interrupts were both fixed to
* IE7 . Since R2 their number has to be read from the c0_intctl register .
*/
# define CP0_LEGACY_COMPARE_IRQ 7
extern int cp0_compare_irq ;
extern int cp0_perfcount_irq ;
2005-04-17 02:20:36 +04:00
# endif /* _ASM_IRQ_H */