drm/msm: Fix failure paths in msm_drm_init()
authorAkhil P Oommen <quic_akhilpo@quicinc.com>
Wed, 21 Dec 2022 15:09:57 +0000 (20:39 +0530)
committerRob Clark <robdclark@chromium.org>
Mon, 16 Jan 2023 18:35:51 +0000 (10:35 -0800)
Ensure that we do drm_dev_put() when there is an early return in
msm_drm_init().

Signed-off-by: Akhil P Oommen <quic_akhilpo@quicinc.com>
Patchwork: https://patchwork.freedesktop.org/patch/515606/
Link: https://lore.kernel.org/r/20221221203925.v2.2.I49dfc3654040be61702e491f1aa63d3a5f308852@changeid
Signed-off-by: Rob Clark <robdclark@chromium.org>
drivers/gpu/drm/msm/disp/msm_disp_snapshot.c
drivers/gpu/drm/msm/msm_drv.c

index e75b971..b73031c 100644 (file)
@@ -129,6 +129,9 @@ void msm_disp_snapshot_destroy(struct drm_device *drm_dev)
        }
 
        priv = drm_dev->dev_private;
+       if (!priv->kms)
+               return;
+
        kms = priv->kms;
 
        if (kms->dump_worker)
index c86af9c..ff3a1ff 100644 (file)
@@ -150,6 +150,9 @@ static void msm_irq_uninstall(struct drm_device *dev)
        struct msm_drm_private *priv = dev->dev_private;
        struct msm_kms *kms = priv->kms;
 
+       if (!priv->kms)
+               return;
+
        kms->funcs->irq_uninstall(kms);
        if (kms->irq_requested)
                free_irq(kms->irq, dev);
@@ -267,8 +270,6 @@ static int msm_drm_uninit(struct device *dev)
        component_unbind_all(dev, ddev);
 
        ddev->dev_private = NULL;
-       drm_dev_put(ddev);
-
        destroy_workqueue(priv->wq);
 
        return 0;
@@ -441,12 +442,12 @@ static int msm_drm_init(struct device *dev, const struct drm_driver *drv)
 
        ret = msm_init_vram(ddev);
        if (ret)
-               return ret;
+               goto err_drm_dev_put;
 
        /* Bind all our sub-components: */
        ret = component_bind_all(dev, ddev);
        if (ret)
-               return ret;
+               goto err_drm_dev_put;
 
        dma_set_max_seg_size(dev, UINT_MAX);
 
@@ -541,6 +542,8 @@ static int msm_drm_init(struct device *dev, const struct drm_driver *drv)
 
 err_msm_uninit:
        msm_drm_uninit(dev);
+err_drm_dev_put:
+       drm_dev_put(ddev);
        return ret;
 }