cbus-retu: Add locking around register access in irq handler
PATCH 1/1 cbus-retu: Add locking around register access in irq handler
This adds locking around the register access in the interrupt service routine.
---
drivers/cbus/retu.c +3 -1
@@ -198,10 +198,12 @@ static irqreturn_t retu_irq_handler(intu16 idr;u16 imr; +mutex_lock (&retu->mutex); idr =__retu_read_reg (retu,RETU_REG_IDR ); imr =__retu_read_reg (retu,RETU_REG_IMR ); - idr &= ~imr; +mutex_unlock (&retu->mutex); + idr &= ~imr;if (!idr) {dev_vdbg (retu->dev,"No IRQ, spurious?\n" );return IRQ_NONE ;
Quoted 5 lines · Michael Buesch
This adds locking around the register access in the interrupt service routine.
Signed-off-by Michael Buesch <[email protected]>Reported-by Felipe Balbi <[email protected]>
Fine by me. Tony, you can apply.
Signature · 1 line
balbi
Quoted 8 lines · Felipe Balbi
Quoted 5 lines · Michael Buesch
This adds locking around the register access in the interrupt service routine.
Signed-off-by Michael Buesch <[email protected]>Reported-by Felipe Balbi <[email protected]>Fine by me. Tony, you can apply.
Only applied the first two to add the register defines because of:
BUG: sleeping function called from invalid context at kernel/mutex.c:278
in_atomic(): 1, irqs_disabled(): 0, pid: 0, name: swapper
INFO: lockdep is turned off.
[<c0063c24>] (unwind_backtrace+0x0/0xec) from [<c0402f98>] (mutex_lock_nested+0x24/0x340) [<c0402f98>] (mutex_lock_nested+0x24/0x340) from [<c032b4e4>] (retu_write_reg+0x20/0x3c) [<c032b4e4>] (retu_write_reg+0x20/0x3c) from [<c032bc4c>] (_retu_modify_counter+0x28/0x34) [<c032bc4c>] (_retu_modify_counter+0x28/0x34) from [<c032be48>] (retu_wdt_set_ping_timer+0x10/0x50) [<c032be48>] (retu_wdt_set_ping_timer+0x10/0x50) from [<c00a2000>] (run_timer_softirq+0x260/0x368) [<c00a2000>] (run_timer_softirq+0x260/0x368) from [<c009bdb8>] (__do_softirq+0xe8/0x1e0) [<c009bdb8>] (__do_softirq+0xe8/0x1e0) from [<c009bf04>] (irq_exit+0x54/0xa0) [<c009bf04>] (irq_exit+0x54/0xa0) from [<c0052090>] (asm_do_IRQ+0x90/0xcc) [<c0052090>] (asm_do_IRQ+0x90/0xcc) from [<c0404adc>] (__irq_svc+0x3c/0x100)
Tony