1bbfbd8b1SPaul Mundt #ifndef __SH_INTC_H 2bbfbd8b1SPaul Mundt #define __SH_INTC_H 3bbfbd8b1SPaul Mundt 4bbfbd8b1SPaul Mundt typedef unsigned char intc_enum; 5bbfbd8b1SPaul Mundt 6bbfbd8b1SPaul Mundt struct intc_vect { 7bbfbd8b1SPaul Mundt intc_enum enum_id; 8bbfbd8b1SPaul Mundt unsigned short vect; 9bbfbd8b1SPaul Mundt }; 10bbfbd8b1SPaul Mundt 11bbfbd8b1SPaul Mundt #define INTC_VECT(enum_id, vect) { enum_id, vect } 12bbfbd8b1SPaul Mundt #define INTC_IRQ(enum_id, irq) INTC_VECT(enum_id, irq2evt(irq)) 13bbfbd8b1SPaul Mundt 14bbfbd8b1SPaul Mundt struct intc_group { 15bbfbd8b1SPaul Mundt intc_enum enum_id; 16bbfbd8b1SPaul Mundt intc_enum enum_ids[32]; 17bbfbd8b1SPaul Mundt }; 18bbfbd8b1SPaul Mundt 19bbfbd8b1SPaul Mundt #define INTC_GROUP(enum_id, ids...) { enum_id, { ids } } 20bbfbd8b1SPaul Mundt 21bbfbd8b1SPaul Mundt struct intc_mask_reg { 22bbfbd8b1SPaul Mundt unsigned long set_reg, clr_reg, reg_width; 23bbfbd8b1SPaul Mundt intc_enum enum_ids[32]; 24bbfbd8b1SPaul Mundt #ifdef CONFIG_SMP 25bbfbd8b1SPaul Mundt unsigned long smp; 26bbfbd8b1SPaul Mundt #endif 27bbfbd8b1SPaul Mundt }; 28bbfbd8b1SPaul Mundt 29bbfbd8b1SPaul Mundt struct intc_prio_reg { 30bbfbd8b1SPaul Mundt unsigned long set_reg, clr_reg, reg_width, field_width; 31bbfbd8b1SPaul Mundt intc_enum enum_ids[16]; 32bbfbd8b1SPaul Mundt #ifdef CONFIG_SMP 33bbfbd8b1SPaul Mundt unsigned long smp; 34bbfbd8b1SPaul Mundt #endif 35bbfbd8b1SPaul Mundt }; 36bbfbd8b1SPaul Mundt 37bbfbd8b1SPaul Mundt struct intc_sense_reg { 38bbfbd8b1SPaul Mundt unsigned long reg, reg_width, field_width; 39bbfbd8b1SPaul Mundt intc_enum enum_ids[16]; 40bbfbd8b1SPaul Mundt }; 41bbfbd8b1SPaul Mundt 42bbfbd8b1SPaul Mundt #ifdef CONFIG_SMP 43bbfbd8b1SPaul Mundt #define INTC_SMP(stride, nr) .smp = (stride) | ((nr) << 8) 44bbfbd8b1SPaul Mundt #else 45bbfbd8b1SPaul Mundt #define INTC_SMP(stride, nr) 46bbfbd8b1SPaul Mundt #endif 47bbfbd8b1SPaul Mundt 48577cd758SMagnus Damm struct intc_hw_desc { 49bbfbd8b1SPaul Mundt struct intc_vect *vectors; 50bbfbd8b1SPaul Mundt unsigned int nr_vectors; 51bbfbd8b1SPaul Mundt struct intc_group *groups; 52bbfbd8b1SPaul Mundt unsigned int nr_groups; 53bbfbd8b1SPaul Mundt struct intc_mask_reg *mask_regs; 54bbfbd8b1SPaul Mundt unsigned int nr_mask_regs; 55bbfbd8b1SPaul Mundt struct intc_prio_reg *prio_regs; 56bbfbd8b1SPaul Mundt unsigned int nr_prio_regs; 57bbfbd8b1SPaul Mundt struct intc_sense_reg *sense_regs; 58bbfbd8b1SPaul Mundt unsigned int nr_sense_regs; 59bbfbd8b1SPaul Mundt struct intc_mask_reg *ack_regs; 60bbfbd8b1SPaul Mundt unsigned int nr_ack_regs; 61bbfbd8b1SPaul Mundt }; 62bbfbd8b1SPaul Mundt 63bbfbd8b1SPaul Mundt #define _INTC_ARRAY(a) a, sizeof(a)/sizeof(*a) 64577cd758SMagnus Damm #define INTC_HW_DESC(vectors, groups, mask_regs, \ 65577cd758SMagnus Damm prio_regs, sense_regs, ack_regs) \ 66577cd758SMagnus Damm { \ 67577cd758SMagnus Damm _INTC_ARRAY(vectors), _INTC_ARRAY(groups), \ 68577cd758SMagnus Damm _INTC_ARRAY(mask_regs), _INTC_ARRAY(prio_regs), \ 69577cd758SMagnus Damm _INTC_ARRAY(sense_regs), _INTC_ARRAY(ack_regs), \ 70577cd758SMagnus Damm } 71577cd758SMagnus Damm 72577cd758SMagnus Damm struct intc_desc { 73577cd758SMagnus Damm char *name; 74d5190953SMagnus Damm intc_enum force_enable; 75*d85429a3SMagnus Damm intc_enum force_disable; 76577cd758SMagnus Damm struct intc_hw_desc hw; 77577cd758SMagnus Damm }; 78577cd758SMagnus Damm 79bbfbd8b1SPaul Mundt #define DECLARE_INTC_DESC(symbol, chipname, vectors, groups, \ 80bbfbd8b1SPaul Mundt mask_regs, prio_regs, sense_regs) \ 81bbfbd8b1SPaul Mundt struct intc_desc symbol __initdata = { \ 82577cd758SMagnus Damm .name = chipname, \ 83577cd758SMagnus Damm .hw = INTC_HW_DESC(vectors, groups, mask_regs, \ 84577cd758SMagnus Damm prio_regs, sense_regs, NULL), \ 85bbfbd8b1SPaul Mundt } 86bbfbd8b1SPaul Mundt 87bbfbd8b1SPaul Mundt #define DECLARE_INTC_DESC_ACK(symbol, chipname, vectors, groups, \ 88bbfbd8b1SPaul Mundt mask_regs, prio_regs, sense_regs, ack_regs) \ 89bbfbd8b1SPaul Mundt struct intc_desc symbol __initdata = { \ 90577cd758SMagnus Damm .name = chipname, \ 91577cd758SMagnus Damm .hw = INTC_HW_DESC(vectors, groups, mask_regs, \ 92577cd758SMagnus Damm prio_regs, sense_regs, ack_regs), \ 93bbfbd8b1SPaul Mundt } 94bbfbd8b1SPaul Mundt 95bbfbd8b1SPaul Mundt void __init register_intc_controller(struct intc_desc *desc); 96bbfbd8b1SPaul Mundt int intc_set_priority(unsigned int irq, unsigned int prio); 97bbfbd8b1SPaul Mundt 9845b9deafSPaul Mundt int reserve_irq_vector(unsigned int irq); 9945b9deafSPaul Mundt void reserve_irq_legacy(void); 10045b9deafSPaul Mundt 101bbfbd8b1SPaul Mundt #endif /* __SH_INTC_H */ 102