All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 1/8] dt: add property iteration helpers
@ 2012-03-16 20:54 ` Stephen Warren
  0 siblings, 0 replies; 19+ messages in thread
From: Stephen Warren @ 2012-03-16 20:54 UTC (permalink / raw)
  To: Linus Walleij, Grant Likely, Rob Herring
  Cc: Linus Walleij, B29396-KZfg59tc24xl57MIdRCFDg,
	s.hauer-bIcnvbaLZ9MEGnE8C9+IrQ, dongas86-Re5JQEeQqe8AvxtiuMwx3w,
	shawn.guo-QSEj5FYQhm4dnm+yROfE0A,
	thomas.abraham-QSEj5FYQhm4dnm+yROfE0A,
	tony-4v6yS6AI5VpBDgjK7y7TUQ, linux-kernel-u79uwXL29TY76Z2rM5mHXA,
	devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ,
	linux-tegra-u79uwXL29TY76Z2rM5mHXA, Stephen Warren

This patch adds macros for_each_u32_property_value and
for_each_string_property_value, which iterate over an array of values
within a device-tree property. Usage is for example:

struct of_iter_string_prop iter;
for_each_string_property_value(iter, np, "pins")
        printk("Got value %s\n", iter.value);

Signed-off-by: Stephen Warren <swarren-3lzwWm7+Weoh9ZMKESR00Q@public.gmane.org>
---
 include/linux/of_iter_prop.h |  139 ++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 139 insertions(+), 0 deletions(-)
 create mode 100644 include/linux/of_iter_prop.h

diff --git a/include/linux/of_iter_prop.h b/include/linux/of_iter_prop.h
new file mode 100644
index 0000000..57e9e6a
--- /dev/null
+++ b/include/linux/of_iter_prop.h
@@ -0,0 +1,139 @@
+/*
+ * Copyright (c) 2011-2012 NVIDIA CORPORATION. All rights reserved.
+ *
+ * Iterate over properties that store arrays.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+#ifndef __OF_ITER_PROP_H__
+#define __OF_ITER_PROP_H__
+
+#include <linux/of.h>
+
+#ifdef CONFIG_OF
+struct of_iter_u32_prop {
+	const struct property *prop;
+	int len;
+	const __be32 *pvalue;
+	u32 value;
+};
+
+static inline void of_iter_u32_next(struct of_iter_u32_prop *iter)
+{
+	if (!iter->len)
+		return;
+
+	iter->len--;
+	if (iter->len)
+		iter->value = be32_to_cpup(iter->pvalue++);
+}
+
+static inline void of_iter_u32_init(struct of_iter_u32_prop *iter,
+				    const struct device_node *np,
+				    const char *name)
+{
+	iter->prop = of_find_property(np, name, &iter->len);
+	if (!iter->prop) {
+		iter->len = 0;
+		return;
+	}
+
+	iter->pvalue = iter->prop->value;
+	if (!iter->pvalue) {
+		iter->len = 0;
+		return;
+	}
+
+	iter->len /= sizeof(*iter->pvalue);
+
+	if (iter->len)
+		iter->value = be32_to_cpup(iter->pvalue++);
+}
+
+static inline bool of_iter_u32_test(struct of_iter_u32_prop *iter)
+{
+	return iter->len > 0;
+}
+
+#define for_each_u32_property_value(iter, np, prop_name) \
+	for (of_iter_u32_init(&iter, np, prop_name); \
+	     of_iter_u32_test(&iter); \
+	     of_iter_u32_next(&iter))
+
+struct of_iter_string_prop {
+	const struct property *prop;
+	int len;
+	const char *value;
+	const char *after;
+};
+
+static inline void of_iter_string_init(struct of_iter_string_prop *iter,
+				       const struct device_node *np,
+				       const char *name)
+{
+	iter->prop = of_find_property(np, name, &iter->len);
+	if (!iter->prop) {
+		iter->value = NULL;
+		return;
+	}
+
+	iter->value = iter->prop->value;
+	if (!iter->value)
+		return;
+
+	iter->after = iter->value + iter->len;
+}
+
+static inline bool of_iter_string_test(struct of_iter_string_prop *iter)
+{
+	if (!iter->value)
+		return false;
+
+	return iter->value < iter->after;
+}
+
+static inline void of_iter_string_next(struct of_iter_string_prop *iter)
+{
+	int len;
+
+	if (!iter->value)
+		return;
+
+	len = strnlen(iter->value, iter->len);
+	iter->len -= len + 1;
+	iter->value += len + 1;
+}
+
+#define for_each_string_property_value(iter, np, prop_name) \
+	for (of_iter_string_init(&iter, np, prop_name); \
+	     of_iter_string_test(&iter); \
+	     of_iter_string_next(&iter))
+
+#else
+struct of_iter_u32_prop {
+	u32 value;
+};
+
+#define for_each_u32_property_value(iter, np, prop_name) \
+	while (0)
+
+struct of_iter_string_prop {
+	const char *value;
+};
+
+#define for_each_string_property_value(iter, np, prop_name) \
+	while (0)
+
+#endif /* CONFIG_OF */
+
+#endif /* __OF_ITER_PROP_H__ */
-- 
1.7.0.4

^ permalink raw reply related	[flat|nested] 19+ messages in thread

end of thread, other threads:[~2012-03-20 16:35 UTC | newest]

Thread overview: 19+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-03-16 20:54 [PATCH 1/8] dt: add property iteration helpers Stephen Warren
2012-03-16 20:54 ` Stephen Warren
2012-03-16 20:54 ` [PATCH 2/8] pinctrl: Include <linux/bug.h> to prevent compile errors Stephen Warren
     [not found]   ` <1331931269-12262-2-git-send-email-swarren-3lzwWm7+Weoh9ZMKESR00Q@public.gmane.org>
2012-03-20 12:12     ` Linus Walleij
2012-03-20 12:12       ` Linus Walleij
2012-03-16 20:54 ` [PATCH 4/8] pinctrl: implement pinctrl_check_ops Stephen Warren
2012-03-20 12:14   ` Linus Walleij
     [not found] ` <1331931269-12262-1-git-send-email-swarren-3lzwWm7+Weoh9ZMKESR00Q@public.gmane.org>
2012-03-16 20:54   ` [PATCH 3/8] dt: pinctrl: Document device tree binding Stephen Warren
2012-03-16 20:54     ` Stephen Warren
2012-03-16 20:54   ` [PATCH 5/8] pinctrl: core device tree mapping table parsing support Stephen Warren
2012-03-16 20:54     ` Stephen Warren
2012-03-20 12:21     ` Linus Walleij
2012-03-19 16:00   ` [PATCH 1/8] dt: add property iteration helpers Rob Herring
2012-03-19 16:00     ` Rob Herring
2012-03-20 16:35   ` Grant Likely
2012-03-20 16:35     ` Grant Likely
2012-03-16 20:54 ` [PATCH 6/8] dt: Move Tegra20 pin mux binding into new pinctrl directory Stephen Warren
2012-03-16 20:54 ` [PATCH 7/8] dt: Document Tegra20/30 pinctrl binding Stephen Warren
2012-03-16 20:54 ` [PATCH 8/8] pinctrl: tegra: Add complete device tree support Stephen Warren

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.