Skip to content

Commit d853315

Browse files
mark1188-uigregkh
authored andcommitted
drm/hisilicon/hibmc: fix the i2c device resource leak when vdac init failed
[ Upstream commit e5f48bf ] Currently the driver missed to clean the i2c adapter when vdac init failed. It may cause resource leak. Fixes: a0d078d ("drm/hisilicon: Features to support reading resolutions from EDID") Signed-off-by: Baihan Li <libaihan@huawei.com> Signed-off-by: Yongbang Shi <shiyongbang@huawei.com> Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com> Link: https://lore.kernel.org/r/20250813094238.3722345-2-shiyongbang@huawei.com Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com> Signed-off-by: Sasha Levin <sashal@kernel.org>
1 parent c8029ab commit d853315

File tree

3 files changed

+14
-3
lines changed

3 files changed

+14
-3
lines changed

drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,5 +58,6 @@ int hibmc_de_init(struct hibmc_drm_private *priv);
5858
int hibmc_vdac_init(struct hibmc_drm_private *priv);
5959

6060
int hibmc_ddc_create(struct drm_device *drm_dev, struct hibmc_vdac *connector);
61+
void hibmc_ddc_del(struct hibmc_vdac *vdac);
6162

6263
#endif

drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_i2c.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,3 +95,8 @@ int hibmc_ddc_create(struct drm_device *drm_dev, struct hibmc_vdac *vdac)
9595

9696
return i2c_bit_add_bus(&vdac->adapter);
9797
}
98+
99+
void hibmc_ddc_del(struct hibmc_vdac *vdac)
100+
{
101+
i2c_del_adapter(&vdac->adapter);
102+
}

drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_vdac.c

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ static void hibmc_connector_destroy(struct drm_connector *connector)
5353
{
5454
struct hibmc_vdac *vdac = to_hibmc_vdac(connector);
5555

56-
i2c_del_adapter(&vdac->adapter);
56+
hibmc_ddc_del(vdac);
5757
drm_connector_cleanup(connector);
5858
}
5959

@@ -109,7 +109,7 @@ int hibmc_vdac_init(struct hibmc_drm_private *priv)
109109
ret = drmm_encoder_init(dev, encoder, NULL, DRM_MODE_ENCODER_DAC, NULL);
110110
if (ret) {
111111
drm_err(dev, "failed to init encoder: %d\n", ret);
112-
return ret;
112+
goto err;
113113
}
114114

115115
drm_encoder_helper_add(encoder, &hibmc_encoder_helper_funcs);
@@ -120,12 +120,17 @@ int hibmc_vdac_init(struct hibmc_drm_private *priv)
120120
&vdac->adapter);
121121
if (ret) {
122122
drm_err(dev, "failed to init connector: %d\n", ret);
123-
return ret;
123+
goto err;
124124
}
125125

126126
drm_connector_helper_add(connector, &hibmc_connector_helper_funcs);
127127

128128
drm_connector_attach_encoder(connector, encoder);
129129

130130
return 0;
131+
132+
err:
133+
hibmc_ddc_del(vdac);
134+
135+
return ret;
131136
}

0 commit comments

Comments
 (0)