2005-04-16 15:20:36 -07:00
# ifndef __ASM_SH_IRQ_H
# define __ASM_SH_IRQ_H
# include <asm/machvec.h>
2007-03-12 14:09:35 +09:00
/*
* A sane default based on a reasonable vector table size , platforms are
* advised to cap this at the hard limit that they ' re interested in
* through the machvec .
2005-04-16 15:20:36 -07:00
*/
2007-03-12 14:09:35 +09:00
# define NR_IRQS 256
2005-04-16 15:20:36 -07:00
2006-12-06 12:05:02 +09:00
/*
* Convert back and forth between INTEVT and IRQ values .
*/
2007-03-14 13:03:35 +09:00
# ifdef CONFIG_CPU_HAS_INTEVT
2006-12-06 12:05:02 +09:00
# define evt2irq(evt) (((evt) >> 5) - 16)
# define irq2evt(irq) (((irq) + 16) << 5)
2007-03-14 13:03:35 +09:00
# else
# define evt2irq(evt) (evt)
# define irq2evt(irq) (irq)
# endif
2006-12-06 12:05:02 +09:00
2005-04-16 15:20:36 -07:00
/*
* Simple Mask Register Support
*/
extern void make_maskreg_irq ( unsigned int irq ) ;
extern unsigned short * irq_mask_register ;
2006-09-27 17:03:56 +09:00
/*
* PINT IRQs
*/
void init_IRQ_pint ( void ) ;
2006-12-06 12:05:02 +09:00
/*
* The shift value is now the number of bits to shift , not the number of
* bits / 4. This is to make it easier to read the value directly from the
* datasheets . The IPR address , addr , will be set from ipr_idx via the
* map_ipridx_to_addr function .
*/
2006-10-31 12:35:02 +09:00
struct ipr_data {
unsigned int irq ;
2006-12-06 12:05:02 +09:00
int ipr_idx ; /* Index for the IPR registered */
int shift ; /* Number of bits to shift the data */
2006-10-31 12:35:02 +09:00
int priority ; /* The priority */
2006-12-06 12:05:02 +09:00
unsigned int addr ; /* Address of Interrupt Priority Register */
2006-10-31 12:35:02 +09:00
} ;
2006-12-06 12:05:02 +09:00
/*
* Given an IPR IDX , map the value to an IPR register address .
*/
unsigned int map_ipridx_to_addr ( int idx ) ;
/*
* Enable individual interrupt mode for external IPR IRQs .
*/
void ipr_irq_enable_irlm ( void ) ;
2005-04-16 15:20:36 -07:00
/*
* Function for " on chip support modules " .
*/
2006-12-06 12:05:02 +09:00
void make_ipr_irq ( struct ipr_data * table , unsigned int nr_irqs ) ;
void make_imask_irq ( unsigned int irq ) ;
void init_IRQ_ipr ( void ) ;
2005-04-16 15:20:36 -07:00
2006-10-06 17:35:48 +09:00
struct intc2_data {
unsigned short irq ;
unsigned char ipr_offset , ipr_shift ;
unsigned char msk_offset , msk_shift ;
unsigned char priority ;
} ;
2006-10-20 15:30:55 +09:00
void make_intc2_irq ( struct intc2_data * , unsigned int nr_irqs ) ;
2005-04-16 15:20:36 -07:00
void init_IRQ_intc2 ( void ) ;
2006-09-27 17:38:11 +09:00
2005-04-16 15:20:36 -07:00
static inline int generic_irq_demux ( int irq )
{
return irq ;
}
# define irq_canonicalize(irq) (irq)
2006-11-20 13:55:34 +09:00
# define irq_demux(irq) sh_mv.mv_irq_demux(irq)
2005-04-16 15:20:36 -07:00
2006-09-27 18:22:14 +09:00
# ifdef CONFIG_4KSTACKS
extern void irq_ctx_init ( int cpu ) ;
extern void irq_ctx_exit ( int cpu ) ;
# define __ARCH_HAS_DO_SOFTIRQ
# else
# define irq_ctx_init(cpu) do { } while (0)
# define irq_ctx_exit(cpu) do { } while (0)
# endif
2005-04-16 15:20:36 -07:00
# endif /* __ASM_SH_IRQ_H */