Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

sh: Move the shared INTC code out to drivers/sh/

The INTC code will be re-used across different architectures, so move
this out to drivers/sh/ and include/linux/sh_intc.h respectively.

Signed-off-by: Paul Mundt <lethal@linux-sh.org>

+95 -93
+2 -90
arch/sh/include/asm/hw_irq.h
··· 2 2 #define __ASM_SH_HW_IRQ_H 3 3 4 4 #include <linux/init.h> 5 + #include <linux/sh_intc.h> 5 6 #include <asm/atomic.h> 6 7 7 8 extern atomic_t irq_err_count; ··· 24 23 25 24 void register_ipr_controller(struct ipr_desc *); 26 25 27 - typedef unsigned char intc_enum; 28 - 29 - struct intc_vect { 30 - intc_enum enum_id; 31 - unsigned short vect; 32 - }; 33 - 34 - #define INTC_VECT(enum_id, vect) { enum_id, vect } 35 - #define INTC_IRQ(enum_id, irq) INTC_VECT(enum_id, irq2evt(irq)) 36 - 37 - struct intc_group { 38 - intc_enum enum_id; 39 - intc_enum enum_ids[32]; 40 - }; 41 - 42 - #define INTC_GROUP(enum_id, ids...) { enum_id, { ids } } 43 - 44 - struct intc_mask_reg { 45 - unsigned long set_reg, clr_reg, reg_width; 46 - intc_enum enum_ids[32]; 47 - #ifdef CONFIG_SMP 48 - unsigned long smp; 49 - #endif 50 - }; 51 - 52 - struct intc_prio_reg { 53 - unsigned long set_reg, clr_reg, reg_width, field_width; 54 - intc_enum enum_ids[16]; 55 - #ifdef CONFIG_SMP 56 - unsigned long smp; 57 - #endif 58 - }; 59 - 60 - struct intc_sense_reg { 61 - unsigned long reg, reg_width, field_width; 62 - intc_enum enum_ids[16]; 63 - }; 64 - 65 - #ifdef CONFIG_SMP 66 - #define INTC_SMP(stride, nr) .smp = (stride) | ((nr) << 8) 67 - #else 68 - #define INTC_SMP(stride, nr) 69 - #endif 70 - 71 - struct intc_desc { 72 - struct intc_vect *vectors; 73 - unsigned int nr_vectors; 74 - struct intc_group *groups; 75 - unsigned int nr_groups; 76 - struct intc_mask_reg *mask_regs; 77 - unsigned int nr_mask_regs; 78 - struct intc_prio_reg *prio_regs; 79 - unsigned int nr_prio_regs; 80 - struct intc_sense_reg *sense_regs; 81 - unsigned int nr_sense_regs; 82 - char *name; 83 - #if defined(CONFIG_CPU_SH3) || defined(CONFIG_CPU_SH4A) 84 - struct intc_mask_reg *ack_regs; 85 - unsigned int nr_ack_regs; 86 - #endif 87 - }; 88 - 89 - #define _INTC_ARRAY(a) a, sizeof(a)/sizeof(*a) 90 - #define DECLARE_INTC_DESC(symbol, chipname, vectors, groups, \ 91 - mask_regs, prio_regs, sense_regs) \ 92 - struct intc_desc symbol __initdata = { \ 93 - _INTC_ARRAY(vectors), _INTC_ARRAY(groups), \ 94 - _INTC_ARRAY(mask_regs), _INTC_ARRAY(prio_regs), \ 95 - _INTC_ARRAY(sense_regs), \ 96 - chipname, \ 97 - } 98 - 99 - #if defined(CONFIG_CPU_SH3) || defined(CONFIG_CPU_SH4A) 100 - #define DECLARE_INTC_DESC_ACK(symbol, chipname, vectors, groups, \ 101 - mask_regs, prio_regs, sense_regs, ack_regs) \ 102 - struct intc_desc symbol __initdata = { \ 103 - _INTC_ARRAY(vectors), _INTC_ARRAY(groups), \ 104 - _INTC_ARRAY(mask_regs), _INTC_ARRAY(prio_regs), \ 105 - _INTC_ARRAY(sense_regs), \ 106 - chipname, \ 107 - _INTC_ARRAY(ack_regs), \ 108 - } 109 - #endif 110 - 111 - void __init register_intc_controller(struct intc_desc *desc); 112 - int intc_set_priority(unsigned int irq, unsigned int prio); 113 - 114 26 void __init plat_irq_setup(void); 115 - #ifdef CONFIG_CPU_SH3 116 27 void __init plat_irq_setup_sh3(void); 117 - #endif 28 + void __init plat_irq_setup_pins(int mode); 118 29 119 30 enum { IRQ_MODE_IRQ, IRQ_MODE_IRQ7654, IRQ_MODE_IRQ3210, 120 31 IRQ_MODE_IRL7654_MASK, IRQ_MODE_IRL3210_MASK, 121 32 IRQ_MODE_IRL7654, IRQ_MODE_IRL3210 }; 122 - void __init plat_irq_setup_pins(int mode); 123 33 124 34 #endif /* __ASM_SH_HW_IRQ_H */
-2
arch/sh/kernel/cpu/irq/Makefile
··· 1 1 # 2 2 # Makefile for the Linux/SuperH CPU-specifc IRQ handlers. 3 3 # 4 - obj-y += intc.o 5 - 6 4 obj-$(CONFIG_SUPERH32) += imask.o 7 5 obj-$(CONFIG_CPU_SH5) += intc-sh5.o 8 6 obj-$(CONFIG_CPU_HAS_IPR_IRQ) += ipr.o
+1
arch/sh/kernel/cpu/irq/intc.c drivers/sh/intc.c
··· 21 21 #include <linux/io.h> 22 22 #include <linux/interrupt.h> 23 23 #include <linux/bootmem.h> 24 + #include <linux/sh_intc.h> 24 25 25 26 #define _INTC_MK(fn, mode, addr_e, addr_d, width, shift) \ 26 27 ((shift) | ((width) << 5) | ((fn) << 9) | ((mode) << 13) | \
+1 -1
drivers/sh/Makefile
··· 1 1 # 2 2 # Makefile for the SuperH specific drivers. 3 3 # 4 - 5 4 obj-$(CONFIG_SUPERHYWAY) += superhyway/ 6 5 obj-$(CONFIG_MAPLE) += maple/ 6 + obj-y += intc.o
+91
include/linux/sh_intc.h
··· 1 + #ifndef __SH_INTC_H 2 + #define __SH_INTC_H 3 + 4 + typedef unsigned char intc_enum; 5 + 6 + struct intc_vect { 7 + intc_enum enum_id; 8 + unsigned short vect; 9 + }; 10 + 11 + #define INTC_VECT(enum_id, vect) { enum_id, vect } 12 + #define INTC_IRQ(enum_id, irq) INTC_VECT(enum_id, irq2evt(irq)) 13 + 14 + struct intc_group { 15 + intc_enum enum_id; 16 + intc_enum enum_ids[32]; 17 + }; 18 + 19 + #define INTC_GROUP(enum_id, ids...) { enum_id, { ids } } 20 + 21 + struct intc_mask_reg { 22 + unsigned long set_reg, clr_reg, reg_width; 23 + intc_enum enum_ids[32]; 24 + #ifdef CONFIG_SMP 25 + unsigned long smp; 26 + #endif 27 + }; 28 + 29 + struct intc_prio_reg { 30 + unsigned long set_reg, clr_reg, reg_width, field_width; 31 + intc_enum enum_ids[16]; 32 + #ifdef CONFIG_SMP 33 + unsigned long smp; 34 + #endif 35 + }; 36 + 37 + struct intc_sense_reg { 38 + unsigned long reg, reg_width, field_width; 39 + intc_enum enum_ids[16]; 40 + }; 41 + 42 + #ifdef CONFIG_SMP 43 + #define INTC_SMP(stride, nr) .smp = (stride) | ((nr) << 8) 44 + #else 45 + #define INTC_SMP(stride, nr) 46 + #endif 47 + 48 + struct intc_desc { 49 + struct intc_vect *vectors; 50 + unsigned int nr_vectors; 51 + struct intc_group *groups; 52 + unsigned int nr_groups; 53 + struct intc_mask_reg *mask_regs; 54 + unsigned int nr_mask_regs; 55 + struct intc_prio_reg *prio_regs; 56 + unsigned int nr_prio_regs; 57 + struct intc_sense_reg *sense_regs; 58 + unsigned int nr_sense_regs; 59 + char *name; 60 + #if defined(CONFIG_CPU_SH3) || defined(CONFIG_CPU_SH4A) 61 + struct intc_mask_reg *ack_regs; 62 + unsigned int nr_ack_regs; 63 + #endif 64 + }; 65 + 66 + #define _INTC_ARRAY(a) a, sizeof(a)/sizeof(*a) 67 + #define DECLARE_INTC_DESC(symbol, chipname, vectors, groups, \ 68 + mask_regs, prio_regs, sense_regs) \ 69 + struct intc_desc symbol __initdata = { \ 70 + _INTC_ARRAY(vectors), _INTC_ARRAY(groups), \ 71 + _INTC_ARRAY(mask_regs), _INTC_ARRAY(prio_regs), \ 72 + _INTC_ARRAY(sense_regs), \ 73 + chipname, \ 74 + } 75 + 76 + #if defined(CONFIG_CPU_SH3) || defined(CONFIG_CPU_SH4A) 77 + #define DECLARE_INTC_DESC_ACK(symbol, chipname, vectors, groups, \ 78 + mask_regs, prio_regs, sense_regs, ack_regs) \ 79 + struct intc_desc symbol __initdata = { \ 80 + _INTC_ARRAY(vectors), _INTC_ARRAY(groups), \ 81 + _INTC_ARRAY(mask_regs), _INTC_ARRAY(prio_regs), \ 82 + _INTC_ARRAY(sense_regs), \ 83 + chipname, \ 84 + _INTC_ARRAY(ack_regs), \ 85 + } 86 + #endif 87 + 88 + void __init register_intc_controller(struct intc_desc *desc); 89 + int intc_set_priority(unsigned int irq, unsigned int prio); 90 + 91 + #endif /* __SH_INTC_H */