[PATCH V3 6/6] dmaengine: zynqmp_dma: Add per-channel reset support
Golla Nagendra <[email protected]>
| Newsgroups | org.kernel.vger.linux-pm,org.infradead.lists.linux-arm-kernel,org.kernel.vger.dmaengine,org.kernel.vger.linux-devicetree,org.kernel.vger.linux-kernel |
|---|---|
| Message-ID | <[email protected]> |
Versal Gen2 and Versal Net expose a dedicated reset line per ZDMA channel. Use device_reset() to trigger a mandatory reset pulse on the channel during probe when match data indicates reset is supported. The has_reset field in zynqmp_dma_config controls whether reset is performed for a given compatible. For Versal Net and Versal Gen2, has_reset is set to true, so device_reset() is called and probe fails if the resets property is missing in the device tree. For legacy SoCs, match_data is NULL and has_reset defaults to false,so the reset path is skipped entirely. Signed-off-by: Golla Nagendra <[email protected]> --- Changes in V3: - Introduce has_reset flag in zynqmp_dma_config to gate the reset path per-compatible instead of calling device_reset() unconditionally - Move the of_device_get_match_data() call before the reset block so has_reset can be checked in the same code path that reads irq_offset --- drivers/dma/xilinx/zynqmp_dma.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/drivers/dma/xilinx/zynqmp_dma.c b/drivers/dma/xilinx/zynqmp_dma.c index 7561416b8e62..7ec6598ea587 100644 --- a/drivers/dma/xilinx/zynqmp_dma.c +++ b/drivers/dma/xilinx/zynqmp_dma.c @@ -18,6 +18,7 @@ #include <linux/clk.h> #include <linux/io-64-nonatomic-lo-hi.h> #include <linux/pm_runtime.h> +#include <linux/reset.h> #include "../dmaengine.h" @@ -928,6 +929,14 @@ static int zynqmp_dma_chan_probe(struct zynqmp_dma_device *zdev, if (IS_ERR(chan->regs)) return PTR_ERR(chan->regs); + match_data = of_device_get_match_data(&pdev->dev); + if (match_data && match_data->has_reset) { + err = device_reset(&pdev->dev); + if (err) + return dev_err_probe(&pdev->dev, err, + "failed to reset channel\n"); + } + chan->bus_width = ZYNQMP_DMA_BUS_WIDTH_64; chan->dst_burst_len = ZYNQMP_DMA_MAX_DST_BURST_LEN; chan->src_burst_len = ZYNQMP_DMA_MAX_SRC_BURST_LEN; @@ -943,7 +952,6 @@ static int zynqmp_dma_chan_probe(struct zynqmp_dma_device *zdev, return -EINVAL; } - match_data = of_device_get_match_data(&pdev->dev); if (match_data) chan->irq_offset = match_data->offset; -- 2.43.7