]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
drm/bridge: get/put the bridge reference in drm_bridge_attach/detach()
authorLuca Ceresoli <luca.ceresoli@bootlin.com>
Fri, 20 Jun 2025 15:59:54 +0000 (17:59 +0200)
committerLuca Ceresoli <luca.ceresoli@bootlin.com>
Thu, 26 Jun 2025 13:05:20 +0000 (15:05 +0200)
drm_bridge_attach() adds the bridge to the encoder chain, so take a
reference for that. Vice versa in drm_bridge_detach().

Reviewed-by: Maxime Ripard <mripard@kernel.org>
Link: https://lore.kernel.org/r/20250620-drm-bridge-alloc-getput-drm-bridge-c-v9-2-ca53372c9a84@bootlin.com
Signed-off-by: Luca Ceresoli <luca.ceresoli@bootlin.com>
drivers/gpu/drm/drm_bridge.c

index fa2b2457b16e145e3ace70c53984937096d310d0..f001bbe95559aabf0aac9f25f89250ad4e1ad9c8 100644 (file)
@@ -411,11 +411,17 @@ int drm_bridge_attach(struct drm_encoder *encoder, struct drm_bridge *bridge,
        if (!encoder || !bridge)
                return -EINVAL;
 
-       if (previous && (!previous->dev || previous->encoder != encoder))
-               return -EINVAL;
+       drm_bridge_get(bridge);
 
-       if (bridge->dev)
-               return -EBUSY;
+       if (previous && (!previous->dev || previous->encoder != encoder)) {
+               ret = -EINVAL;
+               goto err_put_bridge;
+       }
+
+       if (bridge->dev) {
+               ret = -EBUSY;
+               goto err_put_bridge;
+       }
 
        bridge->dev = encoder->dev;
        bridge->encoder = encoder;
@@ -464,6 +470,8 @@ err_reset_bridge:
                              "failed to attach bridge %pOF to encoder %s\n",
                              bridge->of_node, encoder->name);
 
+err_put_bridge:
+       drm_bridge_put(bridge);
        return ret;
 }
 EXPORT_SYMBOL(drm_bridge_attach);
@@ -484,6 +492,7 @@ void drm_bridge_detach(struct drm_bridge *bridge)
 
        list_del(&bridge->chain_node);
        bridge->dev = NULL;
+       drm_bridge_put(bridge);
 }
 
 /**