regmap.h 2.3 KB

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