]> Pileus Git - ~andy/linux/commitdiff
USB: musb: clear the Blackfin interrupt pending bits early in the ISR
authorCliff Cai <cliff.cai@analog.com>
Mon, 16 Nov 2009 10:49:26 +0000 (16:19 +0530)
committerGreg Kroah-Hartman <gregkh@suse.de>
Fri, 11 Dec 2009 19:55:24 +0000 (11:55 -0800)
If we clear the interrupt pending bits at the end, we sometimes return too
fast and have the same interrupt assert itself.  There is no way in a
Blackfin system to force a sync of this state, so the hardware manual
instructs people to clear interrupt flags early in their ISR.

Signed-off-by: Cliff Cai <cliff.cai@analog.com>
Signed-off-by: Mike Frysinger <vapier@gentoo.org>
Signed-off-by: Anand Gadiyar <gadiyar@ti.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
drivers/usb/musb/musbhsdma.c

index 5e83f96d6b77f5588f7dfe6ffa82644787d91c8e..c767387f507b1ca5df7cdbb74a8c32366568d8d6 100644 (file)
@@ -259,6 +259,11 @@ static irqreturn_t dma_controller_irq(int irq, void *private_data)
        if (!int_hsdma)
                goto done;
 
+#ifdef CONFIG_BLACKFIN
+       /* Clear DMA interrupt flags */
+       musb_writeb(mbase, MUSB_HSDMA_INTR, int_hsdma);
+#endif
+
        for (bchannel = 0; bchannel < MUSB_HSDMA_CHANNELS; bchannel++) {
                if (int_hsdma & (1 << bchannel)) {
                        musb_channel = (struct musb_dma_channel *)
@@ -324,11 +329,6 @@ static irqreturn_t dma_controller_irq(int irq, void *private_data)
                }
        }
 
-#ifdef CONFIG_BLACKFIN
-       /* Clear DMA interrup flags */
-       musb_writeb(mbase, MUSB_HSDMA_INTR, int_hsdma);
-#endif
-
        retval = IRQ_HANDLED;
 done:
        spin_unlock_irqrestore(&musb->lock, flags);