Message ID | 87bk1d2pvt.wl-kuninori.morimoto.gx@renesas.com |
---|---|
Headers | show |
Series | of: property: add of_graph_get_next_port/port_endpoint() | expand |
On Wed, Aug 28, 2024 at 05:12:28AM +0000, Kuninori Morimoto wrote: > Now we can use new port related functions for port parsing. Use it. > > Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> > Reviewed-by: Tomi Valkeinen <tomi.valkeinen+renesas@ideasonboard.com> > --- > drivers/media/platform/xilinx/xilinx-tpg.c | 3 ++- > 1 file changed, 2 insertions(+), 1 deletion(-) > > diff --git a/drivers/media/platform/xilinx/xilinx-tpg.c b/drivers/media/platform/xilinx/xilinx-tpg.c > index e05e528ffc6f7..a25f216b2513c 100644 > --- a/drivers/media/platform/xilinx/xilinx-tpg.c > +++ b/drivers/media/platform/xilinx/xilinx-tpg.c > @@ -13,6 +13,7 @@ > #include <linux/gpio/consumer.h> > #include <linux/module.h> > #include <linux/of.h> > +#include <linux/of_graph.h> > #include <linux/platform_device.h> > #include <linux/xilinx-v4l2-controls.h> > > @@ -744,7 +745,7 @@ static int xtpg_parse_of(struct xtpg_device *xtpg) > } > This function is looping over port nodes, why don't you make it use for_each_of_graph_port()? > if (nports == 0) { > - endpoint = of_get_next_child(port, NULL); > + endpoint = of_graph_get_next_port_endpoint(port, NULL); > if (endpoint) > has_endpoint = true; > of_node_put(endpoint); > -- > 2.43.0 >
On Wed, Aug 28, 2024 at 05:11:37AM +0000, Kuninori Morimoto wrote: > We have endpoint base functions > - of_graph_get_next_device_endpoint() > - of_graph_get_device_endpoint_count() > - for_each_of_graph_device_endpoint() > > Here, for_each_of_graph_device_endpoint() loop finds each endpoints > > ports { > port@0 { > (1) endpoint {...}; > }; > port@1 { > (2) endpoint {...}; > }; > ... > }; > > In above case, it finds endpoint as (1) -> (2) -> ... > > Basically, user/driver knows which port is used for what, but not in > all cases. For example on flexible/generic driver case, how many ports > are used is not fixed. > > For example Sound Generic Card driver which is used from many venders > can't know how many ports are used. Because the driver is very > flexible/generic, it is impossible to know how many ports are used, > it depends on each vender SoC and/or its used board. > > And more, the port can have multi endpoints. For example Generic Sound > Card case, it supports many type of connection between CPU / Codec, and > some of them uses multi endpoint in one port. > Then, Generic Sound Card want to handle each connection via "port" > instead of "endpoint". > But, it is very difficult to handle each "port" via existing > for_each_of_graph_device_endpoint(). Getting "port" via of_get_parent() > from "endpoint" doesn't work. see below. > > ports { > port@0 { > (1) endpoint@0 {...}; > (2) endpoint@1 {...}; > }; > port@1 { > (3) endpoint {...}; > }; > ... > }; > > In other case, we want to handle "ports" same as "port" for some reasons. > > node { > => ports@0 { > port@0 { ... }; > port@1 { ... }; > ... > }; > => ports@1 { > ... > }; > }; There is no schema that supports this structure. The closest thing we have is in-ports and out-ports in Coresight bindings. In any case, it should be a separate patch, not buried in here. Rob
Hi Rob Thank you for your review > > index e05e528ffc6f7..a25f216b2513c 100644 > > --- a/drivers/media/platform/xilinx/xilinx-tpg.c > > +++ b/drivers/media/platform/xilinx/xilinx-tpg.c > > @@ -13,6 +13,7 @@ > > #include <linux/gpio/consumer.h> > > #include <linux/module.h> > > #include <linux/of.h> > > +#include <linux/of_graph.h> > > #include <linux/platform_device.h> > > #include <linux/xilinx-v4l2-controls.h> > > > > @@ -744,7 +745,7 @@ static int xtpg_parse_of(struct xtpg_device *xtpg) > > } > > > > This function is looping over port nodes, why don't you make it use > for_each_of_graph_port()? Yes, indeed. Will fix in v5 Thank you for your help !! Best regards --- Kuninori Morimoto
Hi Rob > > node { > > => ports@0 { > > port@0 { ... }; > > port@1 { ... }; > > ... > > }; > > => ports@1 { > > ... > > }; > > }; > > There is no schema that supports this structure. The closest thing we > have is in-ports and out-ports in Coresight bindings. > > In any case, it should be a separate patch, not buried in here. Oops, my driver is using multi ports already. it is handling like below +-- Board -------------+ |+--------+ +------+| ||SoC (A)|<--->|Codec1|| Sound Card0 || | +------+| || (B)|<-+ | |+--------+ | | +------------|----------+ +-- Expansion board ----+ | | +------+| | +->|Codec2|| Sound Card1 | +------+| +-----------------------+ Here (A) is handled by ports0, and (B) is handled by ports1, and each ports has many port nodes. Thank you for your help !! Best regards --- Kuninori Morimoto
Hi Rob > > +EXPORT_SYMBOL(of_graph_get_next_port); > > of_graph_is_present should be reimplemented using this function. So > should part of of_graph_get_next_endpoint(). I didn't notice about of_graph_is_present()... but unfortunately, we can't. The biggest reason is "const". This is because of_graph_get_next_ports() needs to use of_node_get() for "parent", in case of if it doesn't have "ports" node ("parent" node will be handled as "ports" node, in this case). So, it can't use "const" for "parent", but above 2 functions are based on "const". Thus we can't replace these by new helper functions. struct device_node *of_graph_get_next_ports(struct device_node *parent, ...) { ... => prev = of_node_get(parent); ... } Or I can do it if we can remove "const" from there. Thank you for your help !! Best regards --- Kuninori Morimoto