summaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorSwati Agarwal <swati.agarwal@xilinx.com>2022-08-17 11:41:23 +0530
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2023-02-06 07:49:40 +0100
commitbb73b985d272148e6599bb32691e8316d71108cf (patch)
tree6ee1273345f6c61d7cec57e929de533a7a67e97c /drivers
parent2690edc3b4ca721042f63fe7c25f595b8baa8360 (diff)
downloadlinux-stable-bb73b985d272148e6599bb32691e8316d71108cf.tar.gz
linux-stable-bb73b985d272148e6599bb32691e8316d71108cf.tar.bz2
linux-stable-bb73b985d272148e6599bb32691e8316d71108cf.zip
dmaengine: xilinx_dma: Fix devm_platform_ioremap_resource error handling
[ Upstream commit 91df7751eb890e970afc08f50b8f0fa5ea39e03d ] Add missing cleanup in devm_platform_ioremap_resource(). When probe fails remove dma channel resources and disable clocks in accordance with the order of resources allocated . Signed-off-by: Swati Agarwal <swati.agarwal@xilinx.com> Link: https://lore.kernel.org/r/20220817061125.4720-2-swati.agarwal@xilinx.com Signed-off-by: Vinod Koul <vkoul@kernel.org> Stable-dep-of: 596b53ccc36a ("dmaengine: xilinx_dma: call of_node_put() when breaking out of for_each_child_of_node()") Signed-off-by: Sasha Levin <sashal@kernel.org>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/dma/xilinx/xilinx_dma.c13
1 files changed, 7 insertions, 6 deletions
diff --git a/drivers/dma/xilinx/xilinx_dma.c b/drivers/dma/xilinx/xilinx_dma.c
index 6687cee26843..c56ce7cd1f6f 100644
--- a/drivers/dma/xilinx/xilinx_dma.c
+++ b/drivers/dma/xilinx/xilinx_dma.c
@@ -2663,9 +2663,10 @@ static int xilinx_dma_probe(struct platform_device *pdev)
/* Request and map I/O memory */
io = platform_get_resource(pdev, IORESOURCE_MEM, 0);
xdev->regs = devm_ioremap_resource(&pdev->dev, io);
- if (IS_ERR(xdev->regs))
- return PTR_ERR(xdev->regs);
-
+ if (IS_ERR(xdev->regs)) {
+ err = PTR_ERR(xdev->regs);
+ goto disable_clks;
+ }
/* Retrieve the DMA engine properties from the device tree */
xdev->has_sg = of_property_read_bool(node, "xlnx,include-sg");
xdev->max_buffer_len = GENMASK(XILINX_DMA_MAX_TRANS_LEN_MAX - 1, 0);
@@ -2759,7 +2760,7 @@ static int xilinx_dma_probe(struct platform_device *pdev)
for_each_child_of_node(node, child) {
err = xilinx_dma_child_probe(xdev, child);
if (err < 0)
- goto disable_clks;
+ goto error;
}
if (xdev->dma_config->dmatype == XDMA_TYPE_VDMA) {
@@ -2792,12 +2793,12 @@ static int xilinx_dma_probe(struct platform_device *pdev)
return 0;
-disable_clks:
- xdma_disable_allclks(xdev);
error:
for (i = 0; i < xdev->nr_channels; i++)
if (xdev->chan[i])
xilinx_dma_chan_remove(xdev->chan[i]);
+disable_clks:
+ xdma_disable_allclks(xdev);
return err;
}