diff options
30 files changed, 139 insertions, 323 deletions
diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig index 4d64960be035..d8af858fe3f5 100644 --- a/arch/mips/Kconfig +++ b/arch/mips/Kconfig | |||
@@ -242,6 +242,7 @@ config LASAT | |||
242 | select SYS_SUPPORTS_32BIT_KERNEL | 242 | select SYS_SUPPORTS_32BIT_KERNEL |
243 | select SYS_SUPPORTS_64BIT_KERNEL if EXPERIMENTAL | 243 | select SYS_SUPPORTS_64BIT_KERNEL if EXPERIMENTAL |
244 | select SYS_SUPPORTS_LITTLE_ENDIAN | 244 | select SYS_SUPPORTS_LITTLE_ENDIAN |
245 | select GENERIC_HARDIRQS_NO__DO_IRQ | ||
245 | 246 | ||
246 | config MIPS_ATLAS | 247 | config MIPS_ATLAS |
247 | bool "MIPS Atlas board" | 248 | bool "MIPS Atlas board" |
@@ -265,6 +266,7 @@ config MIPS_ATLAS | |||
265 | select SYS_SUPPORTS_BIG_ENDIAN | 266 | select SYS_SUPPORTS_BIG_ENDIAN |
266 | select SYS_SUPPORTS_LITTLE_ENDIAN | 267 | select SYS_SUPPORTS_LITTLE_ENDIAN |
267 | select SYS_SUPPORTS_MULTITHREADING if EXPERIMENTAL | 268 | select SYS_SUPPORTS_MULTITHREADING if EXPERIMENTAL |
269 | select GENERIC_HARDIRQS_NO__DO_IRQ | ||
268 | help | 270 | help |
269 | This enables support for the MIPS Technologies Atlas evaluation | 271 | This enables support for the MIPS Technologies Atlas evaluation |
270 | board. | 272 | board. |
@@ -419,6 +421,7 @@ config MOMENCO_OCELOT_C | |||
419 | select SYS_SUPPORTS_32BIT_KERNEL | 421 | select SYS_SUPPORTS_32BIT_KERNEL |
420 | select SYS_SUPPORTS_64BIT_KERNEL | 422 | select SYS_SUPPORTS_64BIT_KERNEL |
421 | select SYS_SUPPORTS_BIG_ENDIAN | 423 | select SYS_SUPPORTS_BIG_ENDIAN |
424 | select GENERIC_HARDIRQS_NO__DO_IRQ | ||
422 | help | 425 | help |
423 | The Ocelot is a MIPS-based Single Board Computer (SBC) made by | 426 | The Ocelot is a MIPS-based Single Board Computer (SBC) made by |
424 | Momentum Computer <http://www.momenco.com/>. | 427 | Momentum Computer <http://www.momenco.com/>. |
@@ -569,6 +572,7 @@ config SGI_IP27 | |||
569 | select SYS_SUPPORTS_BIG_ENDIAN | 572 | select SYS_SUPPORTS_BIG_ENDIAN |
570 | select SYS_SUPPORTS_NUMA | 573 | select SYS_SUPPORTS_NUMA |
571 | select SYS_SUPPORTS_SMP | 574 | select SYS_SUPPORTS_SMP |
575 | select GENERIC_HARDIRQS_NO__DO_IRQ | ||
572 | help | 576 | help |
573 | This are the SGI Origin 200, Origin 2000 and Onyx 2 Graphics | 577 | This are the SGI Origin 200, Origin 2000 and Onyx 2 Graphics |
574 | workstations. To compile a Linux kernel that runs on these, say Y | 578 | workstations. To compile a Linux kernel that runs on these, say Y |
@@ -835,6 +839,10 @@ config SCHED_NO_NO_OMIT_FRAME_POINTER | |||
835 | bool | 839 | bool |
836 | default y | 840 | default y |
837 | 841 | ||
842 | config GENERIC_HARDIRQS_NO__DO_IRQ | ||
843 | bool | ||
844 | default n | ||
845 | |||
838 | # | 846 | # |
839 | # Select some configuration options automatically based on user selections. | 847 | # Select some configuration options automatically based on user selections. |
840 | # | 848 | # |
@@ -996,6 +1004,7 @@ config SOC_PNX8550 | |||
996 | select HW_HAS_PCI | 1004 | select HW_HAS_PCI |
997 | select SYS_HAS_CPU_MIPS32_R1 | 1005 | select SYS_HAS_CPU_MIPS32_R1 |
998 | select SYS_SUPPORTS_32BIT_KERNEL | 1006 | select SYS_SUPPORTS_32BIT_KERNEL |
1007 | select GENERIC_HARDIRQS_NO__DO_IRQ | ||
999 | 1008 | ||
1000 | config SWAP_IO_SPACE | 1009 | config SWAP_IO_SPACE |
1001 | bool | 1010 | bool |
diff --git a/arch/mips/dec/ecc-berr.c b/arch/mips/dec/ecc-berr.c index c8430c07355e..6d55e8aab668 100644 --- a/arch/mips/dec/ecc-berr.c +++ b/arch/mips/dec/ecc-berr.c | |||
@@ -25,6 +25,7 @@ | |||
25 | #include <asm/cpu.h> | 25 | #include <asm/cpu.h> |
26 | #include <asm/irq_regs.h> | 26 | #include <asm/irq_regs.h> |
27 | #include <asm/processor.h> | 27 | #include <asm/processor.h> |
28 | #include <asm/ptrace.h> | ||
28 | #include <asm/system.h> | 29 | #include <asm/system.h> |
29 | #include <asm/traps.h> | 30 | #include <asm/traps.h> |
30 | 31 | ||
diff --git a/arch/mips/dec/ioasic-irq.c b/arch/mips/dec/ioasic-irq.c index 269b22b34313..4c7cb4048d35 100644 --- a/arch/mips/dec/ioasic-irq.c +++ b/arch/mips/dec/ioasic-irq.c | |||
@@ -67,7 +67,6 @@ static struct irq_chip ioasic_irq_type = { | |||
67 | .mask = mask_ioasic_irq, | 67 | .mask = mask_ioasic_irq, |
68 | .mask_ack = ack_ioasic_irq, | 68 | .mask_ack = ack_ioasic_irq, |
69 | .unmask = unmask_ioasic_irq, | 69 | .unmask = unmask_ioasic_irq, |
70 | .end = end_ioasic_irq, | ||
71 | }; | 70 | }; |
72 | 71 | ||
73 | 72 | ||
@@ -106,8 +105,7 @@ void __init init_ioasic_irqs(int base) | |||
106 | set_irq_chip_and_handler(i, &ioasic_irq_type, | 105 | set_irq_chip_and_handler(i, &ioasic_irq_type, |
107 | handle_level_irq); | 106 | handle_level_irq); |
108 | for (; i < base + IO_IRQ_LINES; i++) | 107 | for (; i < base + IO_IRQ_LINES; i++) |
109 | set_irq_chip_and_handler(i, &ioasic_dma_irq_type, | 108 | set_irq_chip(i, &ioasic_dma_irq_type); |
110 | handle_level_irq); | ||
111 | 109 | ||
112 | ioasic_irq_base = base; | 110 | ioasic_irq_base = base; |
113 | } | 111 | } |
diff --git a/arch/mips/dec/kn01-berr.c b/arch/mips/dec/kn01-berr.c index f19b4617a0a6..d3b8002bf1e7 100644 --- a/arch/mips/dec/kn01-berr.c +++ b/arch/mips/dec/kn01-berr.c | |||
@@ -20,8 +20,10 @@ | |||
20 | #include <linux/types.h> | 20 | #include <linux/types.h> |
21 | 21 | ||
22 | #include <asm/inst.h> | 22 | #include <asm/inst.h> |
23 | #include <asm/irq_regs.h> | ||
23 | #include <asm/mipsregs.h> | 24 | #include <asm/mipsregs.h> |
24 | #include <asm/page.h> | 25 | #include <asm/page.h> |
26 | #include <asm/ptrace.h> | ||
25 | #include <asm/system.h> | 27 | #include <asm/system.h> |
26 | #include <asm/traps.h> | 28 | #include <asm/traps.h> |
27 | #include <asm/uaccess.h> | 29 | #include <asm/uaccess.h> |
diff --git a/arch/mips/dec/kn02-irq.c b/arch/mips/dec/kn02-irq.c index 5a9be4c93584..916e46b8ccd8 100644 --- a/arch/mips/dec/kn02-irq.c +++ b/arch/mips/dec/kn02-irq.c | |||
@@ -57,19 +57,12 @@ static void ack_kn02_irq(unsigned int irq) | |||
57 | iob(); | 57 | iob(); |
58 | } | 58 | } |
59 | 59 | ||
60 | static void end_kn02_irq(unsigned int irq) | ||
61 | { | ||
62 | if (!(irq_desc[irq].status & (IRQ_DISABLED | IRQ_INPROGRESS))) | ||
63 | unmask_kn02_irq(irq); | ||
64 | } | ||
65 | |||
66 | static struct irq_chip kn02_irq_type = { | 60 | static struct irq_chip kn02_irq_type = { |
67 | .typename = "KN02-CSR", | 61 | .typename = "KN02-CSR", |
68 | .ack = ack_kn02_irq, | 62 | .ack = ack_kn02_irq, |
69 | .mask = mask_kn02_irq, | 63 | .mask = mask_kn02_irq, |
70 | .mask_ack = ack_kn02_irq, | 64 | .mask_ack = ack_kn02_irq, |
71 | .unmask = unmask_kn02_irq, | 65 | .unmask = unmask_kn02_irq, |
72 | .end = end_kn02_irq, | ||
73 | }; | 66 | }; |
74 | 67 | ||
75 | 68 | ||
diff --git a/arch/mips/emma2rh/common/irq_emma2rh.c b/arch/mips/emma2rh/common/irq_emma2rh.c index 59b98299c896..8d880f0b06ec 100644 --- a/arch/mips/emma2rh/common/irq_emma2rh.c +++ b/arch/mips/emma2rh/common/irq_emma2rh.c | |||
@@ -56,19 +56,12 @@ static void emma2rh_irq_disable(unsigned int irq) | |||
56 | ll_emma2rh_irq_disable(irq - emma2rh_irq_base); | 56 | ll_emma2rh_irq_disable(irq - emma2rh_irq_base); |
57 | } | 57 | } |
58 | 58 | ||
59 | static void emma2rh_irq_end(unsigned int irq) | ||
60 | { | ||
61 | if (!(irq_desc[irq].status & (IRQ_DISABLED | IRQ_INPROGRESS))) | ||
62 | ll_emma2rh_irq_enable(irq - emma2rh_irq_base); | ||
63 | } | ||
64 | |||
65 | struct irq_chip emma2rh_irq_controller = { | 59 | struct irq_chip emma2rh_irq_controller = { |
66 | .typename = "emma2rh_irq", | 60 | .typename = "emma2rh_irq", |
67 | .ack = emma2rh_irq_disable, | 61 | .ack = emma2rh_irq_disable, |
68 | .mask = emma2rh_irq_disable, | 62 | .mask = emma2rh_irq_disable, |
69 | .mask_ack = emma2rh_irq_disable, | 63 | .mask_ack = emma2rh_irq_disable, |
70 | .unmask = emma2rh_irq_enable, | 64 | .unmask = emma2rh_irq_enable, |
71 | .end = emma2rh_irq_end, | ||
72 | }; | 65 | }; |
73 | 66 | ||
74 | void emma2rh_irq_init(u32 irq_base) | 67 | void emma2rh_irq_init(u32 irq_base) |
diff --git a/arch/mips/emma2rh/markeins/irq_markeins.c b/arch/mips/emma2rh/markeins/irq_markeins.c index 3ac4e405ecdc..2116d9be5fa9 100644 --- a/arch/mips/emma2rh/markeins/irq_markeins.c +++ b/arch/mips/emma2rh/markeins/irq_markeins.c | |||
@@ -48,19 +48,12 @@ static void emma2rh_sw_irq_disable(unsigned int irq) | |||
48 | ll_emma2rh_sw_irq_disable(irq - emma2rh_sw_irq_base); | 48 | ll_emma2rh_sw_irq_disable(irq - emma2rh_sw_irq_base); |
49 | } | 49 | } |
50 | 50 | ||
51 | static void emma2rh_sw_irq_end(unsigned int irq) | ||
52 | { | ||
53 | if (!(irq_desc[irq].status & (IRQ_DISABLED | IRQ_INPROGRESS))) | ||
54 | ll_emma2rh_sw_irq_enable(irq - emma2rh_sw_irq_base); | ||
55 | } | ||
56 | |||
57 | struct irq_chip emma2rh_sw_irq_controller = { | 51 | struct irq_chip emma2rh_sw_irq_controller = { |
58 | .typename = "emma2rh_sw_irq", | 52 | .typename = "emma2rh_sw_irq", |
59 | .ack = emma2rh_sw_irq_disable, | 53 | .ack = emma2rh_sw_irq_disable, |
60 | .mask = emma2rh_sw_irq_disable, | 54 | .mask = emma2rh_sw_irq_disable, |
61 | .mask_ack = emma2rh_sw_irq_disable, | 55 | .mask_ack = emma2rh_sw_irq_disable, |
62 | .unmask = emma2rh_sw_irq_enable, | 56 | .unmask = emma2rh_sw_irq_enable, |
63 | .end = emma2rh_sw_irq_end, | ||
64 | }; | 57 | }; |
65 | 58 | ||
66 | void emma2rh_sw_irq_init(u32 irq_base) | 59 | void emma2rh_sw_irq_init(u32 irq_base) |
diff --git a/arch/mips/jazz/irq.c b/arch/mips/jazz/irq.c index 5c4f50cdf157..f8d417b5c2bb 100644 --- a/arch/mips/jazz/irq.c +++ b/arch/mips/jazz/irq.c | |||
@@ -39,19 +39,12 @@ void disable_r4030_irq(unsigned int irq) | |||
39 | spin_unlock_irqrestore(&r4030_lock, flags); | 39 | spin_unlock_irqrestore(&r4030_lock, flags); |
40 | } | 40 | } |
41 | 41 | ||
42 | static void end_r4030_irq(unsigned int irq) | ||
43 | { | ||
44 | if (!(irq_desc[irq].status & (IRQ_DISABLED|IRQ_INPROGRESS))) | ||
45 | enable_r4030_irq(irq); | ||
46 | } | ||
47 | |||
48 | static struct irq_chip r4030_irq_type = { | 42 | static struct irq_chip r4030_irq_type = { |
49 | .typename = "R4030", | 43 | .typename = "R4030", |
50 | .ack = disable_r4030_irq, | 44 | .ack = disable_r4030_irq, |
51 | .mask = disable_r4030_irq, | 45 | .mask = disable_r4030_irq, |
52 | .mask_ack = disable_r4030_irq, | 46 | .mask_ack = disable_r4030_irq, |
53 | .unmask = enable_r4030_irq, | 47 | .unmask = enable_r4030_irq, |
54 | .end = end_r4030_irq, | ||
55 | }; | 48 | }; |
56 | 49 | ||
57 | void __init init_r4030_ints(void) | 50 | void __init init_r4030_ints(void) |
diff --git a/arch/mips/kernel/i8259.c b/arch/mips/kernel/i8259.c index 2526c0ca4d81..b59a676c6d0e 100644 --- a/arch/mips/kernel/i8259.c +++ b/arch/mips/kernel/i8259.c | |||
@@ -19,9 +19,6 @@ | |||
19 | #include <asm/i8259.h> | 19 | #include <asm/i8259.h> |
20 | #include <asm/io.h> | 20 | #include <asm/io.h> |
21 | 21 | ||
22 | void enable_8259A_irq(unsigned int irq); | ||
23 | void disable_8259A_irq(unsigned int irq); | ||
24 | |||
25 | /* | 22 | /* |
26 | * This is the 'legacy' 8259A Programmable Interrupt Controller, | 23 | * This is the 'legacy' 8259A Programmable Interrupt Controller, |
27 | * present in the majority of PC/AT boxes. | 24 | * present in the majority of PC/AT boxes. |
@@ -31,23 +28,16 @@ void disable_8259A_irq(unsigned int irq); | |||
31 | * moves to arch independent land | 28 | * moves to arch independent land |
32 | */ | 29 | */ |
33 | 30 | ||
31 | static int i8259A_auto_eoi; | ||
34 | DEFINE_SPINLOCK(i8259A_lock); | 32 | DEFINE_SPINLOCK(i8259A_lock); |
35 | 33 | /* some platforms call this... */ | |
36 | static void end_8259A_irq (unsigned int irq) | ||
37 | { | ||
38 | if (!(irq_desc[irq].status & (IRQ_DISABLED|IRQ_INPROGRESS)) && | ||
39 | irq_desc[irq].action) | ||
40 | enable_8259A_irq(irq); | ||
41 | } | ||
42 | |||
43 | void mask_and_ack_8259A(unsigned int); | 34 | void mask_and_ack_8259A(unsigned int); |
44 | 35 | ||
45 | static struct irq_chip i8259A_irq_type = { | 36 | static struct irq_chip i8259A_chip = { |
46 | .typename = "XT-PIC", | 37 | .name = "XT-PIC", |
47 | .enable = enable_8259A_irq, | 38 | .mask = disable_8259A_irq, |
48 | .disable = disable_8259A_irq, | 39 | .unmask = enable_8259A_irq, |
49 | .ack = mask_and_ack_8259A, | 40 | .mask_ack = mask_and_ack_8259A, |
50 | .end = end_8259A_irq, | ||
51 | }; | 41 | }; |
52 | 42 | ||
53 | /* | 43 | /* |
@@ -59,8 +49,8 @@ static struct irq_chip i8259A_irq_type = { | |||
59 | */ | 49 | */ |
60 | static unsigned int cached_irq_mask = 0xffff; | 50 | static unsigned int cached_irq_mask = 0xffff; |
61 | 51 | ||
62 | #define cached_21 (cached_irq_mask) | 52 | #define cached_master_mask (cached_irq_mask) |
63 | #define cached_A1 (cached_irq_mask >> 8) | 53 | #define cached_slave_mask (cached_irq_mask >> 8) |
64 | 54 | ||
65 | void disable_8259A_irq(unsigned int irq) | 55 | void disable_8259A_irq(unsigned int irq) |
66 | { | 56 | { |
@@ -70,9 +60,9 @@ void disable_8259A_irq(unsigned int irq) | |||
70 | spin_lock_irqsave(&i8259A_lock, flags); | 60 | spin_lock_irqsave(&i8259A_lock, flags); |
71 | cached_irq_mask |= mask; | 61 | cached_irq_mask |= mask; |
72 | if (irq & 8) | 62 | if (irq & 8) |
73 | outb(cached_A1,0xA1); | 63 | outb(cached_slave_mask, PIC_SLAVE_IMR); |
74 | else | 64 | else |
75 | outb(cached_21,0x21); | 65 | outb(cached_master_mask, PIC_MASTER_IMR); |
76 | spin_unlock_irqrestore(&i8259A_lock, flags); | 66 | spin_unlock_irqrestore(&i8259A_lock, flags); |
77 | } | 67 | } |
78 | 68 | ||
@@ -84,9 +74,9 @@ void enable_8259A_irq(unsigned int irq) | |||
84 | spin_lock_irqsave(&i8259A_lock, flags); | 74 | spin_lock_irqsave(&i8259A_lock, flags); |
85 | cached_irq_mask &= mask; | 75 | cached_irq_mask &= mask; |
86 | if (irq & 8) | 76 | if (irq & 8) |
87 | outb(cached_A1,0xA1); | 77 | outb(cached_slave_mask, PIC_SLAVE_IMR); |
88 | else | 78 | else |
89 | outb(cached_21,0x21); | 79 | outb(cached_master_mask, PIC_MASTER_IMR); |
90 | spin_unlock_irqrestore(&i8259A_lock, flags); | 80 | spin_unlock_irqrestore(&i8259A_lock, flags); |
91 | } | 81 | } |
92 | 82 | ||
@@ -98,9 +88,9 @@ int i8259A_irq_pending(unsigned int irq) | |||
98 | 88 | ||
99 | spin_lock_irqsave(&i8259A_lock, flags); | 89 | spin_lock_irqsave(&i8259A_lock, flags); |
100 | if (irq < 8) | 90 | if (irq < 8) |
101 | ret = inb(0x20) & mask; | 91 | ret = inb(PIC_MASTER_CMD) & mask; |
102 | else | 92 | else |
103 | ret = inb(0xA0) & (mask >> 8); | 93 | ret = inb(PIC_SLAVE_CMD) & (mask >> 8); |
104 | spin_unlock_irqrestore(&i8259A_lock, flags); | 94 | spin_unlock_irqrestore(&i8259A_lock, flags); |
105 | 95 | ||
106 | return ret; | 96 | return ret; |
@@ -109,7 +99,7 @@ int i8259A_irq_pending(unsigned int irq) | |||
109 | void make_8259A_irq(unsigned int irq) | 99 | void make_8259A_irq(unsigned int irq) |
110 | { | 100 | { |
111 | disable_irq_nosync(irq); | 101 | disable_irq_nosync(irq); |
112 | set_irq_chip(irq, &i8259A_irq_type); | 102 | set_irq_chip_and_handler(irq, &i8259A_chip, handle_level_irq); |
113 | enable_irq(irq); | 103 | enable_irq(irq); |
114 | } | 104 | } |
115 | 105 | ||
@@ -125,14 +115,14 @@ static inline int i8259A_irq_real(unsigned int irq) | |||
125 | int irqmask = 1 << irq; | 115 | int irqmask = 1 << irq; |
126 | 116 | ||
127 | if (irq < 8) { | 117 | if (irq < 8) { |
128 | outb(0x0B,0x20); /* ISR register */ | 118 | outb(0x0B,PIC_MASTER_CMD); /* ISR register */ |
129 | value = inb(0x20) & irqmask; | 119 | value = inb(PIC_MASTER_CMD) & irqmask; |
130 | outb(0x0A,0x20); /* back to the IRR register */ | 120 | outb(0x0A,PIC_MASTER_CMD); /* back to the IRR register */ |
131 | return value; | 121 | return value; |
132 | } | 122 | } |
133 | outb(0x0B,0xA0); /* ISR register */ | 123 | outb(0x0B,PIC_SLAVE_CMD); /* ISR register */ |
134 | value = inb(0xA0) & (irqmask >> 8); | 124 | value = inb(PIC_SLAVE_CMD) & (irqmask >> 8); |
135 | outb(0x0A,0xA0); /* back to the IRR register */ | 125 | outb(0x0A,PIC_SLAVE_CMD); /* back to the IRR register */ |
136 | return value; | 126 | return value; |
137 | } | 127 | } |
138 | 128 | ||
@@ -149,17 +139,19 @@ void mask_and_ack_8259A(unsigned int irq) | |||
149 | 139 | ||
150 | spin_lock_irqsave(&i8259A_lock, flags); | 140 | spin_lock_irqsave(&i8259A_lock, flags); |
151 | /* | 141 | /* |
152 | * Lightweight spurious IRQ detection. We do not want to overdo | 142 | * Lightweight spurious IRQ detection. We do not want |
153 | * spurious IRQ handling - it's usually a sign of hardware problems, so | 143 | * to overdo spurious IRQ handling - it's usually a sign |
154 | * we only do the checks we can do without slowing down good hardware | 144 | * of hardware problems, so we only do the checks we can |
155 | * nnecesserily. | 145 | * do without slowing down good hardware unnecessarily. |
156 | * | 146 | * |
157 | * Note that IRQ7 and IRQ15 (the two spurious IRQs usually resulting | 147 | * Note that IRQ7 and IRQ15 (the two spurious IRQs |
158 | * rom the 8259A-1|2 PICs) occur even if the IRQ is masked in the 8259A. | 148 | * usually resulting from the 8259A-1|2 PICs) occur |
159 | * Thus we can check spurious 8259A IRQs without doing the quite slow | 149 | * even if the IRQ is masked in the 8259A. Thus we |
160 | * i8259A_irq_real() call for every IRQ. This does not cover 100% of | 150 | * can check spurious 8259A IRQs without doing the |
161 | * spurious interrupts, but should be enough to warn the user that | 151 | * quite slow i8259A_irq_real() call for every IRQ. |
162 | * there is something bad going on ... | 152 | * This does not cover 100% of spurious interrupts, |
153 | * but should be enough to warn the user that there | ||
154 | * is something bad going on ... | ||
163 | */ | 155 | */ |
164 | if (cached_irq_mask & irqmask) | 156 | if (cached_irq_mask & irqmask) |
165 | goto spurious_8259A_irq; | 157 | goto spurious_8259A_irq; |
@@ -167,14 +159,14 @@ void mask_and_ack_8259A(unsigned int irq) | |||
167 | 159 | ||
168 | handle_real_irq: | 160 | handle_real_irq: |
169 | if (irq & 8) { | 161 | if (irq & 8) { |
170 | inb(0xA1); /* DUMMY - (do we need this?) */ | 162 | inb(PIC_SLAVE_IMR); /* DUMMY - (do we need this?) */ |
171 | outb(cached_A1,0xA1); | 163 | outb(cached_slave_mask, PIC_SLAVE_IMR); |
172 | outb(0x60+(irq&7),0xA0);/* 'Specific EOI' to slave */ | 164 | outb(0x60+(irq&7),PIC_SLAVE_CMD);/* 'Specific EOI' to slave */ |
173 | outb(0x62,0x20); /* 'Specific EOI' to master-IRQ2 */ | 165 | outb(0x60+PIC_CASCADE_IR,PIC_MASTER_CMD); /* 'Specific EOI' to master-IRQ2 */ |
174 | } else { | 166 | } else { |
175 | inb(0x21); /* DUMMY - (do we need this?) */ | 167 | inb(PIC_MASTER_IMR); /* DUMMY - (do we need this?) */ |
176 | outb(cached_21,0x21); | 168 | outb(cached_master_mask, PIC_MASTER_IMR); |
177 | outb(0x60+irq,0x20); /* 'Specific EOI' to master */ | 169 | outb(0x60+irq,PIC_MASTER_CMD); /* 'Specific EOI to master */ |
178 | } | 170 | } |
179 | #ifdef CONFIG_MIPS_MT_SMTC | 171 | #ifdef CONFIG_MIPS_MT_SMTC |
180 | if (irq_hwmask[irq] & ST0_IM) | 172 | if (irq_hwmask[irq] & ST0_IM) |
@@ -195,7 +187,7 @@ spurious_8259A_irq: | |||
195 | goto handle_real_irq; | 187 | goto handle_real_irq; |
196 | 188 | ||
197 | { | 189 | { |
198 | static int spurious_irq_mask = 0; | 190 | static int spurious_irq_mask; |
199 | /* | 191 | /* |
200 | * At this point we can be sure the IRQ is spurious, | 192 | * At this point we can be sure the IRQ is spurious, |
201 | * lets ACK and report it. [once per IRQ] | 193 | * lets ACK and report it. [once per IRQ] |
@@ -216,13 +208,25 @@ spurious_8259A_irq: | |||
216 | 208 | ||
217 | static int i8259A_resume(struct sys_device *dev) | 209 | static int i8259A_resume(struct sys_device *dev) |
218 | { | 210 | { |
219 | init_8259A(0); | 211 | init_8259A(i8259A_auto_eoi); |
212 | return 0; | ||
213 | } | ||
214 | |||
215 | static int i8259A_shutdown(struct sys_device *dev) | ||
216 | { | ||
217 | /* Put the i8259A into a quiescent state that | ||
218 | * the kernel initialization code can get it | ||
219 | * out of. | ||
220 | */ | ||
221 | outb(0xff, PIC_MASTER_IMR); /* mask all of 8259A-1 */ | ||
222 | outb(0xff, PIC_SLAVE_IMR); /* mask all of 8259A-1 */ | ||
220 | return 0; | 223 | return 0; |
221 | } | 224 | } |
222 | 225 | ||
223 | static struct sysdev_class i8259_sysdev_class = { | 226 | static struct sysdev_class i8259_sysdev_class = { |
224 | set_kset_name("i8259"), | 227 | set_kset_name("i8259"), |
225 | .resume = i8259A_resume, | 228 | .resume = i8259A_resume, |
229 | .shutdown = i8259A_shutdown, | ||
226 | }; | 230 | }; |
227 | 231 | ||
228 | static struct sys_device device_i8259A = { | 232 | static struct sys_device device_i8259A = { |
@@ -244,41 +248,41 @@ void __init init_8259A(int auto_eoi) | |||
244 | { | 248 | { |
245 | unsigned long flags; | 249 | unsigned long flags; |
246 | 250 | ||
251 | i8259A_auto_eoi = auto_eoi; | ||
252 | |||
247 | spin_lock_irqsave(&i8259A_lock, flags); | 253 | spin_lock_irqsave(&i8259A_lock, flags); |
248 | 254 | ||
249 | outb(0xff, 0x21); /* mask all of 8259A-1 */ | 255 | outb(0xff, PIC_MASTER_IMR); /* mask all of 8259A-1 */ |
250 | outb(0xff, 0xA1); /* mask all of 8259A-2 */ | 256 | outb(0xff, PIC_SLAVE_IMR); /* mask all of 8259A-2 */ |
251 | 257 | ||
252 | /* | 258 | /* |
253 | * outb_p - this has to work on a wide range of PC hardware. | 259 | * outb_p - this has to work on a wide range of PC hardware. |
254 | */ | 260 | */ |
255 | outb_p(0x11, 0x20); /* ICW1: select 8259A-1 init */ | 261 | outb_p(0x11, PIC_MASTER_CMD); /* ICW1: select 8259A-1 init */ |
256 | outb_p(0x00, 0x21); /* ICW2: 8259A-1 IR0-7 mapped to 0x00-0x07 */ | 262 | outb_p(I8259A_IRQ_BASE + 0, PIC_MASTER_IMR); /* ICW2: 8259A-1 IR0 mapped to I8259A_IRQ_BASE + 0x00 */ |
257 | outb_p(0x04, 0x21); /* 8259A-1 (the master) has a slave on IR2 */ | 263 | outb_p(1U << PIC_CASCADE_IR, PIC_MASTER_IMR); /* 8259A-1 (the master) has a slave on IR2 */ |
258 | if (auto_eoi) | 264 | if (auto_eoi) /* master does Auto EOI */ |
259 | outb_p(0x03, 0x21); /* master does Auto EOI */ | 265 | outb_p(MASTER_ICW4_DEFAULT | PIC_ICW4_AEOI, PIC_MASTER_IMR); |
260 | else | 266 | else /* master expects normal EOI */ |
261 | outb_p(0x01, 0x21); /* master expects normal EOI */ | 267 | outb_p(MASTER_ICW4_DEFAULT, PIC_MASTER_IMR); |
262 | 268 | ||
263 | outb_p(0x11, 0xA0); /* ICW1: select 8259A-2 init */ | 269 | outb_p(0x11, PIC_SLAVE_CMD); /* ICW1: select 8259A-2 init */ |
264 | outb_p(0x08, 0xA1); /* ICW2: 8259A-2 IR0-7 mapped to 0x08-0x0f */ | 270 | outb_p(I8259A_IRQ_BASE + 8, PIC_SLAVE_IMR); /* ICW2: 8259A-2 IR0 mapped to I8259A_IRQ_BASE + 0x08 */ |
265 | outb_p(0x02, 0xA1); /* 8259A-2 is a slave on master's IR2 */ | 271 | outb_p(PIC_CASCADE_IR, PIC_SLAVE_IMR); /* 8259A-2 is a slave on master's IR2 */ |
266 | outb_p(0x01, 0xA1); /* (slave's support for AEOI in flat mode | 272 | outb_p(SLAVE_ICW4_DEFAULT, PIC_SLAVE_IMR); /* (slave's support for AEOI in flat mode is to be investigated) */ |
267 | is to be investigated) */ | ||
268 | |||
269 | if (auto_eoi) | 273 | if (auto_eoi) |
270 | /* | 274 | /* |
271 | * in AEOI mode we just have to mask the interrupt | 275 | * In AEOI mode we just have to mask the interrupt |
272 | * when acking. | 276 | * when acking. |
273 | */ | 277 | */ |
274 | i8259A_irq_type.ack = disable_8259A_irq; | 278 | i8259A_chip.mask_ack = disable_8259A_irq; |
275 | else | 279 | else |
276 | i8259A_irq_type.ack = mask_and_ack_8259A; | 280 | i8259A_chip.mask_ack = mask_and_ack_8259A; |
277 | 281 | ||
278 | udelay(100); /* wait for 8259A to initialize */ | 282 | udelay(100); /* wait for 8259A to initialize */ |
279 | 283 | ||
280 | outb(cached_21, 0x21); /* restore master IRQ mask */ | 284 | outb(cached_master_mask, PIC_MASTER_IMR); /* restore master IRQ mask */ |
281 | outb(cached_A1, 0xA1); /* restore slave IRQ mask */ | 285 | outb(cached_slave_mask, PIC_SLAVE_IMR); /* restore slave IRQ mask */ |
282 | 286 | ||
283 | spin_unlock_irqrestore(&i8259A_lock, flags); | 287 | spin_unlock_irqrestore(&i8259A_lock, flags); |
284 | } | 288 | } |
@@ -291,11 +295,17 @@ static struct irqaction irq2 = { | |||
291 | }; | 295 | }; |
292 | 296 | ||
293 | static struct resource pic1_io_resource = { | 297 | static struct resource pic1_io_resource = { |
294 | .name = "pic1", .start = 0x20, .end = 0x21, .flags = IORESOURCE_BUSY | 298 | .name = "pic1", |
299 | .start = PIC_MASTER_CMD, | ||
300 | .end = PIC_MASTER_IMR, | ||
301 | .flags = IORESOURCE_BUSY | ||
295 | }; | 302 | }; |
296 | 303 | ||
297 | static struct resource pic2_io_resource = { | 304 | static struct resource pic2_io_resource = { |
298 | .name = "pic2", .start = 0xa0, .end = 0xa1, .flags = IORESOURCE_BUSY | 305 | .name = "pic2", |
306 | .start = PIC_SLAVE_CMD, | ||
307 | .end = PIC_SLAVE_IMR, | ||
308 | .flags = IORESOURCE_BUSY | ||
299 | }; | 309 | }; |
300 | 310 | ||
301 | /* | 311 | /* |
@@ -313,7 +323,7 @@ void __init init_i8259_irqs (void) | |||
313 | init_8259A(0); | 323 | init_8259A(0); |
314 | 324 | ||
315 | for (i = 0; i < 16; i++) | 325 | for (i = 0; i < 16; i++) |
316 | set_irq_chip(i, &i8259A_irq_type); | 326 | set_irq_chip_and_handler(i, &i8259A_chip, handle_level_irq); |
317 | 327 | ||
318 | setup_irq(2, &irq2); | 328 | setup_irq(PIC_CASCADE_IR, &irq2); |
319 | } | 329 | } |
diff --git a/arch/mips/kernel/irq-mv6434x.c b/arch/mips/kernel/irq-mv6434x.c index 6cfb31cafde2..efbd219845b5 100644 --- a/arch/mips/kernel/irq-mv6434x.c +++ b/arch/mips/kernel/irq-mv6434x.c | |||
@@ -67,15 +67,6 @@ static inline void unmask_mv64340_irq(unsigned int irq) | |||
67 | } | 67 | } |
68 | 68 | ||
69 | /* | 69 | /* |
70 | * End IRQ processing | ||
71 | */ | ||
72 | static void end_mv64340_irq(unsigned int irq) | ||
73 | { | ||
74 | if (!(irq_desc[irq].status & (IRQ_DISABLED|IRQ_INPROGRESS))) | ||
75 | unmask_mv64340_irq(irq); | ||
76 | } | ||
77 | |||
78 | /* | ||
79 | * Interrupt handler for interrupts coming from the Marvell chip. | 70 | * Interrupt handler for interrupts coming from the Marvell chip. |
80 | * It could be built in ethernet ports etc... | 71 | * It could be built in ethernet ports etc... |
81 | */ | 72 | */ |
@@ -106,7 +97,6 @@ struct irq_chip mv64340_irq_type = { | |||
106 | .mask = mask_mv64340_irq, | 97 | .mask = mask_mv64340_irq, |
107 | .mask_ack = mask_mv64340_irq, | 98 | .mask_ack = mask_mv64340_irq, |
108 | .unmask = unmask_mv64340_irq, | 99 | .unmask = unmask_mv64340_irq, |
109 | .end = end_mv64340_irq, | ||
110 | }; | 100 | }; |
111 | 101 | ||
112 | void __init mv64340_irq_init(unsigned int base) | 102 | void __init mv64340_irq_init(unsigned int base) |
diff --git a/arch/mips/kernel/irq-rm7000.c b/arch/mips/kernel/irq-rm7000.c index ddcc2a5f8a06..123324ba8c14 100644 --- a/arch/mips/kernel/irq-rm7000.c +++ b/arch/mips/kernel/irq-rm7000.c | |||
@@ -29,19 +29,12 @@ static inline void mask_rm7k_irq(unsigned int irq) | |||
29 | clear_c0_intcontrol(0x100 << (irq - irq_base)); | 29 | clear_c0_intcontrol(0x100 << (irq - irq_base)); |
30 | } | 30 | } |
31 | 31 | ||
32 | static void rm7k_cpu_irq_end(unsigned int irq) | ||
33 | { | ||
34 | if (!(irq_desc[irq].status & (IRQ_DISABLED | IRQ_INPROGRESS))) | ||
35 | unmask_rm7k_irq(irq); | ||
36 | } | ||
37 | |||
38 | static struct irq_chip rm7k_irq_controller = { | 32 | static struct irq_chip rm7k_irq_controller = { |
39 | .typename = "RM7000", | 33 | .typename = "RM7000", |
40 | .ack = mask_rm7k_irq, | 34 | .ack = mask_rm7k_irq, |
41 | .mask = mask_rm7k_irq, | 35 | .mask = mask_rm7k_irq, |
42 | .mask_ack = mask_rm7k_irq, | 36 | .mask_ack = mask_rm7k_irq, |
43 | .unmask = unmask_rm7k_irq, | 37 | .unmask = unmask_rm7k_irq, |
44 | .end = rm7k_cpu_irq_end, | ||
45 | }; | 38 | }; |
46 | 39 | ||
47 | void __init rm7k_cpu_irq_init(int base) | 40 | void __init rm7k_cpu_irq_init(int base) |
diff --git a/arch/mips/kernel/irq-rm9000.c b/arch/mips/kernel/irq-rm9000.c index ba6440c88abd..0e6f4c5349d2 100644 --- a/arch/mips/kernel/irq-rm9000.c +++ b/arch/mips/kernel/irq-rm9000.c | |||
@@ -80,19 +80,12 @@ static void rm9k_perfcounter_irq_shutdown(unsigned int irq) | |||
80 | on_each_cpu(local_rm9k_perfcounter_irq_shutdown, (void *) irq, 0, 1); | 80 | on_each_cpu(local_rm9k_perfcounter_irq_shutdown, (void *) irq, 0, 1); |
81 | } | 81 | } |
82 | 82 | ||
83 | static void rm9k_cpu_irq_end(unsigned int irq) | ||
84 | { | ||
85 | if (!(irq_desc[irq].status & (IRQ_DISABLED | IRQ_INPROGRESS))) | ||
86 | unmask_rm9k_irq(irq); | ||
87 | } | ||
88 | |||
89 | static struct irq_chip rm9k_irq_controller = { | 83 | static struct irq_chip rm9k_irq_controller = { |
90 | .typename = "RM9000", | 84 | .typename = "RM9000", |
91 | .ack = mask_rm9k_irq, | 85 | .ack = mask_rm9k_irq, |
92 | .mask = mask_rm9k_irq, | 86 | .mask = mask_rm9k_irq, |
93 | .mask_ack = mask_rm9k_irq, | 87 | .mask_ack = mask_rm9k_irq, |
94 | .unmask = unmask_rm9k_irq, | 88 | .unmask = unmask_rm9k_irq, |
95 | .end = rm9k_cpu_irq_end, | ||
96 | }; | 89 | }; |
97 | 90 | ||
98 | static struct irq_chip rm9k_perfcounter_irq = { | 91 | static struct irq_chip rm9k_perfcounter_irq = { |
@@ -103,7 +96,6 @@ static struct irq_chip rm9k_perfcounter_irq = { | |||
103 | .mask = mask_rm9k_irq, | 96 | .mask = mask_rm9k_irq, |
104 | .mask_ack = mask_rm9k_irq, | 97 | .mask_ack = mask_rm9k_irq, |
105 | .unmask = unmask_rm9k_irq, | 98 | .unmask = unmask_rm9k_irq, |
106 | .end = rm9k_cpu_irq_end, | ||
107 | }; | 99 | }; |
108 | 100 | ||
109 | unsigned int rm9000_perfcount_irq; | 101 | unsigned int rm9000_perfcount_irq; |
diff --git a/arch/mips/kernel/irq.c b/arch/mips/kernel/irq.c index b339798b3172..2fe4c868a801 100644 --- a/arch/mips/kernel/irq.c +++ b/arch/mips/kernel/irq.c | |||
@@ -117,7 +117,7 @@ int show_interrupts(struct seq_file *p, void *v) | |||
117 | for_each_online_cpu(j) | 117 | for_each_online_cpu(j) |
118 | seq_printf(p, "%10u ", kstat_cpu(j).irqs[i]); | 118 | seq_printf(p, "%10u ", kstat_cpu(j).irqs[i]); |
119 | #endif | 119 | #endif |
120 | seq_printf(p, " %14s", irq_desc[i].chip->typename); | 120 | seq_printf(p, " %14s", irq_desc[i].chip->name); |
121 | seq_printf(p, " %s", action->name); | 121 | seq_printf(p, " %s", action->name); |
122 | 122 | ||
123 | for (action=action->next; action; action = action->next) | 123 | for (action=action->next; action; action = action->next) |
diff --git a/arch/mips/kernel/irq_cpu.c b/arch/mips/kernel/irq_cpu.c index be5ac23d3812..fcc86b96ccf6 100644 --- a/arch/mips/kernel/irq_cpu.c +++ b/arch/mips/kernel/irq_cpu.c | |||
@@ -50,12 +50,6 @@ static inline void mask_mips_irq(unsigned int irq) | |||
50 | irq_disable_hazard(); | 50 | irq_disable_hazard(); |
51 | } | 51 | } |
52 | 52 | ||
53 | static void mips_cpu_irq_end(unsigned int irq) | ||
54 | { | ||
55 | if (!(irq_desc[irq].status & (IRQ_DISABLED | IRQ_INPROGRESS))) | ||
56 | unmask_mips_irq(irq); | ||
57 | } | ||
58 | |||
59 | static struct irq_chip mips_cpu_irq_controller = { | 53 | static struct irq_chip mips_cpu_irq_controller = { |
60 | .typename = "MIPS", | 54 | .typename = "MIPS", |
61 | .ack = mask_mips_irq, | 55 | .ack = mask_mips_irq, |
@@ -63,7 +57,6 @@ static struct irq_chip mips_cpu_irq_controller = { | |||
63 | .mask_ack = mask_mips_irq, | 57 | .mask_ack = mask_mips_irq, |
64 | .unmask = unmask_mips_irq, | 58 | .unmask = unmask_mips_irq, |
65 | .eoi = unmask_mips_irq, | 59 | .eoi = unmask_mips_irq, |
66 | .end = mips_cpu_irq_end, | ||
67 | }; | 60 | }; |
68 | 61 | ||
69 | /* | 62 | /* |
@@ -96,8 +89,6 @@ static void mips_mt_cpu_irq_ack(unsigned int irq) | |||
96 | mask_mips_mt_irq(irq); | 89 | mask_mips_mt_irq(irq); |
97 | } | 90 | } |
98 | 91 | ||
99 | #define mips_mt_cpu_irq_end mips_cpu_irq_end | ||
100 | |||
101 | static struct irq_chip mips_mt_cpu_irq_controller = { | 92 | static struct irq_chip mips_mt_cpu_irq_controller = { |
102 | .typename = "MIPS", | 93 | .typename = "MIPS", |
103 | .startup = mips_mt_cpu_irq_startup, | 94 | .startup = mips_mt_cpu_irq_startup, |
@@ -106,7 +97,6 @@ static struct irq_chip mips_mt_cpu_irq_controller = { | |||
106 | .mask_ack = mips_mt_cpu_irq_ack, | 97 | .mask_ack = mips_mt_cpu_irq_ack, |
107 | .unmask = unmask_mips_mt_irq, | 98 | .unmask = unmask_mips_mt_irq, |
108 | .eoi = unmask_mips_mt_irq, | 99 | .eoi = unmask_mips_mt_irq, |
109 | .end = mips_mt_cpu_irq_end, | ||
110 | }; | 100 | }; |
111 | 101 | ||
112 | void __init mips_cpu_irq_init(int irq_base) | 102 | void __init mips_cpu_irq_init(int irq_base) |
diff --git a/arch/mips/lasat/interrupt.c b/arch/mips/lasat/interrupt.c index 4a84a7beac53..2affa5ff171c 100644 --- a/arch/mips/lasat/interrupt.c +++ b/arch/mips/lasat/interrupt.c | |||
@@ -44,19 +44,12 @@ void enable_lasat_irq(unsigned int irq_nr) | |||
44 | *lasat_int_mask |= (1 << irq_nr) << lasat_int_mask_shift; | 44 | *lasat_int_mask |= (1 << irq_nr) << lasat_int_mask_shift; |
45 | } | 45 | } |
46 | 46 | ||
47 | static void end_lasat_irq(unsigned int irq) | ||
48 | { | ||
49 | if (!(irq_desc[irq].status & (IRQ_DISABLED|IRQ_INPROGRESS))) | ||
50 | enable_lasat_irq(irq); | ||
51 | } | ||
52 | |||
53 | static struct irq_chip lasat_irq_type = { | 47 | static struct irq_chip lasat_irq_type = { |
54 | .typename = "Lasat", | 48 | .typename = "Lasat", |
55 | .ack = disable_lasat_irq, | 49 | .ack = disable_lasat_irq, |
56 | .mask = disable_lasat_irq, | 50 | .mask = disable_lasat_irq, |
57 | .mask_ack = disable_lasat_irq, | 51 | .mask_ack = disable_lasat_irq, |
58 | .unmask = enable_lasat_irq, | 52 | .unmask = enable_lasat_irq, |
59 | .end = end_lasat_irq, | ||
60 | }; | 53 | }; |
61 | 54 | ||
62 | static inline int ls1bit32(unsigned int x) | 55 | static inline int ls1bit32(unsigned int x) |
diff --git a/arch/mips/momentum/ocelot_c/cpci-irq.c b/arch/mips/momentum/ocelot_c/cpci-irq.c index e5a4a0a8a7f0..bb11fef08472 100644 --- a/arch/mips/momentum/ocelot_c/cpci-irq.c +++ b/arch/mips/momentum/ocelot_c/cpci-irq.c | |||
@@ -66,15 +66,6 @@ static inline void unmask_cpci_irq(unsigned int irq) | |||
66 | } | 66 | } |
67 | 67 | ||
68 | /* | 68 | /* |
69 | * End IRQ processing | ||
70 | */ | ||
71 | static void end_cpci_irq(unsigned int irq) | ||
72 | { | ||
73 | if (!(irq_desc[irq].status & (IRQ_DISABLED|IRQ_INPROGRESS))) | ||
74 | unmask_cpci_irq(irq); | ||
75 | } | ||
76 | |||
77 | /* | ||
78 | * Interrupt handler for interrupts coming from the FPGA chip. | 69 | * Interrupt handler for interrupts coming from the FPGA chip. |
79 | * It could be built in ethernet ports etc... | 70 | * It could be built in ethernet ports etc... |
80 | */ | 71 | */ |
@@ -98,7 +89,6 @@ struct irq_chip cpci_irq_type = { | |||
98 | .mask = mask_cpci_irq, | 89 | .mask = mask_cpci_irq, |
99 | .mask_ack = mask_cpci_irq, | 90 | .mask_ack = mask_cpci_irq, |
100 | .unmask = unmask_cpci_irq, | 91 | .unmask = unmask_cpci_irq, |
101 | .end = end_cpci_irq, | ||
102 | }; | 92 | }; |
103 | 93 | ||
104 | void cpci_irq_init(void) | 94 | void cpci_irq_init(void) |
diff --git a/arch/mips/momentum/ocelot_c/uart-irq.c b/arch/mips/momentum/ocelot_c/uart-irq.c index 0029f0008dea..a7a80c0da569 100644 --- a/arch/mips/momentum/ocelot_c/uart-irq.c +++ b/arch/mips/momentum/ocelot_c/uart-irq.c | |||
@@ -60,15 +60,6 @@ static inline void unmask_uart_irq(unsigned int irq) | |||
60 | } | 60 | } |
61 | 61 | ||
62 | /* | 62 | /* |
63 | * End IRQ processing | ||
64 | */ | ||
65 | static void end_uart_irq(unsigned int irq) | ||
66 | { | ||
67 | if (!(irq_desc[irq].status & (IRQ_DISABLED|IRQ_INPROGRESS))) | ||
68 | unmask_uart_irq(irq); | ||
69 | } | ||
70 | |||
71 | /* | ||
72 | * Interrupt handler for interrupts coming from the FPGA chip. | 63 | * Interrupt handler for interrupts coming from the FPGA chip. |
73 | */ | 64 | */ |
74 | void ll_uart_irq(void) | 65 | void ll_uart_irq(void) |
@@ -91,7 +82,6 @@ struct irq_chip uart_irq_type = { | |||
91 | .mask = mask_uart_irq, | 82 | .mask = mask_uart_irq, |
92 | .mask_ack = mask_uart_irq, | 83 | .mask_ack = mask_uart_irq, |
93 | .unmask = unmask_uart_irq, | 84 | .unmask = unmask_uart_irq, |
94 | .end = end_uart_irq, | ||
95 | }; | 85 | }; |
96 | 86 | ||
97 | void uart_irq_init(void) | 87 | void uart_irq_init(void) |
diff --git a/arch/mips/philips/pnx8550/common/int.c b/arch/mips/philips/pnx8550/common/int.c index 0dc23930edbd..2c36c108c4d6 100644 --- a/arch/mips/philips/pnx8550/common/int.c +++ b/arch/mips/philips/pnx8550/common/int.c | |||
@@ -158,20 +158,12 @@ int pnx8550_set_gic_priority(int irq, int priority) | |||
158 | return prev_priority; | 158 | return prev_priority; |
159 | } | 159 | } |
160 | 160 | ||
161 | static void end_irq(unsigned int irq) | ||
162 | { | ||
163 | if (!(irq_desc[irq].status & (IRQ_DISABLED|IRQ_INPROGRESS))) { | ||
164 | unmask_irq(irq); | ||
165 | } | ||
166 | } | ||
167 | |||
168 | static struct irq_chip level_irq_type = { | 161 | static struct irq_chip level_irq_type = { |
169 | .typename = "PNX Level IRQ", | 162 | .typename = "PNX Level IRQ", |
170 | .ack = mask_irq, | 163 | .ack = mask_irq, |
171 | .mask = mask_irq, | 164 | .mask = mask_irq, |
172 | .mask_ack = mask_irq, | 165 | .mask_ack = mask_irq, |
173 | .unmask = unmask_irq, | 166 | .unmask = unmask_irq, |
174 | .end = end_irq, | ||
175 | }; | 167 | }; |
176 | 168 | ||
177 | static struct irqaction gic_action = { | 169 | static struct irqaction gic_action = { |
diff --git a/arch/mips/sgi-ip22/ip22-int.c b/arch/mips/sgi-ip22/ip22-int.c index c7b138053159..c44f8be0644f 100644 --- a/arch/mips/sgi-ip22/ip22-int.c +++ b/arch/mips/sgi-ip22/ip22-int.c | |||
@@ -51,19 +51,12 @@ static void disable_local0_irq(unsigned int irq) | |||
51 | sgint->imask0 &= ~(1 << (irq - SGINT_LOCAL0)); | 51 | sgint->imask0 &= ~(1 << (irq - SGINT_LOCAL0)); |
52 | } | 52 | } |
53 | 53 | ||
54 | static void end_local0_irq (unsigned int irq) | ||
55 | { | ||
56 | if (!(irq_desc[irq].status & (IRQ_DISABLED|IRQ_INPROGRESS))) | ||
57 | enable_local0_irq(irq); | ||
58 | } | ||
59 | |||
60 | static struct irq_chip ip22_local0_irq_type = { | 54 | static struct irq_chip ip22_local0_irq_type = { |
61 | .typename = "IP22 local 0", | 55 | .typename = "IP22 local 0", |
62 | .ack = disable_local0_irq, | 56 | .ack = disable_local0_irq, |
63 | .mask = disable_local0_irq, | 57 | .mask = disable_local0_irq, |
64 | .mask_ack = disable_local0_irq, | 58 | .mask_ack = disable_local0_irq, |
65 | .unmask = enable_local0_irq, | 59 | .unmask = enable_local0_irq, |
66 | .end = end_local0_irq, | ||
67 | }; | 60 | }; |
68 | 61 | ||
69 | static void enable_local1_irq(unsigned int irq) | 62 | static void enable_local1_irq(unsigned int irq) |
@@ -79,19 +72,12 @@ void disable_local1_irq(unsigned int irq) | |||
79 | sgint->imask1 &= ~(1 << (irq - SGINT_LOCAL1)); | 72 | sgint->imask1 &= ~(1 << (irq - SGINT_LOCAL1)); |
80 | } | 73 | } |
81 | 74 | ||
82 | static void end_local1_irq (unsigned int irq) | ||
83 | { | ||
84 | if (!(irq_desc[irq].status & (IRQ_DISABLED|IRQ_INPROGRESS))) | ||
85 | enable_local1_irq(irq); | ||
86 | } | ||
87 | |||
88 | static struct irq_chip ip22_local1_irq_type = { | 75 | static struct irq_chip ip22_local1_irq_type = { |
89 | .typename = "IP22 local 1", | 76 | .typename = "IP22 local 1", |
90 | .ack = disable_local1_irq, | 77 | .ack = disable_local1_irq, |
91 | .mask = disable_local1_irq, | 78 | .mask = disable_local1_irq, |
92 | .mask_ack = disable_local1_irq, | 79 | .mask_ack = disable_local1_irq, |
93 | .unmask = enable_local1_irq, | 80 | .unmask = enable_local1_irq, |
94 | .end = end_local1_irq, | ||
95 | }; | 81 | }; |
96 | 82 | ||
97 | static void enable_local2_irq(unsigned int irq) | 83 | static void enable_local2_irq(unsigned int irq) |
@@ -107,19 +93,12 @@ void disable_local2_irq(unsigned int irq) | |||
107 | sgint->imask0 &= ~(1 << (SGI_MAP_0_IRQ - SGINT_LOCAL0)); | 93 | sgint->imask0 &= ~(1 << (SGI_MAP_0_IRQ - SGINT_LOCAL0)); |
108 | } | 94 | } |
109 | 95 | ||
110 | static void end_local2_irq (unsigned int irq) | ||
111 | { | ||
112 | if (!(irq_desc[irq].status & (IRQ_DISABLED|IRQ_INPROGRESS))) | ||
113 | enable_local2_irq(irq); | ||
114 | } | ||
115 | |||
116 | static struct irq_chip ip22_local2_irq_type = { | 96 | static struct irq_chip ip22_local2_irq_type = { |
117 | .typename = "IP22 local 2", | 97 | .typename = "IP22 local 2", |
118 | .ack = disable_local2_irq, | 98 | .ack = disable_local2_irq, |
119 | .mask = disable_local2_irq, | 99 | .mask = disable_local2_irq, |
120 | .mask_ack = disable_local2_irq, | 100 | .mask_ack = disable_local2_irq, |
121 | .unmask = enable_local2_irq, | 101 | .unmask = enable_local2_irq, |
122 | .end = end_local2_irq, | ||
123 | }; | 102 | }; |
124 | 103 | ||
125 | static void enable_local3_irq(unsigned int irq) | 104 | static void enable_local3_irq(unsigned int irq) |
@@ -135,19 +114,12 @@ void disable_local3_irq(unsigned int irq) | |||
135 | sgint->imask1 &= ~(1 << (SGI_MAP_1_IRQ - SGINT_LOCAL1)); | 114 | sgint->imask1 &= ~(1 << (SGI_MAP_1_IRQ - SGINT_LOCAL1)); |
136 | } | 115 | } |
137 | 116 | ||
138 | static void end_local3_irq (unsigned int irq) | ||
139 | { | ||
140 | if (!(irq_desc[irq].status & (IRQ_DISABLED|IRQ_INPROGRESS))) | ||
141 | enable_local3_irq(irq); | ||
142 | } | ||
143 | |||
144 | static struct irq_chip ip22_local3_irq_type = { | 117 | static struct irq_chip ip22_local3_irq_type = { |
145 | .typename = "IP22 local 3", | 118 | .typename = "IP22 local 3", |
146 | .ack = disable_local3_irq, | 119 | .ack = disable_local3_irq, |
147 | .mask = disable_local3_irq, | 120 | .mask = disable_local3_irq, |
148 | .mask_ack = disable_local3_irq, | 121 | .mask_ack = disable_local3_irq, |
149 | .unmask = enable_local3_irq, | 122 | .unmask = enable_local3_irq, |
150 | .end = end_local3_irq, | ||
151 | }; | 123 | }; |
152 | 124 | ||
153 | static void indy_local0_irqdispatch(void) | 125 | static void indy_local0_irqdispatch(void) |
diff --git a/arch/mips/sgi-ip27/ip27-irq.c b/arch/mips/sgi-ip27/ip27-irq.c index 5f8835b4e84a..319f8803ef6f 100644 --- a/arch/mips/sgi-ip27/ip27-irq.c +++ b/arch/mips/sgi-ip27/ip27-irq.c | |||
@@ -332,13 +332,6 @@ static inline void disable_bridge_irq(unsigned int irq) | |||
332 | intr_disconnect_level(cpu, swlevel); | 332 | intr_disconnect_level(cpu, swlevel); |
333 | } | 333 | } |
334 | 334 | ||
335 | static void end_bridge_irq(unsigned int irq) | ||
336 | { | ||
337 | if (!(irq_desc[irq].status & (IRQ_DISABLED|IRQ_INPROGRESS)) && | ||
338 | irq_desc[irq].action) | ||
339 | enable_bridge_irq(irq); | ||
340 | } | ||
341 | |||
342 | static struct irq_chip bridge_irq_type = { | 335 | static struct irq_chip bridge_irq_type = { |
343 | .typename = "bridge", | 336 | .typename = "bridge", |
344 | .startup = startup_bridge_irq, | 337 | .startup = startup_bridge_irq, |
@@ -347,7 +340,6 @@ static struct irq_chip bridge_irq_type = { | |||
347 | .mask = disable_bridge_irq, | 340 | .mask = disable_bridge_irq, |
348 | .mask_ack = disable_bridge_irq, | 341 | .mask_ack = disable_bridge_irq, |
349 | .unmask = enable_bridge_irq, | 342 | .unmask = enable_bridge_irq, |
350 | .end = end_bridge_irq, | ||
351 | }; | 343 | }; |
352 | 344 | ||
353 | void __devinit register_bridge_irq(unsigned int irq) | 345 | void __devinit register_bridge_irq(unsigned int irq) |
diff --git a/arch/mips/sgi-ip27/ip27-timer.c b/arch/mips/sgi-ip27/ip27-timer.c index 7d361726bbfb..c20e9899b34b 100644 --- a/arch/mips/sgi-ip27/ip27-timer.c +++ b/arch/mips/sgi-ip27/ip27-timer.c | |||
@@ -180,10 +180,6 @@ static void disable_rt_irq(unsigned int irq) | |||
180 | { | 180 | { |
181 | } | 181 | } |
182 | 182 | ||
183 | static void end_rt_irq(unsigned int irq) | ||
184 | { | ||
185 | } | ||
186 | |||
187 | static struct irq_chip rt_irq_type = { | 183 | static struct irq_chip rt_irq_type = { |
188 | .typename = "SN HUB RT timer", | 184 | .typename = "SN HUB RT timer", |
189 | .ack = disable_rt_irq, | 185 | .ack = disable_rt_irq, |
@@ -191,7 +187,6 @@ static struct irq_chip rt_irq_type = { | |||
191 | .mask_ack = disable_rt_irq, | 187 | .mask_ack = disable_rt_irq, |
192 | .unmask = enable_rt_irq, | 188 | .unmask = enable_rt_irq, |
193 | .eoi = enable_rt_irq, | 189 | .eoi = enable_rt_irq, |
194 | .end = end_rt_irq, | ||
195 | }; | 190 | }; |
196 | 191 | ||
197 | static struct irqaction rt_irqaction = { | 192 | static struct irqaction rt_irqaction = { |
diff --git a/arch/mips/tx4927/common/tx4927_irq.c b/arch/mips/tx4927/common/tx4927_irq.c index 21873de49aa8..ed4a19adf361 100644 --- a/arch/mips/tx4927/common/tx4927_irq.c +++ b/arch/mips/tx4927/common/tx4927_irq.c | |||
@@ -66,12 +66,10 @@ | |||
66 | #define TX4927_IRQ_CP0_INIT ( 1 << 10 ) | 66 | #define TX4927_IRQ_CP0_INIT ( 1 << 10 ) |
67 | #define TX4927_IRQ_CP0_ENABLE ( 1 << 13 ) | 67 | #define TX4927_IRQ_CP0_ENABLE ( 1 << 13 ) |
68 | #define TX4927_IRQ_CP0_DISABLE ( 1 << 14 ) | 68 | #define TX4927_IRQ_CP0_DISABLE ( 1 << 14 ) |
69 | #define TX4927_IRQ_CP0_ENDIRQ ( 1 << 16 ) | ||
70 | 69 | ||
71 | #define TX4927_IRQ_PIC_INIT ( 1 << 20 ) | 70 | #define TX4927_IRQ_PIC_INIT ( 1 << 20 ) |
72 | #define TX4927_IRQ_PIC_ENABLE ( 1 << 23 ) | 71 | #define TX4927_IRQ_PIC_ENABLE ( 1 << 23 ) |
73 | #define TX4927_IRQ_PIC_DISABLE ( 1 << 24 ) | 72 | #define TX4927_IRQ_PIC_DISABLE ( 1 << 24 ) |
74 | #define TX4927_IRQ_PIC_ENDIRQ ( 1 << 26 ) | ||
75 | 73 | ||
76 | #define TX4927_IRQ_ALL 0xffffffff | 74 | #define TX4927_IRQ_ALL 0xffffffff |
77 | #endif | 75 | #endif |
@@ -82,12 +80,10 @@ static const u32 tx4927_irq_debug_flag = (TX4927_IRQ_NONE | |||
82 | | TX4927_IRQ_WARN | TX4927_IRQ_EROR | 80 | | TX4927_IRQ_WARN | TX4927_IRQ_EROR |
83 | // | TX4927_IRQ_CP0_INIT | 81 | // | TX4927_IRQ_CP0_INIT |
84 | // | TX4927_IRQ_CP0_ENABLE | 82 | // | TX4927_IRQ_CP0_ENABLE |
85 | // | TX4927_IRQ_CP0_DISABLE | ||
86 | // | TX4927_IRQ_CP0_ENDIRQ | 83 | // | TX4927_IRQ_CP0_ENDIRQ |
87 | // | TX4927_IRQ_PIC_INIT | 84 | // | TX4927_IRQ_PIC_INIT |
88 | // | TX4927_IRQ_PIC_ENABLE | 85 | // | TX4927_IRQ_PIC_ENABLE |
89 | // | TX4927_IRQ_PIC_DISABLE | 86 | // | TX4927_IRQ_PIC_DISABLE |
90 | // | TX4927_IRQ_PIC_ENDIRQ | ||
91 | // | TX4927_IRQ_INIT | 87 | // | TX4927_IRQ_INIT |
92 | // | TX4927_IRQ_NEST1 | 88 | // | TX4927_IRQ_NEST1 |
93 | // | TX4927_IRQ_NEST2 | 89 | // | TX4927_IRQ_NEST2 |
@@ -114,11 +110,9 @@ static const u32 tx4927_irq_debug_flag = (TX4927_IRQ_NONE | |||
114 | 110 | ||
115 | static void tx4927_irq_cp0_enable(unsigned int irq); | 111 | static void tx4927_irq_cp0_enable(unsigned int irq); |
116 | static void tx4927_irq_cp0_disable(unsigned int irq); | 112 | static void tx4927_irq_cp0_disable(unsigned int irq); |
117 | static void tx4927_irq_cp0_end(unsigned int irq); | ||
118 | 113 | ||
119 | static void tx4927_irq_pic_enable(unsigned int irq); | 114 | static void tx4927_irq_pic_enable(unsigned int irq); |
120 | static void tx4927_irq_pic_disable(unsigned int irq); | 115 | static void tx4927_irq_pic_disable(unsigned int irq); |
121 | static void tx4927_irq_pic_end(unsigned int irq); | ||
122 | 116 | ||
123 | /* | 117 | /* |
124 | * Kernel structs for all pic's | 118 | * Kernel structs for all pic's |
@@ -131,7 +125,6 @@ static struct irq_chip tx4927_irq_cp0_type = { | |||
131 | .mask = tx4927_irq_cp0_disable, | 125 | .mask = tx4927_irq_cp0_disable, |
132 | .mask_ack = tx4927_irq_cp0_disable, | 126 | .mask_ack = tx4927_irq_cp0_disable, |
133 | .unmask = tx4927_irq_cp0_enable, | 127 | .unmask = tx4927_irq_cp0_enable, |
134 | .end = tx4927_irq_cp0_end, | ||
135 | }; | 128 | }; |
136 | 129 | ||
137 | #define TX4927_PIC_NAME "TX4927-PIC" | 130 | #define TX4927_PIC_NAME "TX4927-PIC" |
@@ -141,7 +134,6 @@ static struct irq_chip tx4927_irq_pic_type = { | |||
141 | .mask = tx4927_irq_pic_disable, | 134 | .mask = tx4927_irq_pic_disable, |
142 | .mask_ack = tx4927_irq_pic_disable, | 135 | .mask_ack = tx4927_irq_pic_disable, |
143 | .unmask = tx4927_irq_pic_enable, | 136 | .unmask = tx4927_irq_pic_enable, |
144 | .end = tx4927_irq_pic_end, | ||
145 | }; | 137 | }; |
146 | 138 | ||
147 | #define TX4927_PIC_ACTION(s) { no_action, 0, CPU_MASK_NONE, s, NULL, NULL } | 139 | #define TX4927_PIC_ACTION(s) { no_action, 0, CPU_MASK_NONE, s, NULL, NULL } |
@@ -214,15 +206,6 @@ static void tx4927_irq_cp0_disable(unsigned int irq) | |||
214 | tx4927_irq_cp0_modify(CCP0_STATUS, tx4927_irq_cp0_mask(irq), 0); | 206 | tx4927_irq_cp0_modify(CCP0_STATUS, tx4927_irq_cp0_mask(irq), 0); |
215 | } | 207 | } |
216 | 208 | ||
217 | static void tx4927_irq_cp0_end(unsigned int irq) | ||
218 | { | ||
219 | TX4927_IRQ_DPRINTK(TX4927_IRQ_CP0_ENDIRQ, "irq=%d \n", irq); | ||
220 | |||
221 | if (!(irq_desc[irq].status & (IRQ_DISABLED | IRQ_INPROGRESS))) { | ||
222 | tx4927_irq_cp0_enable(irq); | ||
223 | } | ||
224 | } | ||
225 | |||
226 | /* | 209 | /* |
227 | * Functions for pic | 210 | * Functions for pic |
228 | */ | 211 | */ |
@@ -376,15 +359,6 @@ static void tx4927_irq_pic_disable(unsigned int irq) | |||
376 | tx4927_irq_pic_mask(irq), 0); | 359 | tx4927_irq_pic_mask(irq), 0); |
377 | } | 360 | } |
378 | 361 | ||
379 | static void tx4927_irq_pic_end(unsigned int irq) | ||
380 | { | ||
381 | TX4927_IRQ_DPRINTK(TX4927_IRQ_PIC_ENDIRQ, "irq=%d\n", irq); | ||
382 | |||
383 | if (!(irq_desc[irq].status & (IRQ_DISABLED | IRQ_INPROGRESS))) { | ||
384 | tx4927_irq_pic_enable(irq); | ||
385 | } | ||
386 | } | ||
387 | |||
388 | /* | 362 | /* |
389 | * Main init functions | 363 | * Main init functions |
390 | */ | 364 | */ |
diff --git a/arch/mips/tx4927/toshiba_rbtx4927/toshiba_rbtx4927_irq.c b/arch/mips/tx4927/toshiba_rbtx4927/toshiba_rbtx4927_irq.c index 34cdb2a240e9..5a5ea6c0b9f6 100644 --- a/arch/mips/tx4927/toshiba_rbtx4927/toshiba_rbtx4927_irq.c +++ b/arch/mips/tx4927/toshiba_rbtx4927/toshiba_rbtx4927_irq.c | |||
@@ -153,7 +153,6 @@ JP7 is not bus master -- do NOT use -- only 4 pci bus master's allowed -- SouthB | |||
153 | #define TOSHIBA_RBTX4927_IRQ_IOC_INIT ( 1 << 10 ) | 153 | #define TOSHIBA_RBTX4927_IRQ_IOC_INIT ( 1 << 10 ) |
154 | #define TOSHIBA_RBTX4927_IRQ_IOC_ENABLE ( 1 << 13 ) | 154 | #define TOSHIBA_RBTX4927_IRQ_IOC_ENABLE ( 1 << 13 ) |
155 | #define TOSHIBA_RBTX4927_IRQ_IOC_DISABLE ( 1 << 14 ) | 155 | #define TOSHIBA_RBTX4927_IRQ_IOC_DISABLE ( 1 << 14 ) |
156 | #define TOSHIBA_RBTX4927_IRQ_IOC_ENDIRQ ( 1 << 16 ) | ||
157 | 156 | ||
158 | #define TOSHIBA_RBTX4927_IRQ_ISA_INIT ( 1 << 20 ) | 157 | #define TOSHIBA_RBTX4927_IRQ_ISA_INIT ( 1 << 20 ) |
159 | #define TOSHIBA_RBTX4927_IRQ_ISA_ENABLE ( 1 << 23 ) | 158 | #define TOSHIBA_RBTX4927_IRQ_ISA_ENABLE ( 1 << 23 ) |
@@ -172,7 +171,6 @@ static const u32 toshiba_rbtx4927_irq_debug_flag = | |||
172 | // | TOSHIBA_RBTX4927_IRQ_IOC_INIT | 171 | // | TOSHIBA_RBTX4927_IRQ_IOC_INIT |
173 | // | TOSHIBA_RBTX4927_IRQ_IOC_ENABLE | 172 | // | TOSHIBA_RBTX4927_IRQ_IOC_ENABLE |
174 | // | TOSHIBA_RBTX4927_IRQ_IOC_DISABLE | 173 | // | TOSHIBA_RBTX4927_IRQ_IOC_DISABLE |
175 | // | TOSHIBA_RBTX4927_IRQ_IOC_ENDIRQ | ||
176 | // | TOSHIBA_RBTX4927_IRQ_ISA_INIT | 174 | // | TOSHIBA_RBTX4927_IRQ_ISA_INIT |
177 | // | TOSHIBA_RBTX4927_IRQ_ISA_ENABLE | 175 | // | TOSHIBA_RBTX4927_IRQ_ISA_ENABLE |
178 | // | TOSHIBA_RBTX4927_IRQ_ISA_DISABLE | 176 | // | TOSHIBA_RBTX4927_IRQ_ISA_DISABLE |
@@ -223,7 +221,6 @@ extern void mask_and_ack_8259A(unsigned int irq); | |||
223 | 221 | ||
224 | static void toshiba_rbtx4927_irq_ioc_enable(unsigned int irq); | 222 | static void toshiba_rbtx4927_irq_ioc_enable(unsigned int irq); |
225 | static void toshiba_rbtx4927_irq_ioc_disable(unsigned int irq); | 223 | static void toshiba_rbtx4927_irq_ioc_disable(unsigned int irq); |
226 | static void toshiba_rbtx4927_irq_ioc_end(unsigned int irq); | ||
227 | 224 | ||
228 | #ifdef CONFIG_TOSHIBA_FPCIB0 | 225 | #ifdef CONFIG_TOSHIBA_FPCIB0 |
229 | static void toshiba_rbtx4927_irq_isa_enable(unsigned int irq); | 226 | static void toshiba_rbtx4927_irq_isa_enable(unsigned int irq); |
@@ -239,7 +236,6 @@ static struct irq_chip toshiba_rbtx4927_irq_ioc_type = { | |||
239 | .mask = toshiba_rbtx4927_irq_ioc_disable, | 236 | .mask = toshiba_rbtx4927_irq_ioc_disable, |
240 | .mask_ack = toshiba_rbtx4927_irq_ioc_disable, | 237 | .mask_ack = toshiba_rbtx4927_irq_ioc_disable, |
241 | .unmask = toshiba_rbtx4927_irq_ioc_enable, | 238 | .unmask = toshiba_rbtx4927_irq_ioc_enable, |
242 | .end = toshiba_rbtx4927_irq_ioc_end, | ||
243 | }; | 239 | }; |
244 | #define TOSHIBA_RBTX4927_IOC_INTR_ENAB 0xbc002000 | 240 | #define TOSHIBA_RBTX4927_IOC_INTR_ENAB 0xbc002000 |
245 | #define TOSHIBA_RBTX4927_IOC_INTR_STAT 0xbc002006 | 241 | #define TOSHIBA_RBTX4927_IOC_INTR_STAT 0xbc002006 |
@@ -388,23 +384,6 @@ static void toshiba_rbtx4927_irq_ioc_disable(unsigned int irq) | |||
388 | TOSHIBA_RBTX4927_WR08(TOSHIBA_RBTX4927_IOC_INTR_ENAB, v); | 384 | TOSHIBA_RBTX4927_WR08(TOSHIBA_RBTX4927_IOC_INTR_ENAB, v); |
389 | } | 385 | } |
390 | 386 | ||
391 | static void toshiba_rbtx4927_irq_ioc_end(unsigned int irq) | ||
392 | { | ||
393 | TOSHIBA_RBTX4927_IRQ_DPRINTK(TOSHIBA_RBTX4927_IRQ_IOC_ENDIRQ, | ||
394 | "irq=%d\n", irq); | ||
395 | |||
396 | if (irq < TOSHIBA_RBTX4927_IRQ_IOC_BEG | ||
397 | || irq > TOSHIBA_RBTX4927_IRQ_IOC_END) { | ||
398 | TOSHIBA_RBTX4927_IRQ_DPRINTK(TOSHIBA_RBTX4927_IRQ_EROR, | ||
399 | "bad irq=%d\n", irq); | ||
400 | panic("\n"); | ||
401 | } | ||
402 | |||
403 | if (!(irq_desc[irq].status & (IRQ_DISABLED | IRQ_INPROGRESS))) { | ||
404 | toshiba_rbtx4927_irq_ioc_enable(irq); | ||
405 | } | ||
406 | } | ||
407 | |||
408 | 387 | ||
409 | /**********************************************************************************/ | 388 | /**********************************************************************************/ |
410 | /* Functions for isa */ | 389 | /* Functions for isa */ |
diff --git a/arch/mips/tx4938/common/irq.c b/arch/mips/tx4938/common/irq.c index 42e127683ae9..a347b424d91c 100644 --- a/arch/mips/tx4938/common/irq.c +++ b/arch/mips/tx4938/common/irq.c | |||
@@ -39,11 +39,9 @@ | |||
39 | 39 | ||
40 | static void tx4938_irq_cp0_enable(unsigned int irq); | 40 | static void tx4938_irq_cp0_enable(unsigned int irq); |
41 | static void tx4938_irq_cp0_disable(unsigned int irq); | 41 | static void tx4938_irq_cp0_disable(unsigned int irq); |
42 | static void tx4938_irq_cp0_end(unsigned int irq); | ||
43 | 42 | ||
44 | static void tx4938_irq_pic_enable(unsigned int irq); | 43 | static void tx4938_irq_pic_enable(unsigned int irq); |
45 | static void tx4938_irq_pic_disable(unsigned int irq); | 44 | static void tx4938_irq_pic_disable(unsigned int irq); |
46 | static void tx4938_irq_pic_end(unsigned int irq); | ||
47 | 45 | ||
48 | /**********************************************************************************/ | 46 | /**********************************************************************************/ |
49 | /* Kernel structs for all pic's */ | 47 | /* Kernel structs for all pic's */ |
@@ -56,7 +54,6 @@ static struct irq_chip tx4938_irq_cp0_type = { | |||
56 | .mask = tx4938_irq_cp0_disable, | 54 | .mask = tx4938_irq_cp0_disable, |
57 | .mask_ack = tx4938_irq_cp0_disable, | 55 | .mask_ack = tx4938_irq_cp0_disable, |
58 | .unmask = tx4938_irq_cp0_enable, | 56 | .unmask = tx4938_irq_cp0_enable, |
59 | .end = tx4938_irq_cp0_end, | ||
60 | }; | 57 | }; |
61 | 58 | ||
62 | #define TX4938_PIC_NAME "TX4938-PIC" | 59 | #define TX4938_PIC_NAME "TX4938-PIC" |
@@ -66,7 +63,6 @@ static struct irq_chip tx4938_irq_pic_type = { | |||
66 | .mask = tx4938_irq_pic_disable, | 63 | .mask = tx4938_irq_pic_disable, |
67 | .mask_ack = tx4938_irq_pic_disable, | 64 | .mask_ack = tx4938_irq_pic_disable, |
68 | .unmask = tx4938_irq_pic_enable, | 65 | .unmask = tx4938_irq_pic_enable, |
69 | .end = tx4938_irq_pic_end, | ||
70 | }; | 66 | }; |
71 | 67 | ||
72 | static struct irqaction tx4938_irq_pic_action = { | 68 | static struct irqaction tx4938_irq_pic_action = { |
@@ -104,14 +100,6 @@ tx4938_irq_cp0_disable(unsigned int irq) | |||
104 | clear_c0_status(tx4938_irq_cp0_mask(irq)); | 100 | clear_c0_status(tx4938_irq_cp0_mask(irq)); |
105 | } | 101 | } |
106 | 102 | ||
107 | static void | ||
108 | tx4938_irq_cp0_end(unsigned int irq) | ||
109 | { | ||
110 | if (!(irq_desc[irq].status & (IRQ_DISABLED | IRQ_INPROGRESS))) { | ||
111 | tx4938_irq_cp0_enable(irq); | ||
112 | } | ||
113 | } | ||
114 | |||
115 | /**********************************************************************************/ | 103 | /**********************************************************************************/ |
116 | /* Functions for pic */ | 104 | /* Functions for pic */ |
117 | /**********************************************************************************/ | 105 | /**********************************************************************************/ |
@@ -269,14 +257,6 @@ tx4938_irq_pic_disable(unsigned int irq) | |||
269 | tx4938_irq_pic_mask(irq), 0); | 257 | tx4938_irq_pic_mask(irq), 0); |
270 | } | 258 | } |
271 | 259 | ||
272 | static void | ||
273 | tx4938_irq_pic_end(unsigned int irq) | ||
274 | { | ||
275 | if (!(irq_desc[irq].status & (IRQ_DISABLED | IRQ_INPROGRESS))) { | ||
276 | tx4938_irq_pic_enable(irq); | ||
277 | } | ||
278 | } | ||
279 | |||
280 | /**********************************************************************************/ | 260 | /**********************************************************************************/ |
281 | /* Main init functions */ | 261 | /* Main init functions */ |
282 | /**********************************************************************************/ | 262 | /**********************************************************************************/ |
diff --git a/arch/mips/tx4938/toshiba_rbtx4938/irq.c b/arch/mips/tx4938/toshiba_rbtx4938/irq.c index 8c87a35f3068..b6f363d08011 100644 --- a/arch/mips/tx4938/toshiba_rbtx4938/irq.c +++ b/arch/mips/tx4938/toshiba_rbtx4938/irq.c | |||
@@ -89,7 +89,6 @@ IRQ Device | |||
89 | 89 | ||
90 | static void toshiba_rbtx4938_irq_ioc_enable(unsigned int irq); | 90 | static void toshiba_rbtx4938_irq_ioc_enable(unsigned int irq); |
91 | static void toshiba_rbtx4938_irq_ioc_disable(unsigned int irq); | 91 | static void toshiba_rbtx4938_irq_ioc_disable(unsigned int irq); |
92 | static void toshiba_rbtx4938_irq_ioc_end(unsigned int irq); | ||
93 | 92 | ||
94 | #define TOSHIBA_RBTX4938_IOC_NAME "RBTX4938-IOC" | 93 | #define TOSHIBA_RBTX4938_IOC_NAME "RBTX4938-IOC" |
95 | static struct irq_chip toshiba_rbtx4938_irq_ioc_type = { | 94 | static struct irq_chip toshiba_rbtx4938_irq_ioc_type = { |
@@ -98,7 +97,6 @@ static struct irq_chip toshiba_rbtx4938_irq_ioc_type = { | |||
98 | .mask = toshiba_rbtx4938_irq_ioc_disable, | 97 | .mask = toshiba_rbtx4938_irq_ioc_disable, |
99 | .mask_ack = toshiba_rbtx4938_irq_ioc_disable, | 98 | .mask_ack = toshiba_rbtx4938_irq_ioc_disable, |
100 | .unmask = toshiba_rbtx4938_irq_ioc_enable, | 99 | .unmask = toshiba_rbtx4938_irq_ioc_enable, |
101 | .end = toshiba_rbtx4938_irq_ioc_end, | ||
102 | }; | 100 | }; |
103 | 101 | ||
104 | #define TOSHIBA_RBTX4938_IOC_INTR_ENAB 0xb7f02000 | 102 | #define TOSHIBA_RBTX4938_IOC_INTR_ENAB 0xb7f02000 |
@@ -167,14 +165,6 @@ toshiba_rbtx4938_irq_ioc_disable(unsigned int irq) | |||
167 | TX4938_RD08(TOSHIBA_RBTX4938_IOC_INTR_ENAB); | 165 | TX4938_RD08(TOSHIBA_RBTX4938_IOC_INTR_ENAB); |
168 | } | 166 | } |
169 | 167 | ||
170 | static void | ||
171 | toshiba_rbtx4938_irq_ioc_end(unsigned int irq) | ||
172 | { | ||
173 | if (!(irq_desc[irq].status & (IRQ_DISABLED | IRQ_INPROGRESS))) { | ||
174 | toshiba_rbtx4938_irq_ioc_enable(irq); | ||
175 | } | ||
176 | } | ||
177 | |||
178 | extern void __init txx9_spi_irqinit(int irc_irq); | 168 | extern void __init txx9_spi_irqinit(int irc_irq); |
179 | 169 | ||
180 | void __init arch_init_irq(void) | 170 | void __init arch_init_irq(void) |
diff --git a/arch/mips/vr41xx/Kconfig b/arch/mips/vr41xx/Kconfig index 92f41f6f934a..c8dfd8092cab 100644 --- a/arch/mips/vr41xx/Kconfig +++ b/arch/mips/vr41xx/Kconfig | |||
@@ -6,6 +6,7 @@ config CASIO_E55 | |||
6 | select ISA | 6 | select ISA |
7 | select SYS_SUPPORTS_32BIT_KERNEL | 7 | select SYS_SUPPORTS_32BIT_KERNEL |
8 | select SYS_SUPPORTS_LITTLE_ENDIAN | 8 | select SYS_SUPPORTS_LITTLE_ENDIAN |
9 | select GENERIC_HARDIRQS_NO__DO_IRQ | ||
9 | 10 | ||
10 | config IBM_WORKPAD | 11 | config IBM_WORKPAD |
11 | bool "Support for IBM WorkPad z50" | 12 | bool "Support for IBM WorkPad z50" |
@@ -15,6 +16,7 @@ config IBM_WORKPAD | |||
15 | select ISA | 16 | select ISA |
16 | select SYS_SUPPORTS_32BIT_KERNEL | 17 | select SYS_SUPPORTS_32BIT_KERNEL |
17 | select SYS_SUPPORTS_LITTLE_ENDIAN | 18 | select SYS_SUPPORTS_LITTLE_ENDIAN |
19 | select GENERIC_HARDIRQS_NO__DO_IRQ | ||
18 | 20 | ||
19 | config NEC_CMBVR4133 | 21 | config NEC_CMBVR4133 |
20 | bool "Support for NEC CMB-VR4133" | 22 | bool "Support for NEC CMB-VR4133" |
@@ -39,6 +41,7 @@ config TANBAC_TB022X | |||
39 | select IRQ_CPU | 41 | select IRQ_CPU |
40 | select SYS_SUPPORTS_32BIT_KERNEL | 42 | select SYS_SUPPORTS_32BIT_KERNEL |
41 | select SYS_SUPPORTS_LITTLE_ENDIAN | 43 | select SYS_SUPPORTS_LITTLE_ENDIAN |
44 | select GENERIC_HARDIRQS_NO__DO_IRQ | ||
42 | help | 45 | help |
43 | The TANBAC VR4131 multichip module(TB0225) and | 46 | The TANBAC VR4131 multichip module(TB0225) and |
44 | the TANBAC VR4131DIMM(TB0229) are MIPS-based platforms | 47 | the TANBAC VR4131DIMM(TB0229) are MIPS-based platforms |
@@ -71,6 +74,7 @@ config VICTOR_MPC30X | |||
71 | select IRQ_CPU | 74 | select IRQ_CPU |
72 | select SYS_SUPPORTS_32BIT_KERNEL | 75 | select SYS_SUPPORTS_32BIT_KERNEL |
73 | select SYS_SUPPORTS_LITTLE_ENDIAN | 76 | select SYS_SUPPORTS_LITTLE_ENDIAN |
77 | select GENERIC_HARDIRQS_NO__DO_IRQ | ||
74 | 78 | ||
75 | config ZAO_CAPCELLA | 79 | config ZAO_CAPCELLA |
76 | bool "Support for ZAO Networks Capcella" | 80 | bool "Support for ZAO Networks Capcella" |
@@ -80,6 +84,7 @@ config ZAO_CAPCELLA | |||
80 | select IRQ_CPU | 84 | select IRQ_CPU |
81 | select SYS_SUPPORTS_32BIT_KERNEL | 85 | select SYS_SUPPORTS_32BIT_KERNEL |
82 | select SYS_SUPPORTS_LITTLE_ENDIAN | 86 | select SYS_SUPPORTS_LITTLE_ENDIAN |
87 | select GENERIC_HARDIRQS_NO__DO_IRQ | ||
83 | 88 | ||
84 | config PCI_VR41XX | 89 | config PCI_VR41XX |
85 | bool "Add PCI control unit support of NEC VR4100 series" | 90 | bool "Add PCI control unit support of NEC VR4100 series" |
diff --git a/arch/mips/vr41xx/common/icu.c b/arch/mips/vr41xx/common/icu.c index 54b92a74c7ac..c075261976c5 100644 --- a/arch/mips/vr41xx/common/icu.c +++ b/arch/mips/vr41xx/common/icu.c | |||
@@ -427,19 +427,12 @@ static void enable_sysint1_irq(unsigned int irq) | |||
427 | icu1_set(MSYSINT1REG, 1 << SYSINT1_IRQ_TO_PIN(irq)); | 427 | icu1_set(MSYSINT1REG, 1 << SYSINT1_IRQ_TO_PIN(irq)); |
428 | } | 428 | } |
429 | 429 | ||
430 | static void end_sysint1_irq(unsigned int irq) | ||
431 | { | ||
432 | if (!(irq_desc[irq].status & (IRQ_DISABLED | IRQ_INPROGRESS))) | ||
433 | icu1_set(MSYSINT1REG, 1 << SYSINT1_IRQ_TO_PIN(irq)); | ||
434 | } | ||
435 | |||
436 | static struct irq_chip sysint1_irq_type = { | 430 | static struct irq_chip sysint1_irq_type = { |
437 | .typename = "SYSINT1", | 431 | .typename = "SYSINT1", |
438 | .ack = disable_sysint1_irq, | 432 | .ack = disable_sysint1_irq, |
439 | .mask = disable_sysint1_irq, | 433 | .mask = disable_sysint1_irq, |
440 | .mask_ack = disable_sysint1_irq, | 434 | .mask_ack = disable_sysint1_irq, |
441 | .unmask = enable_sysint1_irq, | 435 | .unmask = enable_sysint1_irq, |
442 | .end = end_sysint1_irq, | ||
443 | }; | 436 | }; |
444 | 437 | ||
445 | static void disable_sysint2_irq(unsigned int irq) | 438 | static void disable_sysint2_irq(unsigned int irq) |
@@ -452,19 +445,12 @@ static void enable_sysint2_irq(unsigned int irq) | |||
452 | icu2_set(MSYSINT2REG, 1 << SYSINT2_IRQ_TO_PIN(irq)); | 445 | icu2_set(MSYSINT2REG, 1 << SYSINT2_IRQ_TO_PIN(irq)); |
453 | } | 446 | } |
454 | 447 | ||
455 | static void end_sysint2_irq(unsigned int irq) | ||
456 | { | ||
457 | if (!(irq_desc[irq].status & (IRQ_DISABLED | IRQ_INPROGRESS))) | ||
458 | icu2_set(MSYSINT2REG, 1 << SYSINT2_IRQ_TO_PIN(irq)); | ||
459 | } | ||
460 | |||
461 | static struct irq_chip sysint2_irq_type = { | 448 | static struct irq_chip sysint2_irq_type = { |
462 | .typename = "SYSINT2", | 449 | .typename = "SYSINT2", |
463 | .ack = disable_sysint2_irq, | 450 | .ack = disable_sysint2_irq, |
464 | .mask = disable_sysint2_irq, | 451 | .mask = disable_sysint2_irq, |
465 | .mask_ack = disable_sysint2_irq, | 452 | .mask_ack = disable_sysint2_irq, |
466 | .unmask = enable_sysint2_irq, | 453 | .unmask = enable_sysint2_irq, |
467 | .end = end_sysint2_irq, | ||
468 | }; | 454 | }; |
469 | 455 | ||
470 | static inline int set_sysint1_assign(unsigned int irq, unsigned char assign) | 456 | static inline int set_sysint1_assign(unsigned int irq, unsigned char assign) |
diff --git a/include/asm-mips/i8259.h b/include/asm-mips/i8259.h index 0214abe3f0af..4df8d8b118c0 100644 --- a/include/asm-mips/i8259.h +++ b/include/asm-mips/i8259.h | |||
@@ -19,10 +19,31 @@ | |||
19 | 19 | ||
20 | #include <asm/io.h> | 20 | #include <asm/io.h> |
21 | 21 | ||
22 | /* i8259A PIC registers */ | ||
23 | #define PIC_MASTER_CMD 0x20 | ||
24 | #define PIC_MASTER_IMR 0x21 | ||
25 | #define PIC_MASTER_ISR PIC_MASTER_CMD | ||
26 | #define PIC_MASTER_POLL PIC_MASTER_ISR | ||
27 | #define PIC_MASTER_OCW3 PIC_MASTER_ISR | ||
28 | #define PIC_SLAVE_CMD 0xa0 | ||
29 | #define PIC_SLAVE_IMR 0xa1 | ||
30 | |||
31 | /* i8259A PIC related value */ | ||
32 | #define PIC_CASCADE_IR 2 | ||
33 | #define MASTER_ICW4_DEFAULT 0x01 | ||
34 | #define SLAVE_ICW4_DEFAULT 0x01 | ||
35 | #define PIC_ICW4_AEOI 2 | ||
36 | |||
22 | extern spinlock_t i8259A_lock; | 37 | extern spinlock_t i8259A_lock; |
23 | 38 | ||
39 | extern void init_8259A(int auto_eoi); | ||
40 | extern void enable_8259A_irq(unsigned int irq); | ||
41 | extern void disable_8259A_irq(unsigned int irq); | ||
42 | |||
24 | extern void init_i8259_irqs(void); | 43 | extern void init_i8259_irqs(void); |
25 | 44 | ||
45 | #define I8259A_IRQ_BASE 0 | ||
46 | |||
26 | /* | 47 | /* |
27 | * Do the traditional i8259 interrupt polling thing. This is for the few | 48 | * Do the traditional i8259 interrupt polling thing. This is for the few |
28 | * cases where no better interrupt acknowledge method is available and we | 49 | * cases where no better interrupt acknowledge method is available and we |
@@ -35,15 +56,15 @@ static inline int i8259_irq(void) | |||
35 | spin_lock(&i8259A_lock); | 56 | spin_lock(&i8259A_lock); |
36 | 57 | ||
37 | /* Perform an interrupt acknowledge cycle on controller 1. */ | 58 | /* Perform an interrupt acknowledge cycle on controller 1. */ |
38 | outb(0x0C, 0x20); /* prepare for poll */ | 59 | outb(0x0C, PIC_MASTER_CMD); /* prepare for poll */ |
39 | irq = inb(0x20) & 7; | 60 | irq = inb(PIC_MASTER_CMD) & 7; |
40 | if (irq == 2) { | 61 | if (irq == PIC_CASCADE_IR) { |
41 | /* | 62 | /* |
42 | * Interrupt is cascaded so perform interrupt | 63 | * Interrupt is cascaded so perform interrupt |
43 | * acknowledge on controller 2. | 64 | * acknowledge on controller 2. |
44 | */ | 65 | */ |
45 | outb(0x0C, 0xA0); /* prepare for poll */ | 66 | outb(0x0C, PIC_SLAVE_CMD); /* prepare for poll */ |
46 | irq = (inb(0xA0) & 7) + 8; | 67 | irq = (inb(PIC_SLAVE_CMD) & 7) + 8; |
47 | } | 68 | } |
48 | 69 | ||
49 | if (unlikely(irq == 7)) { | 70 | if (unlikely(irq == 7)) { |
@@ -54,14 +75,14 @@ static inline int i8259_irq(void) | |||
54 | * significant bit is not set then there is no valid | 75 | * significant bit is not set then there is no valid |
55 | * interrupt. | 76 | * interrupt. |
56 | */ | 77 | */ |
57 | outb(0x0B, 0x20); /* ISR register */ | 78 | outb(0x0B, PIC_MASTER_ISR); /* ISR register */ |
58 | if(~inb(0x20) & 0x80) | 79 | if(~inb(PIC_MASTER_ISR) & 0x80) |
59 | irq = -1; | 80 | irq = -1; |
60 | } | 81 | } |
61 | 82 | ||
62 | spin_unlock(&i8259A_lock); | 83 | spin_unlock(&i8259A_lock); |
63 | 84 | ||
64 | return irq; | 85 | return likely(irq >= 0) ? irq + I8259A_IRQ_BASE : irq; |
65 | } | 86 | } |
66 | 87 | ||
67 | #endif /* _ASM_I8259_H */ | 88 | #endif /* _ASM_I8259_H */ |
diff --git a/include/asm-mips/pgtable-32.h b/include/asm-mips/pgtable-32.h index d20f2e9b28be..2fbd47eba32d 100644 --- a/include/asm-mips/pgtable-32.h +++ b/include/asm-mips/pgtable-32.h | |||
@@ -156,9 +156,9 @@ pfn_pte(unsigned long pfn, pgprot_t prot) | |||
156 | #define __pte_offset(address) \ | 156 | #define __pte_offset(address) \ |
157 | (((address) >> PAGE_SHIFT) & (PTRS_PER_PTE - 1)) | 157 | (((address) >> PAGE_SHIFT) & (PTRS_PER_PTE - 1)) |
158 | #define pte_offset(dir, address) \ | 158 | #define pte_offset(dir, address) \ |
159 | ((pte_t *) (pmd_page_vaddr(*dir)) + __pte_offset(address)) | 159 | ((pte_t *) pmd_page_vaddr(*(dir)) + __pte_offset(address)) |
160 | #define pte_offset_kernel(dir, address) \ | 160 | #define pte_offset_kernel(dir, address) \ |
161 | ((pte_t *) pmd_page_vaddr(*(dir)) + __pte_offset(address)) | 161 | ((pte_t *) pmd_page_vaddr(*(dir)) + __pte_offset(address)) |
162 | 162 | ||
163 | #define pte_offset_map(dir, address) \ | 163 | #define pte_offset_map(dir, address) \ |
164 | ((pte_t *)page_address(pmd_page(*(dir))) + __pte_offset(address)) | 164 | ((pte_t *)page_address(pmd_page(*(dir))) + __pte_offset(address)) |
diff --git a/include/asm-mips/pgtable-64.h b/include/asm-mips/pgtable-64.h index b9b1e86493ee..a5b18710b6a4 100644 --- a/include/asm-mips/pgtable-64.h +++ b/include/asm-mips/pgtable-64.h | |||
@@ -212,9 +212,9 @@ static inline pmd_t *pmd_offset(pud_t * pud, unsigned long address) | |||
212 | #define __pte_offset(address) \ | 212 | #define __pte_offset(address) \ |
213 | (((address) >> PAGE_SHIFT) & (PTRS_PER_PTE - 1)) | 213 | (((address) >> PAGE_SHIFT) & (PTRS_PER_PTE - 1)) |
214 | #define pte_offset(dir, address) \ | 214 | #define pte_offset(dir, address) \ |
215 | ((pte_t *) (pmd_page_vaddr(*dir)) + __pte_offset(address)) | 215 | ((pte_t *) pmd_page_vaddr(*(dir)) + __pte_offset(address)) |
216 | #define pte_offset_kernel(dir, address) \ | 216 | #define pte_offset_kernel(dir, address) \ |
217 | ((pte_t *) pmd_page_vaddr(*(dir)) + __pte_offset(address)) | 217 | ((pte_t *) pmd_page_vaddr(*(dir)) + __pte_offset(address)) |
218 | #define pte_offset_map(dir, address) \ | 218 | #define pte_offset_map(dir, address) \ |
219 | ((pte_t *)page_address(pmd_page(*(dir))) + __pte_offset(address)) | 219 | ((pte_t *)page_address(pmd_page(*(dir))) + __pte_offset(address)) |
220 | #define pte_offset_map_nested(dir, address) \ | 220 | #define pte_offset_map_nested(dir, address) \ |