diff options
author | Paul Mundt <lethal@linux-sh.org> | 2006-09-27 05:03:34 -0400 |
---|---|---|
committer | Paul Mundt <lethal@linux-sh.org> | 2006-09-27 05:03:34 -0400 |
commit | 8599cf059209de22dd3be16816b90f1aad10c74a (patch) | |
tree | 8cd5bdec25431a2797147c3eea11532ec71b6272 /arch/sh/boards | |
parent | ba463937ef75bceaf3943edf01f849257c68623a (diff) |
sh: Cleanup IRQ disabling for hardirq handlers.
The generic hardirq layer already takes care of a lot of the
appropriate locking and disabling for us, no need to duplicate
it in the handlers..
Signed-off-by: Paul Mundt <lethal@linux-sh.org>
Diffstat (limited to 'arch/sh/boards')
-rw-r--r-- | arch/sh/boards/bigsur/irq.c | 47 | ||||
-rw-r--r-- | arch/sh/boards/dreamcast/irq.c | 7 | ||||
-rw-r--r-- | arch/sh/boards/landisk/irq.c | 6 | ||||
-rw-r--r-- | arch/sh/boards/mpc1211/setup.c | 14 | ||||
-rw-r--r-- | arch/sh/boards/renesas/hs7751rvoip/irq.c | 6 | ||||
-rw-r--r-- | arch/sh/boards/renesas/r7780rp/irq.c | 6 | ||||
-rw-r--r-- | arch/sh/boards/renesas/rts7751r2d/irq.c | 6 | ||||
-rw-r--r-- | arch/sh/boards/renesas/systemh/irq.c | 8 | ||||
-rw-r--r-- | arch/sh/boards/superh/microdev/irq.c | 39 |
9 files changed, 28 insertions, 111 deletions
diff --git a/arch/sh/boards/bigsur/irq.c b/arch/sh/boards/bigsur/irq.c index ac946a2201c7..1ab04da36382 100644 --- a/arch/sh/boards/bigsur/irq.c +++ b/arch/sh/boards/bigsur/irq.c | |||
@@ -19,6 +19,7 @@ | |||
19 | * IRQ functions for a Hitachi Big Sur Evaluation Board. | 19 | * IRQ functions for a Hitachi Big Sur Evaluation Board. |
20 | * | 20 | * |
21 | */ | 21 | */ |
22 | #undef DEBUG | ||
22 | 23 | ||
23 | #include <linux/sched.h> | 24 | #include <linux/sched.h> |
24 | #include <linux/module.h> | 25 | #include <linux/module.h> |
@@ -41,10 +42,8 @@ | |||
41 | #undef BIGSUR_DEBUG | 42 | #undef BIGSUR_DEBUG |
42 | 43 | ||
43 | #ifdef BIGSUR_DEBUG | 44 | #ifdef BIGSUR_DEBUG |
44 | #define DPRINTK(args...) printk(args) | ||
45 | #define DIPRINTK(n, args...) if (BIGSUR_DEBUG>(n)) printk(args) | 45 | #define DIPRINTK(n, args...) if (BIGSUR_DEBUG>(n)) printk(args) |
46 | #else | 46 | #else |
47 | #define DPRINTK(args...) | ||
48 | #define DIPRINTK(n, args...) | 47 | #define DIPRINTK(n, args...) |
49 | #endif /* BIGSUR_DEBUG */ | 48 | #endif /* BIGSUR_DEBUG */ |
50 | 49 | ||
@@ -60,45 +59,39 @@ extern int hd64465_irq_demux(int irq); | |||
60 | /* Level 1 IRQ routines */ | 59 | /* Level 1 IRQ routines */ |
61 | static void disable_bigsur_l1irq(unsigned int irq) | 60 | static void disable_bigsur_l1irq(unsigned int irq) |
62 | { | 61 | { |
63 | unsigned long flags; | ||
64 | unsigned char mask; | 62 | unsigned char mask; |
65 | unsigned int mask_port = ((irq - BIGSUR_IRQ_LOW)/8) ? BIGSUR_IRLMR1 : BIGSUR_IRLMR0; | 63 | unsigned int mask_port = ((irq - BIGSUR_IRQ_LOW)/8) ? BIGSUR_IRLMR1 : BIGSUR_IRLMR0; |
66 | unsigned char bit = (1 << ((irq - MGATE_IRQ_LOW)%8) ); | 64 | unsigned char bit = (1 << ((irq - MGATE_IRQ_LOW)%8) ); |
67 | 65 | ||
68 | if(irq >= BIGSUR_IRQ_LOW && irq < BIGSUR_IRQ_HIGH) { | 66 | if(irq >= BIGSUR_IRQ_LOW && irq < BIGSUR_IRQ_HIGH) { |
69 | DPRINTK("Disable L1 IRQ %d\n", irq); | 67 | pr_debug("Disable L1 IRQ %d\n", irq); |
70 | DIPRINTK(2,"disable_bigsur_l1irq: IMR=0x%08x mask=0x%x\n", | 68 | DIPRINTK(2,"disable_bigsur_l1irq: IMR=0x%08x mask=0x%x\n", |
71 | mask_port, bit); | 69 | mask_port, bit); |
72 | local_irq_save(flags); | ||
73 | 70 | ||
74 | /* Disable IRQ - set mask bit */ | 71 | /* Disable IRQ - set mask bit */ |
75 | mask = inb(mask_port) | bit; | 72 | mask = inb(mask_port) | bit; |
76 | outb(mask, mask_port); | 73 | outb(mask, mask_port); |
77 | local_irq_restore(flags); | ||
78 | return; | 74 | return; |
79 | } | 75 | } |
80 | DPRINTK("disable_bigsur_l1irq: Invalid IRQ %d\n", irq); | 76 | pr_debug("disable_bigsur_l1irq: Invalid IRQ %d\n", irq); |
81 | } | 77 | } |
82 | 78 | ||
83 | static void enable_bigsur_l1irq(unsigned int irq) | 79 | static void enable_bigsur_l1irq(unsigned int irq) |
84 | { | 80 | { |
85 | unsigned long flags; | ||
86 | unsigned char mask; | 81 | unsigned char mask; |
87 | unsigned int mask_port = ((irq - BIGSUR_IRQ_LOW)/8) ? BIGSUR_IRLMR1 : BIGSUR_IRLMR0; | 82 | unsigned int mask_port = ((irq - BIGSUR_IRQ_LOW)/8) ? BIGSUR_IRLMR1 : BIGSUR_IRLMR0; |
88 | unsigned char bit = (1 << ((irq - MGATE_IRQ_LOW)%8) ); | 83 | unsigned char bit = (1 << ((irq - MGATE_IRQ_LOW)%8) ); |
89 | 84 | ||
90 | if(irq >= BIGSUR_IRQ_LOW && irq < BIGSUR_IRQ_HIGH) { | 85 | if(irq >= BIGSUR_IRQ_LOW && irq < BIGSUR_IRQ_HIGH) { |
91 | DPRINTK("Enable L1 IRQ %d\n", irq); | 86 | pr_debug("Enable L1 IRQ %d\n", irq); |
92 | DIPRINTK(2,"enable_bigsur_l1irq: IMR=0x%08x mask=0x%x\n", | 87 | DIPRINTK(2,"enable_bigsur_l1irq: IMR=0x%08x mask=0x%x\n", |
93 | mask_port, bit); | 88 | mask_port, bit); |
94 | local_irq_save(flags); | ||
95 | /* Enable L1 IRQ - clear mask bit */ | 89 | /* Enable L1 IRQ - clear mask bit */ |
96 | mask = inb(mask_port) & ~bit; | 90 | mask = inb(mask_port) & ~bit; |
97 | outb(mask, mask_port); | 91 | outb(mask, mask_port); |
98 | local_irq_restore(flags); | ||
99 | return; | 92 | return; |
100 | } | 93 | } |
101 | DPRINTK("enable_bigsur_l1irq: Invalid IRQ %d\n", irq); | 94 | pr_debug("enable_bigsur_l1irq: Invalid IRQ %d\n", irq); |
102 | } | 95 | } |
103 | 96 | ||
104 | 97 | ||
@@ -126,51 +119,45 @@ static const u32 imr_offset = BIGSUR_IMR0 - BIGSUR_IMR1; | |||
126 | /* Level 2 IRQ routines */ | 119 | /* Level 2 IRQ routines */ |
127 | static void disable_bigsur_l2irq(unsigned int irq) | 120 | static void disable_bigsur_l2irq(unsigned int irq) |
128 | { | 121 | { |
129 | unsigned long flags; | ||
130 | unsigned char mask; | 122 | unsigned char mask; |
131 | unsigned char bit = 1 << ((irq-BIGSUR_2NDLVL_IRQ_LOW)%8); | 123 | unsigned char bit = 1 << ((irq-BIGSUR_2NDLVL_IRQ_LOW)%8); |
132 | unsigned int mask_port = imr_base - REG_NUM(irq)*imr_offset; | 124 | unsigned int mask_port = imr_base - REG_NUM(irq)*imr_offset; |
133 | 125 | ||
134 | if(irq >= BIGSUR_2NDLVL_IRQ_LOW && irq < BIGSUR_2NDLVL_IRQ_HIGH) { | 126 | if(irq >= BIGSUR_2NDLVL_IRQ_LOW && irq < BIGSUR_2NDLVL_IRQ_HIGH) { |
135 | DPRINTK("Disable L2 IRQ %d\n", irq); | 127 | pr_debug("Disable L2 IRQ %d\n", irq); |
136 | DIPRINTK(2,"disable_bigsur_l2irq: IMR=0x%08x mask=0x%x\n", | 128 | DIPRINTK(2,"disable_bigsur_l2irq: IMR=0x%08x mask=0x%x\n", |
137 | mask_port, bit); | 129 | mask_port, bit); |
138 | local_irq_save(flags); | ||
139 | 130 | ||
140 | /* Disable L2 IRQ - set mask bit */ | 131 | /* Disable L2 IRQ - set mask bit */ |
141 | mask = inb(mask_port) | bit; | 132 | mask = inb(mask_port) | bit; |
142 | outb(mask, mask_port); | 133 | outb(mask, mask_port); |
143 | local_irq_restore(flags); | ||
144 | return; | 134 | return; |
145 | } | 135 | } |
146 | DPRINTK("disable_bigsur_l2irq: Invalid IRQ %d\n", irq); | 136 | pr_debug("disable_bigsur_l2irq: Invalid IRQ %d\n", irq); |
147 | } | 137 | } |
148 | 138 | ||
149 | static void enable_bigsur_l2irq(unsigned int irq) | 139 | static void enable_bigsur_l2irq(unsigned int irq) |
150 | { | 140 | { |
151 | unsigned long flags; | ||
152 | unsigned char mask; | 141 | unsigned char mask; |
153 | unsigned char bit = 1 << ((irq-BIGSUR_2NDLVL_IRQ_LOW)%8); | 142 | unsigned char bit = 1 << ((irq-BIGSUR_2NDLVL_IRQ_LOW)%8); |
154 | unsigned int mask_port = imr_base - REG_NUM(irq)*imr_offset; | 143 | unsigned int mask_port = imr_base - REG_NUM(irq)*imr_offset; |
155 | 144 | ||
156 | if(irq >= BIGSUR_2NDLVL_IRQ_LOW && irq < BIGSUR_2NDLVL_IRQ_HIGH) { | 145 | if(irq >= BIGSUR_2NDLVL_IRQ_LOW && irq < BIGSUR_2NDLVL_IRQ_HIGH) { |
157 | DPRINTK("Enable L2 IRQ %d\n", irq); | 146 | pr_debug("Enable L2 IRQ %d\n", irq); |
158 | DIPRINTK(2,"enable_bigsur_l2irq: IMR=0x%08x mask=0x%x\n", | 147 | DIPRINTK(2,"enable_bigsur_l2irq: IMR=0x%08x mask=0x%x\n", |
159 | mask_port, bit); | 148 | mask_port, bit); |
160 | local_irq_save(flags); | ||
161 | 149 | ||
162 | /* Enable L2 IRQ - clear mask bit */ | 150 | /* Enable L2 IRQ - clear mask bit */ |
163 | mask = inb(mask_port) & ~bit; | 151 | mask = inb(mask_port) & ~bit; |
164 | outb(mask, mask_port); | 152 | outb(mask, mask_port); |
165 | local_irq_restore(flags); | ||
166 | return; | 153 | return; |
167 | } | 154 | } |
168 | DPRINTK("enable_bigsur_l2irq: Invalid IRQ %d\n", irq); | 155 | pr_debug("enable_bigsur_l2irq: Invalid IRQ %d\n", irq); |
169 | } | 156 | } |
170 | 157 | ||
171 | static void mask_and_ack_bigsur(unsigned int irq) | 158 | static void mask_and_ack_bigsur(unsigned int irq) |
172 | { | 159 | { |
173 | DPRINTK("mask_and_ack_bigsur IRQ %d\n", irq); | 160 | pr_debug("mask_and_ack_bigsur IRQ %d\n", irq); |
174 | if(irq >= BIGSUR_IRQ_LOW && irq < BIGSUR_IRQ_HIGH) | 161 | if(irq >= BIGSUR_IRQ_LOW && irq < BIGSUR_IRQ_HIGH) |
175 | disable_bigsur_l1irq(irq); | 162 | disable_bigsur_l1irq(irq); |
176 | else | 163 | else |
@@ -179,7 +166,7 @@ static void mask_and_ack_bigsur(unsigned int irq) | |||
179 | 166 | ||
180 | static void end_bigsur_irq(unsigned int irq) | 167 | static void end_bigsur_irq(unsigned int irq) |
181 | { | 168 | { |
182 | DPRINTK("end_bigsur_irq IRQ %d\n", irq); | 169 | pr_debug("end_bigsur_irq IRQ %d\n", irq); |
183 | if (!(irq_desc[irq].status & (IRQ_DISABLED|IRQ_INPROGRESS))) { | 170 | if (!(irq_desc[irq].status & (IRQ_DISABLED|IRQ_INPROGRESS))) { |
184 | if(irq >= BIGSUR_IRQ_LOW && irq < BIGSUR_IRQ_HIGH) | 171 | if(irq >= BIGSUR_IRQ_LOW && irq < BIGSUR_IRQ_HIGH) |
185 | enable_bigsur_l1irq(irq); | 172 | enable_bigsur_l1irq(irq); |
@@ -193,7 +180,7 @@ static unsigned int startup_bigsur_irq(unsigned int irq) | |||
193 | u8 mask; | 180 | u8 mask; |
194 | u32 reg; | 181 | u32 reg; |
195 | 182 | ||
196 | DPRINTK("startup_bigsur_irq IRQ %d\n", irq); | 183 | pr_debug("startup_bigsur_irq IRQ %d\n", irq); |
197 | 184 | ||
198 | if(irq >= BIGSUR_IRQ_LOW && irq < BIGSUR_IRQ_HIGH) { | 185 | if(irq >= BIGSUR_IRQ_LOW && irq < BIGSUR_IRQ_HIGH) { |
199 | /* Enable the L1 IRQ */ | 186 | /* Enable the L1 IRQ */ |
@@ -218,7 +205,7 @@ static unsigned int startup_bigsur_irq(unsigned int irq) | |||
218 | 205 | ||
219 | static void shutdown_bigsur_irq(unsigned int irq) | 206 | static void shutdown_bigsur_irq(unsigned int irq) |
220 | { | 207 | { |
221 | DPRINTK("shutdown_bigsur_irq IRQ %d\n", irq); | 208 | pr_debug("shutdown_bigsur_irq IRQ %d\n", irq); |
222 | if(irq >= BIGSUR_IRQ_LOW && irq < BIGSUR_IRQ_HIGH) | 209 | if(irq >= BIGSUR_IRQ_LOW && irq < BIGSUR_IRQ_HIGH) |
223 | disable_bigsur_l1irq(irq); | 210 | disable_bigsur_l1irq(irq); |
224 | else | 211 | else |
@@ -260,7 +247,7 @@ static void make_bigsur_l1isr(unsigned int irq) { | |||
260 | disable_bigsur_l1irq(irq); | 247 | disable_bigsur_l1irq(irq); |
261 | return; | 248 | return; |
262 | } | 249 | } |
263 | DPRINTK("make_bigsur_l1isr: bad irq, %d\n", irq); | 250 | pr_debug("make_bigsur_l1isr: bad irq, %d\n", irq); |
264 | return; | 251 | return; |
265 | } | 252 | } |
266 | 253 | ||
@@ -277,7 +264,7 @@ static void make_bigsur_l2isr(unsigned int irq) { | |||
277 | disable_bigsur_l2irq(irq); | 264 | disable_bigsur_l2irq(irq); |
278 | return; | 265 | return; |
279 | } | 266 | } |
280 | DPRINTK("make_bigsur_l2isr: bad irq, %d\n", irq); | 267 | pr_debug("make_bigsur_l2isr: bad irq, %d\n", irq); |
281 | return; | 268 | return; |
282 | } | 269 | } |
283 | 270 | ||
diff --git a/arch/sh/boards/dreamcast/irq.c b/arch/sh/boards/dreamcast/irq.c index 373a22e48ac4..5bf01f86c20c 100644 --- a/arch/sh/boards/dreamcast/irq.c +++ b/arch/sh/boards/dreamcast/irq.c | |||
@@ -10,7 +10,6 @@ | |||
10 | */ | 10 | */ |
11 | 11 | ||
12 | #include <linux/irq.h> | 12 | #include <linux/irq.h> |
13 | |||
14 | #include <asm/io.h> | 13 | #include <asm/io.h> |
15 | #include <asm/irq.h> | 14 | #include <asm/irq.h> |
16 | #include <asm/dreamcast/sysasic.h> | 15 | #include <asm/dreamcast/sysasic.h> |
@@ -57,29 +56,23 @@ | |||
57 | /* Disable the hardware event by masking its bit in its EMR */ | 56 | /* Disable the hardware event by masking its bit in its EMR */ |
58 | static inline void disable_systemasic_irq(unsigned int irq) | 57 | static inline void disable_systemasic_irq(unsigned int irq) |
59 | { | 58 | { |
60 | unsigned long flags; | ||
61 | __u32 emr = EMR_BASE + (LEVEL(irq) << 4) + (LEVEL(irq) << 2); | 59 | __u32 emr = EMR_BASE + (LEVEL(irq) << 4) + (LEVEL(irq) << 2); |
62 | __u32 mask; | 60 | __u32 mask; |
63 | 61 | ||
64 | local_irq_save(flags); | ||
65 | mask = inl(emr); | 62 | mask = inl(emr); |
66 | mask &= ~(1 << EVENT_BIT(irq)); | 63 | mask &= ~(1 << EVENT_BIT(irq)); |
67 | outl(mask, emr); | 64 | outl(mask, emr); |
68 | local_irq_restore(flags); | ||
69 | } | 65 | } |
70 | 66 | ||
71 | /* Enable the hardware event by setting its bit in its EMR */ | 67 | /* Enable the hardware event by setting its bit in its EMR */ |
72 | static inline void enable_systemasic_irq(unsigned int irq) | 68 | static inline void enable_systemasic_irq(unsigned int irq) |
73 | { | 69 | { |
74 | unsigned long flags; | ||
75 | __u32 emr = EMR_BASE + (LEVEL(irq) << 4) + (LEVEL(irq) << 2); | 70 | __u32 emr = EMR_BASE + (LEVEL(irq) << 4) + (LEVEL(irq) << 2); |
76 | __u32 mask; | 71 | __u32 mask; |
77 | 72 | ||
78 | local_irq_save(flags); | ||
79 | mask = inl(emr); | 73 | mask = inl(emr); |
80 | mask |= (1 << EVENT_BIT(irq)); | 74 | mask |= (1 << EVENT_BIT(irq)); |
81 | outl(mask, emr); | 75 | outl(mask, emr); |
82 | local_irq_restore(flags); | ||
83 | } | 76 | } |
84 | 77 | ||
85 | /* Acknowledge a hardware event by writing its bit back to its ESR */ | 78 | /* Acknowledge a hardware event by writing its bit back to its ESR */ |
diff --git a/arch/sh/boards/landisk/irq.c b/arch/sh/boards/landisk/irq.c index 1dcc3feb7a44..a006d6443225 100644 --- a/arch/sh/boards/landisk/irq.c +++ b/arch/sh/boards/landisk/irq.c | |||
@@ -39,30 +39,24 @@ static unsigned int startup_landisk_irq(unsigned int irq) | |||
39 | 39 | ||
40 | static void disable_landisk_irq(unsigned int irq) | 40 | static void disable_landisk_irq(unsigned int irq) |
41 | { | 41 | { |
42 | unsigned long flags; | ||
43 | unsigned char val; | 42 | unsigned char val; |
44 | unsigned char mask = 0xff ^ (0x01 << (irq - 5)); | 43 | unsigned char mask = 0xff ^ (0x01 << (irq - 5)); |
45 | 44 | ||
46 | /* Set the priority in IPR to 0 */ | 45 | /* Set the priority in IPR to 0 */ |
47 | local_irq_save(flags); | ||
48 | val = ctrl_inb(PA_IMASK); | 46 | val = ctrl_inb(PA_IMASK); |
49 | val &= mask; | 47 | val &= mask; |
50 | ctrl_outb(val, PA_IMASK); | 48 | ctrl_outb(val, PA_IMASK); |
51 | local_irq_restore(flags); | ||
52 | } | 49 | } |
53 | 50 | ||
54 | static void enable_landisk_irq(unsigned int irq) | 51 | static void enable_landisk_irq(unsigned int irq) |
55 | { | 52 | { |
56 | unsigned long flags; | ||
57 | unsigned char val; | 53 | unsigned char val; |
58 | unsigned char value = (0x01 << (irq - 5)); | 54 | unsigned char value = (0x01 << (irq - 5)); |
59 | 55 | ||
60 | /* Set priority in IPR back to original value */ | 56 | /* Set priority in IPR back to original value */ |
61 | local_irq_save(flags); | ||
62 | val = ctrl_inb(PA_IMASK); | 57 | val = ctrl_inb(PA_IMASK); |
63 | val |= value; | 58 | val |= value; |
64 | ctrl_outb(val, PA_IMASK); | 59 | ctrl_outb(val, PA_IMASK); |
65 | local_irq_restore(flags); | ||
66 | } | 60 | } |
67 | 61 | ||
68 | static void ack_landisk_irq(unsigned int irq) | 62 | static void ack_landisk_irq(unsigned int irq) |
diff --git a/arch/sh/boards/mpc1211/setup.c b/arch/sh/boards/mpc1211/setup.c index a8c5180ae219..e9c8ff221dda 100644 --- a/arch/sh/boards/mpc1211/setup.c +++ b/arch/sh/boards/mpc1211/setup.c | |||
@@ -80,9 +80,6 @@ volatile unsigned long irq_err_count; | |||
80 | 80 | ||
81 | static void disable_mpc1211_irq(unsigned int irq) | 81 | static void disable_mpc1211_irq(unsigned int irq) |
82 | { | 82 | { |
83 | unsigned long flags; | ||
84 | |||
85 | save_and_cli(flags); | ||
86 | if( irq < 8) { | 83 | if( irq < 8) { |
87 | m_irq_mask |= (1 << irq); | 84 | m_irq_mask |= (1 << irq); |
88 | outb(m_irq_mask,I8259_M_MR); | 85 | outb(m_irq_mask,I8259_M_MR); |
@@ -90,16 +87,11 @@ static void disable_mpc1211_irq(unsigned int irq) | |||
90 | s_irq_mask |= (1 << (irq - 8)); | 87 | s_irq_mask |= (1 << (irq - 8)); |
91 | outb(s_irq_mask,I8259_S_MR); | 88 | outb(s_irq_mask,I8259_S_MR); |
92 | } | 89 | } |
93 | restore_flags(flags); | ||
94 | 90 | ||
95 | } | 91 | } |
96 | 92 | ||
97 | static void enable_mpc1211_irq(unsigned int irq) | 93 | static void enable_mpc1211_irq(unsigned int irq) |
98 | { | 94 | { |
99 | unsigned long flags; | ||
100 | |||
101 | save_and_cli(flags); | ||
102 | |||
103 | if( irq < 8) { | 95 | if( irq < 8) { |
104 | m_irq_mask &= ~(1 << irq); | 96 | m_irq_mask &= ~(1 << irq); |
105 | outb(m_irq_mask,I8259_M_MR); | 97 | outb(m_irq_mask,I8259_M_MR); |
@@ -107,7 +99,6 @@ static void enable_mpc1211_irq(unsigned int irq) | |||
107 | s_irq_mask &= ~(1 << (irq - 8)); | 99 | s_irq_mask &= ~(1 << (irq - 8)); |
108 | outb(s_irq_mask,I8259_S_MR); | 100 | outb(s_irq_mask,I8259_S_MR); |
109 | } | 101 | } |
110 | restore_flags(flags); | ||
111 | } | 102 | } |
112 | 103 | ||
113 | static inline int mpc1211_irq_real(unsigned int irq) | 104 | static inline int mpc1211_irq_real(unsigned int irq) |
@@ -131,10 +122,6 @@ static inline int mpc1211_irq_real(unsigned int irq) | |||
131 | 122 | ||
132 | static void mask_and_ack_mpc1211(unsigned int irq) | 123 | static void mask_and_ack_mpc1211(unsigned int irq) |
133 | { | 124 | { |
134 | unsigned long flags; | ||
135 | |||
136 | save_and_cli(flags); | ||
137 | |||
138 | if(irq < 8) { | 125 | if(irq < 8) { |
139 | if(m_irq_mask & (1<<irq)){ | 126 | if(m_irq_mask & (1<<irq)){ |
140 | if(!mpc1211_irq_real(irq)){ | 127 | if(!mpc1211_irq_real(irq)){ |
@@ -162,7 +149,6 @@ static void mask_and_ack_mpc1211(unsigned int irq) | |||
162 | outb(0x60+(irq-8),I8259_S_CR); /* EOI */ | 149 | outb(0x60+(irq-8),I8259_S_CR); /* EOI */ |
163 | outb(0x60+2,I8259_M_CR); | 150 | outb(0x60+2,I8259_M_CR); |
164 | } | 151 | } |
165 | restore_flags(flags); | ||
166 | } | 152 | } |
167 | 153 | ||
168 | static void end_mpc1211_irq(unsigned int irq) | 154 | static void end_mpc1211_irq(unsigned int irq) |
diff --git a/arch/sh/boards/renesas/hs7751rvoip/irq.c b/arch/sh/boards/renesas/hs7751rvoip/irq.c index 705b7ddcb0d2..c617b188258a 100644 --- a/arch/sh/boards/renesas/hs7751rvoip/irq.c +++ b/arch/sh/boards/renesas/hs7751rvoip/irq.c | |||
@@ -35,30 +35,24 @@ static unsigned int startup_hs7751rvoip_irq(unsigned int irq) | |||
35 | 35 | ||
36 | static void disable_hs7751rvoip_irq(unsigned int irq) | 36 | static void disable_hs7751rvoip_irq(unsigned int irq) |
37 | { | 37 | { |
38 | unsigned long flags; | ||
39 | unsigned short val; | 38 | unsigned short val; |
40 | unsigned short mask = 0xffff ^ (0x0001 << mask_pos[irq]); | 39 | unsigned short mask = 0xffff ^ (0x0001 << mask_pos[irq]); |
41 | 40 | ||
42 | /* Set the priority in IPR to 0 */ | 41 | /* Set the priority in IPR to 0 */ |
43 | local_irq_save(flags); | ||
44 | val = ctrl_inw(IRLCNTR3); | 42 | val = ctrl_inw(IRLCNTR3); |
45 | val &= mask; | 43 | val &= mask; |
46 | ctrl_outw(val, IRLCNTR3); | 44 | ctrl_outw(val, IRLCNTR3); |
47 | local_irq_restore(flags); | ||
48 | } | 45 | } |
49 | 46 | ||
50 | static void enable_hs7751rvoip_irq(unsigned int irq) | 47 | static void enable_hs7751rvoip_irq(unsigned int irq) |
51 | { | 48 | { |
52 | unsigned long flags; | ||
53 | unsigned short val; | 49 | unsigned short val; |
54 | unsigned short value = (0x0001 << mask_pos[irq]); | 50 | unsigned short value = (0x0001 << mask_pos[irq]); |
55 | 51 | ||
56 | /* Set priority in IPR back to original value */ | 52 | /* Set priority in IPR back to original value */ |
57 | local_irq_save(flags); | ||
58 | val = ctrl_inw(IRLCNTR3); | 53 | val = ctrl_inw(IRLCNTR3); |
59 | val |= value; | 54 | val |= value; |
60 | ctrl_outw(val, IRLCNTR3); | 55 | ctrl_outw(val, IRLCNTR3); |
61 | local_irq_restore(flags); | ||
62 | } | 56 | } |
63 | 57 | ||
64 | static void ack_hs7751rvoip_irq(unsigned int irq) | 58 | static void ack_hs7751rvoip_irq(unsigned int irq) |
diff --git a/arch/sh/boards/renesas/r7780rp/irq.c b/arch/sh/boards/renesas/r7780rp/irq.c index c7b9fe6e640d..61d5e5d3c294 100644 --- a/arch/sh/boards/renesas/r7780rp/irq.c +++ b/arch/sh/boards/renesas/r7780rp/irq.c | |||
@@ -39,30 +39,24 @@ static unsigned int startup_r7780rp_irq(unsigned int irq) | |||
39 | 39 | ||
40 | static void disable_r7780rp_irq(unsigned int irq) | 40 | static void disable_r7780rp_irq(unsigned int irq) |
41 | { | 41 | { |
42 | unsigned long flags; | ||
43 | unsigned short val; | 42 | unsigned short val; |
44 | unsigned short mask = 0xffff ^ (0x0001 << mask_pos[irq]); | 43 | unsigned short mask = 0xffff ^ (0x0001 << mask_pos[irq]); |
45 | 44 | ||
46 | /* Set the priority in IPR to 0 */ | 45 | /* Set the priority in IPR to 0 */ |
47 | local_irq_save(flags); | ||
48 | val = ctrl_inw(IRLCNTR1); | 46 | val = ctrl_inw(IRLCNTR1); |
49 | val &= mask; | 47 | val &= mask; |
50 | ctrl_outw(val, IRLCNTR1); | 48 | ctrl_outw(val, IRLCNTR1); |
51 | local_irq_restore(flags); | ||
52 | } | 49 | } |
53 | 50 | ||
54 | static void enable_r7780rp_irq(unsigned int irq) | 51 | static void enable_r7780rp_irq(unsigned int irq) |
55 | { | 52 | { |
56 | unsigned long flags; | ||
57 | unsigned short val; | 53 | unsigned short val; |
58 | unsigned short value = (0x0001 << mask_pos[irq]); | 54 | unsigned short value = (0x0001 << mask_pos[irq]); |
59 | 55 | ||
60 | /* Set priority in IPR back to original value */ | 56 | /* Set priority in IPR back to original value */ |
61 | local_irq_save(flags); | ||
62 | val = ctrl_inw(IRLCNTR1); | 57 | val = ctrl_inw(IRLCNTR1); |
63 | val |= value; | 58 | val |= value; |
64 | ctrl_outw(val, IRLCNTR1); | 59 | ctrl_outw(val, IRLCNTR1); |
65 | local_irq_restore(flags); | ||
66 | } | 60 | } |
67 | 61 | ||
68 | static void ack_r7780rp_irq(unsigned int irq) | 62 | static void ack_r7780rp_irq(unsigned int irq) |
diff --git a/arch/sh/boards/renesas/rts7751r2d/irq.c b/arch/sh/boards/renesas/rts7751r2d/irq.c index 154535440bbf..c915e7a3693a 100644 --- a/arch/sh/boards/renesas/rts7751r2d/irq.c +++ b/arch/sh/boards/renesas/rts7751r2d/irq.c | |||
@@ -41,30 +41,24 @@ static unsigned int startup_rts7751r2d_irq(unsigned int irq) | |||
41 | 41 | ||
42 | static void disable_rts7751r2d_irq(unsigned int irq) | 42 | static void disable_rts7751r2d_irq(unsigned int irq) |
43 | { | 43 | { |
44 | unsigned long flags; | ||
45 | unsigned short val; | 44 | unsigned short val; |
46 | unsigned short mask = 0xffff ^ (0x0001 << mask_pos[irq]); | 45 | unsigned short mask = 0xffff ^ (0x0001 << mask_pos[irq]); |
47 | 46 | ||
48 | /* Set the priority in IPR to 0 */ | 47 | /* Set the priority in IPR to 0 */ |
49 | local_irq_save(flags); | ||
50 | val = ctrl_inw(IRLCNTR1); | 48 | val = ctrl_inw(IRLCNTR1); |
51 | val &= mask; | 49 | val &= mask; |
52 | ctrl_outw(val, IRLCNTR1); | 50 | ctrl_outw(val, IRLCNTR1); |
53 | local_irq_restore(flags); | ||
54 | } | 51 | } |
55 | 52 | ||
56 | static void enable_rts7751r2d_irq(unsigned int irq) | 53 | static void enable_rts7751r2d_irq(unsigned int irq) |
57 | { | 54 | { |
58 | unsigned long flags; | ||
59 | unsigned short val; | 55 | unsigned short val; |
60 | unsigned short value = (0x0001 << mask_pos[irq]); | 56 | unsigned short value = (0x0001 << mask_pos[irq]); |
61 | 57 | ||
62 | /* Set priority in IPR back to original value */ | 58 | /* Set priority in IPR back to original value */ |
63 | local_irq_save(flags); | ||
64 | val = ctrl_inw(IRLCNTR1); | 59 | val = ctrl_inw(IRLCNTR1); |
65 | val |= value; | 60 | val |= value; |
66 | ctrl_outw(val, IRLCNTR1); | 61 | ctrl_outw(val, IRLCNTR1); |
67 | local_irq_restore(flags); | ||
68 | } | 62 | } |
69 | 63 | ||
70 | int rts7751r2d_irq_demux(int irq) | 64 | int rts7751r2d_irq_demux(int irq) |
diff --git a/arch/sh/boards/renesas/systemh/irq.c b/arch/sh/boards/renesas/systemh/irq.c index 53731a0abb8f..8d016dae2333 100644 --- a/arch/sh/boards/renesas/systemh/irq.c +++ b/arch/sh/boards/renesas/systemh/irq.c | |||
@@ -57,12 +57,9 @@ static void shutdown_systemh_irq(unsigned int irq) | |||
57 | static void disable_systemh_irq(unsigned int irq) | 57 | static void disable_systemh_irq(unsigned int irq) |
58 | { | 58 | { |
59 | if (systemh_irq_mask_register) { | 59 | if (systemh_irq_mask_register) { |
60 | unsigned long flags; | ||
61 | unsigned long val, mask = 0x01 << 1; | 60 | unsigned long val, mask = 0x01 << 1; |
62 | 61 | ||
63 | /* Clear the "irq"th bit in the mask and set it in the request */ | 62 | /* Clear the "irq"th bit in the mask and set it in the request */ |
64 | local_irq_save(flags); | ||
65 | |||
66 | val = ctrl_inl((unsigned long)systemh_irq_mask_register); | 63 | val = ctrl_inl((unsigned long)systemh_irq_mask_register); |
67 | val &= ~mask; | 64 | val &= ~mask; |
68 | ctrl_outl(val, (unsigned long)systemh_irq_mask_register); | 65 | ctrl_outl(val, (unsigned long)systemh_irq_mask_register); |
@@ -70,23 +67,18 @@ static void disable_systemh_irq(unsigned int irq) | |||
70 | val = ctrl_inl((unsigned long)systemh_irq_request_register); | 67 | val = ctrl_inl((unsigned long)systemh_irq_request_register); |
71 | val |= mask; | 68 | val |= mask; |
72 | ctrl_outl(val, (unsigned long)systemh_irq_request_register); | 69 | ctrl_outl(val, (unsigned long)systemh_irq_request_register); |
73 | |||
74 | local_irq_restore(flags); | ||
75 | } | 70 | } |
76 | } | 71 | } |
77 | 72 | ||
78 | static void enable_systemh_irq(unsigned int irq) | 73 | static void enable_systemh_irq(unsigned int irq) |
79 | { | 74 | { |
80 | if (systemh_irq_mask_register) { | 75 | if (systemh_irq_mask_register) { |
81 | unsigned long flags; | ||
82 | unsigned long val, mask = 0x01 << 1; | 76 | unsigned long val, mask = 0x01 << 1; |
83 | 77 | ||
84 | /* Set "irq"th bit in the mask register */ | 78 | /* Set "irq"th bit in the mask register */ |
85 | local_irq_save(flags); | ||
86 | val = ctrl_inl((unsigned long)systemh_irq_mask_register); | 79 | val = ctrl_inl((unsigned long)systemh_irq_mask_register); |
87 | val |= mask; | 80 | val |= mask; |
88 | ctrl_outl(val, (unsigned long)systemh_irq_mask_register); | 81 | ctrl_outl(val, (unsigned long)systemh_irq_mask_register); |
89 | local_irq_restore(flags); | ||
90 | } | 82 | } |
91 | } | 83 | } |
92 | 84 | ||
diff --git a/arch/sh/boards/superh/microdev/irq.c b/arch/sh/boards/superh/microdev/irq.c index 236398fbc083..8c64baa30364 100644 --- a/arch/sh/boards/superh/microdev/irq.c +++ b/arch/sh/boards/superh/microdev/irq.c | |||
@@ -11,14 +11,12 @@ | |||
11 | 11 | ||
12 | #include <linux/init.h> | 12 | #include <linux/init.h> |
13 | #include <linux/irq.h> | 13 | #include <linux/irq.h> |
14 | |||
15 | #include <asm/system.h> | 14 | #include <asm/system.h> |
16 | #include <asm/io.h> | 15 | #include <asm/io.h> |
17 | #include <asm/microdev.h> | 16 | #include <asm/microdev.h> |
18 | 17 | ||
19 | #define NUM_EXTERNAL_IRQS 16 /* IRL0 .. IRL15 */ | 18 | #define NUM_EXTERNAL_IRQS 16 /* IRL0 .. IRL15 */ |
20 | 19 | ||
21 | |||
22 | static const struct { | 20 | static const struct { |
23 | unsigned char fpgaIrq; | 21 | unsigned char fpgaIrq; |
24 | unsigned char mapped; | 22 | unsigned char mapped; |
@@ -93,53 +91,42 @@ static struct hw_interrupt_type microdev_irq_type = { | |||
93 | 91 | ||
94 | static void disable_microdev_irq(unsigned int irq) | 92 | static void disable_microdev_irq(unsigned int irq) |
95 | { | 93 | { |
96 | unsigned int flags; | ||
97 | unsigned int fpgaIrq; | 94 | unsigned int fpgaIrq; |
98 | 95 | ||
99 | if (irq >= NUM_EXTERNAL_IRQS) return; | 96 | if (irq >= NUM_EXTERNAL_IRQS) |
100 | if (!fpgaIrqTable[irq].mapped) return; | 97 | return; |
98 | if (!fpgaIrqTable[irq].mapped) | ||
99 | return; | ||
101 | 100 | ||
102 | fpgaIrq = fpgaIrqTable[irq].fpgaIrq; | 101 | fpgaIrq = fpgaIrqTable[irq].fpgaIrq; |
103 | 102 | ||
104 | /* disable interrupts */ | 103 | /* disable interupts on the FPGA INTC register */ |
105 | local_irq_save(flags); | ||
106 | |||
107 | /* disable interupts on the FPGA INTC register */ | ||
108 | ctrl_outl(MICRODEV_FPGA_INTC_MASK(fpgaIrq), MICRODEV_FPGA_INTDSB_REG); | 104 | ctrl_outl(MICRODEV_FPGA_INTC_MASK(fpgaIrq), MICRODEV_FPGA_INTDSB_REG); |
109 | |||
110 | /* restore interrupts */ | ||
111 | local_irq_restore(flags); | ||
112 | } | 105 | } |
113 | 106 | ||
114 | static void enable_microdev_irq(unsigned int irq) | 107 | static void enable_microdev_irq(unsigned int irq) |
115 | { | 108 | { |
116 | unsigned long priorityReg, priorities, pri; | 109 | unsigned long priorityReg, priorities, pri; |
117 | unsigned int flags; | ||
118 | unsigned int fpgaIrq; | 110 | unsigned int fpgaIrq; |
119 | 111 | ||
120 | 112 | if (unlikely(irq >= NUM_EXTERNAL_IRQS)) | |
121 | if (irq >= NUM_EXTERNAL_IRQS) return; | 113 | return; |
122 | if (!fpgaIrqTable[irq].mapped) return; | 114 | if (unlikely(!fpgaIrqTable[irq].mapped)) |
115 | return; | ||
123 | 116 | ||
124 | pri = 15 - irq; | 117 | pri = 15 - irq; |
125 | 118 | ||
126 | fpgaIrq = fpgaIrqTable[irq].fpgaIrq; | 119 | fpgaIrq = fpgaIrqTable[irq].fpgaIrq; |
127 | priorityReg = MICRODEV_FPGA_INTPRI_REG(fpgaIrq); | 120 | priorityReg = MICRODEV_FPGA_INTPRI_REG(fpgaIrq); |
128 | 121 | ||
129 | /* disable interrupts */ | 122 | /* set priority for the interrupt */ |
130 | local_irq_save(flags); | ||
131 | |||
132 | /* set priority for the interrupt */ | ||
133 | priorities = ctrl_inl(priorityReg); | 123 | priorities = ctrl_inl(priorityReg); |
134 | priorities &= ~MICRODEV_FPGA_INTPRI_MASK(fpgaIrq); | 124 | priorities &= ~MICRODEV_FPGA_INTPRI_MASK(fpgaIrq); |
135 | priorities |= MICRODEV_FPGA_INTPRI_LEVEL(fpgaIrq, pri); | 125 | priorities |= MICRODEV_FPGA_INTPRI_LEVEL(fpgaIrq, pri); |
136 | ctrl_outl(priorities, priorityReg); | 126 | ctrl_outl(priorities, priorityReg); |
137 | 127 | ||
138 | /* enable interupts on the FPGA INTC register */ | 128 | /* enable interupts on the FPGA INTC register */ |
139 | ctrl_outl(MICRODEV_FPGA_INTC_MASK(fpgaIrq), MICRODEV_FPGA_INTENB_REG); | 129 | ctrl_outl(MICRODEV_FPGA_INTC_MASK(fpgaIrq), MICRODEV_FPGA_INTENB_REG); |
140 | |||
141 | /* restore interrupts */ | ||
142 | local_irq_restore(flags); | ||
143 | } | 130 | } |
144 | 131 | ||
145 | /* This functions sets the desired irq handler to be a MicroDev type */ | 132 | /* This functions sets the desired irq handler to be a MicroDev type */ |
@@ -158,9 +145,7 @@ static void mask_and_ack_microdev(unsigned int irq) | |||
158 | static void end_microdev_irq(unsigned int irq) | 145 | static void end_microdev_irq(unsigned int irq) |
159 | { | 146 | { |
160 | if (!(irq_desc[irq].status & (IRQ_DISABLED|IRQ_INPROGRESS))) | 147 | if (!(irq_desc[irq].status & (IRQ_DISABLED|IRQ_INPROGRESS))) |
161 | { | ||
162 | enable_microdev_irq(irq); | 148 | enable_microdev_irq(irq); |
163 | } | ||
164 | } | 149 | } |
165 | 150 | ||
166 | extern void __init init_microdev_irq(void) | 151 | extern void __init init_microdev_irq(void) |
@@ -171,9 +156,7 @@ extern void __init init_microdev_irq(void) | |||
171 | ctrl_outl(~0ul, MICRODEV_FPGA_INTDSB_REG); | 156 | ctrl_outl(~0ul, MICRODEV_FPGA_INTDSB_REG); |
172 | 157 | ||
173 | for (i = 0; i < NUM_EXTERNAL_IRQS; i++) | 158 | for (i = 0; i < NUM_EXTERNAL_IRQS; i++) |
174 | { | ||
175 | make_microdev_irq(i); | 159 | make_microdev_irq(i); |
176 | } | ||
177 | } | 160 | } |
178 | 161 | ||
179 | extern void microdev_print_fpga_intc_status(void) | 162 | extern void microdev_print_fpga_intc_status(void) |