| From 765024697807ad1e1cac332aa891253ca4a339da Mon Sep 17 00:00:00 2001 |
| From: Peter Ujfalusi <peter.ujfalusi@ti.com> |
| Date: Tue, 9 Apr 2013 16:33:06 +0200 |
| Subject: dmaengine: omap-dma: Start DMA without delay for cyclic channels |
| |
| From: Peter Ujfalusi <peter.ujfalusi@ti.com> |
| |
| commit 765024697807ad1e1cac332aa891253ca4a339da upstream. |
| |
| 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 <pmeerw@pmeerw.net> |
| Signed-off-by: Peter Ujfalusi <peter.ujfalusi@ti.com> |
| Acked-by: Santosh Shilimkar <santosh.shilimkar@ti.com> |
| Acked-by: Russell King <rmk+kernel@arm.linux.org.uk> |
| Signed-off-by: Vinod Koul <vinod.koul@intel.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/dma/omap-dma.c | 20 ++++++++++++++------ |
| 1 file changed, 14 insertions(+), 6 deletions(-) |
| |
| --- a/drivers/dma/omap-dma.c |
| +++ b/drivers/dma/omap-dma.c |
| @@ -276,12 +276,20 @@ static void omap_dma_issue_pending(struc |
| |
| 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); |
| } |