Hi Dmitry,
Thank you for the patch.
On Sun, Jun 14, 2020 at 08:22:29PM +0300, Dmitry Osipenko wrote:
In some case, like a DRM display code for example, it's useful to silently check whether port node exists at all in a device-tree before proceeding with parsing the graph.
This patch adds of_graph_get_local_port() which returns pointer to a local port node, or NULL if graph isn't specified in a device-tree for a given device node.
Reviewed-by: Rob Herring robh@kernel.org Reviewed-by: Sam Ravnborg sam@ravnborg.org Signed-off-by: Dmitry Osipenko digetx@gmail.com
drivers/of/property.c | 32 +++++++++++++++++++++++--------- include/linux/of_graph.h | 7 +++++++ 2 files changed, 30 insertions(+), 9 deletions(-)
diff --git a/drivers/of/property.c b/drivers/of/property.c index 1f2086f4e7ce..05c5f619b8bb 100644 --- a/drivers/of/property.c +++ b/drivers/of/property.c @@ -608,15 +608,7 @@ struct device_node *of_graph_get_next_endpoint(const struct device_node *parent, * parent port node. */ if (!prev) {
struct device_node *node;
node = of_get_child_by_name(parent, "ports");
if (node)
parent = node;
port = of_get_child_by_name(parent, "port");
of_node_put(node);
if (!port) { pr_err("graph: no port node found in %pOF\n", parent); return NULL;port = of_graph_get_local_port(parent);
@@ -765,6 +757,28 @@ struct device_node *of_graph_get_remote_port(const struct device_node *node) } EXPORT_SYMBOL(of_graph_get_remote_port);
+/**
- of_graph_get_local_port() - get local port node
- @node: pointer to a local endpoint device_node
- Return: First local port node associated with local endpoint node linked
to @node. Use of_node_put() on it when done.
- */
+struct device_node *of_graph_get_local_port(const struct device_node *node) +{
- struct device_node *ports, *port;
- ports = of_get_child_by_name(node, "ports");
- if (ports)
node = ports;
- port = of_get_child_by_name(node, "port");
- of_node_put(ports);
- return port;
The implementation doesn't seem to match the documentation. If node is a pointer to an endpoint, it should not have any ports child.
+} +EXPORT_SYMBOL(of_graph_get_local_port);
int of_graph_get_endpoint_count(const struct device_node *np) { struct device_node *endpoint; diff --git a/include/linux/of_graph.h b/include/linux/of_graph.h index 01038a6aade0..1fdeb72c7765 100644 --- a/include/linux/of_graph.h +++ b/include/linux/of_graph.h @@ -54,6 +54,7 @@ struct device_node *of_graph_get_remote_port_parent( struct device_node *of_graph_get_remote_port(const struct device_node *node); struct device_node *of_graph_get_remote_node(const struct device_node *node, u32 port, u32 endpoint); +struct device_node *of_graph_get_local_port(const struct device_node *node); #else
static inline int of_graph_parse_endpoint(const struct device_node *node, @@ -116,6 +117,12 @@ static inline struct device_node *of_graph_get_remote_node( return NULL; }
+static inline struct device_node *of_graph_get_local_port(
const struct device_node *node)
+{
- return NULL;
+}
#endif /* CONFIG_OF */
#endif /* __LINUX_OF_GRAPH_H */
2.26.0