All of lore.kernel.org
 help / color / mirror / Atom feed
From: Rob Herring <robherring2-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
To: Stephen Warren <swarren-3lzwWm7+Weoh9ZMKESR00Q@public.gmane.org>
Cc: devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ@public.gmane.org,
	rob.herring-bsGFqQB8/DxBDgjK7y7TUQ@public.gmane.org,
	linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
Subject: Re: [PATCH V3] dt: add property iteration helpers
Date: Tue, 20 Mar 2012 20:56:36 -0500	[thread overview]
Message-ID: <4F693554.1010002@gmail.com> (raw)
In-Reply-To: <1332284899-24702-1-git-send-email-swarren-3lzwWm7+Weoh9ZMKESR00Q@public.gmane.org>

On 03/20/2012 06:08 PM, Stephen Warren wrote:
> This patch adds macros of_property_for_each_u32() and
> of_property_for_each_string(), which iterate over an array of values
> within a device-tree property. Usage is for example:
> 
> struct property *prop;
> const __be32 *p;
> u32 u;
> of_property_for_each_u32(np, "propname", prop, p, u)
> 	printk("U32 value: %x\n", u);
> 
> struct property *prop;
> const char *s;
> of_property_for_each_string(np, "propname", prop, s)
> 	printk("String value: %s\n", s);
> 
> Based on work by Rob Herring <robherring2-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
> 
> Signed-off-by: Stephen Warren <swarren-3lzwWm7+Weoh9ZMKESR00Q@public.gmane.org>

Acked-by: Rob Herring <rob.herring-bsGFqQB8/DxBDgjK7y7TUQ@public.gmane.org>


> ---
> v3: Moved code in base.c, defines/prototypes into of.h.
> v2: Simplified the implementation per suggestion by Rob Herring.
> 
> I'm not reposting them to avoid spamming people, but I have pinctrl changes
> that depend on this, so if this could be merged through the pinctrl tree,
> or somehow pulled into that tree, that'd be great.
> 
>  drivers/of/base.c  |   41 +++++++++++++++++++++++++++++++++++++++++
>  include/linux/of.h |   35 +++++++++++++++++++++++++++++++++++
>  2 files changed, 76 insertions(+), 0 deletions(-)
> 
> diff --git a/drivers/of/base.c b/drivers/of/base.c
> index 5806449..d9bfd49 100644
> --- a/drivers/of/base.c
> +++ b/drivers/of/base.c
> @@ -1260,3 +1260,44 @@ int of_alias_get_id(struct device_node *np, const char *stem)
>  	return id;
>  }
>  EXPORT_SYMBOL_GPL(of_alias_get_id);
> +
> +const __be32 *of_prop_next_u32(struct property *prop, const __be32 *cur,
> +			       u32 *pu)
> +{
> +	const void *curv = cur;
> +
> +	if (!prop)
> +		return NULL;
> +
> +	if (!cur) {
> +		curv = prop->value;
> +		goto out_val;
> +	}
> +
> +	curv += sizeof(*cur);
> +	if (curv >= prop->value + prop->length)
> +		return NULL;
> +
> +out_val:
> +	*pu = be32_to_cpup(curv);
> +	return curv;
> +}
> +EXPORT_SYMBOL_GPL(of_prop_next_u32);
> +
> +const char *of_prop_next_string(struct property *prop, const char *cur)
> +{
> +	const void *curv = cur;
> +
> +	if (!prop)
> +		return NULL;
> +
> +	if (!cur)
> +		return prop->value;
> +
> +	curv += strlen(cur) + 1;
> +	if (curv >= prop->value + prop->length)
> +		return NULL;
> +
> +	return curv;
> +}
> +EXPORT_SYMBOL_GPL(of_prop_next_string);
> diff --git a/include/linux/of.h b/include/linux/of.h
> index ba5d849..7c58550 100644
> --- a/include/linux/of.h
> +++ b/include/linux/of.h
> @@ -269,6 +269,37 @@ extern void of_detach_node(struct device_node *);
>  #endif
>  
>  #define of_match_ptr(_ptr)	(_ptr)
> +
> +/*
> + * struct property *prop;
> + * const __be32 *p;
> + * u32 u;
> + *
> + * of_property_for_each_u32(np, "propname", prop, p, u)
> + *         printk("U32 value: %x\n", u);
> + */
> +const __be32 *of_prop_next_u32(struct property *prop, const __be32 *cur,
> +			       u32 *pu);
> +#define of_property_for_each_u32(np, propname, prop, p, u)	\
> +	for (prop = of_find_property(np, propname, NULL),	\
> +		p = of_prop_next_u32(prop, NULL, &u);		\
> +		p;						\
> +		p = of_prop_next_u32(prop, p, &u))
> +
> +/*
> + * struct property *prop;
> + * const char *s;
> + *
> + * of_property_for_each_string(np, "propname", prop, s)
> + *         printk("String value: %s\n", s);
> + */
> +const char *of_prop_next_string(struct property *prop, const char *cur);
> +#define of_property_for_each_string(np, propname, prop, s)	\
> +	for (prop = of_find_property(np, propname, NULL),	\
> +		s = of_prop_next_string(prop, NULL);		\
> +		s;						\
> +		s = of_prop_next_string(prop, s))
> +
>  #else /* CONFIG_OF */
>  
>  static inline bool of_have_populated_dt(void)
> @@ -359,6 +390,10 @@ static inline int of_machine_is_compatible(const char *compat)
>  
>  #define of_match_ptr(_ptr)	NULL
>  #define of_match_node(_matches, _node)	NULL
> +#define of_property_for_each_u32(np, propname, prop, p, u) \
> +	while (0)
> +#define of_property_for_each_string(np, propname, prop, s) \
> +	while (0)
>  #endif /* CONFIG_OF */
>  
>  /**

WARNING: multiple messages have this Message-ID (diff)
From: Rob Herring <robherring2@gmail.com>
To: Stephen Warren <swarren@wwwdotorg.org>
Cc: linus.walleij@linaro.org, devicetree-discuss@lists.ozlabs.org,
	linux-kernel@vger.kernel.org, rob.herring@calxeda.com
Subject: Re: [PATCH V3] dt: add property iteration helpers
Date: Tue, 20 Mar 2012 20:56:36 -0500	[thread overview]
Message-ID: <4F693554.1010002@gmail.com> (raw)
In-Reply-To: <1332284899-24702-1-git-send-email-swarren@wwwdotorg.org>

On 03/20/2012 06:08 PM, Stephen Warren wrote:
> This patch adds macros of_property_for_each_u32() and
> of_property_for_each_string(), which iterate over an array of values
> within a device-tree property. Usage is for example:
> 
> struct property *prop;
> const __be32 *p;
> u32 u;
> of_property_for_each_u32(np, "propname", prop, p, u)
> 	printk("U32 value: %x\n", u);
> 
> struct property *prop;
> const char *s;
> of_property_for_each_string(np, "propname", prop, s)
> 	printk("String value: %s\n", s);
> 
> Based on work by Rob Herring <robherring2@gmail.com>
> 
> Signed-off-by: Stephen Warren <swarren@wwwdotorg.org>

Acked-by: Rob Herring <rob.herring@calxeda.com>


> ---
> v3: Moved code in base.c, defines/prototypes into of.h.
> v2: Simplified the implementation per suggestion by Rob Herring.
> 
> I'm not reposting them to avoid spamming people, but I have pinctrl changes
> that depend on this, so if this could be merged through the pinctrl tree,
> or somehow pulled into that tree, that'd be great.
> 
>  drivers/of/base.c  |   41 +++++++++++++++++++++++++++++++++++++++++
>  include/linux/of.h |   35 +++++++++++++++++++++++++++++++++++
>  2 files changed, 76 insertions(+), 0 deletions(-)
> 
> diff --git a/drivers/of/base.c b/drivers/of/base.c
> index 5806449..d9bfd49 100644
> --- a/drivers/of/base.c
> +++ b/drivers/of/base.c
> @@ -1260,3 +1260,44 @@ int of_alias_get_id(struct device_node *np, const char *stem)
>  	return id;
>  }
>  EXPORT_SYMBOL_GPL(of_alias_get_id);
> +
> +const __be32 *of_prop_next_u32(struct property *prop, const __be32 *cur,
> +			       u32 *pu)
> +{
> +	const void *curv = cur;
> +
> +	if (!prop)
> +		return NULL;
> +
> +	if (!cur) {
> +		curv = prop->value;
> +		goto out_val;
> +	}
> +
> +	curv += sizeof(*cur);
> +	if (curv >= prop->value + prop->length)
> +		return NULL;
> +
> +out_val:
> +	*pu = be32_to_cpup(curv);
> +	return curv;
> +}
> +EXPORT_SYMBOL_GPL(of_prop_next_u32);
> +
> +const char *of_prop_next_string(struct property *prop, const char *cur)
> +{
> +	const void *curv = cur;
> +
> +	if (!prop)
> +		return NULL;
> +
> +	if (!cur)
> +		return prop->value;
> +
> +	curv += strlen(cur) + 1;
> +	if (curv >= prop->value + prop->length)
> +		return NULL;
> +
> +	return curv;
> +}
> +EXPORT_SYMBOL_GPL(of_prop_next_string);
> diff --git a/include/linux/of.h b/include/linux/of.h
> index ba5d849..7c58550 100644
> --- a/include/linux/of.h
> +++ b/include/linux/of.h
> @@ -269,6 +269,37 @@ extern void of_detach_node(struct device_node *);
>  #endif
>  
>  #define of_match_ptr(_ptr)	(_ptr)
> +
> +/*
> + * struct property *prop;
> + * const __be32 *p;
> + * u32 u;
> + *
> + * of_property_for_each_u32(np, "propname", prop, p, u)
> + *         printk("U32 value: %x\n", u);
> + */
> +const __be32 *of_prop_next_u32(struct property *prop, const __be32 *cur,
> +			       u32 *pu);
> +#define of_property_for_each_u32(np, propname, prop, p, u)	\
> +	for (prop = of_find_property(np, propname, NULL),	\
> +		p = of_prop_next_u32(prop, NULL, &u);		\
> +		p;						\
> +		p = of_prop_next_u32(prop, p, &u))
> +
> +/*
> + * struct property *prop;
> + * const char *s;
> + *
> + * of_property_for_each_string(np, "propname", prop, s)
> + *         printk("String value: %s\n", s);
> + */
> +const char *of_prop_next_string(struct property *prop, const char *cur);
> +#define of_property_for_each_string(np, propname, prop, s)	\
> +	for (prop = of_find_property(np, propname, NULL),	\
> +		s = of_prop_next_string(prop, NULL);		\
> +		s;						\
> +		s = of_prop_next_string(prop, s))
> +
>  #else /* CONFIG_OF */
>  
>  static inline bool of_have_populated_dt(void)
> @@ -359,6 +390,10 @@ static inline int of_machine_is_compatible(const char *compat)
>  
>  #define of_match_ptr(_ptr)	NULL
>  #define of_match_node(_matches, _node)	NULL
> +#define of_property_for_each_u32(np, propname, prop, p, u) \
> +	while (0)
> +#define of_property_for_each_string(np, propname, prop, s) \
> +	while (0)
>  #endif /* CONFIG_OF */
>  
>  /**


  parent reply	other threads:[~2012-03-21  1:56 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-03-20 23:08 [PATCH V3] dt: add property iteration helpers Stephen Warren
     [not found] ` <1332284899-24702-1-git-send-email-swarren-3lzwWm7+Weoh9ZMKESR00Q@public.gmane.org>
2012-03-21  1:56   ` Rob Herring [this message]
2012-03-21  1:56     ` Rob Herring

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4F693554.1010002@gmail.com \
    --to=robherring2-re5jqeeqqe8avxtiumwx3w@public.gmane.org \
    --cc=devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ@public.gmane.org \
    --cc=linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
    --cc=rob.herring-bsGFqQB8/DxBDgjK7y7TUQ@public.gmane.org \
    --cc=swarren-3lzwWm7+Weoh9ZMKESR00Q@public.gmane.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.