]>
git.ipfire.org Git - people/ms/u-boot.git/blob - drivers/core/regmap.c
c68bcba54f1e5cfd750ec854f5c12b1a6096b214
2 * Copyright (c) 2015 Google, Inc
3 * Written by Simon Glass <sjg@chromium.org>
5 * SPDX-License-Identifier: GPL-2.0+
18 DECLARE_GLOBAL_DATA_PTR
;
20 static struct regmap
*regmap_alloc_count(int count
)
24 map
= malloc(sizeof(struct regmap
));
28 map
->range
= &map
->base_range
;
30 map
->range
= malloc(count
* sizeof(struct regmap_range
));
36 map
->range_count
= count
;
41 #if CONFIG_IS_ENABLED(OF_PLATDATA)
42 int regmap_init_mem_platdata(struct udevice
*dev
, u32
*reg
, int count
,
45 struct regmap_range
*range
;
48 map
= regmap_alloc_count(count
);
53 for (range
= map
->range
; count
> 0; reg
+= 2, range
++, count
--) {
63 int regmap_init_mem(struct udevice
*dev
, struct regmap
**mapp
)
65 const void *blob
= gd
->fdt_blob
;
66 struct regmap_range
*range
;
70 int addr_len
, size_len
, both_len
;
74 parent
= dev
->parent
->of_offset
;
75 addr_len
= fdt_address_cells(blob
, parent
);
76 size_len
= fdt_size_cells(blob
, parent
);
77 both_len
= addr_len
+ size_len
;
79 cell
= fdt_getprop(blob
, dev
->of_offset
, "reg", &len
);
81 count
= len
/ both_len
;
85 map
= regmap_alloc_count(count
);
89 map
->base
= fdtdec_get_number(cell
, addr_len
);
91 for (range
= map
->range
; count
> 0;
92 count
--, cell
+= both_len
, range
++) {
93 range
->start
= fdtdec_get_number(cell
, addr_len
);
94 range
->size
= fdtdec_get_number(cell
+ addr_len
, size_len
);
103 void *regmap_get_range(struct regmap
*map
, unsigned int range_num
)
105 struct regmap_range
*range
;
107 if (range_num
>= map
->range_count
)
109 range
= &map
->range
[range_num
];
111 return map_sysmem(range
->start
, range
->size
);
114 int regmap_uninit(struct regmap
*map
)
116 if (map
->range_count
> 1)
123 int regmap_read(struct regmap
*map
, uint offset
, uint
*valp
)
125 uint32_t *ptr
= map_physmem(map
->base
+ offset
, 4, MAP_NOCACHE
);
127 *valp
= le32_to_cpu(readl(ptr
));
132 int regmap_write(struct regmap
*map
, uint offset
, uint val
)
134 uint32_t *ptr
= map_physmem(map
->base
+ offset
, 4, MAP_NOCACHE
);
136 writel(cpu_to_le32(val
), ptr
);