mirror of
				https://kernel.googlesource.com/pub/scm/linux/kernel/git/stable/linux-stable.git
				synced 2025-11-04 07:44:51 +10:00 
			
		
		
		
	dt: add property iteration helpers
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>
Cc: Grant Likely <grant.likely@secretlab.ca>
Signed-off-by: Stephen Warren <swarren@nvidia.com>
Acked-by: Rob Herring <rob.herring@calxeda.com>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
			
			
This commit is contained in:
		
							parent
							
								
									c05127c4e2
								
							
						
					
					
						commit
						c541adc637
					
				@ -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);
 | 
			
		||||
 | 
			
		||||
@ -259,6 +259,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)
 | 
			
		||||
@ -349,6 +380,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 */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user