regmap.h 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. /* SPDX-License-Identifier: GPL-2.0+ */
  2. /*
  3. * Copyright (c) 2015 Google, Inc
  4. * Written by Simon Glass <sjg@chromium.org>
  5. */
  6. #ifndef __REGMAP_H
  7. #define __REGMAP_H
  8. /**
  9. * struct regmap_range - a register map range
  10. *
  11. * @start: Start address
  12. * @size: Size in bytes
  13. */
  14. struct regmap_range {
  15. ulong start;
  16. ulong size;
  17. };
  18. /**
  19. * struct regmap - a way of accessing hardware/bus registers
  20. *
  21. * @base: Base address of register map
  22. * @range_count: Number of ranges available within the map
  23. * @range: Pointer to the list of ranges, allocated if @range_count > 1
  24. * @base_range: If @range_count is <= 1, @range points here
  25. */
  26. struct regmap {
  27. phys_addr_t base;
  28. int range_count;
  29. struct regmap_range *range, base_range;
  30. };
  31. /*
  32. * Interface to provide access to registers either through a direct memory
  33. * bus or through a peripheral bus like I2C, SPI.
  34. */
  35. int regmap_write(struct regmap *map, uint offset, uint val);
  36. int regmap_read(struct regmap *map, uint offset, uint *valp);
  37. #define regmap_write32(map, ptr, member, val) \
  38. regmap_write(map, (uint32_t *)(ptr)->member - (uint32_t *)(ptr), val)
  39. #define regmap_read32(map, ptr, member, valp) \
  40. regmap_read(map, (uint32_t *)(ptr)->member - (uint32_t *)(ptr), valp)
  41. /**
  42. * regmap_init_mem() - Set up a new register map that uses memory access
  43. *
  44. * Use regmap_uninit() to free it.
  45. *
  46. * @dev: Device that uses this map
  47. * @mapp: Returns allocated map
  48. */
  49. int regmap_init_mem(struct udevice *dev, struct regmap **mapp);
  50. /**
  51. * regmap_init_mem_platdata() - Set up a new memory register map for of-platdata
  52. *
  53. * This creates a new regmap with a list of regions passed in, rather than
  54. * using the device tree. It only supports 32-bit machines.
  55. *
  56. * Use regmap_uninit() to free it.
  57. *
  58. * @dev: Device that uses this map
  59. * @reg: List of address, size pairs
  60. * @count: Number of pairs (e.g. 1 if the regmap has a single entry)
  61. * @mapp: Returns allocated map
  62. */
  63. int regmap_init_mem_platdata(struct udevice *dev, fdt_val_t *reg, int count,
  64. struct regmap **mapp);
  65. /**
  66. * regmap_get_range() - Obtain the base memory address of a regmap range
  67. *
  68. * @map: Regmap to query
  69. * @range_num: Range to look up
  70. */
  71. void *regmap_get_range(struct regmap *map, unsigned int range_num);
  72. /**
  73. * regmap_uninit() - free a previously inited regmap
  74. */
  75. int regmap_uninit(struct regmap *map);
  76. #endif