[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>

authored by Sergei Shtylylov and committed by Ralf Baechle 702a96a6 5666c094

+19 -9
+19 -9
arch/mips/jmr3927/rbhma3100/irq.c
··· 113 113 114 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 120 static void jmr3927_irq_disable(unsigned int irq_nr) ··· 122 121 struct tb_irq_space* sp; 123 122 unsigned long flags; 124 123 125 - spinlock_irqsave(&jmr3927_irq_lock, flags); 124 + spin_lock_irqsave(&jmr3927_irq_lock, flags); 126 125 for (sp = tb_irq_spaces; sp; sp = sp->next) { 127 126 if (sp->start_irqno <= irq_nr && 128 127 irq_nr < sp->start_irqno + sp->nr_irqs) { ··· 132 131 break; 133 132 } 134 133 } 135 - spinlock_irqrestore(&jmr3927_irq_lock, flags); 134 + spin_unlock_irqrestore(&jmr3927_irq_lock, flags); 136 135 } 137 136 138 137 static void jmr3927_irq_enable(unsigned int irq_nr) ··· 140 139 struct tb_irq_space* sp; 141 140 unsigned long flags; 142 141 143 - spinlock_irqsave(&jmr3927_irq_lock, flags); 142 + spin_lock_irqsave(&jmr3927_irq_lock, flags); 144 143 for (sp = tb_irq_spaces; sp; sp = sp->next) { 145 144 if (sp->start_irqno <= irq_nr && 146 145 irq_nr < sp->start_irqno + sp->nr_irqs) { ··· 150 149 break; 151 150 } 152 151 } 153 - spinlock_irqrestore(&jmr3927_irq_lock, flags); 152 + spin_unlock_irqrestore(&jmr3927_irq_lock, flags); 154 153 } 155 154 156 155 /* ··· 206 205 /* update IRCSR */ 207 206 tx3927_ircptr->imr = 0; 208 207 tx3927_ircptr->imr = irc_elevel; 208 + /* flush write buffer */ 209 + (void)tx3927_ircptr->ssr; 209 210 } 211 + 210 212 static void unmask_irq_irc(int irq_nr, int space_id) 211 213 { 212 214 volatile unsigned long *ilrp = &tx3927_ircptr->ilr[irq_nr / 2]; ··· 280 276 do_IRQ(irq + JMR3927_IRQ_IRC, regs); 281 277 } 282 278 283 - static void jmr3927_ioc_interrupt(int irq, void *dev_id, struct pt_regs *regs) 279 + static irqreturn_t jmr3927_ioc_interrupt(int irq, void *dev_id, struct pt_regs *regs) 284 280 { 285 281 unsigned char istat = jmr3927_ioc_reg_in(JMR3927_IOC_INTS2_ADDR); 286 282 int i; ··· 291 287 do_IRQ(irq, regs); 292 288 } 293 289 } 290 + return IRQ_HANDLED; 294 291 } 295 292 296 293 static struct irqaction ioc_action = { 297 294 jmr3927_ioc_interrupt, 0, CPU_MASK_NONE, "IOC", NULL, NULL, 298 295 }; 299 296 300 - static void jmr3927_isac_interrupt(int irq, void *dev_id, struct pt_regs *regs) 297 + static irqreturn_t jmr3927_isac_interrupt(int irq, void *dev_id, struct pt_regs *regs) 301 298 { 302 299 unsigned char istat = jmr3927_isac_reg_in(JMR3927_ISAC_INTS2_ADDR); 303 300 int i; ··· 309 304 do_IRQ(irq, regs); 310 305 } 311 306 } 307 + return IRQ_HANDLED; 312 308 } 313 309 314 310 static struct irqaction isac_action = { ··· 317 311 }; 318 312 319 313 320 - static void jmr3927_isaerr_interrupt(int irq, void * dev_id, struct pt_regs * regs) 314 + static irqreturn_t jmr3927_isaerr_interrupt(int irq, void * dev_id, struct pt_regs * regs) 321 315 { 322 316 printk(KERN_WARNING "ISA error interrupt (irq 0x%x).\n", irq); 317 + 318 + return IRQ_HANDLED; 323 319 } 324 320 static struct irqaction isaerr_action = { 325 321 jmr3927_isaerr_interrupt, 0, CPU_MASK_NONE, "ISA error", NULL, NULL, 326 322 }; 327 323 328 - static void jmr3927_pcierr_interrupt(int irq, void * dev_id, struct pt_regs * regs) 324 + static irqreturn_t jmr3927_pcierr_interrupt(int irq, void * dev_id, struct pt_regs * regs) 329 325 { 330 326 printk(KERN_WARNING "PCI error interrupt (irq 0x%x).\n", irq); 331 327 printk(KERN_WARNING "pcistat:%02x, lbstat:%04lx\n", 332 328 tx3927_pcicptr->pcistat, tx3927_pcicptr->lbstat); 329 + 330 + return IRQ_HANDLED; 333 331 } 334 332 static struct irqaction pcierr_action = { 335 333 jmr3927_pcierr_interrupt, 0, CPU_MASK_NONE, "PCI error", NULL, NULL,