xref: /rk3399_rockchip-uboot/include/regmap.h (revision 3b2a29e0971397085c616c89a3a09f2609f50ca4)
16f98b750SSimon Glass /*
26f98b750SSimon Glass  * Copyright (c) 2015 Google, Inc
36f98b750SSimon Glass  * Written by Simon Glass <sjg@chromium.org>
46f98b750SSimon Glass  *
56f98b750SSimon Glass  * SPDX-License-Identifier:	GPL-2.0+
66f98b750SSimon Glass  */
76f98b750SSimon Glass 
86f98b750SSimon Glass #ifndef __REGMAP_H
96f98b750SSimon Glass #define __REGMAP_H
106f98b750SSimon Glass 
116f98b750SSimon Glass /**
126f98b750SSimon Glass  * struct regmap_range - a register map range
136f98b750SSimon Glass  *
146f98b750SSimon Glass  * @start:	Start address
156f98b750SSimon Glass  * @size:	Size in bytes
166f98b750SSimon Glass  */
176f98b750SSimon Glass struct regmap_range {
186f98b750SSimon Glass 	ulong start;
196f98b750SSimon Glass 	ulong size;
206f98b750SSimon Glass };
216f98b750SSimon Glass 
226f98b750SSimon Glass /**
236f98b750SSimon Glass  * struct regmap - a way of accessing hardware/bus registers
246f98b750SSimon Glass  *
256f98b750SSimon Glass  * @base:	Base address of register map
266f98b750SSimon Glass  * @range_count: Number of ranges available within the map
276f98b750SSimon Glass  * @range:	Pointer to the list of ranges, allocated if @range_count > 1
286f98b750SSimon Glass  * @base_range:	If @range_count is <= 1, @range points here
296f98b750SSimon Glass  */
306f98b750SSimon Glass struct regmap {
316f98b750SSimon Glass 	phys_addr_t base;
326f98b750SSimon Glass 	int range_count;
336f98b750SSimon Glass 	struct regmap_range *range, base_range;
346f98b750SSimon Glass };
356f98b750SSimon Glass 
366f98b750SSimon Glass /*
376f98b750SSimon Glass  * Interface to provide access to registers either through a direct memory
386f98b750SSimon Glass  * bus or through a peripheral bus like I2C, SPI.
396f98b750SSimon Glass  */
406f98b750SSimon Glass int regmap_write(struct regmap *map, uint offset, uint val);
416f98b750SSimon Glass int regmap_read(struct regmap *map, uint offset, uint *valp);
426f98b750SSimon Glass 
436f98b750SSimon Glass #define regmap_write32(map, ptr, member, val) \
446f98b750SSimon Glass 	regmap_write(map, (uint32_t *)(ptr)->member - (uint32_t *)(ptr), val)
456f98b750SSimon Glass 
466f98b750SSimon Glass #define regmap_read32(map, ptr, member, valp) \
476f98b750SSimon Glass 	regmap_read(map, (uint32_t *)(ptr)->member - (uint32_t *)(ptr), valp)
486f98b750SSimon Glass 
496f98b750SSimon Glass /**
506f98b750SSimon Glass  * regmap_init_mem() - Set up a new register map that uses memory access
516f98b750SSimon Glass  *
526f98b750SSimon Glass  * Use regmap_uninit() to free it.
536f98b750SSimon Glass  *
546f98b750SSimon Glass  * @dev:	Device that uses this map
556f98b750SSimon Glass  * @mapp:	Returns allocated map
566f98b750SSimon Glass  */
576f98b750SSimon Glass int regmap_init_mem(struct udevice *dev, struct regmap **mapp);
586f98b750SSimon Glass 
59*3b2a29e0SSimon Glass int regmap_init_mem_platdata(struct udevice *dev, fdt32_t *reg, int size,
60*3b2a29e0SSimon Glass 			     struct regmap **mapp);
61*3b2a29e0SSimon Glass 
626f98b750SSimon Glass /**
636f98b750SSimon Glass  * regmap_get_range() - Obtain the base memory address of a regmap range
646f98b750SSimon Glass  *
656f98b750SSimon Glass  * @map:	Regmap to query
666f98b750SSimon Glass  * @range_num:	Range to look up
676f98b750SSimon Glass  */
686f98b750SSimon Glass void *regmap_get_range(struct regmap *map, unsigned int range_num);
696f98b750SSimon Glass 
706f98b750SSimon Glass /**
716f98b750SSimon Glass  * regmap_uninit() - free a previously inited regmap
726f98b750SSimon Glass  */
736f98b750SSimon Glass int regmap_uninit(struct regmap *map);
746f98b750SSimon Glass 
756f98b750SSimon Glass #endif
76