lkml.org 
[lkml]   [2022]   [May]   [10]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v3 3/4] drm/bridge: Add devm_drm_bridge_add()
    Date
    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>
    ---

    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
    \
     
     \ /
      Last update: 2022-05-10 21:30    [W:9.546 / U:0.080 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site