Skip to content

Commit e0d7051

Browse files
mark1188-uiwangjinchao
authored andcommitted
drm/hisilicon/hibmc: fix the i2c device resource leak when vdac init failed
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 <[email protected]> Signed-off-by: Yongbang Shi <[email protected]> Reviewed-by: Dmitry Baryshkov <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Dmitry Baryshkov <[email protected]>
1 parent 81838a9 commit e0d7051

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
@@ -69,6 +69,7 @@ int hibmc_de_init(struct hibmc_drm_private *priv);
6969
int hibmc_vdac_init(struct hibmc_drm_private *priv);
7070

7171
int hibmc_ddc_create(struct drm_device *drm_dev, struct hibmc_vdac *connector);
72+
void hibmc_ddc_del(struct hibmc_vdac *vdac);
7273

7374
int hibmc_dp_init(struct hibmc_drm_private *priv);
7475

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

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

116116
drm_encoder_helper_add(encoder, &hibmc_encoder_helper_funcs);
@@ -121,7 +121,7 @@ int hibmc_vdac_init(struct hibmc_drm_private *priv)
121121
&vdac->adapter);
122122
if (ret) {
123123
drm_err(dev, "failed to init connector: %d\n", ret);
124-
return ret;
124+
goto err;
125125
}
126126

127127
drm_connector_helper_add(connector, &hibmc_connector_helper_funcs);
@@ -131,4 +131,9 @@ int hibmc_vdac_init(struct hibmc_drm_private *priv)
131131
connector->polled = DRM_CONNECTOR_POLL_CONNECT | DRM_CONNECTOR_POLL_DISCONNECT;
132132

133133
return 0;
134+
135+
err:
136+
hibmc_ddc_del(vdac);
137+
138+
return ret;
134139
}

0 commit comments

Comments
 (0)