of: Add missing node iteration stubs for disabled CONFIG_OF
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
@@ -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
PATCH 1/1 of: Add missing node iteration stubs for disabled CONFIG_OF
Quoted 6 lines · Tomasz Figa
This patch moves several
for_eachmacros out of the #ifdefCONFIG_OFblock and adds inline stubs for functions used by these macros, compiled conditionally whenCONFIG_OFis not enabled.This eliminates the need to explicitly check for
CONFIG_OFin driver code using mentioned functions and macros.
Do you have some users of this?
Rob
Quoted 168 lines
Signed-off-by Tomasz Figa <[email protected]>--- include/linux/of.h | 92 +++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 63 insertions(+), 29 deletions(-)include/linux/of.h +63
-29@@ -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) {
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_eachmacros out of the #ifdefCONFIG_OFblock and adds inline stubs for functions used by these macros, compiled conditionally whenCONFIG_OFis not enabled.This eliminates the need to explicitly check for
CONFIG_OFin 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
Signed-off-by Tomasz Figa <[email protected]>--- include/linux/of.h | 92 +++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 63 insertions(+), 29 deletions(-)include/linux/of.h +56
-29@@ -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
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_eachmacros out of the #ifdefCONFIG_OFblock and adds inline stubs for functions used by these macros, compiled conditionally whenCONFIG_OFis not enabled.This eliminates the need to explicitly check for
CONFIG_OFin 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 withoutCONFIG_OFwe get a build failure because we lack the definition ofof_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 includelinux/of.hfirst, 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_TIMERto depend onCONFIG_OF, or whether we'd like them to fail gracefully in the case that we *don't* haveCONFIG_OF. I think the current situation is broken either way...Thoughts?
Jonny
Quoted 169 lines
Rob
Quoted 166 lines
Signed-off-by Tomasz Figa <[email protected]>--- include/linux/of.h | 92 +++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 63 insertions(+), 29 deletions(-)include/linux/of.h +63
-29@@ -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.
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_eachmacros out of the #ifdefCONFIG_OF
block and adds inline stubs for functions used by these macros, compiled conditionally whenCONFIG_OFis not enabled.
Quoted 6 lines
Quoted 6 lines
Quoted 5 lines
Quoted 3 lines
This eliminates the need to explicitly check for
CONFIG_OFin 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 withoutCONFIG_OFwe get a build failure because we lack the definition ofof_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 includelinux/of.hfirst, after which Thomasz's patch is relevant).That code path is completely broken if
CONFIG_OFis not set.psci_init()is nothing but calls toCONFIG_OFinfrastructure! I think that code needs to depend onCONFIG_OF, or at least be wrapped with "if (IS_ENABLED(CONFIG_OF))" if there are still usable parts whenCONFIG_OFis 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_TIMERto depend onCONFIG_OF, or whether we'd like them to fail gracefully in the case that we *don't* haveCONFIG_OF. I think the current situation is broken either way...Thoughts?
Jonny
Quoted 227 lines
Rob
Quoted 225 lines
Signed-off-by Tomasz Figa <[email protected]>---
include/linux/of.h | 92+++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 63 insertions(+), 29 deletions(-)
include/linux/of.h +14
-0@@ -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)) +#definefor_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 structdevice_node*of_find_node_by_path(const char *path);
extern structdevice_node*of_find_node_by_phandle(phandle handle);
extern structdevice_node*of_get_parent(const structdevice_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(conststruct
device_node*np)> >>
extern structdevice_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, +
structdevice_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(conststruct
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_tsz)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
PATCH 1/1 of: Add missing node iteration stubs for disabled CONFIG_OF
In reply to Grant LikelyQuoted 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_eachmacros out of the #ifdefCONFIG_OFblock and adds inline stubs for functions used by these macros, compiled conditionally whenCONFIG_OFis not enabled.This eliminates the need to explicitly check for
CONFIG_OFin 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 withoutCONFIG_OFwe get a build failure because we lack the definition ofof_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 includelinux/of.hfirst, after which Thomasz's patch is relevant).That code path is completely broken if
CONFIG_OFis not set.psci_init()is nothing but calls toCONFIG_OFinfrastructure! 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 whenCONFIG_OFis 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_TIMERto depend onCONFIG_OF, or whether we'd like them to fail gracefully in the case that we *don't* haveCONFIG_OF. I think the current situation is broken either way...Thoughts?
Jonny
Quoted 169 lines
Rob
Quoted 166 lines
Signed-off-by Tomasz Figa <[email protected]>--- include/linux/of.h | 92 +++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 63 insertions(+), 29 deletions(-)include/linux/of.h +63
-29@@ -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