diff options
author | Sergei Shtylylov <sshtylyov@ru.mvista.com> | 2005-11-18 14:20:31 -0500 |
---|---|---|
committer | Ralf Baechle <ralf@linux-mips.org> | 2005-12-01 06:05:10 -0500 |
commit | 702a96a62b2a37025a752409b0dc08d8473096b1 (patch) | |
tree | c8be650426703bd8881969493c6d2523a4444bfe /arch/mips/jmr3927/rbhma3100 | |
parent | 5666c0947ede0432ba5148570aa66ffb9febff5b (diff) |
[MIPS] JMR3927 fixes.
o Check if IRQ is disabled or in progress before reenabling interrupts
in jmr3927_irq_end..
o s/spinlock_irqsave/spin_lock_irqsave/
o s/spinlock_irqrestore/spin_unlock_irqrestore/
o Flush write buffer after setting IRQ mask
o In 2.6 jmr3927_ioc_interrupt interrupt handlers return irqreturn_t
Signed-off-by: Sergei Shtylyov <sshtylyov@ru.mvista.com>
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
Diffstat (limited to 'arch/mips/jmr3927/rbhma3100')
-rw-r--r-- | arch/mips/jmr3927/rbhma3100/irq.c | 28 |
1 files changed, 19 insertions, 9 deletions
diff --git a/arch/mips/jmr3927/rbhma3100/irq.c b/arch/mips/jmr3927/rbhma3100/irq.c index 7cbe14483f13..2810727f1d4e 100644 --- a/arch/mips/jmr3927/rbhma3100/irq.c +++ b/arch/mips/jmr3927/rbhma3100/irq.c | |||
@@ -113,7 +113,8 @@ static void jmr3927_irq_ack(unsigned int irq) | |||
113 | 113 | ||
114 | static void jmr3927_irq_end(unsigned int irq) | 114 | static void jmr3927_irq_end(unsigned int irq) |
115 | { | 115 | { |
116 | jmr3927_irq_enable(irq); | 116 | if (!(irq_desc[irq].status & (IRQ_DISABLED | IRQ_INPROGRESS))) |
117 | jmr3927_irq_enable(irq); | ||
117 | } | 118 | } |
118 | 119 | ||
119 | static void jmr3927_irq_disable(unsigned int irq_nr) | 120 | static void jmr3927_irq_disable(unsigned int irq_nr) |
@@ -121,7 +122,7 @@ static void jmr3927_irq_disable(unsigned int irq_nr) | |||
121 | struct tb_irq_space* sp; | 122 | struct tb_irq_space* sp; |
122 | unsigned long flags; | 123 | unsigned long flags; |
123 | 124 | ||
124 | spinlock_irqsave(&jmr3927_irq_lock, flags); | 125 | spin_lock_irqsave(&jmr3927_irq_lock, flags); |
125 | for (sp = tb_irq_spaces; sp; sp = sp->next) { | 126 | for (sp = tb_irq_spaces; sp; sp = sp->next) { |
126 | if (sp->start_irqno <= irq_nr && | 127 | if (sp->start_irqno <= irq_nr && |
127 | irq_nr < sp->start_irqno + sp->nr_irqs) { | 128 | irq_nr < sp->start_irqno + sp->nr_irqs) { |
@@ -131,7 +132,7 @@ static void jmr3927_irq_disable(unsigned int irq_nr) | |||
131 | break; | 132 | break; |
132 | } | 133 | } |
133 | } | 134 | } |
134 | spinlock_irqrestore(&jmr3927_irq_lock, flags); | 135 | spin_unlock_irqrestore(&jmr3927_irq_lock, flags); |
135 | } | 136 | } |
136 | 137 | ||
137 | static void jmr3927_irq_enable(unsigned int irq_nr) | 138 | static void jmr3927_irq_enable(unsigned int irq_nr) |
@@ -139,7 +140,7 @@ static void jmr3927_irq_enable(unsigned int irq_nr) | |||
139 | struct tb_irq_space* sp; | 140 | struct tb_irq_space* sp; |
140 | unsigned long flags; | 141 | unsigned long flags; |
141 | 142 | ||
142 | spinlock_irqsave(&jmr3927_irq_lock, flags); | 143 | spin_lock_irqsave(&jmr3927_irq_lock, flags); |
143 | for (sp = tb_irq_spaces; sp; sp = sp->next) { | 144 | for (sp = tb_irq_spaces; sp; sp = sp->next) { |
144 | if (sp->start_irqno <= irq_nr && | 145 | if (sp->start_irqno <= irq_nr && |
145 | irq_nr < sp->start_irqno + sp->nr_irqs) { | 146 | irq_nr < sp->start_irqno + sp->nr_irqs) { |
@@ -149,7 +150,7 @@ static void jmr3927_irq_enable(unsigned int irq_nr) | |||
149 | break; | 150 | break; |
150 | } | 151 | } |
151 | } | 152 | } |
152 | spinlock_irqrestore(&jmr3927_irq_lock, flags); | 153 | spin_unlock_irqrestore(&jmr3927_irq_lock, flags); |
153 | } | 154 | } |
154 | 155 | ||
155 | /* | 156 | /* |
@@ -205,7 +206,10 @@ static void mask_irq_irc(int irq_nr, int space_id) | |||
205 | /* update IRCSR */ | 206 | /* update IRCSR */ |
206 | tx3927_ircptr->imr = 0; | 207 | tx3927_ircptr->imr = 0; |
207 | tx3927_ircptr->imr = irc_elevel; | 208 | tx3927_ircptr->imr = irc_elevel; |
209 | /* flush write buffer */ | ||
210 | (void)tx3927_ircptr->ssr; | ||
208 | } | 211 | } |
212 | |||
209 | static void unmask_irq_irc(int irq_nr, int space_id) | 213 | static void unmask_irq_irc(int irq_nr, int space_id) |
210 | { | 214 | { |
211 | volatile unsigned long *ilrp = &tx3927_ircptr->ilr[irq_nr / 2]; | 215 | volatile unsigned long *ilrp = &tx3927_ircptr->ilr[irq_nr / 2]; |
@@ -276,7 +280,7 @@ void jmr3927_irc_irqdispatch(struct pt_regs *regs) | |||
276 | do_IRQ(irq + JMR3927_IRQ_IRC, regs); | 280 | do_IRQ(irq + JMR3927_IRQ_IRC, regs); |
277 | } | 281 | } |
278 | 282 | ||
279 | static void jmr3927_ioc_interrupt(int irq, void *dev_id, struct pt_regs *regs) | 283 | static irqreturn_t jmr3927_ioc_interrupt(int irq, void *dev_id, struct pt_regs *regs) |
280 | { | 284 | { |
281 | unsigned char istat = jmr3927_ioc_reg_in(JMR3927_IOC_INTS2_ADDR); | 285 | unsigned char istat = jmr3927_ioc_reg_in(JMR3927_IOC_INTS2_ADDR); |
282 | int i; | 286 | int i; |
@@ -287,13 +291,14 @@ static void jmr3927_ioc_interrupt(int irq, void *dev_id, struct pt_regs *regs) | |||
287 | do_IRQ(irq, regs); | 291 | do_IRQ(irq, regs); |
288 | } | 292 | } |
289 | } | 293 | } |
294 | return IRQ_HANDLED; | ||
290 | } | 295 | } |
291 | 296 | ||
292 | static struct irqaction ioc_action = { | 297 | static struct irqaction ioc_action = { |
293 | jmr3927_ioc_interrupt, 0, CPU_MASK_NONE, "IOC", NULL, NULL, | 298 | jmr3927_ioc_interrupt, 0, CPU_MASK_NONE, "IOC", NULL, NULL, |
294 | }; | 299 | }; |
295 | 300 | ||
296 | static void jmr3927_isac_interrupt(int irq, void *dev_id, struct pt_regs *regs) | 301 | static irqreturn_t jmr3927_isac_interrupt(int irq, void *dev_id, struct pt_regs *regs) |
297 | { | 302 | { |
298 | unsigned char istat = jmr3927_isac_reg_in(JMR3927_ISAC_INTS2_ADDR); | 303 | unsigned char istat = jmr3927_isac_reg_in(JMR3927_ISAC_INTS2_ADDR); |
299 | int i; | 304 | int i; |
@@ -304,6 +309,7 @@ static void jmr3927_isac_interrupt(int irq, void *dev_id, struct pt_regs *regs) | |||
304 | do_IRQ(irq, regs); | 309 | do_IRQ(irq, regs); |
305 | } | 310 | } |
306 | } | 311 | } |
312 | return IRQ_HANDLED; | ||
307 | } | 313 | } |
308 | 314 | ||
309 | static struct irqaction isac_action = { | 315 | static struct irqaction isac_action = { |
@@ -311,19 +317,23 @@ static struct irqaction isac_action = { | |||
311 | }; | 317 | }; |
312 | 318 | ||
313 | 319 | ||
314 | static void jmr3927_isaerr_interrupt(int irq, void * dev_id, struct pt_regs * regs) | 320 | static irqreturn_t jmr3927_isaerr_interrupt(int irq, void * dev_id, struct pt_regs * regs) |
315 | { | 321 | { |
316 | printk(KERN_WARNING "ISA error interrupt (irq 0x%x).\n", irq); | 322 | printk(KERN_WARNING "ISA error interrupt (irq 0x%x).\n", irq); |
323 | |||
324 | return IRQ_HANDLED; | ||
317 | } | 325 | } |
318 | static struct irqaction isaerr_action = { | 326 | static struct irqaction isaerr_action = { |
319 | jmr3927_isaerr_interrupt, 0, CPU_MASK_NONE, "ISA error", NULL, NULL, | 327 | jmr3927_isaerr_interrupt, 0, CPU_MASK_NONE, "ISA error", NULL, NULL, |
320 | }; | 328 | }; |
321 | 329 | ||
322 | static void jmr3927_pcierr_interrupt(int irq, void * dev_id, struct pt_regs * regs) | 330 | static irqreturn_t jmr3927_pcierr_interrupt(int irq, void * dev_id, struct pt_regs * regs) |
323 | { | 331 | { |
324 | printk(KERN_WARNING "PCI error interrupt (irq 0x%x).\n", irq); | 332 | printk(KERN_WARNING "PCI error interrupt (irq 0x%x).\n", irq); |
325 | printk(KERN_WARNING "pcistat:%02x, lbstat:%04lx\n", | 333 | printk(KERN_WARNING "pcistat:%02x, lbstat:%04lx\n", |
326 | tx3927_pcicptr->pcistat, tx3927_pcicptr->lbstat); | 334 | tx3927_pcicptr->pcistat, tx3927_pcicptr->lbstat); |
335 | |||
336 | return IRQ_HANDLED; | ||
327 | } | 337 | } |
328 | static struct irqaction pcierr_action = { | 338 | static struct irqaction pcierr_action = { |
329 | jmr3927_pcierr_interrupt, 0, CPU_MASK_NONE, "PCI error", NULL, NULL, | 339 | jmr3927_pcierr_interrupt, 0, CPU_MASK_NONE, "PCI error", NULL, NULL, |