]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
drm/bridge: display-connector: Fix I2C adapter resource leak
authorLaurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
Fri, 17 Jul 2026 18:48:36 +0000 (21:48 +0300)
committerLuca Ceresoli <luca.ceresoli@bootlin.com>
Mon, 27 Jul 2026 12:52:47 +0000 (14:52 +0200)
If the probe function returns an error after getting the I2C adapter for
DDC, the reference to the adapter is never released. Fix it by releasing
it in the bridge .destroy() handler.

There is no need to test the ddc pointer with !IS_ERR(), as
of_get_i2c_adapter_by_node() returns NULL on error.

Fixes: 2e2bf3a5584d ("drm/bridge: display-connector: add DP support")
Cc: stable@vger.kernel.org
Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
Reviewed-by: Johan Hovold <johan@kernel.org>
Reviewed-by: Luca Ceresoli <luca.ceresoli@bootlin.com>
Link: https://patch.msgid.link/20260717184836.2017386-1-laurent.pinchart+renesas@ideasonboard.com
Signed-off-by: Luca Ceresoli <luca.ceresoli@bootlin.com>
drivers/gpu/drm/bridge/display-connector.c

index 16c0631adeb182fec71bf1c83887a240e98fbe4c..6b128fabe3a97be5b916b0d3d04f8f87ee0ff929 100644 (file)
@@ -40,6 +40,13 @@ static int display_connector_attach(struct drm_bridge *bridge,
        return flags & DRM_BRIDGE_ATTACH_NO_CONNECTOR ? 0 : -EINVAL;
 }
 
+static void display_connector_destroy(struct drm_bridge *bridge)
+{
+       struct display_connector *conn = to_display_connector(bridge);
+
+       i2c_put_adapter(conn->bridge.ddc);
+}
+
 static enum drm_connector_status display_connector_detect(struct drm_bridge *bridge)
 {
        struct display_connector *conn = to_display_connector(bridge);
@@ -177,6 +184,7 @@ static u32 *display_connector_get_input_bus_fmts(struct drm_bridge *bridge,
 
 static const struct drm_bridge_funcs display_connector_bridge_funcs = {
        .attach = display_connector_attach,
+       .destroy = display_connector_destroy,
        .detect = display_connector_bridge_detect,
        .edid_read = display_connector_edid_read,
        .atomic_get_output_bus_fmts = display_connector_get_output_bus_fmts,
@@ -403,9 +411,6 @@ static void display_connector_remove(struct platform_device *pdev)
                regulator_disable(conn->supply);
 
        drm_bridge_remove(&conn->bridge);
-
-       if (!IS_ERR(conn->bridge.ddc))
-               i2c_put_adapter(conn->bridge.ddc);
 }
 
 static const struct of_device_id display_connector_match[] = {