regmap: use fdt address translation
authorJean-Jacques Hiblot <jjhiblot@ti.com>
Mon, 13 Feb 2017 15:17:48 +0000 (16:17 +0100)
committerStefan Roese <sr@denx.de>
Wed, 29 Mar 2017 05:38:07 +0000 (07:38 +0200)
In the DTS, the addresses are defined relative to the parent bus. We need
to translate them to get the address as seen by the CPU core.

Signed-off-by: Jean-Jacques Hiblot <jjhiblot@ti.com>
drivers/core/regmap.c

index 833cd78e8489038496da2ad7fe31a3f4600e9a07..3bec3df9b6e36dc7dac19c1ae414e2ac5094fca4 100644 (file)
@@ -70,6 +70,7 @@ int regmap_init_mem(struct udevice *dev, struct regmap **mapp)
        int addr_len, size_len, both_len;
        int parent;
        int len;
+       int index;
 
        parent = dev_of_offset(dev->parent);
        addr_len = fdt_address_cells(blob, parent);
@@ -86,13 +87,14 @@ int regmap_init_mem(struct udevice *dev, struct regmap **mapp)
        if (!map)
                return -ENOMEM;
 
-       map->base = fdtdec_get_number(cell, addr_len);
-
-       for (range = map->range; count > 0;
-            count--, cell += both_len, range++) {
-               range->start = fdtdec_get_number(cell, addr_len);
-               range->size = fdtdec_get_number(cell + addr_len, size_len);
+       for (range = map->range, index = 0; count > 0;
+            count--, cell += both_len, range++, index++) {
+               fdt_size_t sz;
+               range->start = fdtdec_get_addr_size_fixed(blob, dev->of_offset,
+                               "reg", index, addr_len, size_len, &sz, true);
+               range->size = sz;
        }
+       map->base = map->range[0].start;
 
        *mapp = map;