diff options
Diffstat (limited to 'drivers/usb/musb/musb_cppi41.c')
-rw-r--r-- | drivers/usb/musb/musb_cppi41.c | 24 |
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; |