media: bdisp: add missed destroy_workqueue in remove and probe failure
authorChuhong Yuan <hslester96@gmail.com>
Wed, 13 Nov 2019 06:37:30 +0000 (07:37 +0100)
committerMauro Carvalho Chehab <mchehab+huawei@kernel.org>
Fri, 13 Dec 2019 08:18:16 +0000 (09:18 +0100)
The driver forgets to call destroy_workqueue when remove and probe fails.
Add the missed calls to fix it.

Signed-off-by: Chuhong Yuan <hslester96@gmail.com>
Reviewed-by: Fabien Dessenne <fabien.dessenne@st.com>
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
drivers/media/platform/sti/bdisp/bdisp-v4l2.c

index 675b5f2..d1025a5 100644 (file)
@@ -1274,6 +1274,8 @@ static int bdisp_remove(struct platform_device *pdev)
        if (!IS_ERR(bdisp->clock))
                clk_unprepare(bdisp->clock);
 
+       destroy_workqueue(bdisp->work_queue);
+
        dev_dbg(&pdev->dev, "%s driver unloaded\n", pdev->name);
 
        return 0;
@@ -1317,20 +1319,22 @@ static int bdisp_probe(struct platform_device *pdev)
        bdisp->regs = devm_ioremap_resource(dev, res);
        if (IS_ERR(bdisp->regs)) {
                dev_err(dev, "failed to get regs\n");
-               return PTR_ERR(bdisp->regs);
+               ret = PTR_ERR(bdisp->regs);
+               goto err_wq;
        }
 
        bdisp->clock = devm_clk_get(dev, BDISP_NAME);
        if (IS_ERR(bdisp->clock)) {
                dev_err(dev, "failed to get clock\n");
-               return PTR_ERR(bdisp->clock);
+               ret = PTR_ERR(bdisp->clock);
+               goto err_wq;
        }
 
        ret = clk_prepare(bdisp->clock);
        if (ret < 0) {
                dev_err(dev, "clock prepare failed\n");
                bdisp->clock = ERR_PTR(-EINVAL);
-               return ret;
+               goto err_wq;
        }
 
        res = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
@@ -1402,7 +1406,8 @@ err_v4l2:
 err_clk:
        if (!IS_ERR(bdisp->clock))
                clk_unprepare(bdisp->clock);
-
+err_wq:
+       destroy_workqueue(bdisp->work_queue);
        return ret;
 }