[PATCH] drm/bridge: display-connector: fix i2c adapter leak on probe failure

From: Johan Hovold

Date: Fri Jul 17 2026 - 04:58:45 EST


Make sure to drop the i2c adapter device and module references on failed
regulator and enable gpio lookup (and regulator enable) during probe
(e.g. on probe deferral).

Note that of_get_i2c_adapter_by_node() does not return error pointers,
but i2c_put_adapter() can handle a NULL argument so the error pointer
check at remove works even if it is misleading.

Fixes: 2e2bf3a5584d ("drm/bridge: display-connector: add DP support")
Fixes: 6de79dd3a920 ("drm/bridge: display-connector: add ddc-en gpio support")
Fixes: 6eb6b6f0a012 ("drm/bridge: display-connector: handle hdmi-pwr supply")
Cc: stable@xxxxxxxxxxxxxxx # 5.12
Cc: Tomi Valkeinen <tomi.valkeinen@xxxxxxxxxxxxxxxx>
Cc: H. Nikolaus Schaller <hns@xxxxxxxxxxxxx>
Cc: Dmitry Baryshkov <lumag@xxxxxxxxxx>
Cc: Laurent Pinchart <laurent.pinchart@xxxxxxxxxxxxxxxx>
Signed-off-by: Johan Hovold <johan@xxxxxxxxxx>
---
drivers/gpu/drm/bridge/display-connector.c | 16 +++++++++++++---
1 file changed, 13 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/bridge/display-connector.c b/drivers/gpu/drm/bridge/display-connector.c
index 16c0631adeb1..c38de5518211 100644
--- a/drivers/gpu/drm/bridge/display-connector.c
+++ b/drivers/gpu/drm/bridge/display-connector.c
@@ -208,6 +208,13 @@ static int display_connector_get_supply(struct platform_device *pdev,
return PTR_ERR_OR_ZERO(conn->supply);
}

+static void display_connector_put_ddc(void *_ddc)
+{
+ struct i2c_adapter *ddc = _ddc;
+
+ i2c_put_adapter(ddc);
+}
+
static int display_connector_probe(struct platform_device *pdev)
{
struct display_connector *conn;
@@ -328,6 +335,12 @@ static int display_connector_probe(struct platform_device *pdev)
of_node_put(phandle);
if (!conn->bridge.ddc)
return -EPROBE_DEFER;
+
+ ret = devm_add_action_or_reset(&pdev->dev,
+ display_connector_put_ddc,
+ conn->bridge.ddc);
+ if (ret)
+ return ret;
} else {
dev_dbg(&pdev->dev,
"No I2C bus specified, disabling EDID readout\n");
@@ -403,9 +416,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[] = {
--
2.54.0