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