dmaengine: dw: Move check for paused channel to dwc_get_residue()
authorAndy Shevchenko <andriy.shevchenko@linux.intel.com>
Mon, 30 Jan 2023 15:17:47 +0000 (17:17 +0200)
committerVinod Koul <vkoul@kernel.org>
Thu, 16 Feb 2023 13:15:48 +0000 (18:45 +0530)
Move check for paused channel to dwc_get_residue() and rename the latter
to dwc_get_residue_and_status().

This improves data integrity as residue and DMA channel status are set
in the same function under the same conditions.

Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Link: https://lore.kernel.org/r/20230130151747.20704-1-andriy.shevchenko@linux.intel.com
Signed-off-by: Vinod Koul <vkoul@kernel.org>
drivers/dma/dw/core.c

index 97ba3bf..5f7d690 100644 (file)
@@ -889,7 +889,8 @@ static struct dw_desc *dwc_find_desc(struct dw_dma_chan *dwc, dma_cookie_t c)
        return NULL;
 }
 
-static u32 dwc_get_residue(struct dw_dma_chan *dwc, dma_cookie_t cookie)
+static u32 dwc_get_residue_and_status(struct dw_dma_chan *dwc, dma_cookie_t cookie,
+                                     enum dma_status *status)
 {
        struct dw_desc *desc;
        unsigned long flags;
@@ -903,6 +904,8 @@ static u32 dwc_get_residue(struct dw_dma_chan *dwc, dma_cookie_t cookie)
                        residue = desc->residue;
                        if (test_bit(DW_DMA_IS_SOFT_LLP, &dwc->flags) && residue)
                                residue -= dwc_get_sent(dwc);
+                       if (test_bit(DW_DMA_IS_PAUSED, &dwc->flags))
+                               *status = DMA_PAUSED;
                } else {
                        residue = desc->total_len;
                }
@@ -932,11 +935,7 @@ dwc_tx_status(struct dma_chan *chan,
        if (ret == DMA_COMPLETE)
                return ret;
 
-       dma_set_residue(txstate, dwc_get_residue(dwc, cookie));
-
-       if (test_bit(DW_DMA_IS_PAUSED, &dwc->flags) && ret == DMA_IN_PROGRESS)
-               return DMA_PAUSED;
-
+       dma_set_residue(txstate, dwc_get_residue_and_status(dwc, cookie, &ret));
        return ret;
 }