|
@@ -357,47 +357,49 @@ static void txstate(struct musb *musb, struct musb_request *req)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-#elif defined(CONFIG_USB_TI_CPPI_DMA)
|
|
|
- /* program endpoint CSR first, then setup DMA */
|
|
|
- csr &= ~(MUSB_TXCSR_P_UNDERRUN | MUSB_TXCSR_TXPKTRDY);
|
|
|
- csr |= MUSB_TXCSR_DMAENAB | MUSB_TXCSR_DMAMODE |
|
|
|
- MUSB_TXCSR_MODE;
|
|
|
- musb_writew(epio, MUSB_TXCSR,
|
|
|
- (MUSB_TXCSR_P_WZC_BITS & ~MUSB_TXCSR_P_UNDERRUN)
|
|
|
- | csr);
|
|
|
-
|
|
|
- /* ensure writebuffer is empty */
|
|
|
- csr = musb_readw(epio, MUSB_TXCSR);
|
|
|
-
|
|
|
- /* NOTE host side sets DMAENAB later than this; both are
|
|
|
- * OK since the transfer dma glue (between CPPI and Mentor
|
|
|
- * fifos) just tells CPPI it could start. Data only moves
|
|
|
- * to the USB TX fifo when both fifos are ready.
|
|
|
- */
|
|
|
-
|
|
|
- /* "mode" is irrelevant here; handle terminating ZLPs like
|
|
|
- * PIO does, since the hardware RNDIS mode seems unreliable
|
|
|
- * except for the last-packet-is-already-short case.
|
|
|
- */
|
|
|
- use_dma = use_dma && c->channel_program(
|
|
|
- musb_ep->dma, musb_ep->packet_sz,
|
|
|
- 0,
|
|
|
- request->dma + request->actual,
|
|
|
- request_size);
|
|
|
- if (!use_dma) {
|
|
|
- c->channel_release(musb_ep->dma);
|
|
|
- musb_ep->dma = NULL;
|
|
|
- csr &= ~MUSB_TXCSR_DMAENAB;
|
|
|
- musb_writew(epio, MUSB_TXCSR, csr);
|
|
|
- /* invariant: prequest->buf is non-null */
|
|
|
- }
|
|
|
-#elif defined(CONFIG_USB_TUSB_OMAP_DMA)
|
|
|
- use_dma = use_dma && c->channel_program(
|
|
|
- musb_ep->dma, musb_ep->packet_sz,
|
|
|
- request->zero,
|
|
|
- request->dma + request->actual,
|
|
|
- request_size);
|
|
|
#endif
|
|
|
+ if (is_cppi_enabled()) {
|
|
|
+ /* program endpoint CSR first, then setup DMA */
|
|
|
+ csr &= ~(MUSB_TXCSR_P_UNDERRUN | MUSB_TXCSR_TXPKTRDY);
|
|
|
+ csr |= MUSB_TXCSR_DMAENAB | MUSB_TXCSR_DMAMODE |
|
|
|
+ MUSB_TXCSR_MODE;
|
|
|
+ musb_writew(epio, MUSB_TXCSR, (MUSB_TXCSR_P_WZC_BITS &
|
|
|
+ ~MUSB_TXCSR_P_UNDERRUN) | csr);
|
|
|
+
|
|
|
+ /* ensure writebuffer is empty */
|
|
|
+ csr = musb_readw(epio, MUSB_TXCSR);
|
|
|
+
|
|
|
+ /*
|
|
|
+ * NOTE host side sets DMAENAB later than this; both are
|
|
|
+ * OK since the transfer dma glue (between CPPI and
|
|
|
+ * Mentor fifos) just tells CPPI it could start. Data
|
|
|
+ * only moves to the USB TX fifo when both fifos are
|
|
|
+ * ready.
|
|
|
+ */
|
|
|
+ /*
|
|
|
+ * "mode" is irrelevant here; handle terminating ZLPs
|
|
|
+ * like PIO does, since the hardware RNDIS mode seems
|
|
|
+ * unreliable except for the
|
|
|
+ * last-packet-is-already-short case.
|
|
|
+ */
|
|
|
+ use_dma = use_dma && c->channel_program(
|
|
|
+ musb_ep->dma, musb_ep->packet_sz,
|
|
|
+ 0,
|
|
|
+ request->dma + request->actual,
|
|
|
+ request_size);
|
|
|
+ if (!use_dma) {
|
|
|
+ c->channel_release(musb_ep->dma);
|
|
|
+ musb_ep->dma = NULL;
|
|
|
+ csr &= ~MUSB_TXCSR_DMAENAB;
|
|
|
+ musb_writew(epio, MUSB_TXCSR, csr);
|
|
|
+ /* invariant: prequest->buf is non-null */
|
|
|
+ }
|
|
|
+ } else if (tusb_dma_omap())
|
|
|
+ use_dma = use_dma && c->channel_program(
|
|
|
+ musb_ep->dma, musb_ep->packet_sz,
|
|
|
+ request->zero,
|
|
|
+ request->dma + request->actual,
|
|
|
+ request_size);
|
|
|
}
|
|
|
#endif
|
|
|
|