提交 76502469 编写于 作者: P Peter Ujfalusi 提交者: Vinod Koul

dmaengine: omap-dma: Start DMA without delay for cyclic channels

cyclic DMA is only used by audio which needs DMA to be started without a
delay.
If the DMA for audio is started using the tasklet we experience random
channel switch (to be more precise: channel shift).
Reported-by: NPeter Meerwald <pmeerw@pmeerw.net>
CC: stable@vger.kernel.org  # v3.7+
Signed-off-by: NPeter Ujfalusi <peter.ujfalusi@ti.com>
Acked-by: NSantosh Shilimkar <santosh.shilimkar@ti.com>
Acked-by: NRussell King <rmk+kernel@arm.linux.org.uk>
Signed-off-by: NVinod Koul <vinod.koul@intel.com>
上级 0b94c577
...@@ -276,12 +276,20 @@ static void omap_dma_issue_pending(struct dma_chan *chan) ...@@ -276,12 +276,20 @@ static void omap_dma_issue_pending(struct dma_chan *chan)
spin_lock_irqsave(&c->vc.lock, flags); spin_lock_irqsave(&c->vc.lock, flags);
if (vchan_issue_pending(&c->vc) && !c->desc) { if (vchan_issue_pending(&c->vc) && !c->desc) {
struct omap_dmadev *d = to_omap_dma_dev(chan->device); /*
spin_lock(&d->lock); * c->cyclic is used only by audio and in this case the DMA need
if (list_empty(&c->node)) * to be started without delay.
list_add_tail(&c->node, &d->pending); */
spin_unlock(&d->lock); if (!c->cyclic) {
tasklet_schedule(&d->task); 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); spin_unlock_irqrestore(&c->vc.lock, flags);
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册