* [PATCH v7 0/3] Add of-graph helpers to loop over endpoints and find ports by id @ 2014-12-23 13:09 Philipp Zabel 2014-12-23 13:09 ` [PATCH v7 1/3] of: Decrement refcount of previous endpoint in of_graph_get_next_endpoint Philipp Zabel ` (2 more replies) 0 siblings, 3 replies; 6+ messages in thread From: Philipp Zabel @ 2014-12-23 13:09 UTC (permalink / raw) To: linux-arm-kernel Hi, I addressed Andrzej's comments on of_graph_get_port_by_id() and added Mathieu's ack to the first patch. Also I missed the omap2-dss init code last time around. For the first patch, I'd like to get an ack for the rcar-du and omap2-dss changes so this can go in through Grant's tree. This series converts all existing users of of_graph_get_next_endpoint that pass a non-NULL prev argument to the function and decrement its refcount themselves to stop doing that. The of_node_put is moved into of_graph_get_next_endpoint instead. This allows to add a for_each_endpoint_of_node helper macro to loop over all endpoints in a device tree node. Changes since v6: - Fixed of_graph_get_port_by_id to handle the optional 'ports' node and synchronize documentation and parameter names in the process. - Added omap2-dss to the list of updated of_graph_get_next_endpoint users in the first patch. - Added Mathieu's ack to the first patch. The previous version can be found here: https://lkml.org/lkml/2014/12/22/220 regards Philipp Philipp Zabel (3): of: Decrement refcount of previous endpoint in of_graph_get_next_endpoint of: Add for_each_endpoint_of_node helper macro of: Add of_graph_get_port_by_id function drivers/coresight/of_coresight.c | 13 ++----- drivers/gpu/drm/imx/imx-drm-core.c | 13 ++----- drivers/gpu/drm/rcar-du/rcar_du_kms.c | 15 +++------ drivers/media/platform/soc_camera/soc_camera.c | 3 +- drivers/of/base.c | 41 ++++++++++++++++++----- drivers/video/fbdev/omap2/dss/omapdss-boot-init.c | 7 +--- include/linux/of_graph.h | 18 ++++++++++ 7 files changed, 62 insertions(+), 48 deletions(-) -- 2.1.4 ^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH v7 1/3] of: Decrement refcount of previous endpoint in of_graph_get_next_endpoint 2014-12-23 13:09 [PATCH v7 0/3] Add of-graph helpers to loop over endpoints and find ports by id Philipp Zabel @ 2014-12-23 13:09 ` Philipp Zabel 2014-12-26 9:44 ` Laurent Pinchart 2015-01-13 11:08 ` Tomi Valkeinen 2014-12-23 13:09 ` [PATCH v7 2/3] of: Add for_each_endpoint_of_node helper macro Philipp Zabel 2014-12-23 13:09 ` [PATCH v7 3/3] of: Add of_graph_get_port_by_id function Philipp Zabel 2 siblings, 2 replies; 6+ messages in thread From: Philipp Zabel @ 2014-12-23 13:09 UTC (permalink / raw) To: linux-arm-kernel Decrementing the reference count of the previous endpoint node allows to use the of_graph_get_next_endpoint function in a for_each_... style macro. All current users of this function that pass a non-NULL prev parameter (coresight, rcar-du, imx-drm, soc_camera, and omap2-dss) are changed to not decrement the passed prev argument's refcount themselves. Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de> Acked-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com> Acked-by: Mathieu Poirier <mathieu.poirier@linaro.org> --- Changes since v6: - Added omap2-dss. - Added Mathieu's ack. --- drivers/coresight/of_coresight.c | 13 ++----------- drivers/gpu/drm/imx/imx-drm-core.c | 13 ++----------- drivers/gpu/drm/rcar-du/rcar_du_kms.c | 15 ++++----------- drivers/media/platform/soc_camera/soc_camera.c | 3 ++- drivers/of/base.c | 9 +-------- drivers/video/fbdev/omap2/dss/omapdss-boot-init.c | 7 +------ 6 files changed, 12 insertions(+), 48 deletions(-) diff --git a/drivers/coresight/of_coresight.c b/drivers/coresight/of_coresight.c index 5030c07..349c88b 100644 --- a/drivers/coresight/of_coresight.c +++ b/drivers/coresight/of_coresight.c @@ -52,15 +52,6 @@ of_coresight_get_endpoint_device(struct device_node *endpoint) endpoint, of_dev_node_match); } -static struct device_node *of_get_coresight_endpoint( - const struct device_node *parent, struct device_node *prev) -{ - struct device_node *node = of_graph_get_next_endpoint(parent, prev); - - of_node_put(prev); - return node; -} - static void of_coresight_get_ports(struct device_node *node, int *nr_inport, int *nr_outport) { @@ -68,7 +59,7 @@ static void of_coresight_get_ports(struct device_node *node, int in = 0, out = 0; do { - ep = of_get_coresight_endpoint(node, ep); + ep = of_graph_get_next_endpoint(node, ep); if (!ep) break; @@ -140,7 +131,7 @@ struct coresight_platform_data *of_get_coresight_platform_data( /* Iterate through each port to discover topology */ do { /* Get a handle on a port */ - ep = of_get_coresight_endpoint(node, ep); + ep = of_graph_get_next_endpoint(node, ep); if (!ep) break; diff --git a/drivers/gpu/drm/imx/imx-drm-core.c b/drivers/gpu/drm/imx/imx-drm-core.c index b250130..fed627d 100644 --- a/drivers/gpu/drm/imx/imx-drm-core.c +++ b/drivers/gpu/drm/imx/imx-drm-core.c @@ -436,15 +436,6 @@ static uint32_t imx_drm_find_crtc_mask(struct imx_drm_device *imxdrm, return 0; } -static struct device_node *imx_drm_of_get_next_endpoint( - const struct device_node *parent, struct device_node *prev) -{ - struct device_node *node = of_graph_get_next_endpoint(parent, prev); - - of_node_put(prev); - return node; -} - int imx_drm_encoder_parse_of(struct drm_device *drm, struct drm_encoder *encoder, struct device_node *np) { @@ -456,7 +447,7 @@ int imx_drm_encoder_parse_of(struct drm_device *drm, for (i = 0; ; i++) { u32 mask; - ep = imx_drm_of_get_next_endpoint(np, ep); + ep = of_graph_get_next_endpoint(np, ep); if (!ep) break; @@ -504,7 +495,7 @@ int imx_drm_encoder_get_mux_id(struct device_node *node, return -EINVAL; do { - ep = imx_drm_of_get_next_endpoint(node, ep); + ep = of_graph_get_next_endpoint(node, ep); if (!ep) break; diff --git a/drivers/gpu/drm/rcar-du/rcar_du_kms.c b/drivers/gpu/drm/rcar-du/rcar_du_kms.c index 0c5ee61..480c4d9 100644 --- a/drivers/gpu/drm/rcar-du/rcar_du_kms.c +++ b/drivers/gpu/drm/rcar-du/rcar_du_kms.c @@ -206,7 +206,7 @@ static int rcar_du_encoders_init_one(struct rcar_du_device *rcdu, enum rcar_du_encoder_type enc_type = RCAR_DU_ENCODER_NONE; struct device_node *connector = NULL; struct device_node *encoder = NULL; - struct device_node *prev = NULL; + struct device_node *ep_node = NULL; struct device_node *entity_ep_node; struct device_node *entity; int ret; @@ -225,11 +225,7 @@ static int rcar_du_encoders_init_one(struct rcar_du_device *rcdu, entity_ep_node = of_parse_phandle(ep->local_node, "remote-endpoint", 0); while (1) { - struct device_node *ep_node; - - ep_node = of_graph_get_next_endpoint(entity, prev); - of_node_put(prev); - prev = ep_node; + ep_node = of_graph_get_next_endpoint(entity, ep_node); if (!ep_node) break; @@ -300,7 +296,7 @@ static int rcar_du_encoders_init_one(struct rcar_du_device *rcdu, static int rcar_du_encoders_init(struct rcar_du_device *rcdu) { struct device_node *np = rcdu->dev->of_node; - struct device_node *prev = NULL; + struct device_node *ep_node = NULL; unsigned int num_encoders = 0; /* @@ -308,15 +304,12 @@ static int rcar_du_encoders_init(struct rcar_du_device *rcdu) * pipeline. */ while (1) { - struct device_node *ep_node; enum rcar_du_output output; struct of_endpoint ep; unsigned int i; int ret; - ep_node = of_graph_get_next_endpoint(np, prev); - of_node_put(prev); - prev = ep_node; + ep_node = of_graph_get_next_endpoint(np, ep_node); if (ep_node == NULL) break; diff --git a/drivers/media/platform/soc_camera/soc_camera.c b/drivers/media/platform/soc_camera/soc_camera.c index b3db51c..289b637 100644 --- a/drivers/media/platform/soc_camera/soc_camera.c +++ b/drivers/media/platform/soc_camera/soc_camera.c @@ -1710,7 +1710,6 @@ static void scan_of_host(struct soc_camera_host *ici) if (!i) soc_of_bind(ici, epn, ren->parent); - of_node_put(epn); of_node_put(ren); if (i) { @@ -1718,6 +1717,8 @@ static void scan_of_host(struct soc_camera_host *ici) break; } } + + of_node_put(epn); } #else diff --git a/drivers/of/base.c b/drivers/of/base.c index 36536b6..aac66df 100644 --- a/drivers/of/base.c +++ b/drivers/of/base.c @@ -2085,8 +2085,7 @@ EXPORT_SYMBOL(of_graph_parse_endpoint); * @prev: previous endpoint node, or NULL to get first * * Return: An 'endpoint' node pointer with refcount incremented. Refcount - * of the passed @prev node is not decremented, the caller have to use - * of_node_put() on it when done. + * of the passed @prev node is decremented. */ struct device_node *of_graph_get_next_endpoint(const struct device_node *parent, struct device_node *prev) @@ -2122,12 +2121,6 @@ struct device_node *of_graph_get_next_endpoint(const struct device_node *parent, if (WARN_ONCE(!port, "%s(): endpoint %s has no parent node\n", __func__, prev->full_name)) return NULL; - - /* - * Avoid dropping prev node refcount to 0 when getting the next - * child below. - */ - of_node_get(prev); } while (1) { diff --git a/drivers/video/fbdev/omap2/dss/omapdss-boot-init.c b/drivers/video/fbdev/omap2/dss/omapdss-boot-init.c index 2f0822e..76fb18b 100644 --- a/drivers/video/fbdev/omap2/dss/omapdss-boot-init.c +++ b/drivers/video/fbdev/omap2/dss/omapdss-boot-init.c @@ -164,20 +164,15 @@ static void __init omapdss_walk_device(struct device_node *node, bool root) pn = of_graph_get_remote_port_parent(n); - if (!pn) { - of_node_put(n); + if (!pn) continue; - } if (!of_device_is_available(pn) || omapdss_list_contains(pn)) { of_node_put(pn); - of_node_put(n); continue; } omapdss_walk_device(pn, false); - - of_node_put(n); } } -- 2.1.4 ^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH v7 1/3] of: Decrement refcount of previous endpoint in of_graph_get_next_endpoint 2014-12-23 13:09 ` [PATCH v7 1/3] of: Decrement refcount of previous endpoint in of_graph_get_next_endpoint Philipp Zabel @ 2014-12-26 9:44 ` Laurent Pinchart 2015-01-13 11:08 ` Tomi Valkeinen 1 sibling, 0 replies; 6+ messages in thread From: Laurent Pinchart @ 2014-12-26 9:44 UTC (permalink / raw) To: linux-arm-kernel Hi Philipp, Thank you for the patch. On Tuesday 23 December 2014 14:09:16 Philipp Zabel wrote: > Decrementing the reference count of the previous endpoint node allows to > use the of_graph_get_next_endpoint function in a for_each_... style macro. > All current users of this function that pass a non-NULL prev parameter > (coresight, rcar-du, imx-drm, soc_camera, and omap2-dss) are changed to > not decrement the passed prev argument's refcount themselves. > > Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de> > Acked-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com> > Acked-by: Mathieu Poirier <mathieu.poirier@linaro.org> > --- > Changes since v6: > - Added omap2-dss. > - Added Mathieu's ack. > --- > drivers/coresight/of_coresight.c | 13 ++----------- > drivers/gpu/drm/imx/imx-drm-core.c | 13 ++----------- > drivers/gpu/drm/rcar-du/rcar_du_kms.c | 15 ++++----------- For rcar-du, Acked-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> > drivers/media/platform/soc_camera/soc_camera.c | 3 ++- > drivers/of/base.c | 9 +-------- > drivers/video/fbdev/omap2/dss/omapdss-boot-init.c | 7 +------ > 6 files changed, 12 insertions(+), 48 deletions(-) > > diff --git a/drivers/coresight/of_coresight.c > b/drivers/coresight/of_coresight.c index 5030c07..349c88b 100644 > --- a/drivers/coresight/of_coresight.c > +++ b/drivers/coresight/of_coresight.c > @@ -52,15 +52,6 @@ of_coresight_get_endpoint_device(struct device_node > *endpoint) endpoint, of_dev_node_match); > } > > -static struct device_node *of_get_coresight_endpoint( > - const struct device_node *parent, struct device_node *prev) > -{ > - struct device_node *node = of_graph_get_next_endpoint(parent, prev); > - > - of_node_put(prev); > - return node; > -} > - > static void of_coresight_get_ports(struct device_node *node, > int *nr_inport, int *nr_outport) > { > @@ -68,7 +59,7 @@ static void of_coresight_get_ports(struct device_node > *node, int in = 0, out = 0; > > do { > - ep = of_get_coresight_endpoint(node, ep); > + ep = of_graph_get_next_endpoint(node, ep); > if (!ep) > break; > > @@ -140,7 +131,7 @@ struct coresight_platform_data > *of_get_coresight_platform_data( /* Iterate through each port to discover > topology */ > do { > /* Get a handle on a port */ > - ep = of_get_coresight_endpoint(node, ep); > + ep = of_graph_get_next_endpoint(node, ep); > if (!ep) > break; > > diff --git a/drivers/gpu/drm/imx/imx-drm-core.c > b/drivers/gpu/drm/imx/imx-drm-core.c index b250130..fed627d 100644 > --- a/drivers/gpu/drm/imx/imx-drm-core.c > +++ b/drivers/gpu/drm/imx/imx-drm-core.c > @@ -436,15 +436,6 @@ static uint32_t imx_drm_find_crtc_mask(struct > imx_drm_device *imxdrm, return 0; > } > > -static struct device_node *imx_drm_of_get_next_endpoint( > - const struct device_node *parent, struct device_node *prev) > -{ > - struct device_node *node = of_graph_get_next_endpoint(parent, prev); > - > - of_node_put(prev); > - return node; > -} > - > int imx_drm_encoder_parse_of(struct drm_device *drm, > struct drm_encoder *encoder, struct device_node *np) > { > @@ -456,7 +447,7 @@ int imx_drm_encoder_parse_of(struct drm_device *drm, > for (i = 0; ; i++) { > u32 mask; > > - ep = imx_drm_of_get_next_endpoint(np, ep); > + ep = of_graph_get_next_endpoint(np, ep); > if (!ep) > break; > > @@ -504,7 +495,7 @@ int imx_drm_encoder_get_mux_id(struct device_node *node, > return -EINVAL; > > do { > - ep = imx_drm_of_get_next_endpoint(node, ep); > + ep = of_graph_get_next_endpoint(node, ep); > if (!ep) > break; > > diff --git a/drivers/gpu/drm/rcar-du/rcar_du_kms.c > b/drivers/gpu/drm/rcar-du/rcar_du_kms.c index 0c5ee61..480c4d9 100644 > --- a/drivers/gpu/drm/rcar-du/rcar_du_kms.c > +++ b/drivers/gpu/drm/rcar-du/rcar_du_kms.c > @@ -206,7 +206,7 @@ static int rcar_du_encoders_init_one(struct > rcar_du_device *rcdu, enum rcar_du_encoder_type enc_type = > RCAR_DU_ENCODER_NONE; > struct device_node *connector = NULL; > struct device_node *encoder = NULL; > - struct device_node *prev = NULL; > + struct device_node *ep_node = NULL; > struct device_node *entity_ep_node; > struct device_node *entity; > int ret; > @@ -225,11 +225,7 @@ static int rcar_du_encoders_init_one(struct > rcar_du_device *rcdu, entity_ep_node = of_parse_phandle(ep->local_node, > "remote-endpoint", 0); > > while (1) { > - struct device_node *ep_node; > - > - ep_node = of_graph_get_next_endpoint(entity, prev); > - of_node_put(prev); > - prev = ep_node; > + ep_node = of_graph_get_next_endpoint(entity, ep_node); > > if (!ep_node) > break; > @@ -300,7 +296,7 @@ static int rcar_du_encoders_init_one(struct > rcar_du_device *rcdu, static int rcar_du_encoders_init(struct > rcar_du_device *rcdu) > { > struct device_node *np = rcdu->dev->of_node; > - struct device_node *prev = NULL; > + struct device_node *ep_node = NULL; > unsigned int num_encoders = 0; > > /* > @@ -308,15 +304,12 @@ static int rcar_du_encoders_init(struct rcar_du_device > *rcdu) * pipeline. > */ > while (1) { > - struct device_node *ep_node; > enum rcar_du_output output; > struct of_endpoint ep; > unsigned int i; > int ret; > > - ep_node = of_graph_get_next_endpoint(np, prev); > - of_node_put(prev); > - prev = ep_node; > + ep_node = of_graph_get_next_endpoint(np, ep_node); > > if (ep_node == NULL) > break; > diff --git a/drivers/media/platform/soc_camera/soc_camera.c > b/drivers/media/platform/soc_camera/soc_camera.c index b3db51c..289b637 > 100644 > --- a/drivers/media/platform/soc_camera/soc_camera.c > +++ b/drivers/media/platform/soc_camera/soc_camera.c > @@ -1710,7 +1710,6 @@ static void scan_of_host(struct soc_camera_host *ici) > if (!i) > soc_of_bind(ici, epn, ren->parent); > > - of_node_put(epn); > of_node_put(ren); > > if (i) { > @@ -1718,6 +1717,8 @@ static void scan_of_host(struct soc_camera_host *ici) > break; > } > } > + > + of_node_put(epn); > } > > #else > diff --git a/drivers/of/base.c b/drivers/of/base.c > index 36536b6..aac66df 100644 > --- a/drivers/of/base.c > +++ b/drivers/of/base.c > @@ -2085,8 +2085,7 @@ EXPORT_SYMBOL(of_graph_parse_endpoint); > * @prev: previous endpoint node, or NULL to get first > * > * Return: An 'endpoint' node pointer with refcount incremented. Refcount > - * of the passed @prev node is not decremented, the caller have to use > - * of_node_put() on it when done. > + * of the passed @prev node is decremented. > */ > struct device_node *of_graph_get_next_endpoint(const struct device_node > *parent, struct device_node *prev) > @@ -2122,12 +2121,6 @@ struct device_node *of_graph_get_next_endpoint(const > struct device_node *parent, if (WARN_ONCE(!port, "%s(): endpoint %s has no > parent node\n", > __func__, prev->full_name)) > return NULL; > - > - /* > - * Avoid dropping prev node refcount to 0 when getting the next > - * child below. > - */ > - of_node_get(prev); > } > > while (1) { > diff --git a/drivers/video/fbdev/omap2/dss/omapdss-boot-init.c > b/drivers/video/fbdev/omap2/dss/omapdss-boot-init.c index 2f0822e..76fb18b > 100644 > --- a/drivers/video/fbdev/omap2/dss/omapdss-boot-init.c > +++ b/drivers/video/fbdev/omap2/dss/omapdss-boot-init.c > @@ -164,20 +164,15 @@ static void __init omapdss_walk_device(struct > device_node *node, bool root) > > pn = of_graph_get_remote_port_parent(n); > > - if (!pn) { > - of_node_put(n); > + if (!pn) > continue; > - } > > if (!of_device_is_available(pn) || omapdss_list_contains(pn)) { > of_node_put(pn); > - of_node_put(n); > continue; > } > > omapdss_walk_device(pn, false); > - > - of_node_put(n); > } > } -- Regards, Laurent Pinchart ^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH v7 1/3] of: Decrement refcount of previous endpoint in of_graph_get_next_endpoint 2014-12-23 13:09 ` [PATCH v7 1/3] of: Decrement refcount of previous endpoint in of_graph_get_next_endpoint Philipp Zabel 2014-12-26 9:44 ` Laurent Pinchart @ 2015-01-13 11:08 ` Tomi Valkeinen 1 sibling, 0 replies; 6+ messages in thread From: Tomi Valkeinen @ 2015-01-13 11:08 UTC (permalink / raw) To: linux-arm-kernel On 23/12/14 15:09, Philipp Zabel wrote: > Decrementing the reference count of the previous endpoint node allows to > use the of_graph_get_next_endpoint function in a for_each_... style macro. > All current users of this function that pass a non-NULL prev parameter > (coresight, rcar-du, imx-drm, soc_camera, and omap2-dss) are changed to > not decrement the passed prev argument's refcount themselves. > > Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de> > Acked-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com> > Acked-by: Mathieu Poirier <mathieu.poirier@linaro.org> > --- > Changes since v6: > - Added omap2-dss. > - Added Mathieu's ack. > --- > drivers/coresight/of_coresight.c | 13 ++----------- > drivers/gpu/drm/imx/imx-drm-core.c | 13 ++----------- > drivers/gpu/drm/rcar-du/rcar_du_kms.c | 15 ++++----------- > drivers/media/platform/soc_camera/soc_camera.c | 3 ++- > drivers/of/base.c | 9 +-------- > drivers/video/fbdev/omap2/dss/omapdss-boot-init.c | 7 +------ > 6 files changed, 12 insertions(+), 48 deletions(-) > For omapdss: Acked-by: Tomi Valkeinen <tomi.valkeinen@ti.com> Tomi -------------- next part -------------- A non-text attachment was scrubbed... Name: signature.asc Type: application/pgp-signature Size: 819 bytes Desc: OpenPGP digital signature URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20150113/d171a937/attachment.sig> ^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH v7 2/3] of: Add for_each_endpoint_of_node helper macro 2014-12-23 13:09 [PATCH v7 0/3] Add of-graph helpers to loop over endpoints and find ports by id Philipp Zabel 2014-12-23 13:09 ` [PATCH v7 1/3] of: Decrement refcount of previous endpoint in of_graph_get_next_endpoint Philipp Zabel @ 2014-12-23 13:09 ` Philipp Zabel 2014-12-23 13:09 ` [PATCH v7 3/3] of: Add of_graph_get_port_by_id function Philipp Zabel 2 siblings, 0 replies; 6+ messages in thread From: Philipp Zabel @ 2014-12-23 13:09 UTC (permalink / raw) To: linux-arm-kernel Note that while of_graph_get_next_endpoint decrements the reference count of the child node passed to it, of_node_put(child) still has to be called manually when breaking out of the loop. Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de> Acked-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> --- include/linux/of_graph.h | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/include/linux/of_graph.h b/include/linux/of_graph.h index befef42..e43442e 100644 --- a/include/linux/of_graph.h +++ b/include/linux/of_graph.h @@ -26,6 +26,17 @@ struct of_endpoint { const struct device_node *local_node; }; +/** + * for_each_endpoint_of_node - iterate over every endpoint in a device node + * @parent: parent device node containing ports and endpoints + * @child: loop variable pointing to the current endpoint node + * + * When breaking out of the loop, of_node_put(child) has to be called manually. + */ +#define for_each_endpoint_of_node(parent, child) \ + for (child = of_graph_get_next_endpoint(parent, NULL); child != NULL; \ + child = of_graph_get_next_endpoint(parent, child)) + #ifdef CONFIG_OF int of_graph_parse_endpoint(const struct device_node *node, struct of_endpoint *endpoint); -- 2.1.4 ^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH v7 3/3] of: Add of_graph_get_port_by_id function 2014-12-23 13:09 [PATCH v7 0/3] Add of-graph helpers to loop over endpoints and find ports by id Philipp Zabel 2014-12-23 13:09 ` [PATCH v7 1/3] of: Decrement refcount of previous endpoint in of_graph_get_next_endpoint Philipp Zabel 2014-12-23 13:09 ` [PATCH v7 2/3] of: Add for_each_endpoint_of_node helper macro Philipp Zabel @ 2014-12-23 13:09 ` Philipp Zabel 2 siblings, 0 replies; 6+ messages in thread From: Philipp Zabel @ 2014-12-23 13:09 UTC (permalink / raw) To: linux-arm-kernel This patch adds a function to get a port device tree node by port id, or reg property value. Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de> Acked-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> --- Changes since v6: - Fixed of_graph_get_port_by_id to handle the optional 'ports' node and synchronize documentation and parameter names in the process, spotted by Andrzej Hajda. --- drivers/of/base.c | 32 ++++++++++++++++++++++++++++++++ include/linux/of_graph.h | 7 +++++++ 2 files changed, 39 insertions(+) diff --git a/drivers/of/base.c b/drivers/of/base.c index aac66df..8389215 100644 --- a/drivers/of/base.c +++ b/drivers/of/base.c @@ -2080,6 +2080,38 @@ int of_graph_parse_endpoint(const struct device_node *node, EXPORT_SYMBOL(of_graph_parse_endpoint); /** + * of_graph_get_port_by_id() - get the port matching a given id + * @parent: pointer to the parent device node + * @id: id of the port + * + * Return: A 'port' node pointer with refcount incremented. The caller + * has to use of_node_put() on it when done. + */ +struct device_node *of_graph_get_port_by_id(struct device_node *parent, u32 id) +{ + struct device_node *node, *port; + + node = of_get_child_by_name(parent, "ports"); + if (node) + parent = node; + + for_each_child_of_node(parent, port) { + u32 port_id = 0; + + if (of_node_cmp(port->name, "port") != 0) + continue; + of_property_read_u32(port, "reg", &port_id); + if (id == port_id) + break; + } + + of_node_put(node); + + return port; +} +EXPORT_SYMBOL(of_graph_get_port_by_id); + +/** * of_graph_get_next_endpoint() - get next endpoint node * @parent: pointer to the parent device node * @prev: previous endpoint node, or NULL to get first diff --git a/include/linux/of_graph.h b/include/linux/of_graph.h index e43442e..3c1c95a 100644 --- a/include/linux/of_graph.h +++ b/include/linux/of_graph.h @@ -40,6 +40,7 @@ struct of_endpoint { #ifdef CONFIG_OF int of_graph_parse_endpoint(const struct device_node *node, struct of_endpoint *endpoint); +struct device_node *of_graph_get_port_by_id(struct device_node *node, u32 id); struct device_node *of_graph_get_next_endpoint(const struct device_node *parent, struct device_node *previous); struct device_node *of_graph_get_remote_port_parent( @@ -53,6 +54,12 @@ static inline int of_graph_parse_endpoint(const struct device_node *node, return -ENOSYS; } +static inline struct device_node *of_graph_get_port_by_id( + struct device_node *node, u32 id) +{ + return NULL; +} + static inline struct device_node *of_graph_get_next_endpoint( const struct device_node *parent, struct device_node *previous) -- 2.1.4 ^ permalink raw reply related [flat|nested] 6+ messages in thread
end of thread, other threads:[~2015-01-13 11:08 UTC | newest] Thread overview: 6+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2014-12-23 13:09 [PATCH v7 0/3] Add of-graph helpers to loop over endpoints and find ports by id Philipp Zabel 2014-12-23 13:09 ` [PATCH v7 1/3] of: Decrement refcount of previous endpoint in of_graph_get_next_endpoint Philipp Zabel 2014-12-26 9:44 ` Laurent Pinchart 2015-01-13 11:08 ` Tomi Valkeinen 2014-12-23 13:09 ` [PATCH v7 2/3] of: Add for_each_endpoint_of_node helper macro Philipp Zabel 2014-12-23 13:09 ` [PATCH v7 3/3] of: Add of_graph_get_port_by_id function Philipp Zabel
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).