From dafdf13f253449a3f7806f7ba78aaf832a9aec0b Mon Sep 17 00:00:00 2001 From: Hauke Mehrtens Date: Sat, 22 Feb 2014 23:37:46 +0100 Subject: [PATCH] backports: add of_property_count_u32_elems() This is needed by drivers/regulator/gpio-regulator.c This also adds of_property_count_elems_of_size() Signed-off-by: Hauke Mehrtens --- backport/backport-include/linux/of.h | 35 ++++++++++++++++++++++++++++ backport/compat/backport-3.15.c | 35 ++++++++++++++++++++++++++++ 2 files changed, 70 insertions(+) diff --git a/backport/backport-include/linux/of.h b/backport/backport-include/linux/of.h index a4189bb6ecd5..10a3d11abc36 100644 --- a/backport/backport-include/linux/of.h +++ b/backport/backport-include/linux/of.h @@ -46,4 +46,39 @@ static inline int of_property_read_u8_array(const struct device_node *np, #endif /* CONFIG_OF */ #endif /* LINUX_VERSION_CODE < KERNEL_VERSION(3,7,0) */ +#if LINUX_VERSION_CODE < KERNEL_VERSION(3,15,0) +#define of_property_count_elems_of_size LINUX_BACKPORT(of_property_count_elems_of_size) +#ifdef CONFIG_OF +extern int of_property_count_elems_of_size(const struct device_node *np, + const char *propname, int elem_size); +#else +static inline int of_property_count_elems_of_size(const struct device_node *np, + const char *propname, int elem_size) +{ + return -ENOSYS; +} +#endif /* CONFIG_OF */ +#endif /* LINUX_VERSION_CODE < KERNEL_VERSION(3,15,0) */ + + +#if LINUX_VERSION_CODE < KERNEL_VERSION(3,15,0) +/** + * of_property_count_u32_elems - Count the number of u32 elements in a property + * + * @np: device node from which the property value is to be read. + * @propname: name of the property to be searched. + * + * Search for a property in a device node and count the number of u32 elements + * in it. Returns number of elements on sucess, -EINVAL if the property does + * not exist or its length does not match a multiple of u32 and -ENODATA if the + * property does not have a value. + */ +#define of_property_count_u32_elems LINUX_BACKPORT(of_property_count_u32_elems) +static inline int of_property_count_u32_elems(const struct device_node *np, + const char *propname) +{ + return of_property_count_elems_of_size(np, propname, sizeof(u32)); +} +#endif /* LINUX_VERSION_CODE < KERNEL_VERSION(3,15,0) */ + #endif /* _COMPAT_LINUX_OF_H */ diff --git a/backport/compat/backport-3.15.c b/backport/compat/backport-3.15.c index 367ff9d77bdc..67d672bce97f 100644 --- a/backport/compat/backport-3.15.c +++ b/backport/compat/backport-3.15.c @@ -10,6 +10,7 @@ #include #include #include +#include /** * devm_kstrdup - Allocate resource managed space and @@ -36,3 +37,37 @@ char *devm_kstrdup(struct device *dev, const char *s, gfp_t gfp) return buf; } EXPORT_SYMBOL_GPL(devm_kstrdup); + +#ifdef CONFIG_OF +/** + * of_property_count_elems_of_size - Count the number of elements in a property + * + * @np: device node from which the property value is to be read. + * @propname: name of the property to be searched. + * @elem_size: size of the individual element + * + * Search for a property in a device node and count the number of elements of + * size elem_size in it. Returns number of elements on sucess, -EINVAL if the + * property does not exist or its length does not match a multiple of elem_size + * and -ENODATA if the property does not have a value. + */ +int of_property_count_elems_of_size(const struct device_node *np, + const char *propname, int elem_size) +{ + struct property *prop = of_find_property(np, propname, NULL); + + if (!prop) + return -EINVAL; + if (!prop->value) + return -ENODATA; + + if (prop->length % elem_size != 0) { + pr_err("size of %s in node %s is not a multiple of %d\n", + propname, np->full_name, elem_size); + return -EINVAL; + } + + return prop->length / elem_size; +} +EXPORT_SYMBOL_GPL(of_property_count_elems_of_size); +#endif -- 2.30.2