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