lkml.org 
[lkml]   [2021]   [Oct]   [6]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v2 06/34] drm/of: Add a drm_of_aggregate_probe() API
    Date
    Similar to drm_of_component_probe() but using the new API that registers
    a driver instead of an ops struct. This allows us to migrate the users
    of drm_of_component_probe() to the new way of doing things.

    Cc: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
    Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
    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/gpu/drm/drm_of.c | 85 +++++++++++++++++++++++++++++++---------
    include/drm/drm_of.h | 11 ++++++
    2 files changed, 77 insertions(+), 19 deletions(-)

    diff --git a/drivers/gpu/drm/drm_of.c b/drivers/gpu/drm/drm_of.c
    index 997b8827fed2..58db65ad2770 100644
    --- a/drivers/gpu/drm/drm_of.c
    +++ b/drivers/gpu/drm/drm_of.c
    @@ -99,30 +99,18 @@ void drm_of_component_match_add(struct device *master,
    }
    EXPORT_SYMBOL_GPL(drm_of_component_match_add);

    -/**
    - * drm_of_component_probe - Generic probe function for a component based master
    - * @dev: master device containing the OF node
    - * @compare_of: compare function used for matching components
    - * @m_ops: component master ops to be used
    - *
    - * Parse the platform device OF node and bind all the components associated
    - * with the master. Interface ports are added before the encoders in order to
    - * satisfy their .bind requirements
    - * See Documentation/devicetree/bindings/graph.txt for the bindings.
    - *
    - * Returns zero if successful, or one of the standard error codes if it fails.
    - */
    -int drm_of_component_probe(struct device *dev,
    +static int _drm_of_component_probe(struct device *dev,
    int (*compare_of)(struct device *, void *),
    - const struct component_master_ops *m_ops)
    + struct component_match **matchptr)
    {
    struct device_node *ep, *port, *remote;
    - struct component_match *match = NULL;
    int i;

    if (!dev->of_node)
    return -EINVAL;

    + *matchptr = NULL;
    +
    /*
    * Bind the crtc's ports first, so that drm_of_find_possible_crtcs()
    * called from encoder's .bind callbacks works as expected
    @@ -133,7 +121,7 @@ int drm_of_component_probe(struct device *dev,
    break;

    if (of_device_is_available(port->parent))
    - drm_of_component_match_add(dev, &match, compare_of,
    + drm_of_component_match_add(dev, matchptr, compare_of,
    port);

    of_node_put(port);
    @@ -144,7 +132,7 @@ int drm_of_component_probe(struct device *dev,
    return -ENODEV;
    }

    - if (!match) {
    + if (!*matchptr) {
    dev_err(dev, "no available port\n");
    return -ENODEV;
    }
    @@ -174,17 +162,76 @@ int drm_of_component_probe(struct device *dev,
    continue;
    }

    - drm_of_component_match_add(dev, &match, compare_of,
    + drm_of_component_match_add(dev, matchptr, compare_of,
    remote);
    of_node_put(remote);
    }
    of_node_put(port);
    }

    + return 0;
    +}
    +
    +/**
    + * drm_of_component_probe - Generic probe function for a component based master
    + * @dev: master device containing the OF node
    + * @compare_of: compare function used for matching components
    + * @m_ops: component master ops to be used
    + *
    + * Parse the platform device OF node and bind all the components associated
    + * with the master. Interface ports are added before the encoders in order to
    + * satisfy their .bind requirements
    + * See Documentation/devicetree/bindings/graph.txt for the bindings.
    + *
    + * Deprecated: Use drm_of_aggregate_probe() instead.
    + *
    + * Returns zero if successful, or one of the standard error codes if it fails.
    + */
    +static int drm_of_component_probe(struct device *dev,
    + int (*compare_of)(struct device *, void *),
    + const struct component_master_ops *m_ops)
    +{
    +
    + struct component_match *match;
    + int ret;
    +
    + ret = _drm_of_component_probe(dev, compare_of, &match);
    + if (ret)
    + return ret;
    +
    return component_master_add_with_match(dev, m_ops, match);
    }
    EXPORT_SYMBOL(drm_of_component_probe);

    +
    +/**
    + * drm_of_aggregate_probe - Generic probe function for a component based aggregate host
    + * @dev: device containing the OF node
    + * @compare_of: compare function used for matching components
    + * @adrv: aggregate driver to be used
    + *
    + * Parse the platform device OF node and bind all the components associated
    + * with the aggregate device. Interface ports are added before the encoders in
    + * order to satisfy their .bind_component requirements
    + * See Documentation/devicetree/bindings/graph.txt for the bindings.
    + *
    + * Returns zero if successful, or one of the standard error codes if it fails.
    + */
    +static int drm_of_aggregate_probe(struct device *dev,
    + int (*compare_of)(struct device *, void *),
    + struct aggregate_driver *adrv)
    +{
    + struct component_match *match;
    + int ret;
    +
    + ret = _drm_of_component_probe(dev, compare_of, &match);
    + if (ret)
    + return ret;
    +
    + return component_aggregate_register(dev, adrv, match);
    +}
    +EXPORT_SYMBOL(drm_of_aggregate_probe);
    +
    /*
    * drm_of_encoder_active_endpoint - return the active encoder endpoint
    * @node: device tree node containing encoder input ports
    diff --git a/include/drm/drm_of.h b/include/drm/drm_of.h
    index b9b093add92e..c3ec9b14df48 100644
    --- a/include/drm/drm_of.h
    +++ b/include/drm/drm_of.h
    @@ -40,6 +40,9 @@ void drm_of_component_match_add(struct device *master,
    int drm_of_component_probe(struct device *dev,
    int (*compare_of)(struct device *, void *),
    const struct component_master_ops *m_ops);
    +int drm_of_aggregate_probe(struct device *dev,
    + int (*compare_of)(struct device *, void *),
    + struct aggregate_driver *adrv);
    int drm_of_encoder_active_endpoint(struct device_node *node,
    struct drm_encoder *encoder,
    struct of_endpoint *endpoint);
    @@ -78,6 +81,14 @@ drm_of_component_probe(struct device *dev,
    return -EINVAL;
    }

    +static inline int
    +drm_of_aggregate_probe(struct device *dev,
    + int (*compare_of)(struct device *, void *),
    + struct aggregate_driver *adrv)
    +{
    + return -EINVAL;
    +}
    +
    static inline int drm_of_encoder_active_endpoint(struct device_node *node,
    struct drm_encoder *encoder,
    struct of_endpoint *endpoint)
    --
    https://chromeos.dev
    \
     
     \ /
      Last update: 2021-10-06 21:39    [W:4.387 / U:0.944 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site