]> www.infradead.org Git - users/hch/uuid.git/commitdiff
dmaengine: stm32-dma3: add device_pause and device_resume ops
authorAmelie Delaunay <amelie.delaunay@foss.st.com>
Fri, 31 May 2024 15:07:08 +0000 (17:07 +0200)
committerVinod Koul <vkoul@kernel.org>
Tue, 11 Jun 2024 18:25:34 +0000 (23:55 +0530)
STM32 DMA3 controller is able to suspend an ongoing transfer (the transfer
is suspended after the ongoing burst is flushed to the destination) and
resume it from the point it was suspended. No need to reconfigure any
register.

Signed-off-by: Amelie Delaunay <amelie.delaunay@foss.st.com>
Link: https://lore.kernel.org/r/20240531150712.2503554-9-amelie.delaunay@foss.st.com
Signed-off-by: Vinod Koul <vkoul@kernel.org>
drivers/dma/stm32/stm32-dma3.c

index 5d4e875c2e51e251958e245c7999e4b9da25a5d4..8182d82501a365ed89b8b1f0adcac17e17ef1fd0 100644 (file)
@@ -1249,6 +1249,35 @@ static int stm32_dma3_config(struct dma_chan *c, struct dma_slave_config *config
        return 0;
 }
 
+static int stm32_dma3_pause(struct dma_chan *c)
+{
+       struct stm32_dma3_chan *chan = to_stm32_dma3_chan(c);
+       int ret;
+
+       ret = stm32_dma3_chan_suspend(chan, true);
+       if (ret)
+               return ret;
+
+       chan->dma_status = DMA_PAUSED;
+
+       dev_dbg(chan2dev(chan), "vchan %pK: paused\n", &chan->vchan);
+
+       return 0;
+}
+
+static int stm32_dma3_resume(struct dma_chan *c)
+{
+       struct stm32_dma3_chan *chan = to_stm32_dma3_chan(c);
+
+       stm32_dma3_chan_suspend(chan, false);
+
+       chan->dma_status = DMA_IN_PROGRESS;
+
+       dev_dbg(chan2dev(chan), "vchan %pK: resumed\n", &chan->vchan);
+
+       return 0;
+}
+
 static int stm32_dma3_terminate_all(struct dma_chan *c)
 {
        struct stm32_dma3_chan *chan = to_stm32_dma3_chan(c);
@@ -1485,6 +1514,8 @@ static int stm32_dma3_probe(struct platform_device *pdev)
        dma_dev->device_prep_dma_cyclic = stm32_dma3_prep_dma_cyclic;
        dma_dev->device_caps = stm32_dma3_caps;
        dma_dev->device_config = stm32_dma3_config;
+       dma_dev->device_pause = stm32_dma3_pause;
+       dma_dev->device_resume = stm32_dma3_resume;
        dma_dev->device_terminate_all = stm32_dma3_terminate_all;
        dma_dev->device_synchronize = stm32_dma3_synchronize;
        dma_dev->device_tx_status = dma_cookie_status;