On Wed, Dec 8, 2021 at 2:20 AM Rob Herring robh+dt@kernel.org wrote:
On Mon, Dec 6, 2021 at 11:49 PM Jagan Teki jagan@amarulasolutions.com wrote:
Add of_get_non_port_child() helper that can be used to lookup non port child nodes.
Some OF graphs don't require 'ports' to represent the next output instead, it simply adds a child node on a given parent node. This helper lookup that child node, however that child node is not a 'port' on given parent as 'port' based nodes are looked up via of_graph_get_remote_node().
Example OF graph representation of DSI host, which doesn't have 'ports'.
This seems pretty specific to DSI and also can't handle there being more than 1 non-port node. That's allowed for DSI too, but I don't think I've ever seen a case. Anyways, I'd just move this to DRM rather than common DT code. One comment on the implementation that will shrink it.
I think it can be possible to OF graph even for non-DSI, however if the end-node outputs to a panel or bridge. At the moment, I can one use case on the non-DSI side is rcar du encoder. https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git/tree/dri...
I'm not sure this can be done existing of_graph_get_remote_node, but an example.
dsi { #address-cells = <1>; #size-cells = <0>;
port { dsi_in_tcon0: endpoint { remote-endpoint = <tcon0_out_dsi>; }; panel@0 { reg = <0>; };
};
Signed-off-by: Jagan Teki jagan@amarulasolutions.com
drivers/of/base.c | 29 +++++++++++++++++++++++++++++ include/linux/of.h | 6 ++++++ 2 files changed, 35 insertions(+)
diff --git a/drivers/of/base.c b/drivers/of/base.c index 61de453b885c..31bbf885b0f8 100644 --- a/drivers/of/base.c +++ b/drivers/of/base.c @@ -854,6 +854,35 @@ struct device_node *of_get_compatible_child(const struct device_node *parent, } EXPORT_SYMBOL(of_get_compatible_child);
+/**
- of_get_non_port_child - Find the non port child node for a given parent
- @node: parent node
- This function looks for child node which is not port child for given parent.
- Return: A node pointer if found, with refcount incremented, use
- of_node_put() on it when done.
- Returns NULL if node is not found.
- */
+struct device_node *of_get_non_port_child(const struct device_node *parent) +{
struct device_node *child;
for_each_child_of_node(parent, child) {
for_each_available_child_of_node
Look like this simplifies not required to use of_device_is_available, I will use it in v2.
Thanks, Jagan.