1bbfbd8b1SPaul Mundt #ifndef __SH_INTC_H 2bbfbd8b1SPaul Mundt #define __SH_INTC_H 3bbfbd8b1SPaul Mundt 4*dec710b7SMagnus Damm #include <linux/ioport.h> 5*dec710b7SMagnus Damm 6bbfbd8b1SPaul Mundt typedef unsigned char intc_enum; 7bbfbd8b1SPaul Mundt 8bbfbd8b1SPaul Mundt struct intc_vect { 9bbfbd8b1SPaul Mundt intc_enum enum_id; 10bbfbd8b1SPaul Mundt unsigned short vect; 11bbfbd8b1SPaul Mundt }; 12bbfbd8b1SPaul Mundt 13bbfbd8b1SPaul Mundt #define INTC_VECT(enum_id, vect) { enum_id, vect } 14bbfbd8b1SPaul Mundt #define INTC_IRQ(enum_id, irq) INTC_VECT(enum_id, irq2evt(irq)) 15bbfbd8b1SPaul Mundt 16bbfbd8b1SPaul Mundt struct intc_group { 17bbfbd8b1SPaul Mundt intc_enum enum_id; 18bbfbd8b1SPaul Mundt intc_enum enum_ids[32]; 19bbfbd8b1SPaul Mundt }; 20bbfbd8b1SPaul Mundt 21bbfbd8b1SPaul Mundt #define INTC_GROUP(enum_id, ids...) { enum_id, { ids } } 22bbfbd8b1SPaul Mundt 23bbfbd8b1SPaul Mundt struct intc_mask_reg { 24bbfbd8b1SPaul Mundt unsigned long set_reg, clr_reg, reg_width; 25bbfbd8b1SPaul Mundt intc_enum enum_ids[32]; 26bbfbd8b1SPaul Mundt #ifdef CONFIG_SMP 27bbfbd8b1SPaul Mundt unsigned long smp; 28bbfbd8b1SPaul Mundt #endif 29bbfbd8b1SPaul Mundt }; 30bbfbd8b1SPaul Mundt 31bbfbd8b1SPaul Mundt struct intc_prio_reg { 32bbfbd8b1SPaul Mundt unsigned long set_reg, clr_reg, reg_width, field_width; 33bbfbd8b1SPaul Mundt intc_enum enum_ids[16]; 34bbfbd8b1SPaul Mundt #ifdef CONFIG_SMP 35bbfbd8b1SPaul Mundt unsigned long smp; 36bbfbd8b1SPaul Mundt #endif 37bbfbd8b1SPaul Mundt }; 38bbfbd8b1SPaul Mundt 39bbfbd8b1SPaul Mundt struct intc_sense_reg { 40bbfbd8b1SPaul Mundt unsigned long reg, reg_width, field_width; 41bbfbd8b1SPaul Mundt intc_enum enum_ids[16]; 42bbfbd8b1SPaul Mundt }; 43bbfbd8b1SPaul Mundt 44bbfbd8b1SPaul Mundt #ifdef CONFIG_SMP 45bbfbd8b1SPaul Mundt #define INTC_SMP(stride, nr) .smp = (stride) | ((nr) << 8) 46bbfbd8b1SPaul Mundt #else 47bbfbd8b1SPaul Mundt #define INTC_SMP(stride, nr) 48bbfbd8b1SPaul Mundt #endif 49bbfbd8b1SPaul Mundt 50577cd758SMagnus Damm struct intc_hw_desc { 51bbfbd8b1SPaul Mundt struct intc_vect *vectors; 52bbfbd8b1SPaul Mundt unsigned int nr_vectors; 53bbfbd8b1SPaul Mundt struct intc_group *groups; 54bbfbd8b1SPaul Mundt unsigned int nr_groups; 55bbfbd8b1SPaul Mundt struct intc_mask_reg *mask_regs; 56bbfbd8b1SPaul Mundt unsigned int nr_mask_regs; 57bbfbd8b1SPaul Mundt struct intc_prio_reg *prio_regs; 58bbfbd8b1SPaul Mundt unsigned int nr_prio_regs; 59bbfbd8b1SPaul Mundt struct intc_sense_reg *sense_regs; 60bbfbd8b1SPaul Mundt unsigned int nr_sense_regs; 61bbfbd8b1SPaul Mundt struct intc_mask_reg *ack_regs; 62bbfbd8b1SPaul Mundt unsigned int nr_ack_regs; 63bbfbd8b1SPaul Mundt }; 64bbfbd8b1SPaul Mundt 65bbfbd8b1SPaul Mundt #define _INTC_ARRAY(a) a, sizeof(a)/sizeof(*a) 66577cd758SMagnus Damm #define INTC_HW_DESC(vectors, groups, mask_regs, \ 67577cd758SMagnus Damm prio_regs, sense_regs, ack_regs) \ 68577cd758SMagnus Damm { \ 69577cd758SMagnus Damm _INTC_ARRAY(vectors), _INTC_ARRAY(groups), \ 70577cd758SMagnus Damm _INTC_ARRAY(mask_regs), _INTC_ARRAY(prio_regs), \ 71577cd758SMagnus Damm _INTC_ARRAY(sense_regs), _INTC_ARRAY(ack_regs), \ 72577cd758SMagnus Damm } 73577cd758SMagnus Damm 74577cd758SMagnus Damm struct intc_desc { 75577cd758SMagnus Damm char *name; 76*dec710b7SMagnus Damm struct resource *resource; 77*dec710b7SMagnus Damm unsigned int num_resources; 78d5190953SMagnus Damm intc_enum force_enable; 79d85429a3SMagnus Damm intc_enum force_disable; 80577cd758SMagnus Damm struct intc_hw_desc hw; 81577cd758SMagnus Damm }; 82577cd758SMagnus Damm 83bbfbd8b1SPaul Mundt #define DECLARE_INTC_DESC(symbol, chipname, vectors, groups, \ 84bbfbd8b1SPaul Mundt mask_regs, prio_regs, sense_regs) \ 85bbfbd8b1SPaul Mundt struct intc_desc symbol __initdata = { \ 86577cd758SMagnus Damm .name = chipname, \ 87577cd758SMagnus Damm .hw = INTC_HW_DESC(vectors, groups, mask_regs, \ 88577cd758SMagnus Damm prio_regs, sense_regs, NULL), \ 89bbfbd8b1SPaul Mundt } 90bbfbd8b1SPaul Mundt 91bbfbd8b1SPaul Mundt #define DECLARE_INTC_DESC_ACK(symbol, chipname, vectors, groups, \ 92bbfbd8b1SPaul Mundt mask_regs, prio_regs, sense_regs, ack_regs) \ 93bbfbd8b1SPaul Mundt struct intc_desc symbol __initdata = { \ 94577cd758SMagnus Damm .name = chipname, \ 95577cd758SMagnus Damm .hw = INTC_HW_DESC(vectors, groups, mask_regs, \ 96577cd758SMagnus Damm prio_regs, sense_regs, ack_regs), \ 97bbfbd8b1SPaul Mundt } 98bbfbd8b1SPaul Mundt 9901e9651aSMagnus Damm int __init register_intc_controller(struct intc_desc *desc); 100bbfbd8b1SPaul Mundt int intc_set_priority(unsigned int irq, unsigned int prio); 101bbfbd8b1SPaul Mundt 10245b9deafSPaul Mundt int reserve_irq_vector(unsigned int irq); 10345b9deafSPaul Mundt void reserve_irq_legacy(void); 10445b9deafSPaul Mundt 105bbfbd8b1SPaul Mundt #endif /* __SH_INTC_H */ 106