in vc4_vec_encoder_enable, the call to pm_runtime_get_sync increments
the counter even in case of failure, leading to incorrect
ref count. In case of failure, decrement the ref count before returning.

Signed-off-by: Navid Emamdoost <navid.emamdo...@gmail.com>
---
 drivers/gpu/drm/vc4/vc4_vec.c | 8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/vc4/vc4_vec.c b/drivers/gpu/drm/vc4/vc4_vec.c
index bd5b8eb58b18..706fdc7758f9 100644
--- a/drivers/gpu/drm/vc4/vc4_vec.c
+++ b/drivers/gpu/drm/vc4/vc4_vec.c
@@ -406,7 +406,7 @@ static void vc4_vec_encoder_enable(struct drm_encoder 
*encoder)
        ret = pm_runtime_get_sync(&vec->pdev->dev);
        if (ret < 0) {
                DRM_ERROR("Failed to retain power domain: %d\n", ret);
-               return;
+               goto out;
        }
 
        /*
@@ -419,13 +419,13 @@ static void vc4_vec_encoder_enable(struct drm_encoder 
*encoder)
        ret = clk_set_rate(vec->clock, 108000000);
        if (ret) {
                DRM_ERROR("Failed to set clock rate: %d\n", ret);
-               return;
+               goto out;
        }
 
        ret = clk_prepare_enable(vec->clock);
        if (ret) {
                DRM_ERROR("Failed to turn on core clock: %d\n", ret);
-               return;
+               goto out;
        }
 
        /* Reset the different blocks */
@@ -464,6 +464,8 @@ static void vc4_vec_encoder_enable(struct drm_encoder 
*encoder)
        VEC_WRITE(VEC_DAC_MISC,
                  VEC_DAC_MISC_VID_ACT | VEC_DAC_MISC_DAC_RST_N);
        VEC_WRITE(VEC_CFG, VEC_CFG_VEC_EN);
+out:
+       pm_runtime_put(&vec->pdev->dev);
 }
 
 
-- 
2.17.1

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

Reply via email to