linux-ti33x-psp 3.2: backport PM and USB fixes from PSP
[glsdk/meta-ti-glsdk.git] / recipes-kernel / linux / linux-ti33x-psp-3.2 / psp / 0015-usb-musb-cppi41-txdma-flushfifo-fixes-during-channel.patch
1 From a67c22912417f2b4c22f063767405992e702efbe Mon Sep 17 00:00:00 2001
2 From: Ravi B <ravibabu@ti.com>
3 Date: Thu, 10 May 2012 17:05:41 +0530
4 Subject: [PATCH 15/18] usb: musb: cppi41: txdma flushfifo fixes during
5  channel abort
7 This patch fixes the flushfifo sequence during tx dma channel
8 abort, the txfifo should be flushed only when the TXPKTRDY bit
9 is set in TXCSR register.
11 Signed-off-by: Ravi B <ravibabu@ti.com>
12 ---
13  drivers/usb/musb/cppi41_dma.c |   14 +++++++++-----
14  1 files changed, 9 insertions(+), 5 deletions(-)
16 diff --git a/drivers/usb/musb/cppi41_dma.c b/drivers/usb/musb/cppi41_dma.c
17 index bf74cf3..4367e4f 100644
18 --- a/drivers/usb/musb/cppi41_dma.c
19 +++ b/drivers/usb/musb/cppi41_dma.c
20 @@ -1198,7 +1198,7 @@ static int cppi41_channel_abort(struct dma_channel *channel)
21         void __iomem *reg_base, *epio;
22         unsigned long pd_addr;
23         u32 csr, td_reg;
24 -       u8 ch_num, ep_num;
25 +       u8 ch_num, ep_num, i;
26  
27         cppi_ch = container_of(channel, struct cppi41_channel, channel);
28         ch_num = cppi_ch->ch_num;
29 @@ -1250,10 +1250,14 @@ static int cppi41_channel_abort(struct dma_channel *channel)
30                 musb_writel(reg_base, cppi->teardown_reg_offs, td_reg);
31  
32                 /* Flush FIFO of the endpoint */
33 -               csr  = musb_readw(epio, MUSB_TXCSR);
34 -               csr |= MUSB_TXCSR_FLUSHFIFO | MUSB_TXCSR_H_WZC_BITS;
35 -               musb_writew(epio, MUSB_TXCSR, csr);
36 -               musb_writew(epio, MUSB_TXCSR, csr);
37 +               for (i = 0; i < 2; ++i) {
38 +                       csr  = musb_readw(epio, MUSB_TXCSR);
39 +                       if (csr & MUSB_TXCSR_TXPKTRDY) {
40 +                               csr |= MUSB_TXCSR_FLUSHFIFO |
41 +                                       MUSB_TXCSR_H_WZC_BITS;
42 +                               musb_writew(epio, MUSB_TXCSR, csr);
43 +                       }
44 +               }
45         } else { /* Rx */
46                 dprintk("Rx channel teardown, cppi_ch = %p\n", cppi_ch);
47  
48 -- 
49 1.7.7.6