drm/panthor: Fix OPP refcnt leaks in devfreq initialisation

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
This commit is contained in:
Adrián Larumbe 2024-11-05 20:54:56 +00:00 committed by Mecid Urganci
parent 0d953c8cdf
commit 9166127505

View file

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