From c33b0ddcb783fb211206ce46aa32d62e9477ca8e Mon Sep 17 00:00:00 2001 From: Laurent Pinchart Date: Thu, 4 Apr 2019 14:32:54 +0300 Subject: [PATCH] v4l: xilinx: scd: Cleanup the DMA engine at remove() time The resources allocated by the xscd_dma_init() function are never released. Add a new xscd_dma_cleanup() function to handle the cleanup and call it at driver remove() time. Signed-off-by: Laurent Pinchart Reviewed-by: Hyun Kwon --- .../media/platform/xilinx/xilinx-scenechange-dma.c | 13 +++++++++++++ drivers/media/platform/xilinx/xilinx-scenechange.c | 1 + drivers/media/platform/xilinx/xilinx-scenechange.h | 1 + 3 files changed, 15 insertions(+) diff --git a/drivers/media/platform/xilinx/xilinx-scenechange-dma.c b/drivers/media/platform/xilinx/xilinx-scenechange-dma.c index 23b8dc58dd84..4d632ad86421 100644 --- a/drivers/media/platform/xilinx/xilinx-scenechange-dma.c +++ b/drivers/media/platform/xilinx/xilinx-scenechange-dma.c @@ -548,3 +548,16 @@ error: } return ret; } + +/** + * xscd_dma_cleanup - Clean up the SCD DMA engine + * @xscd: Pointer to the SCD device structure + * + * This function is the counterpart of xscd_dma_init() and cleans up the + * resources related to the DMA engine. + */ +void xscd_dma_cleanup(struct xscd_device *xscd) +{ + dma_async_device_unregister(&xscd->dma_device); + of_dma_controller_free(xscd->dev->of_node); +} diff --git a/drivers/media/platform/xilinx/xilinx-scenechange.c b/drivers/media/platform/xilinx/xilinx-scenechange.c index bc12750038af..1b463c6e5443 100644 --- a/drivers/media/platform/xilinx/xilinx-scenechange.c +++ b/drivers/media/platform/xilinx/xilinx-scenechange.c @@ -148,6 +148,7 @@ static int xscd_remove(struct platform_device *pdev) { struct xscd_device *xscd = platform_get_drvdata(pdev); + xscd_dma_cleanup(xscd); clk_disable_unprepare(xscd->clk); return 0; diff --git a/drivers/media/platform/xilinx/xilinx-scenechange.h b/drivers/media/platform/xilinx/xilinx-scenechange.h index 598703685100..b76220e54e86 100644 --- a/drivers/media/platform/xilinx/xilinx-scenechange.h +++ b/drivers/media/platform/xilinx/xilinx-scenechange.h @@ -244,6 +244,7 @@ void xscd_dma_chan_enable(struct xscd_dma_chan *chan, int chan_en); void xscd_dma_reset(struct xscd_dma_chan *chan); void xscd_dma_halt(struct xscd_dma_chan *chan); int xscd_dma_init(struct xscd_device *xscd); +void xscd_dma_cleanup(struct xscd_device *xscd); void xscd_chan_irq_handler(struct xscd_chan *chan); int xscd_chan_init(struct xscd_device *xscd, unsigned int chan_id, -- 2.39.2