]>
git.ipfire.org Git - people/ms/u-boot.git/blob - drivers/core/regmap.c
2 * Copyright (c) 2015 Google, Inc
3 * Written by Simon Glass <sjg@chromium.org>
5 * SPDX-License-Identifier: GPL-2.0+
16 DECLARE_GLOBAL_DATA_PTR
;
18 int regmap_init_mem(struct udevice
*dev
, struct regmap
**mapp
)
20 const void *blob
= gd
->fdt_blob
;
21 struct regmap_range
*range
;
25 int addr_len
, size_len
, both_len
;
29 parent
= dev
->parent
->of_offset
;
30 addr_len
= fdt_address_cells(blob
, parent
);
31 size_len
= fdt_size_cells(blob
, parent
);
32 both_len
= addr_len
+ size_len
;
34 cell
= fdt_getprop(blob
, dev
->of_offset
, "reg", &len
);
36 count
= len
/ both_len
;
40 map
= malloc(sizeof(struct regmap
));
45 map
->range
= &map
->base_range
;
47 map
->range
= malloc(count
* sizeof(struct regmap_range
));
54 map
->base
= fdtdec_get_number(cell
, addr_len
);
55 map
->range_count
= count
;
57 for (range
= map
->range
; count
> 0;
58 count
--, cell
+= both_len
, range
++) {
59 range
->start
= fdtdec_get_number(cell
, addr_len
);
60 range
->size
= fdtdec_get_number(cell
+ addr_len
, size_len
);
68 void *regmap_get_range(struct regmap
*map
, unsigned int range_num
)
70 struct regmap_range
*range
;
72 if (range_num
>= map
->range_count
)
74 range
= &map
->range
[range_num
];
76 return map_sysmem(range
->start
, range
->size
);
79 int regmap_uninit(struct regmap
*map
)
81 if (map
->range_count
> 1)