video: fbdev: pxa3xx-gcu: release the resources correctly in pxa3xx_gcu_probe/remove()

[ Upstream commit d87ad457f7e1b8d2492ca5b1531eb35030a1cc8f ]

In pxa3xx_gcu_probe(), the sequence of error lable is wrong, it will
leads some resource leaked, so adjust the sequence to handle the error
correctly, and if pxa3xx_gcu_add_buffer() fails, pxa3xx_gcu_free_buffers()
need be called.
In pxa3xx_gcu_remove(), add missing clk_disable_unpreprare().

Signed-off-by: Yang Yingliang <yangyingliang@huawei.com>
Signed-off-by: Helge Deller <deller@gmx.de>
Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
Yang Yingliang
2022-05-13 18:05:41 +08:00
committed by Greg Kroah-Hartman
parent c09b873f3f
commit 8b3d5bafb1

View File

@@ -650,6 +650,7 @@ static int pxa3xx_gcu_probe(struct platform_device *pdev)
for (i = 0; i < 8; i++) { for (i = 0; i < 8; i++) {
ret = pxa3xx_gcu_add_buffer(dev, priv); ret = pxa3xx_gcu_add_buffer(dev, priv);
if (ret) { if (ret) {
pxa3xx_gcu_free_buffers(dev, priv);
dev_err(dev, "failed to allocate DMA memory\n"); dev_err(dev, "failed to allocate DMA memory\n");
goto err_disable_clk; goto err_disable_clk;
} }
@@ -666,15 +667,15 @@ static int pxa3xx_gcu_probe(struct platform_device *pdev)
SHARED_SIZE, irq); SHARED_SIZE, irq);
return 0; return 0;
err_free_dma: err_disable_clk:
dma_free_coherent(dev, SHARED_SIZE, clk_disable_unprepare(priv->clk);
priv->shared, priv->shared_phys);
err_misc_deregister: err_misc_deregister:
misc_deregister(&priv->misc_dev); misc_deregister(&priv->misc_dev);
err_disable_clk: err_free_dma:
clk_disable_unprepare(priv->clk); dma_free_coherent(dev, SHARED_SIZE,
priv->shared, priv->shared_phys);
return ret; return ret;
} }
@@ -687,6 +688,7 @@ static int pxa3xx_gcu_remove(struct platform_device *pdev)
pxa3xx_gcu_wait_idle(priv); pxa3xx_gcu_wait_idle(priv);
misc_deregister(&priv->misc_dev); misc_deregister(&priv->misc_dev);
dma_free_coherent(dev, SHARED_SIZE, priv->shared, priv->shared_phys); dma_free_coherent(dev, SHARED_SIZE, priv->shared, priv->shared_phys);
clk_disable_unprepare(priv->clk);
pxa3xx_gcu_free_buffers(dev, priv); pxa3xx_gcu_free_buffers(dev, priv);
return 0; return 0;