aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/dma/stm32-dma.c20
1 files changed, 9 insertions, 11 deletions
diff --git a/drivers/dma/stm32-dma.c b/drivers/dma/stm32-dma.c
index 3688d0873a3e..a8c2ad686173 100644
--- a/drivers/dma/stm32-dma.c
+++ b/drivers/dma/stm32-dma.c
@@ -421,7 +421,7 @@ static void stm32_dma_dump_reg(struct stm32_dma_chan *chan)
421 dev_dbg(chan2dev(chan), "SFCR: 0x%08x\n", sfcr); 421 dev_dbg(chan2dev(chan), "SFCR: 0x%08x\n", sfcr);
422} 422}
423 423
424static int stm32_dma_start_transfer(struct stm32_dma_chan *chan) 424static void stm32_dma_start_transfer(struct stm32_dma_chan *chan)
425{ 425{
426 struct stm32_dma_device *dmadev = stm32_dma_get_dev(chan); 426 struct stm32_dma_device *dmadev = stm32_dma_get_dev(chan);
427 struct virt_dma_desc *vdesc; 427 struct virt_dma_desc *vdesc;
@@ -432,12 +432,12 @@ static int stm32_dma_start_transfer(struct stm32_dma_chan *chan)
432 432
433 ret = stm32_dma_disable_chan(chan); 433 ret = stm32_dma_disable_chan(chan);
434 if (ret < 0) 434 if (ret < 0)
435 return ret; 435 return;
436 436
437 if (!chan->desc) { 437 if (!chan->desc) {
438 vdesc = vchan_next_desc(&chan->vchan); 438 vdesc = vchan_next_desc(&chan->vchan);
439 if (!vdesc) 439 if (!vdesc)
440 return -EPERM; 440 return;
441 441
442 chan->desc = to_stm32_dma_desc(vdesc); 442 chan->desc = to_stm32_dma_desc(vdesc);
443 chan->next_sg = 0; 443 chan->next_sg = 0;
@@ -471,7 +471,7 @@ static int stm32_dma_start_transfer(struct stm32_dma_chan *chan)
471 471
472 chan->busy = true; 472 chan->busy = true;
473 473
474 return 0; 474 dev_dbg(chan2dev(chan), "vchan %p: started\n", &chan->vchan);
475} 475}
476 476
477static void stm32_dma_configure_next_sg(struct stm32_dma_chan *chan) 477static void stm32_dma_configure_next_sg(struct stm32_dma_chan *chan)
@@ -552,15 +552,13 @@ static void stm32_dma_issue_pending(struct dma_chan *c)
552{ 552{
553 struct stm32_dma_chan *chan = to_stm32_dma_chan(c); 553 struct stm32_dma_chan *chan = to_stm32_dma_chan(c);
554 unsigned long flags; 554 unsigned long flags;
555 int ret;
556 555
557 spin_lock_irqsave(&chan->vchan.lock, flags); 556 spin_lock_irqsave(&chan->vchan.lock, flags);
558 if (!chan->busy) { 557 if (vchan_issue_pending(&chan->vchan) && !chan->desc && !chan->busy) {
559 if (vchan_issue_pending(&chan->vchan) && !chan->desc) { 558 dev_dbg(chan2dev(chan), "vchan %p: issued\n", &chan->vchan);
560 ret = stm32_dma_start_transfer(chan); 559 stm32_dma_start_transfer(chan);
561 if ((!ret) && (chan->desc->cyclic)) 560 if (chan->desc->cyclic)
562 stm32_dma_configure_next_sg(chan); 561 stm32_dma_configure_next_sg(chan);
563 }
564 } 562 }
565 spin_unlock_irqrestore(&chan->vchan.lock, flags); 563 spin_unlock_irqrestore(&chan->vchan.lock, flags);
566} 564}