]>
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 #include <dm/of_addr.h>
17 #include <linux/ioport.h>
19 DECLARE_GLOBAL_DATA_PTR
;
21 static struct regmap
*regmap_alloc_count(int count
)
25 map
= malloc(sizeof(struct regmap
));
29 map
->range
= &map
->base_range
;
31 map
->range
= malloc(count
* sizeof(struct regmap_range
));
37 map
->range_count
= count
;
42 #if CONFIG_IS_ENABLED(OF_PLATDATA)
43 int regmap_init_mem_platdata(struct udevice
*dev
, fdt_val_t
*reg
, int count
,
46 struct regmap_range
*range
;
49 map
= regmap_alloc_count(count
);
54 for (range
= map
->range
; count
> 0; reg
+= 2, range
++, count
--) {
64 int regmap_init_mem(struct udevice
*dev
, struct regmap
**mapp
)
66 struct regmap_range
*range
;
69 int addr_len
, size_len
, both_len
;
72 ofnode node
= dev_ofnode(dev
);
75 addr_len
= dev_read_simple_addr_cells(dev
->parent
);
76 size_len
= dev_read_simple_size_cells(dev
->parent
);
77 both_len
= addr_len
+ size_len
;
79 len
= dev_read_size(dev
, "reg");
82 len
/= sizeof(fdt32_t
);
83 count
= len
/ both_len
;
87 map
= regmap_alloc_count(count
);
91 for (range
= map
->range
, index
= 0; count
> 0;
92 count
--, range
++, index
++) {
94 if (of_live_active()) {
95 of_address_to_resource(ofnode_to_np(node
), index
, &r
);
96 range
->start
= r
.start
;
97 range
->size
= r
.end
- r
.start
+ 1;
99 range
->start
= fdtdec_get_addr_size_fixed(gd
->fdt_blob
,
100 dev_of_offset(dev
), "reg", index
,
101 addr_len
, size_len
, &sz
, true);
105 map
->base
= map
->range
[0].start
;
113 void *regmap_get_range(struct regmap
*map
, unsigned int range_num
)
115 struct regmap_range
*range
;
117 if (range_num
>= map
->range_count
)
119 range
= &map
->range
[range_num
];
121 return map_sysmem(range
->start
, range
->size
);
124 int regmap_uninit(struct regmap
*map
)
126 if (map
->range_count
> 1)
133 int regmap_read(struct regmap
*map
, uint offset
, uint
*valp
)
135 uint32_t *ptr
= map_physmem(map
->base
+ offset
, 4, MAP_NOCACHE
);
137 *valp
= le32_to_cpu(readl(ptr
));
142 int regmap_write(struct regmap
*map
, uint offset
, uint val
)
144 uint32_t *ptr
= map_physmem(map
->base
+ offset
, 4, MAP_NOCACHE
);
146 writel(cpu_to_le32(val
), ptr
);