drm/panthor: Fix OPP refcnt leaks in devfreq initialisation
authorAdrián Larumbe <adrian.larumbe@collabora.com>
Tue, 5 Nov 2024 20:54:56 +0000 (20:54 +0000)
committerSteven Price <steven.price@arm.com>
Wed, 6 Nov 2024 15:41:47 +0000 (15:41 +0000)
Rearrange lookup of recommended OPP for the Mali GPU device and its refcnt
decremental to make sure no OPP object leaks happen in the error path.

Signed-off-by: Adrián Larumbe <adrian.larumbe@collabora.com>
Fixes: fac9b22df4b1 ("drm/panthor: Add the devfreq logical block")
Reviewed-by: Steven Price <steven.price@arm.com>
Reviewed-by: Liviu Dudau <liviu.dudau@arm.com>
Signed-off-by: Steven Price <steven.price@arm.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20241105205458.1318989-2-adrian.larumbe@collabora.com
drivers/gpu/drm/panthor/panthor_devfreq.c

index 9d0f891..ecc7a52 100644 (file)
@@ -163,13 +163,6 @@ int panthor_devfreq_init(struct panthor_device *ptdev)
 
        cur_freq = clk_get_rate(ptdev->clks.core);
 
-       opp = devfreq_recommended_opp(dev, &cur_freq, 0);
-       if (IS_ERR(opp))
-               return PTR_ERR(opp);
-
-       panthor_devfreq_profile.initial_freq = cur_freq;
-       ptdev->current_frequency = cur_freq;
-
        /* Regulator coupling only takes care of synchronizing/balancing voltage
         * updates, but the coupled regulator needs to be enabled manually.
         *
@@ -200,18 +193,24 @@ int panthor_devfreq_init(struct panthor_device *ptdev)
                return ret;
        }
 
+       opp = devfreq_recommended_opp(dev, &cur_freq, 0);
+       if (IS_ERR(opp))
+               return PTR_ERR(opp);
+
+       panthor_devfreq_profile.initial_freq = cur_freq;
+       ptdev->current_frequency = cur_freq;
+
        /*
         * Set the recommend OPP this will enable and configure the regulator
         * if any and will avoid a switch off by regulator_late_cleanup()
         */
        ret = dev_pm_opp_set_opp(dev, opp);
+       dev_pm_opp_put(opp);
        if (ret) {
                DRM_DEV_ERROR(dev, "Couldn't set recommended OPP\n");
                return ret;
        }
 
-       dev_pm_opp_put(opp);
-
        /* Find the fastest defined rate  */
        opp = dev_pm_opp_find_freq_floor(dev, &freq);
        if (IS_ERR(opp))