2005-04-16 15:20:36 -07:00
# ifndef __ASM_SH_HW_IRQ_H
# define __ASM_SH_HW_IRQ_H
2007-07-18 17:25:09 +09:00
# include <linux/init.h>
2006-10-06 15:31:16 +09:00
# include <asm/atomic.h>
extern atomic_t irq_err_count ;
2007-06-15 18:56:19 +09:00
struct ipr_data {
unsigned char irq ;
unsigned char ipr_idx ; /* Index for the IPR registered */
unsigned char shift ; /* Number of bits to shift the data */
unsigned char priority ; /* The priority */
} ;
struct ipr_desc {
unsigned long * ipr_offsets ;
unsigned int nr_offsets ;
struct ipr_data * ipr_data ;
unsigned int nr_irqs ;
struct irq_chip chip ;
} ;
void register_ipr_controller ( struct ipr_desc * ) ;
2007-07-18 17:25:09 +09:00
typedef unsigned char intc_enum ;
struct intc_vect {
intc_enum enum_id ;
unsigned short vect ;
} ;
# define INTC_VECT(enum_id, vect) { enum_id, vect }
2007-08-03 14:25:32 +09:00
# define INTC_IRQ(enum_id, irq) INTC_VECT(enum_id, irq2evt(irq))
2007-07-18 17:25:09 +09:00
struct intc_prio {
intc_enum enum_id ;
unsigned char priority ;
} ;
# define INTC_PRIO(enum_id, prio) { enum_id, prio }
struct intc_group {
intc_enum enum_id ;
2007-08-17 00:45:35 +09:00
intc_enum enum_ids [ 32 ] ;
2007-07-18 17:25:09 +09:00
} ;
2007-08-17 00:45:35 +09:00
# define INTC_GROUP(enum_id, ids...) { enum_id, { ids } }
2007-07-18 17:25:09 +09:00
struct intc_mask_reg {
unsigned long set_reg , clr_reg , reg_width ;
intc_enum enum_ids [ 32 ] ;
2007-09-21 18:16:42 +09:00
# ifdef CONFIG_SMP
unsigned long smp ;
# endif
2007-07-18 17:25:09 +09:00
} ;
struct intc_prio_reg {
2007-08-12 15:22:02 +09:00
unsigned long set_reg , clr_reg , reg_width , field_width ;
2007-07-18 17:25:09 +09:00
intc_enum enum_ids [ 16 ] ;
2007-09-21 18:16:42 +09:00
# ifdef CONFIG_SMP
unsigned long smp ;
# endif
2007-07-18 17:25:09 +09:00
} ;
struct intc_sense_reg {
unsigned long reg , reg_width , field_width ;
intc_enum enum_ids [ 16 ] ;
} ;
2007-09-21 18:16:42 +09:00
# ifdef CONFIG_SMP
# define INTC_SMP(stride, nr) .smp = (stride) | ((nr) << 8)
# else
# define INTC_SMP(stride, nr)
# endif
2007-07-18 17:25:09 +09:00
struct intc_desc {
struct intc_vect * vectors ;
unsigned int nr_vectors ;
struct intc_group * groups ;
unsigned int nr_groups ;
struct intc_prio * priorities ;
unsigned int nr_priorities ;
struct intc_mask_reg * mask_regs ;
unsigned int nr_mask_regs ;
struct intc_prio_reg * prio_regs ;
unsigned int nr_prio_regs ;
struct intc_sense_reg * sense_regs ;
unsigned int nr_sense_regs ;
2007-08-12 15:26:12 +09:00
char * name ;
2007-07-18 17:25:09 +09:00
} ;
# define _INTC_ARRAY(a) a, sizeof(a) / sizeof(*a)
# define DECLARE_INTC_DESC(symbol, chipname, vectors, groups, \
priorities , mask_regs , prio_regs , sense_regs ) \
2007-08-17 00:45:35 +09:00
struct intc_desc symbol __initdata = { \
2007-07-18 17:25:09 +09:00
_INTC_ARRAY ( vectors ) , _INTC_ARRAY ( groups ) , \
_INTC_ARRAY ( priorities ) , \
_INTC_ARRAY ( mask_regs ) , _INTC_ARRAY ( prio_regs ) , \
_INTC_ARRAY ( sense_regs ) , \
2007-08-12 15:26:12 +09:00
chipname , \
2007-07-18 17:25:09 +09:00
}
void __init register_intc_controller ( struct intc_desc * desc ) ;
2007-08-17 00:50:44 +09:00
int intc_set_priority ( unsigned int irq , unsigned int prio ) ;
2007-07-18 17:25:09 +09:00
2007-07-18 17:57:34 +09:00
void __init plat_irq_setup ( void ) ;
2007-07-31 17:11:21 +09:00
enum { IRQ_MODE_IRQ , IRQ_MODE_IRQ7654 , IRQ_MODE_IRQ3210 ,
2007-09-10 12:03:50 +09:00
IRQ_MODE_IRL7654_MASK , IRQ_MODE_IRL3210_MASK ,
2007-07-31 17:11:21 +09:00
IRQ_MODE_IRL7654 , IRQ_MODE_IRL3210 } ;
2007-07-20 12:10:29 +09:00
void __init plat_irq_setup_pins ( int mode ) ;
2005-04-16 15:20:36 -07:00
# endif /* __ASM_SH_HW_IRQ_H */