@@ -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.
+ */
+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.
+ */
+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
@@ -7,6 +7,7 @@
#include <drm/drm_bridge.h>
#endif
+struct aggregate_driver;
struct component_master_ops;
struct component_match;
struct device;
@@ -40,6 +41,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 +82,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)
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 | 12 ++++++ 2 files changed, 78 insertions(+), 19 deletions(-)