aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb/musb/musb_cppi41.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/usb/musb/musb_cppi41.c')
-rw-r--r--drivers/usb/musb/musb_cppi41.c24
1 files changed, 15 insertions, 9 deletions
diff --git a/drivers/usb/musb/musb_cppi41.c b/drivers/usb/musb/musb_cppi41.c
index c39a16ad7832..be84562d021b 100644
--- a/drivers/usb/musb/musb_cppi41.c
+++ b/drivers/usb/musb/musb_cppi41.c
@@ -9,9 +9,9 @@
9 9
10#define RNDIS_REG(x) (0x80 + ((x - 1) * 4)) 10#define RNDIS_REG(x) (0x80 + ((x - 1) * 4))
11 11
12#define EP_MODE_AUTOREG_NONE 0 12#define EP_MODE_AUTOREQ_NONE 0
13#define EP_MODE_AUTOREG_ALL_NEOP 1 13#define EP_MODE_AUTOREQ_ALL_NEOP 1
14#define EP_MODE_AUTOREG_ALWAYS 3 14#define EP_MODE_AUTOREQ_ALWAYS 3
15 15
16#define EP_MODE_DMA_TRANSPARENT 0 16#define EP_MODE_DMA_TRANSPARENT 0
17#define EP_MODE_DMA_RNDIS 1 17#define EP_MODE_DMA_RNDIS 1
@@ -404,19 +404,19 @@ static bool cppi41_configure_channel(struct dma_channel *channel,
404 404
405 /* auto req */ 405 /* auto req */
406 cppi41_set_autoreq_mode(cppi41_channel, 406 cppi41_set_autoreq_mode(cppi41_channel,
407 EP_MODE_AUTOREG_ALL_NEOP); 407 EP_MODE_AUTOREQ_ALL_NEOP);
408 } else { 408 } else {
409 musb_writel(musb->ctrl_base, 409 musb_writel(musb->ctrl_base,
410 RNDIS_REG(cppi41_channel->port_num), 0); 410 RNDIS_REG(cppi41_channel->port_num), 0);
411 cppi41_set_dma_mode(cppi41_channel, 411 cppi41_set_dma_mode(cppi41_channel,
412 EP_MODE_DMA_TRANSPARENT); 412 EP_MODE_DMA_TRANSPARENT);
413 cppi41_set_autoreq_mode(cppi41_channel, 413 cppi41_set_autoreq_mode(cppi41_channel,
414 EP_MODE_AUTOREG_NONE); 414 EP_MODE_AUTOREQ_NONE);
415 } 415 }
416 } else { 416 } else {
417 /* fallback mode */ 417 /* fallback mode */
418 cppi41_set_dma_mode(cppi41_channel, EP_MODE_DMA_TRANSPARENT); 418 cppi41_set_dma_mode(cppi41_channel, EP_MODE_DMA_TRANSPARENT);
419 cppi41_set_autoreq_mode(cppi41_channel, EP_MODE_AUTOREG_NONE); 419 cppi41_set_autoreq_mode(cppi41_channel, EP_MODE_AUTOREQ_NONE);
420 len = min_t(u32, packet_sz, len); 420 len = min_t(u32, packet_sz, len);
421 } 421 }
422 cppi41_channel->prog_len = len; 422 cppi41_channel->prog_len = len;
@@ -549,10 +549,15 @@ static int cppi41_dma_channel_abort(struct dma_channel *channel)
549 csr &= ~MUSB_TXCSR_DMAENAB; 549 csr &= ~MUSB_TXCSR_DMAENAB;
550 musb_writew(epio, MUSB_TXCSR, csr); 550 musb_writew(epio, MUSB_TXCSR, csr);
551 } else { 551 } else {
552 cppi41_set_autoreq_mode(cppi41_channel, EP_MODE_AUTOREQ_NONE);
553
552 csr = musb_readw(epio, MUSB_RXCSR); 554 csr = musb_readw(epio, MUSB_RXCSR);
553 csr &= ~(MUSB_RXCSR_H_REQPKT | MUSB_RXCSR_DMAENAB); 555 csr &= ~(MUSB_RXCSR_H_REQPKT | MUSB_RXCSR_DMAENAB);
554 musb_writew(epio, MUSB_RXCSR, csr); 556 musb_writew(epio, MUSB_RXCSR, csr);
555 557
558 /* wait to drain cppi dma pipe line */
559 udelay(50);
560
556 csr = musb_readw(epio, MUSB_RXCSR); 561 csr = musb_readw(epio, MUSB_RXCSR);
557 if (csr & MUSB_RXCSR_RXPKTRDY) { 562 if (csr & MUSB_RXCSR_RXPKTRDY) {
558 csr |= MUSB_RXCSR_FLUSHFIFO; 563 csr |= MUSB_RXCSR_FLUSHFIFO;
@@ -566,13 +571,14 @@ static int cppi41_dma_channel_abort(struct dma_channel *channel)
566 tdbit <<= 16; 571 tdbit <<= 16;
567 572
568 do { 573 do {
569 musb_writel(musb->ctrl_base, USB_TDOWN, tdbit); 574 if (is_tx)
575 musb_writel(musb->ctrl_base, USB_TDOWN, tdbit);
570 ret = dmaengine_terminate_all(cppi41_channel->dc); 576 ret = dmaengine_terminate_all(cppi41_channel->dc);
571 } while (ret == -EAGAIN); 577 } while (ret == -EAGAIN);
572 578
573 musb_writel(musb->ctrl_base, USB_TDOWN, tdbit);
574
575 if (is_tx) { 579 if (is_tx) {
580 musb_writel(musb->ctrl_base, USB_TDOWN, tdbit);
581
576 csr = musb_readw(epio, MUSB_TXCSR); 582 csr = musb_readw(epio, MUSB_TXCSR);
577 if (csr & MUSB_TXCSR_TXPKTRDY) { 583 if (csr & MUSB_TXCSR_TXPKTRDY) {
578 csr |= MUSB_TXCSR_FLUSHFIFO; 584 csr |= MUSB_TXCSR_FLUSHFIFO;