* [RFC] Add of_find_matching_node() helper function
@ 2008-01-07 18:15 Grant Likely
2008-01-07 19:23 ` Stephen Neuendorffer
2008-01-08 0:48 ` Stephen Rothwell
0 siblings, 2 replies; 3+ messages in thread
From: Grant Likely @ 2008-01-07 18:15 UTC (permalink / raw)
To: paulus, sfr, linuxppc-dev
From: Grant Likely <grant.likely@secretlab.ca>
Similar to of_find_compatible_node(), of_find_matching_node() and
for_each_matching_node() allow you to iterate over the device tree
looking for specific nodes except that it accepts a of_device_id
table instead of strings.
This patch also moves of_match_node() from driver/of/device.c to
driver/of/base.c to colocate it with the of_find_matching_node which
depends on it.
Signed-off-by: Grant Likely <grant.likely@secretlab.ca>
---
I've found this change useful for the 5200 board ports to clean up the
platform matching code. It works well in my environment, but it could
have farther reaching consequences. Please review and comment.
Cheers,
g.
drivers/of/base.c | 58 +++++++++++++++++++++++++++++++++++++++++++++
drivers/of/device.c | 29 -----------------------
include/linux/of.h | 8 ++++++
include/linux/of_device.h | 2 --
4 files changed, 66 insertions(+), 31 deletions(-)
diff --git a/drivers/of/base.c b/drivers/of/base.c
index 9377f3b..b306fef 100644
--- a/drivers/of/base.c
+++ b/drivers/of/base.c
@@ -273,3 +273,61 @@ struct device_node *of_find_compatible_node(struct device_node *from,
return np;
}
EXPORT_SYMBOL(of_find_compatible_node);
+
+/**
+ * of_match_node - Tell if an device_node has a matching of_match structure
+ * @matches: array of of device match structures to search in
+ * @node: the of device structure to match against
+ *
+ * Low level utility function used by device matching.
+ */
+const struct of_device_id *of_match_node(const struct of_device_id *matches,
+ const struct device_node *node)
+{
+ while (matches->name[0] || matches->type[0] || matches->compatible[0]) {
+ int match = 1;
+ if (matches->name[0])
+ match &= node->name
+ && !strcmp(matches->name, node->name);
+ if (matches->type[0])
+ match &= node->type
+ && !strcmp(matches->type, node->type);
+ if (matches->compatible[0])
+ match &= of_device_is_compatible(node,
+ matches->compatible);
+ if (match)
+ return matches;
+ matches++;
+ }
+ return NULL;
+}
+EXPORT_SYMBOL(of_match_node);
+
+/**
+ * of_find_matching_node - Find a node based on an of_device_id match
+ * table.
+ * @from: The node to start searching from or NULL, the node
+ * you pass will not be searched, only the next one
+ * will; typically, you pass what the previous call
+ * returned. of_node_put() will be called on it
+ * @matches: array of of device match structures to search in
+ *
+ * Returns a node pointer with refcount incremented, use
+ * of_node_put() on it when done.
+ */
+struct device_node *of_find_matching_node(struct device_node *from,
+ const struct of_device_id *matches)
+{
+ struct device_node *np;
+
+ read_lock(&devtree_lock);
+ np = from ? from->allnext : allnodes;
+ for (; np; np = np->allnext) {
+ if (of_match_node(matches, np) && of_node_get(np))
+ break;
+ }
+ of_node_put(from);
+ read_unlock(&devtree_lock);
+ return np;
+}
+EXPORT_SYMBOL(of_find_matching_node);
diff --git a/drivers/of/device.c b/drivers/of/device.c
index 6245f06..29681c4 100644
--- a/drivers/of/device.c
+++ b/drivers/of/device.c
@@ -10,35 +10,6 @@
#include <asm/errno.h>
/**
- * of_match_node - Tell if an device_node has a matching of_match structure
- * @ids: array of of device match structures to search in
- * @node: the of device structure to match against
- *
- * Low level utility function used by device matching.
- */
-const struct of_device_id *of_match_node(const struct of_device_id *matches,
- const struct device_node *node)
-{
- while (matches->name[0] || matches->type[0] || matches->compatible[0]) {
- int match = 1;
- if (matches->name[0])
- match &= node->name
- && !strcmp(matches->name, node->name);
- if (matches->type[0])
- match &= node->type
- && !strcmp(matches->type, node->type);
- if (matches->compatible[0])
- match &= of_device_is_compatible(node,
- matches->compatible);
- if (match)
- return matches;
- matches++;
- }
- return NULL;
-}
-EXPORT_SYMBOL(of_match_node);
-
-/**
* of_match_device - Tell if an of_device structure has a matching
* of_match structure
* @ids: array of of device match structures to search in
diff --git a/include/linux/of.h b/include/linux/of.h
index c65af7b..b5f33ef 100644
--- a/include/linux/of.h
+++ b/include/linux/of.h
@@ -17,6 +17,7 @@
*/
#include <linux/types.h>
#include <linux/bitops.h>
+#include <linux/mod_devicetable.h>
#include <asm/prom.h>
@@ -41,6 +42,11 @@ extern struct device_node *of_find_compatible_node(struct device_node *from,
#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(struct device_node *from,
+ const struct of_device_id *matches);
+#define for_each_matching_node(dn, matches) \
+ for (dn = of_find_matching_node(NULL, matches); dn; \
+ dn = of_find_matching_node(dn, matches))
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);
@@ -60,5 +66,7 @@ extern const void *of_get_property(const struct device_node *node,
int *lenp);
extern int of_n_addr_cells(struct device_node *np);
extern int of_n_size_cells(struct device_node *np);
+extern const struct of_device_id *of_match_node(
+ const struct of_device_id *matches, const struct device_node *node);
#endif /* _LINUX_OF_H */
diff --git a/include/linux/of_device.h b/include/linux/of_device.h
index 212bffb..6dc1195 100644
--- a/include/linux/of_device.h
+++ b/include/linux/of_device.h
@@ -10,8 +10,6 @@
#define to_of_device(d) container_of(d, struct of_device, dev)
-extern const struct of_device_id *of_match_node(
- const struct of_device_id *matches, const struct device_node *node);
extern const struct of_device_id *of_match_device(
const struct of_device_id *matches, const struct of_device *dev);
^ permalink raw reply related [flat|nested] 3+ messages in thread* RE: [RFC] Add of_find_matching_node() helper function
2008-01-07 18:15 [RFC] Add of_find_matching_node() helper function Grant Likely
@ 2008-01-07 19:23 ` Stephen Neuendorffer
2008-01-08 0:48 ` Stephen Rothwell
1 sibling, 0 replies; 3+ messages in thread
From: Stephen Neuendorffer @ 2008-01-07 19:23 UTC (permalink / raw)
To: Grant Likely, paulus, sfr, linuxppc-dev
I wanted such function too, but stopped short of writing it because
of_match_node was in the wrong place.
Steve
> -----Original Message-----
> From: =
linuxppc-dev-bounces+stephen.neuendorffer=3Dxilinx.com@ozlabs.org
[mailto:linuxppc-dev-
> bounces+stephen.neuendorffer=3Dxilinx.com@ozlabs.org] On Behalf Of =
Grant
Likely
> Sent: Monday, January 07, 2008 10:16 AM
> To: paulus@samba.org; sfr@canb.auug.org.au; linuxppc-dev@ozlabs.org
> Subject: [RFC] Add of_find_matching_node() helper function
>=20
> From: Grant Likely <grant.likely@secretlab.ca>
>=20
> Similar to of_find_compatible_node(), of_find_matching_node() and
> for_each_matching_node() allow you to iterate over the device tree
> looking for specific nodes except that it accepts a of_device_id
> table instead of strings.
>=20
> This patch also moves of_match_node() from driver/of/device.c to
> driver/of/base.c to colocate it with the of_find_matching_node which
> depends on it.
>=20
> Signed-off-by: Grant Likely <grant.likely@secretlab.ca>
> ---
>=20
> I've found this change useful for the 5200 board ports to clean up the
> platform matching code. It works well in my environment, but it could
> have farther reaching consequences. Please review and comment.
>=20
> Cheers,
> g.
>=20
> drivers/of/base.c | 58
+++++++++++++++++++++++++++++++++++++++++++++
> drivers/of/device.c | 29 -----------------------
> include/linux/of.h | 8 ++++++
> include/linux/of_device.h | 2 --
> 4 files changed, 66 insertions(+), 31 deletions(-)
>=20
> diff --git a/drivers/of/base.c b/drivers/of/base.c
> index 9377f3b..b306fef 100644
> --- a/drivers/of/base.c
> +++ b/drivers/of/base.c
> @@ -273,3 +273,61 @@ struct device_node
*of_find_compatible_node(struct device_node *from,
> return np;
> }
> EXPORT_SYMBOL(of_find_compatible_node);
> +
> +/**
> + * of_match_node - Tell if an device_node has a matching of_match
structure
> + * @matches: array of of device match structures to search in
> + * @node: the of device structure to match against
> + *
> + * Low level utility function used by device matching.
> + */
> +const struct of_device_id *of_match_node(const struct of_device_id
*matches,
> + const struct device_node *node)
> +{
> + while (matches->name[0] || matches->type[0] ||
matches->compatible[0]) {
> + int match =3D 1;
> + if (matches->name[0])
> + match &=3D node->name
> + && !strcmp(matches->name, node->name);
> + if (matches->type[0])
> + match &=3D node->type
> + && !strcmp(matches->type, node->type);
> + if (matches->compatible[0])
> + match &=3D of_device_is_compatible(node,
> + matches->compatible);
> + if (match)
> + return matches;
> + matches++;
> + }
> + return NULL;
> +}
> +EXPORT_SYMBOL(of_match_node);
> +
> +/**
> + * of_find_matching_node - Find a node based on an of_device_id
match
> + * table.
> + * @from: The node to start searching from or NULL, the
node
> + * you pass will not be searched, only the next one
> + * will; typically, you pass what the previous call
> + * returned. of_node_put() will be called on it
> + * @matches: array of of device match structures to search in
> + *
> + * Returns a node pointer with refcount incremented, use
> + * of_node_put() on it when done.
> + */
> +struct device_node *of_find_matching_node(struct device_node *from,
> + const struct of_device_id
*matches)
> +{
> + struct device_node *np;
> +
> + read_lock(&devtree_lock);
> + np =3D from ? from->allnext : allnodes;
> + for (; np; np =3D np->allnext) {
> + if (of_match_node(matches, np) && of_node_get(np))
> + break;
> + }
> + of_node_put(from);
> + read_unlock(&devtree_lock);
> + return np;
> +}
> +EXPORT_SYMBOL(of_find_matching_node);
> diff --git a/drivers/of/device.c b/drivers/of/device.c
> index 6245f06..29681c4 100644
> --- a/drivers/of/device.c
> +++ b/drivers/of/device.c
> @@ -10,35 +10,6 @@
> #include <asm/errno.h>
>=20
> /**
> - * of_match_node - Tell if an device_node has a matching of_match
structure
> - * @ids: array of of device match structures to search in
> - * @node: the of device structure to match against
> - *
> - * Low level utility function used by device matching.
> - */
> -const struct of_device_id *of_match_node(const struct of_device_id
*matches,
> - const struct device_node *node)
> -{
> - while (matches->name[0] || matches->type[0] ||
matches->compatible[0]) {
> - int match =3D 1;
> - if (matches->name[0])
> - match &=3D node->name
> - && !strcmp(matches->name, node->name);
> - if (matches->type[0])
> - match &=3D node->type
> - && !strcmp(matches->type, node->type);
> - if (matches->compatible[0])
> - match &=3D of_device_is_compatible(node,
> - matches->compatible);
> - if (match)
> - return matches;
> - matches++;
> - }
> - return NULL;
> -}
> -EXPORT_SYMBOL(of_match_node);
> -
> -/**
> * of_match_device - Tell if an of_device structure has a matching
> * of_match structure
> * @ids: array of of device match structures to search in
> diff --git a/include/linux/of.h b/include/linux/of.h
> index c65af7b..b5f33ef 100644
> --- a/include/linux/of.h
> +++ b/include/linux/of.h
> @@ -17,6 +17,7 @@
> */
> #include <linux/types.h>
> #include <linux/bitops.h>
> +#include <linux/mod_devicetable.h>
>=20
> #include <asm/prom.h>
>=20
> @@ -41,6 +42,11 @@ extern struct device_node
*of_find_compatible_node(struct device_node *from,
> #define for_each_compatible_node(dn, type, compatible) \
> for (dn =3D of_find_compatible_node(NULL, type, compatible); dn; \
> dn =3D of_find_compatible_node(dn, type, compatible))
> +extern struct device_node *of_find_matching_node(struct device_node
*from,
> + const struct of_device_id *matches);
> +#define for_each_matching_node(dn, matches) \
> + for (dn =3D of_find_matching_node(NULL, matches); dn; \
> + dn =3D of_find_matching_node(dn, matches))
> 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);
> @@ -60,5 +66,7 @@ extern const void *of_get_property(const struct
device_node *node,
> int *lenp);
> extern int of_n_addr_cells(struct device_node *np);
> extern int of_n_size_cells(struct device_node *np);
> +extern const struct of_device_id *of_match_node(
> + const struct of_device_id *matches, const struct device_node
*node);
>=20
> #endif /* _LINUX_OF_H */
> diff --git a/include/linux/of_device.h b/include/linux/of_device.h
> index 212bffb..6dc1195 100644
> --- a/include/linux/of_device.h
> +++ b/include/linux/of_device.h
> @@ -10,8 +10,6 @@
>=20
> #define to_of_device(d) container_of(d, struct of_device, dev)
>=20
> -extern const struct of_device_id *of_match_node(
> - const struct of_device_id *matches, const struct device_node
*node);
> extern const struct of_device_id *of_match_device(
> const struct of_device_id *matches, const struct of_device
*dev);
>=20
>=20
> _______________________________________________
> Linuxppc-dev mailing list
> Linuxppc-dev@ozlabs.org
> https://ozlabs.org/mailman/listinfo/linuxppc-dev
^ permalink raw reply [flat|nested] 3+ messages in thread* Re: [RFC] Add of_find_matching_node() helper function
2008-01-07 18:15 [RFC] Add of_find_matching_node() helper function Grant Likely
2008-01-07 19:23 ` Stephen Neuendorffer
@ 2008-01-08 0:48 ` Stephen Rothwell
1 sibling, 0 replies; 3+ messages in thread
From: Stephen Rothwell @ 2008-01-08 0:48 UTC (permalink / raw)
To: Grant Likely; +Cc: linuxppc-dev, paulus
[-- Attachment #1: Type: text/plain, Size: 1227 bytes --]
Hi Grant,
On Mon, 07 Jan 2008 11:15:56 -0700 Grant Likely <grant.likely@secretlab.ca> wrote:
>
> +++ b/include/linux/of.h
> @@ -60,5 +66,7 @@ extern const void *of_get_property(const struct device_node *node,
> int *lenp);
> extern int of_n_addr_cells(struct device_node *np);
> extern int of_n_size_cells(struct device_node *np);
> +extern const struct of_device_id *of_match_node(
> + const struct of_device_id *matches, const struct device_node *node);
>
> #endif /* _LINUX_OF_H */
> diff --git a/include/linux/of_device.h b/include/linux/of_device.h
> index 212bffb..6dc1195 100644
> --- a/include/linux/of_device.h
> +++ b/include/linux/of_device.h
> @@ -10,8 +10,6 @@
>
> #define to_of_device(d) container_of(d, struct of_device, dev)
>
> -extern const struct of_device_id *of_match_node(
> - const struct of_device_id *matches, const struct device_node *node);
> extern const struct of_device_id *of_match_device(
> const struct of_device_id *matches, const struct of_device *dev);
So you should really change all the callers of of_match_node to include linux/of.h.
--
Cheers,
Stephen Rothwell sfr@canb.auug.org.au
http://www.canb.auug.org.au/~sfr/
[-- Attachment #2: Type: application/pgp-signature, Size: 189 bytes --]
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2008-01-08 0:49 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-01-07 18:15 [RFC] Add of_find_matching_node() helper function Grant Likely
2008-01-07 19:23 ` Stephen Neuendorffer
2008-01-08 0:48 ` Stephen Rothwell
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).