From f69b7614f79e31b73701e27eb25077cd336cfc46 Mon Sep 17 00:00:00 2001 From: Kevin Hilman Date: Fri, 31 Aug 2007 16:31:06 -0700 Subject: [PATCH] ARM: OMAP: MUSB: DMA interrupt locking fix dma_controller_irq() should take the lock (and disable interrupts) as the main interrupt handler does since the functions it calls assume this to be the case. Signed-off-by: Kevin Hilman Acked-by: David Brownell --- drivers/usb/musb/musbhsdma.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/drivers/usb/musb/musbhsdma.c b/drivers/usb/musb/musbhsdma.c index a45c1c0b099..589ca80a64e 100644 --- a/drivers/usb/musb/musbhsdma.c +++ b/drivers/usb/musb/musbhsdma.c @@ -296,6 +296,7 @@ static irqreturn_t dma_controller_irq(int irq, void *private_data) struct musb_dma_controller *controller = (struct musb_dma_controller *)private_data; struct musb_dma_channel *pImplChannel; + struct musb *musb = controller->pDmaPrivate; u8 *mbase = controller->pCoreBase; struct dma_channel *pChannel; u8 bChannel; @@ -303,6 +304,9 @@ static irqreturn_t dma_controller_irq(int irq, void *private_data) u32 dwAddress; u8 int_hsdma; irqreturn_t retval = IRQ_NONE; + unsigned long flags; + + spin_lock_irqsave(&musb->lock, flags); int_hsdma = musb_readb(mbase, MUSB_HSDMA_INTR); if (!int_hsdma) @@ -358,7 +362,7 @@ static irqreturn_t dma_controller_irq(int irq, void *private_data) MUSB_TXCSR_TXPKTRDY); } else musb_dma_completion( - controller->pDmaPrivate, + musb, pImplChannel->epnum, pImplChannel->transmit); } @@ -366,6 +370,7 @@ static irqreturn_t dma_controller_irq(int irq, void *private_data) } retval = IRQ_HANDLED; done: + spin_unlock_irqrestore(&musb->lock, flags); return retval; } -- 2.41.0