aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBenoit Cousson <b-cousson@ti.com>2011-12-05 09:23:55 -0500
committerGrant Likely <grant.likely@secretlab.ca>2012-01-04 02:27:22 -0500
commit35f3da32af0e8970cc41288d4a7e3bd32399900e (patch)
tree67390af46cf0fff8f65e31ac3b07e553cfc2fa16
parent93797d87d63d36404907640e4e20bb976bff4744 (diff)
of/address: Add reg-names property to name an iomem resource
Add a reg-names property to allow for reg regions to be reference by name instead of by index. Some devices have multiple register regions which are more naturally referenced by name. If the name is available, use it to name the resource when creating a devices. Otherwise keep the device name. Signed-off-by: Benoit Cousson <b-cousson@ti.com> Cc: Grant Likely <grant.likely@secretlab.ca> Cc: Rob Herring <rob.herring@calxeda.com> [Generalized documentation to be for any -names property] Signed-off-by: Grant Likely <grant.likely@secretlab.ca>
-rw-r--r--Documentation/devicetree/bindings/resource-names.txt50
-rw-r--r--drivers/of/address.c16
2 files changed, 61 insertions, 5 deletions
diff --git a/Documentation/devicetree/bindings/resource-names.txt b/Documentation/devicetree/bindings/resource-names.txt
new file mode 100644
index 000000000000..8405b956acaa
--- /dev/null
+++ b/Documentation/devicetree/bindings/resource-names.txt
@@ -0,0 +1,50 @@
1Some properties contain an ordered list of 1 or more datum which are
2normally accessed by index. However, some devices will have multiple
3values which are more naturally accessed by name. Device nodes can
4include a supplemental property for assigning names to each of the list
5items. The names property consists of a list of strings in the same
6order as the data in the resource property.
7
8The following supplemental names properties are defined.
9
10Resource Property Supplemental Names Property
11----------------- ---------------------------
12reg reg-names
13clocks clock-names
14interrupts interrupt-names
15
16Usage:
17
18The -names property must be used in conjunction with the normal resource
19property. If not it will be ignored.
20
21Examples:
22
23l4-abe {
24 compatible = "simple-bus";
25 #address-cells = <2>;
26 #size-cells = <1>;
27 ranges = <0 0 0x48000000 0x00001000>, /* MPU path */
28 <1 0 0x49000000 0x00001000>; /* L3 path */
29 mcasp {
30 compatible = "ti,mcasp";
31 reg = <0 0x10 0x10>, <0 0x20 0x10>,
32 <1 0x10 0x10>, <1 0x20 0x10>;
33 reg-names = "mpu", "dat",
34 "dma", "dma_dat";
35 };
36
37 timer {
38 compatible = "ti,timer";
39 reg = <0 0x40 0x10>, <1 0x40 0x10>;
40 reg-names = "mpu", "dma";
41 };
42};
43
44
45usb {
46 compatible = "ti,usb-host";
47 reg = <0x4a064000 0x800>, <0x4a064800 0x200>,
48 <0x4a064c00 0x200>;
49 reg-names = "config", "ohci", "ehci";
50};
diff --git a/drivers/of/address.c b/drivers/of/address.c
index 72c33fbe451d..66d96f14c274 100644
--- a/drivers/of/address.c
+++ b/drivers/of/address.c
@@ -14,7 +14,7 @@
14static struct of_bus *of_match_bus(struct device_node *np); 14static struct of_bus *of_match_bus(struct device_node *np);
15static int __of_address_to_resource(struct device_node *dev, 15static int __of_address_to_resource(struct device_node *dev,
16 const __be32 *addrp, u64 size, unsigned int flags, 16 const __be32 *addrp, u64 size, unsigned int flags,
17 struct resource *r); 17 const char *name, struct resource *r);
18 18
19/* Debug utility */ 19/* Debug utility */
20#ifdef DEBUG 20#ifdef DEBUG
@@ -215,7 +215,7 @@ int of_pci_address_to_resource(struct device_node *dev, int bar,
215 addrp = of_get_pci_address(dev, bar, &size, &flags); 215 addrp = of_get_pci_address(dev, bar, &size, &flags);
216 if (addrp == NULL) 216 if (addrp == NULL)
217 return -EINVAL; 217 return -EINVAL;
218 return __of_address_to_resource(dev, addrp, size, flags, r); 218 return __of_address_to_resource(dev, addrp, size, flags, NULL, r);
219} 219}
220EXPORT_SYMBOL_GPL(of_pci_address_to_resource); 220EXPORT_SYMBOL_GPL(of_pci_address_to_resource);
221#endif /* CONFIG_PCI */ 221#endif /* CONFIG_PCI */
@@ -529,7 +529,7 @@ EXPORT_SYMBOL(of_get_address);
529 529
530static int __of_address_to_resource(struct device_node *dev, 530static int __of_address_to_resource(struct device_node *dev,
531 const __be32 *addrp, u64 size, unsigned int flags, 531 const __be32 *addrp, u64 size, unsigned int flags,
532 struct resource *r) 532 const char *name, struct resource *r)
533{ 533{
534 u64 taddr; 534 u64 taddr;
535 535
@@ -551,7 +551,8 @@ static int __of_address_to_resource(struct device_node *dev,
551 r->end = taddr + size - 1; 551 r->end = taddr + size - 1;
552 } 552 }
553 r->flags = flags; 553 r->flags = flags;
554 r->name = dev->full_name; 554 r->name = name ? name : dev->full_name;
555
555 return 0; 556 return 0;
556} 557}
557 558
@@ -569,11 +570,16 @@ int of_address_to_resource(struct device_node *dev, int index,
569 const __be32 *addrp; 570 const __be32 *addrp;
570 u64 size; 571 u64 size;
571 unsigned int flags; 572 unsigned int flags;
573 const char *name = NULL;
572 574
573 addrp = of_get_address(dev, index, &size, &flags); 575 addrp = of_get_address(dev, index, &size, &flags);
574 if (addrp == NULL) 576 if (addrp == NULL)
575 return -EINVAL; 577 return -EINVAL;
576 return __of_address_to_resource(dev, addrp, size, flags, r); 578
579 /* Get optional "reg-names" property to add a name to a resource */
580 of_property_read_string_index(dev, "reg-names", index, &name);
581
582 return __of_address_to_resource(dev, addrp, size, flags, name, r);
577} 583}
578EXPORT_SYMBOL_GPL(of_address_to_resource); 584EXPORT_SYMBOL_GPL(of_address_to_resource);
579 585