of/address: Add of_find_matching_node_by_address helper
Grant Likely [Wed, 6 Jul 2011 05:42:28 +0000 (23:42 -0600)]
of_find_matching_node_by_address() can be used to find a device tree
node for a device at a specific address.

Signed-off-by: Grant Likely <grant.likely@secretlab.ca>

drivers/of/address.c
include/linux/of_address.h

index b4559c5..da1f4b9 100644 (file)
@@ -577,6 +577,24 @@ int of_address_to_resource(struct device_node *dev, int index,
 }
 EXPORT_SYMBOL_GPL(of_address_to_resource);
 
+struct device_node *of_find_matching_node_by_address(struct device_node *from,
+                                       const struct of_device_id *matches,
+                                       u64 base_address)
+{
+       struct device_node *dn = of_find_matching_node(from, matches);
+       struct resource res;
+
+       while (dn) {
+               if (of_address_to_resource(dn, 0, &res))
+                       continue;
+               if (res.start == base_address)
+                       return dn;
+               dn = of_find_matching_node(dn, matches);
+       }
+
+       return NULL;
+}
+
 
 /**
  * of_iomap - Maps the memory mapped IO for a given device_node
index 2feda6e..bdfc20d 100644 (file)
@@ -6,6 +6,10 @@
 extern u64 of_translate_address(struct device_node *np, const __be32 *addr);
 extern int of_address_to_resource(struct device_node *dev, int index,
                                  struct resource *r);
+extern struct device_node *of_find_matching_node_by_address(
+                                       struct device_node *from,
+                                       const struct of_device_id *matches,
+                                       u64 base_address);
 extern void __iomem *of_iomap(struct device_node *device, int index);
 
 /* Extract an address from a device, returns the region size and