1*bbfbd8b1SPaul Mundt #ifndef __SH_INTC_H 2*bbfbd8b1SPaul Mundt #define __SH_INTC_H 3*bbfbd8b1SPaul Mundt 4*bbfbd8b1SPaul Mundt typedef unsigned char intc_enum; 5*bbfbd8b1SPaul Mundt 6*bbfbd8b1SPaul Mundt struct intc_vect { 7*bbfbd8b1SPaul Mundt intc_enum enum_id; 8*bbfbd8b1SPaul Mundt unsigned short vect; 9*bbfbd8b1SPaul Mundt }; 10*bbfbd8b1SPaul Mundt 11*bbfbd8b1SPaul Mundt #define INTC_VECT(enum_id, vect) { enum_id, vect } 12*bbfbd8b1SPaul Mundt #define INTC_IRQ(enum_id, irq) INTC_VECT(enum_id, irq2evt(irq)) 13*bbfbd8b1SPaul Mundt 14*bbfbd8b1SPaul Mundt struct intc_group { 15*bbfbd8b1SPaul Mundt intc_enum enum_id; 16*bbfbd8b1SPaul Mundt intc_enum enum_ids[32]; 17*bbfbd8b1SPaul Mundt }; 18*bbfbd8b1SPaul Mundt 19*bbfbd8b1SPaul Mundt #define INTC_GROUP(enum_id, ids...) { enum_id, { ids } } 20*bbfbd8b1SPaul Mundt 21*bbfbd8b1SPaul Mundt struct intc_mask_reg { 22*bbfbd8b1SPaul Mundt unsigned long set_reg, clr_reg, reg_width; 23*bbfbd8b1SPaul Mundt intc_enum enum_ids[32]; 24*bbfbd8b1SPaul Mundt #ifdef CONFIG_SMP 25*bbfbd8b1SPaul Mundt unsigned long smp; 26*bbfbd8b1SPaul Mundt #endif 27*bbfbd8b1SPaul Mundt }; 28*bbfbd8b1SPaul Mundt 29*bbfbd8b1SPaul Mundt struct intc_prio_reg { 30*bbfbd8b1SPaul Mundt unsigned long set_reg, clr_reg, reg_width, field_width; 31*bbfbd8b1SPaul Mundt intc_enum enum_ids[16]; 32*bbfbd8b1SPaul Mundt #ifdef CONFIG_SMP 33*bbfbd8b1SPaul Mundt unsigned long smp; 34*bbfbd8b1SPaul Mundt #endif 35*bbfbd8b1SPaul Mundt }; 36*bbfbd8b1SPaul Mundt 37*bbfbd8b1SPaul Mundt struct intc_sense_reg { 38*bbfbd8b1SPaul Mundt unsigned long reg, reg_width, field_width; 39*bbfbd8b1SPaul Mundt intc_enum enum_ids[16]; 40*bbfbd8b1SPaul Mundt }; 41*bbfbd8b1SPaul Mundt 42*bbfbd8b1SPaul Mundt #ifdef CONFIG_SMP 43*bbfbd8b1SPaul Mundt #define INTC_SMP(stride, nr) .smp = (stride) | ((nr) << 8) 44*bbfbd8b1SPaul Mundt #else 45*bbfbd8b1SPaul Mundt #define INTC_SMP(stride, nr) 46*bbfbd8b1SPaul Mundt #endif 47*bbfbd8b1SPaul Mundt 48*bbfbd8b1SPaul Mundt struct intc_desc { 49*bbfbd8b1SPaul Mundt struct intc_vect *vectors; 50*bbfbd8b1SPaul Mundt unsigned int nr_vectors; 51*bbfbd8b1SPaul Mundt struct intc_group *groups; 52*bbfbd8b1SPaul Mundt unsigned int nr_groups; 53*bbfbd8b1SPaul Mundt struct intc_mask_reg *mask_regs; 54*bbfbd8b1SPaul Mundt unsigned int nr_mask_regs; 55*bbfbd8b1SPaul Mundt struct intc_prio_reg *prio_regs; 56*bbfbd8b1SPaul Mundt unsigned int nr_prio_regs; 57*bbfbd8b1SPaul Mundt struct intc_sense_reg *sense_regs; 58*bbfbd8b1SPaul Mundt unsigned int nr_sense_regs; 59*bbfbd8b1SPaul Mundt char *name; 60*bbfbd8b1SPaul Mundt #if defined(CONFIG_CPU_SH3) || defined(CONFIG_CPU_SH4A) 61*bbfbd8b1SPaul Mundt struct intc_mask_reg *ack_regs; 62*bbfbd8b1SPaul Mundt unsigned int nr_ack_regs; 63*bbfbd8b1SPaul Mundt #endif 64*bbfbd8b1SPaul Mundt }; 65*bbfbd8b1SPaul Mundt 66*bbfbd8b1SPaul Mundt #define _INTC_ARRAY(a) a, sizeof(a)/sizeof(*a) 67*bbfbd8b1SPaul Mundt #define DECLARE_INTC_DESC(symbol, chipname, vectors, groups, \ 68*bbfbd8b1SPaul Mundt mask_regs, prio_regs, sense_regs) \ 69*bbfbd8b1SPaul Mundt struct intc_desc symbol __initdata = { \ 70*bbfbd8b1SPaul Mundt _INTC_ARRAY(vectors), _INTC_ARRAY(groups), \ 71*bbfbd8b1SPaul Mundt _INTC_ARRAY(mask_regs), _INTC_ARRAY(prio_regs), \ 72*bbfbd8b1SPaul Mundt _INTC_ARRAY(sense_regs), \ 73*bbfbd8b1SPaul Mundt chipname, \ 74*bbfbd8b1SPaul Mundt } 75*bbfbd8b1SPaul Mundt 76*bbfbd8b1SPaul Mundt #if defined(CONFIG_CPU_SH3) || defined(CONFIG_CPU_SH4A) 77*bbfbd8b1SPaul Mundt #define DECLARE_INTC_DESC_ACK(symbol, chipname, vectors, groups, \ 78*bbfbd8b1SPaul Mundt mask_regs, prio_regs, sense_regs, ack_regs) \ 79*bbfbd8b1SPaul Mundt struct intc_desc symbol __initdata = { \ 80*bbfbd8b1SPaul Mundt _INTC_ARRAY(vectors), _INTC_ARRAY(groups), \ 81*bbfbd8b1SPaul Mundt _INTC_ARRAY(mask_regs), _INTC_ARRAY(prio_regs), \ 82*bbfbd8b1SPaul Mundt _INTC_ARRAY(sense_regs), \ 83*bbfbd8b1SPaul Mundt chipname, \ 84*bbfbd8b1SPaul Mundt _INTC_ARRAY(ack_regs), \ 85*bbfbd8b1SPaul Mundt } 86*bbfbd8b1SPaul Mundt #endif 87*bbfbd8b1SPaul Mundt 88*bbfbd8b1SPaul Mundt void __init register_intc_controller(struct intc_desc *desc); 89*bbfbd8b1SPaul Mundt int intc_set_priority(unsigned int irq, unsigned int prio); 90*bbfbd8b1SPaul Mundt 91*bbfbd8b1SPaul Mundt #endif /* __SH_INTC_H */ 92