|
@@ -276,12 +276,20 @@ static void omap_dma_issue_pending(struct dma_chan *chan)
|
|
|
|
|
|
spin_lock_irqsave(&c->vc.lock, flags);
|
|
|
if (vchan_issue_pending(&c->vc) && !c->desc) {
|
|
|
- struct omap_dmadev *d = to_omap_dma_dev(chan->device);
|
|
|
- spin_lock(&d->lock);
|
|
|
- if (list_empty(&c->node))
|
|
|
- list_add_tail(&c->node, &d->pending);
|
|
|
- spin_unlock(&d->lock);
|
|
|
- tasklet_schedule(&d->task);
|
|
|
+ /*
|
|
|
+ * c->cyclic is used only by audio and in this case the DMA need
|
|
|
+ * to be started without delay.
|
|
|
+ */
|
|
|
+ if (!c->cyclic) {
|
|
|
+ struct omap_dmadev *d = to_omap_dma_dev(chan->device);
|
|
|
+ spin_lock(&d->lock);
|
|
|
+ if (list_empty(&c->node))
|
|
|
+ list_add_tail(&c->node, &d->pending);
|
|
|
+ spin_unlock(&d->lock);
|
|
|
+ tasklet_schedule(&d->task);
|
|
|
+ } else {
|
|
|
+ omap_dma_start_desc(c);
|
|
|
+ }
|
|
|
}
|
|
|
spin_unlock_irqrestore(&c->vc.lock, flags);
|
|
|
}
|