Commit 94d50c1a authored by Luca Ceresoli's avatar Luca Ceresoli
Browse files

drm/bridge: get/put the bridge reference in drm_bridge_attach/detach()



drm_bridge_attach() adds the bridge to the encoder chain, so take a
reference for that. Vice versa in drm_bridge_detach().

Reviewed-by: default avatarMaxime 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: default avatarLuca Ceresoli <luca.ceresoli@bootlin.com>
parent a7748dd1
Loading
Loading
Loading
Loading
+13 −4
Original line number Diff line number Diff line
@@ -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 @@ int drm_bridge_attach(struct drm_encoder *encoder, struct drm_bridge *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);
}

/**