aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/usb/musb/musb_cppi41.c')
-rw-r--r--drivers/usb/musb/musb_cppi41.c23
1 files changed, 21 insertions, 2 deletions
diff --git a/drivers/usb/musb/musb_cppi41.c b/drivers/usb/musb/musb_cppi41.c
index e499b862a946..88f26ac2a185 100644
--- a/drivers/usb/musb/musb_cppi41.c
+++ b/drivers/usb/musb/musb_cppi41.c
@@ -250,8 +250,27 @@ static void cppi41_dma_callback(void *private_data)
250 transferred < cppi41_channel->packet_sz) 250 transferred < cppi41_channel->packet_sz)
251 cppi41_channel->prog_len = 0; 251 cppi41_channel->prog_len = 0;
252 252
253 if (cppi41_channel->is_tx) 253 if (cppi41_channel->is_tx) {
254 empty = musb_is_tx_fifo_empty(hw_ep); 254 u8 type;
255
256 if (is_host_active(musb))
257 type = hw_ep->out_qh->type;
258 else
259 type = hw_ep->ep_in.type;
260
261 if (type == USB_ENDPOINT_XFER_ISOC)
262 /*
263 * Don't use the early-TX-interrupt workaround below
264 * for Isoch transfter. Since Isoch are periodic
265 * transfer, by the time the next transfer is
266 * scheduled, the current one should be done already.
267 *
268 * This avoids audio playback underrun issue.
269 */
270 empty = true;
271 else
272 empty = musb_is_tx_fifo_empty(hw_ep);
273 }
255 274
256 if (!cppi41_channel->is_tx || empty) { 275 if (!cppi41_channel->is_tx || empty) {
257 cppi41_trans_done(cppi41_channel); 276 cppi41_trans_done(cppi41_channel);