On Tue, 10 May 2022 at 22:30, Douglas Anderson <dianders@xxxxxxxxxxxx> 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@xxxxxxxxxx> > Signed-off-by: Douglas Anderson <dianders@xxxxxxxxxxxx> Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@xxxxxxxxxx> > --- > > 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