regmap: Add API regmap_init_mem_index()
authorFaiz Abbas <faiz_abbas@ti.com>
Mon, 10 Jun 2019 19:13:33 +0000 (00:43 +0530)
committerTom Rini <trini@konsulko.com>
Wed, 17 Jul 2019 15:12:08 +0000 (11:12 -0400)
In device nodes with more than one entry in the reg property,
it is sometimes useful to regmap only of the entries. Add an
API regmap_init_mem_index() to facilitate this.

Signed-off-by: Faiz Abbas <faiz_abbas@ti.com>
Reviewed-by: Tom Rini <trini@konsulko.com>
drivers/core/regmap.c
include/regmap.h

index 5ef0f71c8b7d2d07f2884ea9f84215c683c66225..d1d12eef385f5757bd327cb01d2027bbe3bfb662 100644 (file)
@@ -108,6 +108,48 @@ static int init_range(ofnode node, struct regmap_range *range, int addr_len,
        return 0;
 }
 
+int regmap_init_mem_index(ofnode node, struct regmap **mapp, int index)
+{
+       struct regmap *map;
+       int addr_len, size_len;
+       int ret;
+
+       addr_len = ofnode_read_simple_addr_cells(ofnode_get_parent(node));
+       if (addr_len < 0) {
+               debug("%s: Error while reading the addr length (ret = %d)\n",
+                     ofnode_get_name(node), addr_len);
+               return addr_len;
+       }
+
+       size_len = ofnode_read_simple_size_cells(ofnode_get_parent(node));
+       if (size_len < 0) {
+               debug("%s: Error while reading the size length: (ret = %d)\n",
+                     ofnode_get_name(node), size_len);
+               return size_len;
+       }
+
+       map = regmap_alloc(1);
+       if (!map)
+               return -ENOMEM;
+
+       ret = init_range(node, map->ranges, addr_len, size_len, index);
+       if (ret)
+               return ret;
+
+       if (ofnode_read_bool(node, "little-endian"))
+               map->endianness = REGMAP_LITTLE_ENDIAN;
+       else if (ofnode_read_bool(node, "big-endian"))
+               map->endianness = REGMAP_BIG_ENDIAN;
+       else if (ofnode_read_bool(node, "native-endian"))
+               map->endianness = REGMAP_NATIVE_ENDIAN;
+       else /* Default: native endianness */
+               map->endianness = REGMAP_NATIVE_ENDIAN;
+
+       *mapp = map;
+
+       return ret;
+}
+
 int regmap_init_mem(ofnode node, struct regmap **mapp)
 {
        struct regmap_range *range;
index 3cd7a66cea70a16ad3161ac73ab25146e1263743..0854200a9c162811a96b47e3d14f6e0779b3121c 100644 (file)
@@ -330,6 +330,8 @@ int regmap_init_mem(ofnode node, struct regmap **mapp);
 int regmap_init_mem_platdata(struct udevice *dev, fdt_val_t *reg, int count,
                             struct regmap **mapp);
 
+int regmap_init_mem_index(ofnode node, struct regmap **mapp, int index);
+
 /**
  * regmap_get_range() - Obtain the base memory address of a regmap range
  *