Skip to contentSkip to conversation

of: Add missing node iteration stubs for disabled CONFIG_OF

PATCH New Tomasz Figa 4 participants 6 messages Mar 9, 2013 – Jun 12, 2013 Device tree

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 of: Add missing node iteration stubs for disabled CONFIG_OF

This patch moves several for_each macros out of the #ifdef CONFIG_OF block and adds inline stubs for functions used by these macros, compiled conditionally when CONFIG_OF is not enabled.

This eliminates the need to explicitly check for CONFIG_OF in driver code using mentioned functions and macros.

---
 include/linux/of.h | 92 +++++++++++++++++++++++++++++++++++++-----------------
 1 file changed, 63 insertions(+), 29 deletions(-)
include/linux/of.h +63 -29
index a0f1292..7a736b8 100644
@@ -86,6 +86,31 @@ static inline struct device_node *of_node_get(struct device_node *node)
 static inline void of_node_put(struct device_node *node) { }
 #endif /* !CONFIG_OF_DYNAMIC */
 
+#define for_each_node_by_name(dn, name) \
+	for (dn = of_find_node_by_name(NULL, name); dn; \
+	     dn = of_find_node_by_name(dn, name))
+#define for_each_node_by_type(dn, type) \
+	for (dn = of_find_node_by_type(NULL, type); dn; \
+	     dn = of_find_node_by_type(dn, type))
+#define for_each_compatible_node(dn, type, compatible) \
+	for (dn = of_find_compatible_node(NULL, type, compatible); dn; \
+	     dn = of_find_compatible_node(dn, type, compatible))
+#define for_each_matching_node(dn, matches) \
+	for (dn = of_find_matching_node(NULL, matches); dn; \
+	     dn = of_find_matching_node(dn, matches))
+#define for_each_matching_node_and_match(dn, matches, match) \
+	for (dn = of_find_matching_node_and_match(NULL, matches, match); \
+	     dn; dn = of_find_matching_node_and_match(dn, matches, match))
+#define for_each_child_of_node(parent, child) \
+	for (child = of_get_next_child(parent, NULL); child != NULL; \
+	     child = of_get_next_child(parent, child))
+#define for_each_available_child_of_node(parent, child) \
+	for (child = of_get_next_available_child(parent, NULL); child != NULL; \
+	     child = of_get_next_available_child(parent, child))
+#define for_each_node_with_property(dn, prop_name) \
+	for (dn = of_find_node_with_property(NULL, prop_name); dn; \
+	     dn = of_find_node_with_property(dn, prop_name))
+
 #ifdef CONFIG_OF
 
 /* Pointer for first entry in chain of all nodes. */
@@ -167,19 +192,10 @@ static inline const char *of_node_full_name(const struct device_node *np)
 
 extern struct device_node *of_find_node_by_name(struct device_node *from,
 	const char *name);
-#define for_each_node_by_name(dn, name) \
-	for (dn = of_find_node_by_name(NULL, name); dn; \
-	     dn = of_find_node_by_name(dn, name))
 extern struct device_node *of_find_node_by_type(struct device_node *from,
 	const char *type);
-#define for_each_node_by_type(dn, type) \
-	for (dn = of_find_node_by_type(NULL, type); dn; \
-	     dn = of_find_node_by_type(dn, type))
 extern struct device_node *of_find_compatible_node(struct device_node *from,
 	const char *type, const char *compat);
-#define for_each_compatible_node(dn, type, compatible) \
-	for (dn = of_find_compatible_node(NULL, type, compatible); dn; \
-	     dn = of_find_compatible_node(dn, type, compatible))
 extern struct device_node *of_find_matching_node_and_match(
 	struct device_node *from,
 	const struct of_device_id *matches,
@@ -190,12 +206,6 @@ static inline struct device_node *of_find_matching_node(
 {
 	return of_find_matching_node_and_match(from, matches, NULL);
 }
-#define for_each_matching_node(dn, matches) \
-	for (dn = of_find_matching_node(NULL, matches); dn; \
-	     dn = of_find_matching_node(dn, matches))
-#define for_each_matching_node_and_match(dn, matches, match) \
-	for (dn = of_find_matching_node_and_match(NULL, matches, match); \
-	     dn; dn = of_find_matching_node_and_match(dn, matches, match))
 extern struct device_node *of_find_node_by_path(const char *path);
 extern struct device_node *of_find_node_by_phandle(phandle handle);
 extern struct device_node *of_get_parent(const struct device_node *node);
@@ -207,14 +217,6 @@ extern struct device_node *of_get_next_available_child(
 
 extern struct device_node *of_get_child_by_name(const struct device_node *node,
 					const char *name);
-#define for_each_child_of_node(parent, child) \
-	for (child = of_get_next_child(parent, NULL); child != NULL; \
-	     child = of_get_next_child(parent, child))
-
-#define for_each_available_child_of_node(parent, child) \
-	for (child = of_get_next_available_child(parent, NULL); child != NULL; \
-	     child = of_get_next_available_child(parent, child))
-
 static inline int of_get_child_count(const struct device_node *np)
 {
 	struct device_node *child;
@@ -228,10 +230,6 @@ static inline int of_get_child_count(const struct device_node *np)
 
 extern struct device_node *of_find_node_with_property(
 	struct device_node *from, const char *prop_name);
-#define for_each_node_with_property(dn, prop_name) \
-	for (dn = of_find_node_with_property(NULL, prop_name); dn; \
-	     dn = of_find_node_with_property(dn, prop_name))
-
 extern struct property *of_find_property(const struct device_node *np,
 					 const char *name,
 					 int *lenp);
@@ -353,13 +351,28 @@ static inline struct device_node *of_find_node_by_name(struct device_node *from,
 	return NULL;
 }
 
+static inline struct device_node *of_find_node_by_type(struct device_node *from,
+	const char *type)
+{
+	return NULL;
+}
+
 static inline bool of_have_populated_dt(void)
 {
 	return false;
 }
 
-#define for_each_child_of_node(parent, child) \
-	while (0)
+static inline struct device_node *of_get_next_child(const struct device_node *node,
+					     struct device_node *prev)
+{
+	return NULL;
+}
+
+static inline struct device_node *of_get_next_available_child(
+	const struct device_node *node, struct device_node *prev)
+{
+	return NULL;
+}
 
 static inline struct device_node *of_get_child_by_name(
 					const struct device_node *node,
@@ -373,6 +386,12 @@ static inline int of_get_child_count(const struct device_node *np)
 	return 0;
 }
 
+static inline struct device_node *of_find_node_with_property(
+	struct device_node *from, const char *prop_name)
+{
+	return NULL;
+}
+
 static inline int of_device_is_compatible(const struct device_node *device,
 					  const char *name)
 {
@@ -394,6 +413,21 @@ static inline struct device_node *of_find_compatible_node(
 	return NULL;
 }
 
+static inline struct device_node *of_find_matching_node_and_match(
+	struct device_node *from,
+	const struct of_device_id *matches,
+	const struct of_device_id **match)
+{
+	return NULL;
+}
+
+static inline struct device_node *of_find_matching_node(
+	struct device_node *from,
+	const struct of_device_id *matches)
+{
+	return NULL;
+}
+
 static inline int of_property_read_u8_array(const struct device_node *np,
 			const char *propname, u8 *out_values, size_t sz)
 {
Signature · 1 line
1.8.1.5
#1 lore raw

PATCH 1/1 of: Add missing node iteration stubs for disabled CONFIG_OF

Quoted 6 lines · Tomasz Figa

This patch moves several for_each macros out of the #ifdef CONFIG_OF block and adds inline stubs for functions used by these macros, compiled conditionally when CONFIG_OF is not enabled.

This eliminates the need to explicitly check for CONFIG_OF in driver code using mentioned functions and macros.

Do you have some users of this?

Rob

Quoted 168 lines
---
 include/linux/of.h | 92 +++++++++++++++++++++++++++++++++++++-----------------
 1 file changed, 63 insertions(+), 29 deletions(-)
include/linux/of.h +63 -29
index a0f1292..7a736b8 100644
@@ -86,6 +86,31 @@ static inline struct device_node *of_node_get(struct device_node *node)
 static inline void of_node_put(struct device_node *node) { }
 #endif /* !CONFIG_OF_DYNAMIC */
 
+#define for_each_node_by_name(dn, name) \
+	for (dn = of_find_node_by_name(NULL, name); dn; \
+	     dn = of_find_node_by_name(dn, name))
+#define for_each_node_by_type(dn, type) \
+	for (dn = of_find_node_by_type(NULL, type); dn; \
+	     dn = of_find_node_by_type(dn, type))
+#define for_each_compatible_node(dn, type, compatible) \
+	for (dn = of_find_compatible_node(NULL, type, compatible); dn; \
+	     dn = of_find_compatible_node(dn, type, compatible))
+#define for_each_matching_node(dn, matches) \
+	for (dn = of_find_matching_node(NULL, matches); dn; \
+	     dn = of_find_matching_node(dn, matches))
+#define for_each_matching_node_and_match(dn, matches, match) \
+	for (dn = of_find_matching_node_and_match(NULL, matches, match); \
+	     dn; dn = of_find_matching_node_and_match(dn, matches, match))
+#define for_each_child_of_node(parent, child) \
+	for (child = of_get_next_child(parent, NULL); child != NULL; \
+	     child = of_get_next_child(parent, child))
+#define for_each_available_child_of_node(parent, child) \
+	for (child = of_get_next_available_child(parent, NULL); child != NULL; \
+	     child = of_get_next_available_child(parent, child))
+#define for_each_node_with_property(dn, prop_name) \
+	for (dn = of_find_node_with_property(NULL, prop_name); dn; \
+	     dn = of_find_node_with_property(dn, prop_name))
+
 #ifdef CONFIG_OF
 
 /* Pointer for first entry in chain of all nodes. */
@@ -167,19 +192,10 @@ static inline const char *of_node_full_name(const struct device_node *np)
 
 extern struct device_node *of_find_node_by_name(struct device_node *from,
 	const char *name);
-#define for_each_node_by_name(dn, name) \
-	for (dn = of_find_node_by_name(NULL, name); dn; \
-	     dn = of_find_node_by_name(dn, name))
 extern struct device_node *of_find_node_by_type(struct device_node *from,
 	const char *type);
-#define for_each_node_by_type(dn, type) \
-	for (dn = of_find_node_by_type(NULL, type); dn; \
-	     dn = of_find_node_by_type(dn, type))
 extern struct device_node *of_find_compatible_node(struct device_node *from,
 	const char *type, const char *compat);
-#define for_each_compatible_node(dn, type, compatible) \
-	for (dn = of_find_compatible_node(NULL, type, compatible); dn; \
-	     dn = of_find_compatible_node(dn, type, compatible))
 extern struct device_node *of_find_matching_node_and_match(
 	struct device_node *from,
 	const struct of_device_id *matches,
@@ -190,12 +206,6 @@ static inline struct device_node *of_find_matching_node(
 {
 	return of_find_matching_node_and_match(from, matches, NULL);
 }
-#define for_each_matching_node(dn, matches) \
-	for (dn = of_find_matching_node(NULL, matches); dn; \
-	     dn = of_find_matching_node(dn, matches))
-#define for_each_matching_node_and_match(dn, matches, match) \
-	for (dn = of_find_matching_node_and_match(NULL, matches, match); \
-	     dn; dn = of_find_matching_node_and_match(dn, matches, match))
 extern struct device_node *of_find_node_by_path(const char *path);
 extern struct device_node *of_find_node_by_phandle(phandle handle);
 extern struct device_node *of_get_parent(const struct device_node *node);
@@ -207,14 +217,6 @@ extern struct device_node *of_get_next_available_child(
 
 extern struct device_node *of_get_child_by_name(const struct device_node *node,
 					const char *name);
-#define for_each_child_of_node(parent, child) \
-	for (child = of_get_next_child(parent, NULL); child != NULL; \
-	     child = of_get_next_child(parent, child))
-
-#define for_each_available_child_of_node(parent, child) \
-	for (child = of_get_next_available_child(parent, NULL); child != NULL; \
-	     child = of_get_next_available_child(parent, child))
-
 static inline int of_get_child_count(const struct device_node *np)
 {
 	struct device_node *child;
@@ -228,10 +230,6 @@ static inline int of_get_child_count(const struct device_node *np)
 
 extern struct device_node *of_find_node_with_property(
 	struct device_node *from, const char *prop_name);
-#define for_each_node_with_property(dn, prop_name) \
-	for (dn = of_find_node_with_property(NULL, prop_name); dn; \
-	     dn = of_find_node_with_property(dn, prop_name))
-
 extern struct property *of_find_property(const struct device_node *np,
 					 const char *name,
 					 int *lenp);
@@ -353,13 +351,28 @@ static inline struct device_node *of_find_node_by_name(struct device_node *from,
 	return NULL;
 }
 
+static inline struct device_node *of_find_node_by_type(struct device_node *from,
+	const char *type)
+{
+	return NULL;
+}
+
 static inline bool of_have_populated_dt(void)
 {
 	return false;
 }
 
-#define for_each_child_of_node(parent, child) \
-	while (0)
+static inline struct device_node *of_get_next_child(const struct device_node *node,
+					     struct device_node *prev)
+{
+	return NULL;
+}
+
+static inline struct device_node *of_get_next_available_child(
+	const struct device_node *node, struct device_node *prev)
+{
+	return NULL;
+}
 
 static inline struct device_node *of_get_child_by_name(
 					const struct device_node *node,
@@ -373,6 +386,12 @@ static inline int of_get_child_count(const struct device_node *np)
 	return 0;
 }
 
+static inline struct device_node *of_find_node_with_property(
+	struct device_node *from, const char *prop_name)
+{
+	return NULL;
+}
+
 static inline int of_device_is_compatible(const struct device_node *device,
 					  const char *name)
 {
@@ -394,6 +413,21 @@ static inline struct device_node *of_find_compatible_node(
 	return NULL;
 }
 
+static inline struct device_node *of_find_matching_node_and_match(
+	struct device_node *from,
+	const struct of_device_id *matches,
+	const struct of_device_id **match)
+{
+	return NULL;
+}
+
+static inline struct device_node *of_find_matching_node(
+	struct device_node *from,
+	const struct of_device_id *matches)
+{
+	return NULL;
+}
+
 static inline int of_property_read_u8_array(const struct device_node *np,
 			const char *propname, u8 *out_values, size_t sz)
 {
#2 lore raw

PATCH 1/1 of: Add missing node iteration stubs for disabled CONFIG_OF

Hi Rob, Thomasz,

(dredging up an oldish thread as I just ran in to this issue)

Quoted 9 lines · Rob Herring
Quoted 6 lines · Tomasz Figa

This patch moves several for_each macros out of the #ifdef CONFIG_OF block and adds inline stubs for functions used by these macros, compiled conditionally when CONFIG_OF is not enabled.

This eliminates the need to explicitly check for CONFIG_OF in driver code using mentioned functions and macros.

Do you have some users of this?

I do!

Or at least I might.

I'm not certain as perhaps the fix to what I describe below is to add dependencies on CONFIG_OF - it isn't clear to me either way:

With both psci and arch_timers (CONFIG_ARM_PSCI, CONFIG_ARM_ARCH_TIMER) and without CONFIG_OF we get a build failure because we lack the definition of of_find_matching_node():

eg:
arch/arm/kernel/psci.c:167:2: error: implicit declaration of function ?of_find_matching_node? [-Werror=implicit-function-declaration]

The same happens with arm_arch_timer.c (well, there's a patch required to include linux/of.h first, after which Thomasz's patch is relevant).

So, I guess the question is whether we should expect PSCI and ARM_ARCH_TIMER to depend on CONFIG_OF, or whether we'd like them to fail gracefully in the case that we *don't* have CONFIG_OF. I think the current situation is broken either way...

Thoughts?

Jonny

Quoted 178 lines

Rob

Quoted 158 lines
---
  include/linux/of.h | 92 +++++++++++++++++++++++++++++++++++++-----------------
  1 file changed, 63 insertions(+), 29 deletions(-)
include/linux/of.h +56 -29
index a0f1292..7a736b8 100644
@@ -86,6 +86,31 @@ static inline struct device_node *of_node_get(struct device_node *node)
  static inline void of_node_put(struct device_node *node) { }
  #endif /* !CONFIG_OF_DYNAMIC */
 
+#define for_each_node_by_name(dn, name) \
+     for (dn = of_find_node_by_name(NULL, name); dn; \
+          dn = of_find_node_by_name(dn, name))
+#define for_each_node_by_type(dn, type) \
+     for (dn = of_find_node_by_type(NULL, type); dn; \
+          dn = of_find_node_by_type(dn, type))
+#define for_each_compatible_node(dn, type, compatible) \
+     for (dn = of_find_compatible_node(NULL, type, compatible); dn; \
+          dn = of_find_compatible_node(dn, type, compatible))
+#define for_each_matching_node(dn, matches) \
+     for (dn = of_find_matching_node(NULL, matches); dn; \
+          dn = of_find_matching_node(dn, matches))
+#define for_each_matching_node_and_match(dn, matches, match) \
+     for (dn = of_find_matching_node_and_match(NULL, matches, match); \
+          dn; dn = of_find_matching_node_and_match(dn, matches, match))
+#define for_each_child_of_node(parent, child) \
+     for (child = of_get_next_child(parent, NULL); child != NULL; \
+          child = of_get_next_child(parent, child))
+#define for_each_available_child_of_node(parent, child) \
+     for (child = of_get_next_available_child(parent, NULL); child != NULL; \
+          child = of_get_next_available_child(parent, child))
+#define for_each_node_with_property(dn, prop_name) \
+     for (dn = of_find_node_with_property(NULL, prop_name); dn; \
+          dn = of_find_node_with_property(dn, prop_name))
+
  #ifdef CONFIG_OF
 
  /* Pointer for first entry in chain of all nodes. */
@@ -167,19 +192,10 @@ static inline const char *of_node_full_name(const struct device_node *np)
 
  extern struct device_node *of_find_node_by_name(struct device_node *from,
       const char *name);
-#define for_each_node_by_name(dn, name) \
-     for (dn = of_find_node_by_name(NULL, name); dn; \
-          dn = of_find_node_by_name(dn, name))
  extern struct device_node *of_find_node_by_type(struct device_node *from,
       const char *type);
-#define for_each_node_by_type(dn, type) \
-     for (dn = of_find_node_by_type(NULL, type); dn; \
-          dn = of_find_node_by_type(dn, type))
  extern struct device_node *of_find_compatible_node(struct device_node *from,
       const char *type, const char *compat);
-#define for_each_compatible_node(dn, type, compatible) \
-     for (dn = of_find_compatible_node(NULL, type, compatible); dn; \
-          dn = of_find_compatible_node(dn, type, compatible))
  extern struct device_node *of_find_matching_node_and_match(
       struct device_node *from,
       const struct of_device_id *matches,
@@ -190,12 +206,6 @@ static inline struct device_node *of_find_matching_node(
  {
       return of_find_matching_node_and_match(from, matches, NULL);
  }
-#define for_each_matching_node(dn, matches) \
-     for (dn = of_find_matching_node(NULL, matches); dn; \
-          dn = of_find_matching_node(dn, matches))
-#define for_each_matching_node_and_match(dn, matches, match) \
-     for (dn = of_find_matching_node_and_match(NULL, matches, match); \
-          dn; dn = of_find_matching_node_and_match(dn, matches, match))
  extern struct device_node *of_find_node_by_path(const char *path);
  extern struct device_node *of_find_node_by_phandle(phandle handle);
  extern struct device_node *of_get_parent(const struct device_node *node);
@@ -207,14 +217,6 @@ extern struct device_node *of_get_next_available_child(
 
  extern struct device_node *of_get_child_by_name(const struct device_node *node,
                                       const char *name);
-#define for_each_child_of_node(parent, child) \
-     for (child = of_get_next_child(parent, NULL); child != NULL; \
-          child = of_get_next_child(parent, child))
-
-#define for_each_available_child_of_node(parent, child) \
-     for (child = of_get_next_available_child(parent, NULL); child != NULL; \
-          child = of_get_next_available_child(parent, child))
-
  static inline int of_get_child_count(const struct device_node *np)
  {
       struct device_node *child;
@@ -228,10 +230,6 @@ static inline int of_get_child_count(const struct device_node *np)
 
  extern struct device_node *of_find_node_with_property(
       struct device_node *from, const char *prop_name);
-#define for_each_node_with_property(dn, prop_name) \
-     for (dn = of_find_node_with_property(NULL, prop_name); dn; \
-          dn = of_find_node_with_property(dn, prop_name))
-
  extern struct property *of_find_property(const struct device_node *np,
                                        const char *name,
                                        int *lenp);
@@ -353,13 +351,28 @@ static inline struct device_node *of_find_node_by_name(struct device_node *from,
       return NULL;
  }
 
+static inline struct device_node *of_find_node_by_type(struct device_node *from,
+     const char *type)
+{
+     return NULL;
+}
+
  static inline bool of_have_populated_dt(void)
  {
       return false;
  }
 
-#define for_each_child_of_node(parent, child) \
-     while (0)
+static inline struct device_node *of_get_next_child(const struct device_node *node,
+                                          struct device_node *prev)
+{
+     return NULL;
+}
+
+static inline struct device_node *of_get_next_available_child(
+     const struct device_node *node, struct device_node *prev)
+{
+     return NULL;
+}
 
  static inline struct device_node *of_get_child_by_name(
                                       const struct device_node *node,
@@ -373,6 +386,12 @@ static inline int of_get_child_count(const struct device_node *np)
       return 0;
  }
 
+static inline struct device_node *of_find_node_with_property(
+     struct device_node *from, const char *prop_name)
+{
+     return NULL;
+}
+
  static inline int of_device_is_compatible(const struct device_node *device,
                                         const char *name)
  {
@@ -394,6 +413,21 @@ static inline struct device_node *of_find_compatible_node(
       return NULL;
  }
 
+static inline struct device_node *of_find_matching_node_and_match(
+     struct device_node *from,
+     const struct of_device_id *matches,
+     const struct of_device_id **match)
+{
+     return NULL;
+}
+

include/linux/of.h static inline struct device_node *of_find_compatible_node( · line 433

Quoted 10 lines
include/linux/of.h +7 -0
+static inline struct device_node *of_find_matching_node(
+     struct device_node *from,
+     const struct of_device_id *matches)
+{
+     return NULL;
+}
+
  static inline int of_property_read_u8_array(const struct device_node *np,
                       const char *propname, u8 *out_values, size_t sz)
  {

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel at lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

#3 lore raw

PATCH 1/1 of: Add missing node iteration stubs for disabled CONFIG_OF

Quoted 26 lines · Jonathan Austin

Hi Rob, Thomasz,

(dredging up an oldish thread as I just ran in to this issue)

Quoted 9 lines · Rob Herring
Quoted 6 lines · Tomasz Figa

This patch moves several for_each macros out of the #ifdef CONFIG_OF block and adds inline stubs for functions used by these macros, compiled conditionally when CONFIG_OF is not enabled.

This eliminates the need to explicitly check for CONFIG_OF in driver code using mentioned functions and macros.

Do you have some users of this?

I do!

Or at least I might.

I'm not certain as perhaps the fix to what I describe below is to add dependencies on CONFIG_OF - it isn't clear to me either way:

With both psci and arch_timers (CONFIG_ARM_PSCI, CONFIG_ARM_ARCH_TIMER) and without CONFIG_OF we get a build failure because we lack the definition of of_find_matching_node():

Quoted 5 lines

eg:
arch/arm/kernel/psci.c:167:2: error: implicit declaration of function ???of_find_matching_node??? [-Werror=implicit-function-declaration]

The same happens with arm_arch_timer.c (well, there's a patch required to include linux/of.h first, after which Thomasz's patch is relevant).

That code path is completely broken if CONFIG_OF is not set. psci_init() is nothing but calls to CONFIG_OF infrastructure! I think that code needs to depend on CONFIG_OF, or at least be wrapped with "if (IS_ENABLED(CONFIG_OF))" if there are still usable parts when CONFIG_OF is disabled. Frankly I don't see that as being a real concern.

That said, Arnd has posted a patch that moves at least some of the function prototypes out from under the #ifdef block so that GCC can do syntax checking on disabled code. That overlaps a bit with this patch.

Regardless, I'm not going to apply it without a legitimate (as opposed to theoretical) user.

g.

Quoted 194 lines

So, I guess the question is whether we should expect PSCI and ARM_ARCH_TIMER to depend on CONFIG_OF, or whether we'd like them to fail gracefully in the case that we *don't* have CONFIG_OF. I think the current situation is broken either way...

Thoughts?

Jonny

Quoted 169 lines

Rob

Quoted 166 lines
---
  include/linux/of.h | 92 +++++++++++++++++++++++++++++++++++++-----------------
  1 file changed, 63 insertions(+), 29 deletions(-)
include/linux/of.h +63 -29
index a0f1292..7a736b8 100644
@@ -86,6 +86,31 @@ static inline struct device_node *of_node_get(struct device_node *node)
  static inline void of_node_put(struct device_node *node) { }
  #endif /* !CONFIG_OF_DYNAMIC */
 
+#define for_each_node_by_name(dn, name) \
+     for (dn = of_find_node_by_name(NULL, name); dn; \
+          dn = of_find_node_by_name(dn, name))
+#define for_each_node_by_type(dn, type) \
+     for (dn = of_find_node_by_type(NULL, type); dn; \
+          dn = of_find_node_by_type(dn, type))
+#define for_each_compatible_node(dn, type, compatible) \
+     for (dn = of_find_compatible_node(NULL, type, compatible); dn; \
+          dn = of_find_compatible_node(dn, type, compatible))
+#define for_each_matching_node(dn, matches) \
+     for (dn = of_find_matching_node(NULL, matches); dn; \
+          dn = of_find_matching_node(dn, matches))
+#define for_each_matching_node_and_match(dn, matches, match) \
+     for (dn = of_find_matching_node_and_match(NULL, matches, match); \
+          dn; dn = of_find_matching_node_and_match(dn, matches, match))
+#define for_each_child_of_node(parent, child) \
+     for (child = of_get_next_child(parent, NULL); child != NULL; \
+          child = of_get_next_child(parent, child))
+#define for_each_available_child_of_node(parent, child) \
+     for (child = of_get_next_available_child(parent, NULL); child != NULL; \
+          child = of_get_next_available_child(parent, child))
+#define for_each_node_with_property(dn, prop_name) \
+     for (dn = of_find_node_with_property(NULL, prop_name); dn; \
+          dn = of_find_node_with_property(dn, prop_name))
+
  #ifdef CONFIG_OF
 
  /* Pointer for first entry in chain of all nodes. */
@@ -167,19 +192,10 @@ static inline const char *of_node_full_name(const struct device_node *np)
 
  extern struct device_node *of_find_node_by_name(struct device_node *from,
       const char *name);
-#define for_each_node_by_name(dn, name) \
-     for (dn = of_find_node_by_name(NULL, name); dn; \
-          dn = of_find_node_by_name(dn, name))
  extern struct device_node *of_find_node_by_type(struct device_node *from,
       const char *type);
-#define for_each_node_by_type(dn, type) \
-     for (dn = of_find_node_by_type(NULL, type); dn; \
-          dn = of_find_node_by_type(dn, type))
  extern struct device_node *of_find_compatible_node(struct device_node *from,
       const char *type, const char *compat);
-#define for_each_compatible_node(dn, type, compatible) \
-     for (dn = of_find_compatible_node(NULL, type, compatible); dn; \
-          dn = of_find_compatible_node(dn, type, compatible))
  extern struct device_node *of_find_matching_node_and_match(
       struct device_node *from,
       const struct of_device_id *matches,
@@ -190,12 +206,6 @@ static inline struct device_node *of_find_matching_node(
  {
       return of_find_matching_node_and_match(from, matches, NULL);
  }
-#define for_each_matching_node(dn, matches) \
-     for (dn = of_find_matching_node(NULL, matches); dn; \
-          dn = of_find_matching_node(dn, matches))
-#define for_each_matching_node_and_match(dn, matches, match) \
-     for (dn = of_find_matching_node_and_match(NULL, matches, match); \
-          dn; dn = of_find_matching_node_and_match(dn, matches, match))
  extern struct device_node *of_find_node_by_path(const char *path);
  extern struct device_node *of_find_node_by_phandle(phandle handle);
  extern struct device_node *of_get_parent(const struct device_node *node);
@@ -207,14 +217,6 @@ extern struct device_node *of_get_next_available_child(
 
  extern struct device_node *of_get_child_by_name(const struct device_node *node,
                                       const char *name);
-#define for_each_child_of_node(parent, child) \
-     for (child = of_get_next_child(parent, NULL); child != NULL; \
-          child = of_get_next_child(parent, child))
-
-#define for_each_available_child_of_node(parent, child) \
-     for (child = of_get_next_available_child(parent, NULL); child != NULL; \
-          child = of_get_next_available_child(parent, child))
-
  static inline int of_get_child_count(const struct device_node *np)
  {
       struct device_node *child;
@@ -228,10 +230,6 @@ static inline int of_get_child_count(const struct device_node *np)
 
  extern struct device_node *of_find_node_with_property(
       struct device_node *from, const char *prop_name);
-#define for_each_node_with_property(dn, prop_name) \
-     for (dn = of_find_node_with_property(NULL, prop_name); dn; \
-          dn = of_find_node_with_property(dn, prop_name))
-
  extern struct property *of_find_property(const struct device_node *np,
                                        const char *name,
                                        int *lenp);
@@ -353,13 +351,28 @@ static inline struct device_node *of_find_node_by_name(struct device_node *from,
       return NULL;
  }
 
+static inline struct device_node *of_find_node_by_type(struct device_node *from,
+     const char *type)
+{
+     return NULL;
+}
+
  static inline bool of_have_populated_dt(void)
  {
       return false;
  }
 
-#define for_each_child_of_node(parent, child) \
-     while (0)
+static inline struct device_node *of_get_next_child(const struct device_node *node,
+                                          struct device_node *prev)
+{
+     return NULL;
+}
+
+static inline struct device_node *of_get_next_available_child(
+     const struct device_node *node, struct device_node *prev)
+{
+     return NULL;
+}
 
  static inline struct device_node *of_get_child_by_name(
                                       const struct device_node *node,
@@ -373,6 +386,12 @@ static inline int of_get_child_count(const struct device_node *np)
       return 0;
  }
 
+static inline struct device_node *of_find_node_with_property(
+     struct device_node *from, const char *prop_name)
+{
+     return NULL;
+}
+
  static inline int of_device_is_compatible(const struct device_node *device,
                                         const char *name)
  {
@@ -394,6 +413,21 @@ static inline struct device_node *of_find_compatible_node(
       return NULL;
  }
 
+static inline struct device_node *of_find_matching_node_and_match(
+     struct device_node *from,
+     const struct of_device_id *matches,
+     const struct of_device_id **match)
+{
+     return NULL;
+}
+
+static inline struct device_node *of_find_matching_node(
+     struct device_node *from,
+     const struct of_device_id *matches)
+{
+     return NULL;
+}
+
  static inline int of_property_read_u8_array(const struct device_node *np,
                       const char *propname, u8 *out_values, size_t sz)
Quoted 9 lines

include/linux/of.h static inline struct device_node *of_find_compatible_node( · line 433

Quoted 2 lines
include/linux/of.h +0 -0
  {

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel at lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel at lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

Signature · 2 lines
Grant Likely, B.Sc, P.Eng.
Secret Lab Technologies, Ltd.
#4 lore raw

PATCH 1/1 of: Add missing node iteration stubs for disabled CONFIG_OF

Hi,

Quoted 1 line · On Tuesday 11 of June 2013 22:51:47 Grant Likely wrote:

On Tue, 11 Jun 2013 17:22:55 +0100, Jonathan Austin

Quoted 11 lines · <[email protected]> wrote:
Quoted 11 lines

Hi Rob, Thomasz,

(dredging up an oldish thread as I just ran in to this issue)

Quoted 6 lines · Rob Herring
Quoted 5 lines · Tomasz Figa

This patch moves several for_each macros out of the #ifdef CONFIG_OF
block and adds inline stubs for functions used by these macros, compiled conditionally when CONFIG_OF is not enabled.

Quoted 6 lines
Quoted 6 lines
Quoted 5 lines
Quoted 3 lines

This eliminates the need to explicitly check for CONFIG_OF in driver
code using mentioned functions and macros.

Do you have some users of this?

Oops, it looks like I have missed Rob's reply.

I had eventually managed to get rid of code that needed this patch and forgotten about it, but still this allowed me to track a problem with my mail filtering...

Best regards,
Tomasz

Quoted 281 lines
Quoted 12 lines

I do!

Or at least I might.

I'm not certain as perhaps the fix to what I describe below is to add dependencies on CONFIG_OF - it isn't clear to me either way:

With both psci and arch_timers (CONFIG_ARM_PSCI, CONFIG_ARM_ARCH_TIMER)
and without CONFIG_OF we get a build failure because we lack the definition of of_find_matching_node():

Quoted 7 lines

eg:
arch/arm/kernel/psci.c:167:2: error: implicit declaration of function ???of_find_matching_node??? [-Werror=implicit-function-declaration]

The same happens with arm_arch_timer.c (well, there's a patch required to include linux/of.h first, after which Thomasz's patch is relevant).

That code path is completely broken if CONFIG_OF is not set. psci_init() is nothing but calls to CONFIG_OF infrastructure! I think that code needs to depend on CONFIG_OF, or at least be wrapped with "if (IS_ENABLED(CONFIG_OF))" if there are still usable parts when CONFIG_OF is disabled. Frankly I don't see that as being a real concern.

That said, Arnd has posted a patch that moves at least some of the function prototypes out from under the #ifdef block so that GCC can do syntax checking on disabled code. That overlaps a bit with this patch.

Regardless, I'm not going to apply it without a legitimate (as opposed to theoretical) user.

g.

Quoted 247 lines

So, I guess the question is whether we should expect PSCI and ARM_ARCH_TIMER to depend on CONFIG_OF, or whether we'd like them to fail gracefully in the case that we *don't* have CONFIG_OF. I think the current situation is broken either way...

Thoughts?

Jonny

Quoted 227 lines

Rob

Quoted 225 lines

---

  include/linux/of.h | 92

+++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 63 insertions(+), 29 deletions(-)

include/linux/of.h +14 -0
index a0f1292..7a736b8 100644
@@ -86,6 +86,31 @@ static inline struct device_node
 *of_node_get(struct device_node *node)> >> 
  static inline void of_node_put(struct device_node *node) { }
  #endif /* !CONFIG_OF_DYNAMIC */
 
+#define for_each_node_by_name(dn, name) \
+     for (dn = of_find_node_by_name(NULL, name); dn; \
+          dn = of_find_node_by_name(dn, name))
+#define for_each_node_by_type(dn, type) \
+     for (dn = of_find_node_by_type(NULL, type); dn; \
+          dn = of_find_node_by_type(dn, type))
+#define for_each_compatible_node(dn, type, compatible) \
+     for (dn = of_find_compatible_node(NULL, type, compatible);
 dn; \
+          dn = of_find_compatible_node(dn, type, compatible))
+#define for_each_matching_node(dn, matches) \
+     for (dn = of_find_matching_node(NULL, matches); dn; \
+          dn = of_find_matching_node(dn, matches))
+#define for_each_matching_node_and_match(dn, matches, match) \
+     for (dn = of_find_matching_node_and_match(NULL, matches,
 match); \ +          dn; dn = of_find_matching_node_and_match(dn,

matches, match)) +#define for_each_child_of_node(parent, child) \
+ for (child = of_get_next_child(parent, NULL); child != NULL;
\

include/linux/of.h +3 -0
+          child = of_get_next_child(parent, child))
+#define for_each_available_child_of_node(parent, child) \
+     for (child = of_get_next_available_child(parent, NULL); child

!= NULL; \ + child = of_get_next_available_child(parent,
child)) +#define for_each_node_with_property(dn, prop_name) \

include/linux/of.h +3 -8
+     for (dn = of_find_node_with_property(NULL, prop_name); dn; \
+          dn = of_find_node_with_property(dn, prop_name))
+
 
  #ifdef CONFIG_OF
 
  /* Pointer for first entry in chain of all nodes. */
@@ -167,19 +192,10 @@ static inline const char
 *of_node_full_name(const struct device_node *np)> >> 
  extern struct device_node *of_find_node_by_name(struct
  device_node *from,> >>   
       const char *name);
 
-#define for_each_node_by_name(dn, name) \
-     for (dn = of_find_node_by_name(NULL, name); dn; \
-          dn = of_find_node_by_name(dn, name))
 
  extern struct device_node *of_find_node_by_type(struct
  device_node *from,> >>   
       const char *type);
 
-#define for_each_node_by_type(dn, type) \
-     for (dn = of_find_node_by_type(NULL, type); dn; \
-          dn = of_find_node_by_type(dn, type))
 
  extern struct device_node *of_find_compatible_node(struct
  device_node *from,> >>   
       const char *type, const char *compat);
 
-#define for_each_compatible_node(dn, type, compatible) \
-     for (dn = of_find_compatible_node(NULL, type, compatible);

dn; \

include/linux/of.h +0 -6
-          dn = of_find_compatible_node(dn, type, compatible))
 
  extern struct device_node *of_find_matching_node_and_match(
 
       struct device_node *from,
       const struct of_device_id *matches,
@@ -190,12 +206,6 @@ static inline struct device_node
 *of_find_matching_node(> >> 
  {
 
       return of_find_matching_node_and_match(from, matches, NULL);
 
  }
 
-#define for_each_matching_node(dn, matches) \
-     for (dn = of_find_matching_node(NULL, matches); dn; \
-          dn = of_find_matching_node(dn, matches))
-#define for_each_matching_node_and_match(dn, matches, match) \
-     for (dn = of_find_matching_node_and_match(NULL, matches,

match); \ - dn; dn = of_find_matching_node_and_match(dn,
matches, match))> >>
extern struct device_node *of_find_node_by_path(const char *path);
extern struct device_node *of_find_node_by_phandle(phandle handle);
extern struct device_node *of_get_parent(const struct device_node *node);> >>

include/linux/of.h +0 -6
@@ -207,14 +217,6 @@ extern struct device_node
 *of_get_next_available_child(> >> 
  extern struct device_node *of_get_child_by_name(const struct
  device_node *node,> >>   
                                       const char *name);
 
-#define for_each_child_of_node(parent, child) \
-     for (child = of_get_next_child(parent, NULL); child != NULL;
 \
-          child = of_get_next_child(parent, child))
-
-#define for_each_available_child_of_node(parent, child) \
-     for (child = of_get_next_available_child(parent, NULL); child

!= NULL; \ - child = of_get_next_available_child(parent,
child)) -

  static inline int of_get_child_count(const struct device_node
  *np)
  {
       struct device_node *child;
include/linux/of.h +0 -0
@@ -228,10 +230,6 @@ static inline int of_get_child_count(const

struct device_node *np)> >>
extern struct device_node *of_find_node_with_property(

       struct device_node *from, const char *prop_name);
include/linux/of.h +6 -6
-#define for_each_node_with_property(dn, prop_name) \
-     for (dn = of_find_node_with_property(NULL, prop_name); dn; \
-          dn = of_find_node_with_property(dn, prop_name))
-
 
  extern struct property *of_find_property(const struct device_node
  *np,
 
                                        const char *name,
                                        int *lenp);
@@ -353,13 +351,28 @@ static inline struct device_node
 *of_find_node_by_name(struct device_node *from,> >> 
       return NULL;
 
  }
 
+static inline struct device_node *of_find_node_by_type(struct
 device_node *from, +     const char *type)
+{
+     return NULL;
+}
+
 
  static inline bool of_have_populated_dt(void)
  {
 
       return false;
 
  }
 
-#define for_each_child_of_node(parent, child) \
-     while (0)
+static inline struct device_node *of_get_next_child(const struct

device_node *node, +
struct device_node *prev) +{

include/linux/of.h +8 -0
+     return NULL;
+}
+
+static inline struct device_node *of_get_next_available_child(
+     const struct device_node *node, struct device_node *prev)
+{
+     return NULL;
+}
 
  static inline struct device_node *of_get_child_by_name(
 
                                       const struct device_node
                                       *node,
@@ -373,6 +386,12 @@ static inline int of_get_child_count(const

struct device_node *np)> >>

       return 0;
  }
include/linux/of.h +21 -0
+static inline struct device_node *of_find_node_with_property(
+     struct device_node *from, const char *prop_name)
+{
+     return NULL;
+}
+
 
  static inline int of_device_is_compatible(const struct
  device_node *device,> >>   
                                         const char *name)
 
  {
@@ -394,6 +413,21 @@ static inline struct device_node
 *of_find_compatible_node(> >> 
       return NULL;
 
  }
 
+static inline struct device_node *of_find_matching_node_and_match(
+     struct device_node *from,
+     const struct of_device_id *matches,
+     const struct of_device_id **match)
+{
+     return NULL;
+}
+
+static inline struct device_node *of_find_matching_node(
+     struct device_node *from,
+     const struct of_device_id *matches)
+{
+     return NULL;
+}
+
 

static inline int of_property_read_u8_array(const struct device_node *np,> >>
const char *propname, u8 *out_values, size_t sz)

Quoted 6 lines
Quoted 1 line
  {

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel at lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel at lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

#5 lore raw

PATCH 1/1 of: Add missing node iteration stubs for disabled CONFIG_OF

In reply to Grant Likely
Quoted 27 lines · Grant Likely
Quoted 26 lines · Jonathan Austin

Hi Rob, Thomasz,

(dredging up an oldish thread as I just ran in to this issue)

Quoted 9 lines · Rob Herring
Quoted 6 lines · Tomasz Figa

This patch moves several for_each macros out of the #ifdef CONFIG_OF block and adds inline stubs for functions used by these macros, compiled conditionally when CONFIG_OF is not enabled.

This eliminates the need to explicitly check for CONFIG_OF in driver code using mentioned functions and macros.

Do you have some users of this?

I do!

Or at least I might.

I'm not certain as perhaps the fix to what I describe below is to add dependencies on CONFIG_OF - it isn't clear to me either way:

With both psci and arch_timers (CONFIG_ARM_PSCI, CONFIG_ARM_ARCH_TIMER) and without CONFIG_OF we get a build failure because we lack the definition of of_find_matching_node():

Quoted 8 lines
Quoted 5 lines

eg:
arch/arm/kernel/psci.c:167:2: error: implicit declaration of function ???of_find_matching_node??? [-Werror=implicit-function-declaration]

The same happens with arm_arch_timer.c (well, there's a patch required to include linux/of.h first, after which Thomasz's patch is relevant).

That code path is completely broken if CONFIG_OF is not set. psci_init() is nothing but calls to CONFIG_OF infrastructure! I think that code

Well, it looks like the intention of that code was to just behave like there was no relevant node in the case the CONFIG_OF was disabled:

	np = of_find_matching_node(NULL, psci_of_match);
	if (!np)
		return 0;

If of_find_matching() node behaved like of_match_node() then nothing would be 'broken' per se, but we would have a bunch of useless code compiled in to our kernel.

Quoted 3 lines

needs to depend on CONFIG_OF, or at least be wrapped with "if (IS_ENABLED(CONFIG_OF))" if there are still usable parts when CONFIG_OF is disabled. Frankly I don't see that as being a real concern.

Indeed, despite the clarification above, I think it'd be fine to not build these without CONFIG_OF.

I'm happy to submit a patches to add dependencies on CONFIG_OF for ARM_ARCH_TIMER and ARM_PSCI - I don't think either of those will get any complaints because as you say, neither makes very much sense without a DT to specify them.

Thanks,
Jonny

Quoted 205 lines

That said, Arnd has posted a patch that moves at least some of the function prototypes out from under the #ifdef block so that GCC can do syntax checking on disabled code. That overlaps a bit with this patch.

Regardless, I'm not going to apply it without a legitimate (as opposed to theoretical) user.

g.

Quoted 194 lines

So, I guess the question is whether we should expect PSCI and ARM_ARCH_TIMER to depend on CONFIG_OF, or whether we'd like them to fail gracefully in the case that we *don't* have CONFIG_OF. I think the current situation is broken either way...

Thoughts?

Jonny

Quoted 169 lines

Rob

Quoted 166 lines
---
   include/linux/of.h | 92 +++++++++++++++++++++++++++++++++++++-----------------
   1 file changed, 63 insertions(+), 29 deletions(-)
include/linux/of.h +63 -29
index a0f1292..7a736b8 100644
@@ -86,6 +86,31 @@ static inline struct device_node *of_node_get(struct device_node *node)
   static inline void of_node_put(struct device_node *node) { }
   #endif /* !CONFIG_OF_DYNAMIC */
 
+#define for_each_node_by_name(dn, name) \
+     for (dn = of_find_node_by_name(NULL, name); dn; \
+          dn = of_find_node_by_name(dn, name))
+#define for_each_node_by_type(dn, type) \
+     for (dn = of_find_node_by_type(NULL, type); dn; \
+          dn = of_find_node_by_type(dn, type))
+#define for_each_compatible_node(dn, type, compatible) \
+     for (dn = of_find_compatible_node(NULL, type, compatible); dn; \
+          dn = of_find_compatible_node(dn, type, compatible))
+#define for_each_matching_node(dn, matches) \
+     for (dn = of_find_matching_node(NULL, matches); dn; \
+          dn = of_find_matching_node(dn, matches))
+#define for_each_matching_node_and_match(dn, matches, match) \
+     for (dn = of_find_matching_node_and_match(NULL, matches, match); \
+          dn; dn = of_find_matching_node_and_match(dn, matches, match))
+#define for_each_child_of_node(parent, child) \
+     for (child = of_get_next_child(parent, NULL); child != NULL; \
+          child = of_get_next_child(parent, child))
+#define for_each_available_child_of_node(parent, child) \
+     for (child = of_get_next_available_child(parent, NULL); child != NULL; \
+          child = of_get_next_available_child(parent, child))
+#define for_each_node_with_property(dn, prop_name) \
+     for (dn = of_find_node_with_property(NULL, prop_name); dn; \
+          dn = of_find_node_with_property(dn, prop_name))
+
   #ifdef CONFIG_OF
 
   /* Pointer for first entry in chain of all nodes. */
@@ -167,19 +192,10 @@ static inline const char *of_node_full_name(const struct device_node *np)
 
   extern struct device_node *of_find_node_by_name(struct device_node *from,
        const char *name);
-#define for_each_node_by_name(dn, name) \
-     for (dn = of_find_node_by_name(NULL, name); dn; \
-          dn = of_find_node_by_name(dn, name))
   extern struct device_node *of_find_node_by_type(struct device_node *from,
        const char *type);
-#define for_each_node_by_type(dn, type) \
-     for (dn = of_find_node_by_type(NULL, type); dn; \
-          dn = of_find_node_by_type(dn, type))
   extern struct device_node *of_find_compatible_node(struct device_node *from,
        const char *type, const char *compat);
-#define for_each_compatible_node(dn, type, compatible) \
-     for (dn = of_find_compatible_node(NULL, type, compatible); dn; \
-          dn = of_find_compatible_node(dn, type, compatible))
   extern struct device_node *of_find_matching_node_and_match(
        struct device_node *from,
        const struct of_device_id *matches,
@@ -190,12 +206,6 @@ static inline struct device_node *of_find_matching_node(
   {
        return of_find_matching_node_and_match(from, matches, NULL);
   }
-#define for_each_matching_node(dn, matches) \
-     for (dn = of_find_matching_node(NULL, matches); dn; \
-          dn = of_find_matching_node(dn, matches))
-#define for_each_matching_node_and_match(dn, matches, match) \
-     for (dn = of_find_matching_node_and_match(NULL, matches, match); \
-          dn; dn = of_find_matching_node_and_match(dn, matches, match))
   extern struct device_node *of_find_node_by_path(const char *path);
   extern struct device_node *of_find_node_by_phandle(phandle handle);
   extern struct device_node *of_get_parent(const struct device_node *node);
@@ -207,14 +217,6 @@ extern struct device_node *of_get_next_available_child(
 
   extern struct device_node *of_get_child_by_name(const struct device_node *node,
                                        const char *name);
-#define for_each_child_of_node(parent, child) \
-     for (child = of_get_next_child(parent, NULL); child != NULL; \
-          child = of_get_next_child(parent, child))
-
-#define for_each_available_child_of_node(parent, child) \
-     for (child = of_get_next_available_child(parent, NULL); child != NULL; \
-          child = of_get_next_available_child(parent, child))
-
   static inline int of_get_child_count(const struct device_node *np)
   {
        struct device_node *child;
@@ -228,10 +230,6 @@ static inline int of_get_child_count(const struct device_node *np)
 
   extern struct device_node *of_find_node_with_property(
        struct device_node *from, const char *prop_name);
-#define for_each_node_with_property(dn, prop_name) \
-     for (dn = of_find_node_with_property(NULL, prop_name); dn; \
-          dn = of_find_node_with_property(dn, prop_name))
-
   extern struct property *of_find_property(const struct device_node *np,
                                         const char *name,
                                         int *lenp);
@@ -353,13 +351,28 @@ static inline struct device_node *of_find_node_by_name(struct device_node *from,
        return NULL;
   }
 
+static inline struct device_node *of_find_node_by_type(struct device_node *from,
+     const char *type)
+{
+     return NULL;
+}
+
   static inline bool of_have_populated_dt(void)
   {
        return false;
   }
 
-#define for_each_child_of_node(parent, child) \
-     while (0)
+static inline struct device_node *of_get_next_child(const struct device_node *node,
+                                          struct device_node *prev)
+{
+     return NULL;
+}
+
+static inline struct device_node *of_get_next_available_child(
+     const struct device_node *node, struct device_node *prev)
+{
+     return NULL;
+}
 
   static inline struct device_node *of_get_child_by_name(
                                        const struct device_node *node,
@@ -373,6 +386,12 @@ static inline int of_get_child_count(const struct device_node *np)
        return 0;
   }
 
+static inline struct device_node *of_find_node_with_property(
+     struct device_node *from, const char *prop_name)
+{
+     return NULL;
+}
+
   static inline int of_device_is_compatible(const struct device_node *device,
                                          const char *name)
   {
@@ -394,6 +413,21 @@ static inline struct device_node *of_find_compatible_node(
        return NULL;
   }
 
+static inline struct device_node *of_find_matching_node_and_match(
+     struct device_node *from,
+     const struct of_device_id *matches,
+     const struct of_device_id **match)
+{
+     return NULL;
+}
+
+static inline struct device_node *of_find_matching_node(
+     struct device_node *from,
+     const struct of_device_id *matches)
+{
+     return NULL;
+}
+
   static inline int of_property_read_u8_array(const struct device_node *np,
                        const char *propname, u8 *out_values, size_t sz)
Quoted 9 lines

include/linux/of.h static inline struct device_node *of_find_compatible_node( · line 433

Quoted 2 lines
include/linux/of.h +0 -0
   {

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel at lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel at lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel