lkml.org 
[lkml]   [2022]   [Jan]   [27]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v6 04/35] component: Add {bind,unbind}_component() ops that take aggregate device
    Date
    We'd like to get more device model features in the component framework
    so let's pass the struct aggregate_device pointer instead of the parent
    device pointer to the component binding functions. This will allow
    drivers to inspect and control things related to the aggregate device in
    case they need it, and they'll always be able to get back to the device
    they were using before by using the 'parent' member of the aggregate
    device struct.

    Suggested-by: Daniel Vetter <daniel@ffwll.ch>
    Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
    Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Cc: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
    Cc: "Rafael J. Wysocki" <rafael@kernel.org>
    Cc: Rob Clark <robdclark@gmail.com>
    Cc: Russell King <rmk+kernel@arm.linux.org.uk>
    Cc: Saravana Kannan <saravanak@google.com>
    Signed-off-by: Stephen Boyd <swboyd@chromium.org>
    ---
    drivers/base/component.c | 14 +++++++++++---
    include/linux/component.h | 23 ++++++++++++++++++++++-
    2 files changed, 33 insertions(+), 4 deletions(-)

    diff --git a/drivers/base/component.c b/drivers/base/component.c
    index 13ac2004a913..5b91a114786d 100644
    --- a/drivers/base/component.c
    +++ b/drivers/base/component.c
    @@ -735,8 +735,13 @@ static void component_unbind(struct component *component,
    {
    WARN_ON(!component->bound);

    - if (component->ops && component->ops->unbind)
    - component->ops->unbind(component->dev, adev->parent, data);
    + if (component->ops) {
    + if (component->ops->unbind)
    + component->ops->unbind(component->dev, adev->parent, data);
    + else if (component->ops->unbind_component)
    + component->ops->unbind_component(component->dev, adev, data);
    + }
    +
    component->bound = false;

    /* Release all resources claimed in the binding of this component */
    @@ -801,7 +806,10 @@ static int component_bind(struct component *component, struct aggregate_device *
    dev_dbg(adev->parent, "binding %s (ops %ps)\n",
    dev_name(component->dev), component->ops);

    - ret = component->ops->bind(component->dev, adev->parent, data);
    + if (component->ops->bind_component)
    + ret = component->ops->bind_component(component->dev, adev, data);
    + else
    + ret = component->ops->bind(component->dev, adev->parent, data);
    if (!ret) {
    component->bound = true;

    diff --git a/include/linux/component.h b/include/linux/component.h
    index c39dea7824af..073cbe9fea32 100644
    --- a/include/linux/component.h
    +++ b/include/linux/component.h
    @@ -6,6 +6,7 @@
    #include <linux/device/driver.h>
    #include <linux/refcount.h>

    +struct aggregate_device;
    struct device;

    /**
    @@ -20,18 +21,39 @@ struct component_ops {
    *
    * Called through component_bind_all() when the aggregate driver is
    * ready to bind the overall driver.
    + *
    + * Deprecated: Use bind_component() instead.
    */
    int (*bind)(struct device *comp, struct device *master,
    void *master_data);
    + /**
    + * @bind_component:
    + *
    + * Called through component_bind_all() when the aggregate driver is
    + * ready to bind the overall driver.
    + */
    + int (*bind_component)(struct device *comp, struct aggregate_device *adev,
    + void *aggregate_data);
    /**
    * @unbind:
    *
    * Called through component_unbind_all() when the aggregate driver is
    * ready to bind the overall driver, or when component_bind_all() fails
    * part-ways through and needs to unbind some already bound components.
    + *
    + * Deprecated: Use unbind_component() instead.
    */
    void (*unbind)(struct device *comp, struct device *master,
    void *master_data);
    + /**
    + * @unbind_component:
    + *
    + * Called through component_unbind_all() when the aggregate driver is
    + * ready to unbind the overall driver, or when component_bind_all() fails
    + * part-ways through and needs to unbind some already bound components.
    + */
    + int (*unbind_component)(struct device *comp, struct aggregate_device *adev,
    + void *aggregate_data);
    };

    int component_add(struct device *, const struct component_ops *);
    @@ -42,7 +64,6 @@ void component_del(struct device *, const struct component_ops *);
    int component_bind_all(struct device *parent, void *data);
    void component_unbind_all(struct device *parent, void *data);

    -struct aggregate_device;
    struct device *aggregate_device_parent(const struct aggregate_device *adev);

    /**
    --
    https://chromeos.dev
    \
     
     \ /
      Last update: 2022-01-27 21:02    [W:4.255 / U:0.504 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site