In vop2_bind(), when vop2_create_crtcs() fails, the function returns immediately without calling vop2_destroy_crtcs(). This means any of_node references stored in vp->crtc.port by vop2_create_crtcs() are leaked, as they are only released in vop2_destroy_crtcs().
Fix by ensuring vop2_create_crtcs() failures go through the err_crtcs label, which calls vop2_destroy_crtcs() to properly release all resources including of_node references. Note: the IRQ registered via devm_request_irq() earlier in vop2_bind() is managed by devres and must NOT be manually freed in the error path. Devres will automatically release it when the device is unbound or released by the component framework. Signed-off-by: Jiaqi <[email protected]> --- drivers/gpu/drm/rockchip/rockchip_drm_vop2.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c index 8afabe2118a9..1234567890ab 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c @@ -2735,7 +2735,7 @@ static int vop2_bind(struct device *dev, struct device *master, void *data) ret = vop2_create_crtcs(vop2); if (ret) - return ret; + goto err_crtcs; ret = vop2_find_rgb_encoder(vop2); if (ret >= 0) { -- 2.40.0
