xref: /rk3399_rockchip-uboot/include/regmap.h (revision a28bfcc35587bf3d3f86eb49fb81c9570ddfcc4b)
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 
591e6ca1a6SSimon Glass /**
601e6ca1a6SSimon Glass  * regmap_init_mem_platdata() - Set up a new memory register map for of-platdata
611e6ca1a6SSimon Glass  *
621e6ca1a6SSimon Glass  * This creates a new regmap with a list of regions passed in, rather than
631e6ca1a6SSimon Glass  * using the device tree. It only supports 32-bit machines.
641e6ca1a6SSimon Glass  *
651e6ca1a6SSimon Glass  * Use regmap_uninit() to free it.
661e6ca1a6SSimon Glass  *
671e6ca1a6SSimon Glass  * @dev:	Device that uses this map
681e6ca1a6SSimon Glass  * @reg:	List of address, size pairs
691e6ca1a6SSimon Glass  * @count:	Number of pairs (e.g. 1 if the regmap has a single entry)
701e6ca1a6SSimon Glass  * @mapp:	Returns allocated map
711e6ca1a6SSimon Glass  */
72*a28bfcc3SSimon Glass int regmap_init_mem_platdata(struct udevice *dev, fdt_val_t *reg, int count,
733b2a29e0SSimon Glass 			     struct regmap **mapp);
743b2a29e0SSimon Glass 
756f98b750SSimon Glass /**
766f98b750SSimon Glass  * regmap_get_range() - Obtain the base memory address of a regmap range
776f98b750SSimon Glass  *
786f98b750SSimon Glass  * @map:	Regmap to query
796f98b750SSimon Glass  * @range_num:	Range to look up
806f98b750SSimon Glass  */
816f98b750SSimon Glass void *regmap_get_range(struct regmap *map, unsigned int range_num);
826f98b750SSimon Glass 
836f98b750SSimon Glass /**
846f98b750SSimon Glass  * regmap_uninit() - free a previously inited regmap
856f98b750SSimon Glass  */
866f98b750SSimon Glass int regmap_uninit(struct regmap *map);
876f98b750SSimon Glass 
886f98b750SSimon Glass #endif
89