[SPARC64]: Expand of_*() interfaces some more.
authorDavid S. Miller <davem@sunset.davemloft.net>
Fri, 23 Jun 2006 05:08:58 +0000 (22:08 -0700)
committerDavid S. Miller <davem@sunset.davemloft.net>
Sat, 24 Jun 2006 06:15:41 +0000 (23:15 -0700)
Import some more stuff from powerpc.

Add of_device_is_compatible(), and of_find_compatible_node().
Export some more of the other routines to modules.

Signed-off-by: David S. Miller <davem@davemloft.net>
arch/sparc64/kernel/prom.c
include/asm-sparc64/prom.h

index 7809100034b05ace35ed0a142e9fcb022bf9f073..e9d703eea806a097aaa0c57e0c1d90e36a61d4f0 100644 (file)
 
 static struct device_node *allnodes;
 
+int of_device_is_compatible(struct device_node *device, const char *compat)
+{
+       const char* cp;
+       int cplen, l;
+
+       cp = (char *) of_get_property(device, "compatible", &cplen);
+       if (cp == NULL)
+               return 0;
+       while (cplen > 0) {
+               if (strncmp(cp, compat, strlen(compat)) == 0)
+                       return 1;
+               l = strlen(cp) + 1;
+               cp += l;
+               cplen -= l;
+       }
+
+       return 0;
+}
+EXPORT_SYMBOL(of_device_is_compatible);
+
 struct device_node *of_get_parent(const struct device_node *node)
 {
        struct device_node *np;
@@ -38,6 +58,7 @@ struct device_node *of_get_parent(const struct device_node *node)
 
        return np;
 }
+EXPORT_SYMBOL(of_get_parent);
 
 struct device_node *of_get_next_child(const struct device_node *node,
        struct device_node *prev)
@@ -51,6 +72,7 @@ struct device_node *of_get_next_child(const struct device_node *node,
 
        return next;
 }
+EXPORT_SYMBOL(of_get_next_child);
 
 struct device_node *of_find_node_by_path(const char *path)
 {
@@ -75,6 +97,7 @@ struct device_node *of_find_node_by_phandle(phandle handle)
 
        return np;
 }
+EXPORT_SYMBOL(of_find_node_by_phandle);
 
 struct device_node *of_find_node_by_name(struct device_node *from,
        const char *name)
@@ -88,6 +111,7 @@ struct device_node *of_find_node_by_name(struct device_node *from,
 
        return np;
 }
+EXPORT_SYMBOL(of_find_node_by_name);
 
 struct device_node *of_find_node_by_type(struct device_node *from,
        const char *type)
@@ -101,6 +125,25 @@ struct device_node *of_find_node_by_type(struct device_node *from,
 
        return np;
 }
+EXPORT_SYMBOL(of_find_node_by_type);
+
+struct device_node *of_find_compatible_node(struct device_node *from,
+       const char *type, const char *compatible)
+{
+       struct device_node *np;
+
+       np = from ? from->allnext : allnodes;
+       for (; np != 0; np = np->allnext) {
+               if (type != NULL
+                   && !(np->type != 0 && strcmp(np->type, type) == 0))
+                       continue;
+               if (of_device_is_compatible(np, compatible))
+                       break;
+       }
+
+       return np;
+}
+EXPORT_SYMBOL(of_find_compatible_node);
 
 struct property *of_find_property(struct device_node *np, const char *name,
                                  int *lenp)
index 062ae6e1212e6b507f0189d94153772c6c7fbf25..6d1556c0c263307f0cc95995fb04ac00ab2e84cc 100644 (file)
@@ -75,6 +75,8 @@ extern struct device_node *of_find_node_by_type(struct device_node *from,
 #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);
 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);
@@ -83,6 +85,7 @@ extern struct device_node *of_get_next_child(const struct device_node *node,
 extern struct property *of_find_property(struct device_node *np,
                                         const char *name,
                                         int *lenp);
+extern int of_device_is_compatible(struct device_node *device, const char *);
 extern void *of_get_property(struct device_node *node, const char *name,
                             int *lenp);
 extern int of_getintprop_default(struct device_node *np,