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