Skip to content

Commit

Permalink
dmaengine: omap-dma: Start DMA without delay for cyclic channels
Browse files Browse the repository at this point in the history
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: Peter Meerwald <[email protected]>
CC: [email protected]  # v3.7+
Signed-off-by: Peter Ujfalusi <[email protected]>
Acked-by: Santosh Shilimkar <[email protected]>
Acked-by: Russell King <[email protected]>
Signed-off-by: Vinod Koul <[email protected]>
  • Loading branch information
Peter Ujfalusi authored and Vinod Koul committed Apr 10, 2013
1 parent 0b94c57 commit 7650246
Showing 1 changed file with 14 additions and 6 deletions.
20 changes: 14 additions & 6 deletions drivers/dma/omap-dma.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
Expand Down

0 comments on commit 7650246

Please sign in to comment.