i2c: sh_mobile: update to new DMAENGINE API when terminating
authorWolfram Sang <wsa+renesas@sang-engineering.com>
Wed, 8 Dec 2021 08:45:43 +0000 (09:45 +0100)
committerWolfram Sang <wsa@kernel.org>
Thu, 16 Dec 2021 21:23:04 +0000 (22:23 +0100)
dmaengine_terminate_all() is deprecated. When converting the existing
calls, it turned out that the termination in the DMA setup and callback
were superfluous and only a side effect of simply calling
rcar_i2c_cleanup_dma(). As either no DMA transfers have been submitted
yet or the last one has successfully completed, there is nothing to
terminate and we can leave it out. So, merge the DMA unmap and cleanup
function to save some code. Then, add a flag if the new cleanup function
needs to terminate DMA. This is only the case for the erorr handling in
the main thread, so we can finally switch from dmaengine_terminate_all()
to dmaengine_terminate_sync() here.

Signed-off-by: Wolfram Sang <wsa+renesas@sang-engineering.com>
Signed-off-by: Wolfram Sang <wsa@kernel.org>
drivers/i2c/busses/i2c-sh_mobile.c

index db8fa41868146a859b3efc227f1e7b7d28261229..7b8caf17285109c8ccc83c901aac7dbdba7df530 100644 (file)
@@ -442,34 +442,26 @@ static irqreturn_t sh_mobile_i2c_isr(int irq, void *dev_id)
        return IRQ_HANDLED;
 }
 
-static void sh_mobile_i2c_dma_unmap(struct sh_mobile_i2c_data *pd)
+static void sh_mobile_i2c_cleanup_dma(struct sh_mobile_i2c_data *pd, bool terminate)
 {
        struct dma_chan *chan = pd->dma_direction == DMA_FROM_DEVICE
                                ? pd->dma_rx : pd->dma_tx;
 
+       /* only allowed from thread context! */
+       if (terminate)
+               dmaengine_terminate_sync(chan);
+
        dma_unmap_single(chan->device->dev, sg_dma_address(&pd->sg),
                         pd->msg->len, pd->dma_direction);
 
        pd->dma_direction = DMA_NONE;
 }
 
-static void sh_mobile_i2c_cleanup_dma(struct sh_mobile_i2c_data *pd)
-{
-       if (pd->dma_direction == DMA_NONE)
-               return;
-       else if (pd->dma_direction == DMA_FROM_DEVICE)
-               dmaengine_terminate_sync(pd->dma_rx);
-       else if (pd->dma_direction == DMA_TO_DEVICE)
-               dmaengine_terminate_sync(pd->dma_tx);
-
-       sh_mobile_i2c_dma_unmap(pd);
-}
-
 static void sh_mobile_i2c_dma_callback(void *data)
 {
        struct sh_mobile_i2c_data *pd = data;
 
-       sh_mobile_i2c_dma_unmap(pd);
+       sh_mobile_i2c_cleanup_dma(pd, false);
        pd->pos = pd->msg->len;
        pd->stop_after_dma = true;
 
@@ -549,7 +541,7 @@ static void sh_mobile_i2c_xfer_dma(struct sh_mobile_i2c_data *pd)
                                         DMA_PREP_INTERRUPT | DMA_CTRL_ACK);
        if (!txdesc) {
                dev_dbg(pd->dev, "dma prep slave sg failed, using PIO\n");
-               sh_mobile_i2c_cleanup_dma(pd);
+               sh_mobile_i2c_cleanup_dma(pd, false);
                return;
        }
 
@@ -559,7 +551,7 @@ static void sh_mobile_i2c_xfer_dma(struct sh_mobile_i2c_data *pd)
        cookie = dmaengine_submit(txdesc);
        if (dma_submit_error(cookie)) {
                dev_dbg(pd->dev, "submitting dma failed, using PIO\n");
-               sh_mobile_i2c_cleanup_dma(pd);
+               sh_mobile_i2c_cleanup_dma(pd, false);
                return;
        }
 
@@ -698,7 +690,7 @@ static int sh_mobile_xfer(struct sh_mobile_i2c_data *pd,
                if (!time_left) {
                        dev_err(pd->dev, "Transfer request timed out\n");
                        if (pd->dma_direction != DMA_NONE)
-                               sh_mobile_i2c_cleanup_dma(pd);
+                               sh_mobile_i2c_cleanup_dma(pd, true);
 
                        err = -ETIMEDOUT;
                        break;