[POWERPC] Add of_find_matching_node() helper function
authorGrant Likely <grant.likely@secretlab.ca>
Tue, 8 Jan 2008 19:20:40 +0000 (06:20 +1100)
committerPaul Mackerras <paulus@samba.org>
Thu, 17 Jan 2008 03:53:22 +0000 (14:53 +1100)
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 they take of_device_id
tables instead of strings.

This 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>
Signed-off-by: Paul Mackerras <paulus@samba.org>
arch/powerpc/kernel/ibmebus.c
arch/powerpc/kernel/of_platform.c
arch/powerpc/platforms/celleb/io-workarounds.c
arch/powerpc/platforms/celleb/pci.c
drivers/net/ibm_newemac/core.c
drivers/of/base.c
drivers/of/device.c
drivers/serial/mpc52xx_uart.c
include/linux/of.h
include/linux/of_device.h

index caae49ff06683eb44f3ed6d1e89a98bf4f37d5ab..3b708449f731a80cfd156e7b13a3c61a3a052369 100644 (file)
@@ -41,6 +41,7 @@
 #include <linux/kobject.h>
 #include <linux/dma-mapping.h>
 #include <linux/interrupt.h>
+#include <linux/of.h>
 #include <linux/of_platform.h>
 #include <asm/ibmebus.h>
 #include <asm/abs_addr.h>
index de36e235a60a3a2b4be2a9a8379f88b0cc29047b..7a3cafbe8af98419fd1cd15ade58fedd516d792a 100644 (file)
@@ -19,6 +19,7 @@
 #include <linux/mod_devicetable.h>
 #include <linux/slab.h>
 #include <linux/pci.h>
+#include <linux/of.h>
 #include <linux/of_device.h>
 #include <linux/of_platform.h>
 
index b939c0e98af8eaf018acb3afce1621f32a87172d..423339be1bac8f3c2a0ef2400fcf19ede0275682 100644 (file)
@@ -22,6 +22,7 @@
 
 #undef DEBUG
 
+#include <linux/of.h>
 #include <linux/of_device.h>
 #include <linux/irq.h>
 
index 5d399e038c2326954002f956e89199d97f333f10..51b390d34e4dc51dd085075b0b4289648ad26008 100644 (file)
@@ -31,6 +31,7 @@
 #include <linux/init.h>
 #include <linux/bootmem.h>
 #include <linux/pci_regs.h>
+#include <linux/of.h>
 #include <linux/of_device.h>
 
 #include <asm/io.h>
index cb06280dced5234806ec28c4c6235f0ab978769d..fced441face6f6c197811a691f27c1c865db045f 100644 (file)
@@ -37,6 +37,7 @@
 #include <linux/mii.h>
 #include <linux/bitops.h>
 #include <linux/workqueue.h>
+#include <linux/of.h>
 
 #include <asm/processor.h>
 #include <asm/io.h>
index 9377f3bc410ac0083e96f3fefb48400ae4342a43..b306fef1ac4151dffe03a89d4328ca4e6f703547 100644 (file)
@@ -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);
index 6245f060fb774a17780375b869d1950bb0266a67..29681c4b700b13d2fa8b4f106b40faceec403716 100644 (file)
@@ -9,35 +9,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
index ec36ad78d2fe042aafa149eac1ed3a65d3ace527..7e3ba8b455a82a061b01b88d02345a9e8623a3a1 100644 (file)
@@ -72,7 +72,8 @@
 #include <asm/io.h>
 
 #if defined(CONFIG_PPC_MERGE)
-#include <asm/of_platform.h>
+#include <linux/of.h>
+#include <linux/of_platform.h>
 #else
 #include <linux/platform_device.h>
 #endif
index c65af7bd1e9c6369757dfaeeecf74feccea83f97..b5f33efcb8e20006165336ffbcdd9e25c7e793b3 100644 (file)
@@ -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 */
index 212bffb2b17453449ed9a6331372d5eff8cf3773..6dc11959770c23da51f4fa394c9b694f60aa1ff1 100644 (file)
@@ -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);