diff options
| -rw-r--r-- | drivers/dma/omap-dma.c | 20 |
1 files changed, 14 insertions, 6 deletions
diff --git a/drivers/dma/omap-dma.c b/drivers/dma/omap-dma.c index c4b4fd2acc42..08b43bf37158 100644 --- a/drivers/dma/omap-dma.c +++ b/drivers/dma/omap-dma.c | |||
| @@ -276,12 +276,20 @@ static void omap_dma_issue_pending(struct dma_chan *chan) | |||
| 276 | 276 | ||
| 277 | spin_lock_irqsave(&c->vc.lock, flags); | 277 | spin_lock_irqsave(&c->vc.lock, flags); |
| 278 | if (vchan_issue_pending(&c->vc) && !c->desc) { | 278 | if (vchan_issue_pending(&c->vc) && !c->desc) { |
| 279 | struct omap_dmadev *d = to_omap_dma_dev(chan->device); | 279 | /* |
| 280 | spin_lock(&d->lock); | 280 | * c->cyclic is used only by audio and in this case the DMA need |
| 281 | if (list_empty(&c->node)) | 281 | * to be started without delay. |
| 282 | list_add_tail(&c->node, &d->pending); | 282 | */ |
| 283 | spin_unlock(&d->lock); | 283 | if (!c->cyclic) { |
| 284 | tasklet_schedule(&d->task); | 284 | struct omap_dmadev *d = to_omap_dma_dev(chan->device); |
| 285 | spin_lock(&d->lock); | ||
| 286 | if (list_empty(&c->node)) | ||
| 287 | list_add_tail(&c->node, &d->pending); | ||
| 288 | spin_unlock(&d->lock); | ||
| 289 | tasklet_schedule(&d->task); | ||
| 290 | } else { | ||
| 291 | omap_dma_start_desc(c); | ||
| 292 | } | ||
| 285 | } | 293 | } |
| 286 | spin_unlock_irqrestore(&c->vc.lock, flags); | 294 | spin_unlock_irqrestore(&c->vc.lock, flags); |
| 287 | } | 295 | } |
