On Tue, 10 May 2022 at 22:30, Douglas Anderson dianders@chromium.org wrote:
This adds a devm managed version of drm_bridge_add(). Like other "devm" function listed in drm_bridge.h, this function takes an explicit "dev" to use for the lifetime management. A few notes:
- In general we have a "struct device" for bridges that makes a good candidate for where the lifetime matches exactly what we want.
- The "bridge->dev->dev" device appears to be the encoder device. That's not the right device to use for lifetime management.
Suggested-by: Dmitry Baryshkov dmitry.baryshkov@linaro.org Signed-off-by: Douglas Anderson dianders@chromium.org
Reviewed-by: Dmitry Baryshkov dmitry.baryshkov@linaro.org
Changes in v3:
- Patch ("drm/bridge: Add devm_drm_bridge_add()") new for v3.
drivers/gpu/drm/drm_bridge.c | 23 +++++++++++++++++++++++ include/drm/drm_bridge.h | 1 + 2 files changed, 24 insertions(+)
diff --git a/drivers/gpu/drm/drm_bridge.c b/drivers/gpu/drm/drm_bridge.c index c96847fc0ebc..e275b4ca344b 100644 --- a/drivers/gpu/drm/drm_bridge.c +++ b/drivers/gpu/drm/drm_bridge.c @@ -170,6 +170,29 @@ void drm_bridge_add(struct drm_bridge *bridge) } EXPORT_SYMBOL(drm_bridge_add);
+static void drm_bridge_remove_void(void *bridge) +{
drm_bridge_remove(bridge);
+}
+/**
- devm_drm_bridge_add - devm managed version of drm_bridge_add()
- @dev: device to tie the bridge lifetime to
- @bridge: bridge control structure
- This is the managed version of drm_bridge_add() which automatically
- calls drm_bridge_remove() when @dev is unbound.
- Return: 0 if no error or negative error code.
- */
+int devm_drm_bridge_add(struct device *dev, struct drm_bridge *bridge) +{
drm_bridge_add(bridge);
return devm_add_action_or_reset(dev, drm_bridge_remove_void, bridge);
+} +EXPORT_SYMBOL(devm_drm_bridge_add);
/**
- drm_bridge_remove - remove the given bridge from the global bridge list
diff --git a/include/drm/drm_bridge.h b/include/drm/drm_bridge.h index f27b4060faa2..42aec8612f37 100644 --- a/include/drm/drm_bridge.h +++ b/include/drm/drm_bridge.h @@ -796,6 +796,7 @@ drm_priv_to_bridge(struct drm_private_obj *priv) }
void drm_bridge_add(struct drm_bridge *bridge); +int devm_drm_bridge_add(struct device *dev, struct drm_bridge *bridge); void drm_bridge_remove(struct drm_bridge *bridge); int drm_bridge_attach(struct drm_encoder *encoder, struct drm_bridge *bridge, struct drm_bridge *previous, -- 2.36.0.550.gb090851708-goog
-- With best wishes Dmitry