]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
DMA: shdma: tidyup callback chunk finder
authorKuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Thu, 3 Apr 2014 03:16:51 +0000 (20:16 -0700)
committerVinod Koul <vinod.koul@intel.com>
Fri, 2 May 2014 16:17:01 +0000 (21:47 +0530)
Current shdma is using "last" which indicates last desc which needs to have
callback function. But that desc's chunks is always 1, we can use it as finder

Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
[reflown changelog for readablity]
Signed-off-by: Vinod Koul <vinod.koul@intel.com>
drivers/dma/sh/shdma-base.c

index 52396771acbe53951c3d080660621355b6500e3d..6786ecbd5ed41a9d36cb9dfe07aa8a30a25cbeb1 100644 (file)
@@ -73,8 +73,7 @@ static void shdma_chan_xfer_ld_queue(struct shdma_chan *schan)
 static dma_cookie_t shdma_tx_submit(struct dma_async_tx_descriptor *tx)
 {
        struct shdma_desc *chunk, *c, *desc =
-               container_of(tx, struct shdma_desc, async_tx),
-               *last = desc;
+               container_of(tx, struct shdma_desc, async_tx);
        struct shdma_chan *schan = to_shdma_chan(tx->chan);
        dma_async_tx_callback callback = tx->callback;
        dma_cookie_t cookie;
@@ -98,19 +97,20 @@ static dma_cookie_t shdma_tx_submit(struct dma_async_tx_descriptor *tx)
                                      &chunk->node == &schan->ld_free))
                        break;
                chunk->mark = DESC_SUBMITTED;
-               /* Callback goes to the last chunk */
-               chunk->async_tx.callback = NULL;
+               if (chunk->chunks == 1) {
+                       chunk->async_tx.callback = callback;
+                       chunk->async_tx.callback_param = tx->callback_param;
+               } else {
+                       /* Callback goes to the last chunk */
+                       chunk->async_tx.callback = NULL;
+               }
                chunk->cookie = cookie;
                list_move_tail(&chunk->node, &schan->ld_queue);
-               last = chunk;
 
                dev_dbg(schan->dev, "submit #%d@%p on %d\n",
-                       tx->cookie, &last->async_tx, schan->id);
+                       tx->cookie, &chunk->async_tx, schan->id);
        }
 
-       last->async_tx.callback = callback;
-       last->async_tx.callback_param = tx->callback_param;
-
        if (power_up) {
                int ret;
                schan->pm_state = SHDMA_PM_BUSY;