backports: add of_property_read_u32_index()
authorHauke Mehrtens <hauke@hauke-m.de>
Sun, 23 Feb 2014 14:57:38 +0000 (15:57 +0100)
committerHauke Mehrtens <hauke@hauke-m.de>
Sun, 23 Feb 2014 23:15:03 +0000 (00:15 +0100)
This is needed by drivers/regulator/gpio-regulator.c

Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
backport/backport-include/linux/of.h
backport/compat/backport-3.10.c

index 10a3d11abc36dcbfc8cb6433bdf2f542ebd3bd41..e60005540e120d536922e8f0d7d06aa4f8302d04 100644 (file)
@@ -46,6 +46,21 @@ 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,10,0)
+#define of_property_read_u32_index LINUX_BACKPORT(of_property_read_u32_index)
+#ifdef CONFIG_OF
+extern int of_property_read_u32_index(const struct device_node *np,
+                                      const char *propname,
+                                      u32 index, u32 *out_value);
+#else
+static inline int of_property_read_u32_index(const struct device_node *np,
+                       const char *propname, u32 index, u32 *out_value)
+{
+       return -ENOSYS;
+}
+#endif /* CONFIG_OF */
+#endif /* LINUX_VERSION_CODE < KERNEL_VERSION(3,10,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
index a9f74ed3713256c62780d897b7bbe2397726fd96..2e64228212ddae50ca5b2998b35e35c3808a27aa 100644 (file)
@@ -16,6 +16,7 @@
 #include <linux/tty.h>
 #include <linux/pci.h>
 #include <linux/pci_regs.h>
+#include <linux/of.h>
 
 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,6,0))
 #include <linux/init.h>
@@ -27,7 +28,6 @@
 #include <linux/suspend.h>
 #include <linux/delay.h>
 #include <linux/gpio.h>
-#include <linux/of.h>
 #include <linux/regmap.h>
 #include <linux/regulator/of_regulator.h>
 #include <linux/regulator/consumer.h>
@@ -175,3 +175,35 @@ EXPORT_SYMBOL_GPL(pci_vfs_assigned);
 #endif /* CONFIG_PCI_IOV */
 
 #endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,28)) */
+
+#ifdef CONFIG_OF
+/**
+ * of_property_read_u32_index - Find and read a u32 from a multi-value property.
+ *
+ * @np:                device node from which the property value is to be read.
+ * @propname:  name of the property to be searched.
+ * @index:     index of the u32 in the list of values
+ * @out_value: pointer to return value, modified only if no error.
+ *
+ * Search for a property in a device node and read nth 32-bit value from
+ * it. Returns 0 on success, -EINVAL if the property does not exist,
+ * -ENODATA if property does not have a value, and -EOVERFLOW if the
+ * property data isn't large enough.
+ *
+ * The out_value is modified only if a valid u32 value can be decoded.
+ */
+int of_property_read_u32_index(const struct device_node *np,
+                                      const char *propname,
+                                      u32 index, u32 *out_value)
+{
+       const u32 *val = of_find_property_value_of_size(np, propname,
+                                       ((index + 1) * sizeof(*out_value)));
+
+       if (IS_ERR(val))
+               return PTR_ERR(val);
+
+       *out_value = be32_to_cpup(((__be32 *)val) + index);
+       return 0;
+}
+EXPORT_SYMBOL_GPL(of_property_read_u32_index);
+#endif /* CONFIG_OF */