regmap.h 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. #ifndef __LINUX_REGMAP_H
  2. #define __LINUX_REGMAP_H
  3. /*
  4. * Register map access API
  5. *
  6. * Copyright 2011 Wolfson Microelectronics plc
  7. *
  8. * Author: Mark Brown <broonie@opensource.wolfsonmicro.com>
  9. *
  10. * This program is free software; you can redistribute it and/or modify
  11. * it under the terms of the GNU General Public License version 2 as
  12. * published by the Free Software Foundation.
  13. */
  14. #include <linux/device.h>
  15. #include <linux/list.h>
  16. #include <linux/module.h>
  17. struct i2c_client;
  18. struct spi_device;
  19. /**
  20. * Configuration for the register map of a device.
  21. *
  22. * @reg_bits: Number of bits in a register address, mandatory.
  23. * @val_bits: Number of bits in a register value, mandatory.
  24. *
  25. * @max_register: Optional, specifies the maximum valid register index.
  26. * @writeable_reg: Optional callback returning true if the register
  27. * can be written to.
  28. * @readable_reg: Optional callback returning true if the register
  29. * can be read from.
  30. * @volatile_reg: Optional callback returning true if the register
  31. * value can't be cached.
  32. * @precious_reg: Optional callback returning true if the rgister
  33. * should not be read outside of a call from the driver
  34. * (eg, a clear on read interrupt status register).
  35. */
  36. struct regmap_config {
  37. int reg_bits;
  38. int val_bits;
  39. unsigned int max_register;
  40. bool (*writeable_reg)(struct device *dev, unsigned int reg);
  41. bool (*readable_reg)(struct device *dev, unsigned int reg);
  42. bool (*volatile_reg)(struct device *dev, unsigned int reg);
  43. bool (*precious_reg)(struct device *dev, unsigned int reg);
  44. };
  45. typedef int (*regmap_hw_write)(struct device *dev, const void *data,
  46. size_t count);
  47. typedef int (*regmap_hw_gather_write)(struct device *dev,
  48. const void *reg, size_t reg_len,
  49. const void *val, size_t val_len);
  50. typedef int (*regmap_hw_read)(struct device *dev,
  51. const void *reg_buf, size_t reg_size,
  52. void *val_buf, size_t val_size);
  53. /**
  54. * Description of a hardware bus for the register map infrastructure.
  55. *
  56. * @list: Internal use.
  57. * @type: Bus type, used to identify bus to be used for a device.
  58. * @write: Write operation.
  59. * @gather_write: Write operation with split register/value, return -ENOTSUPP
  60. * if not implemented on a given device.
  61. * @read: Read operation. Data is returned in the buffer used to transmit
  62. * data.
  63. * @owner: Module with the bus implementation, used to pin the implementation
  64. * in memory.
  65. * @read_flag_mask: Mask to be set in the top byte of the register when doing
  66. * a read.
  67. */
  68. struct regmap_bus {
  69. struct list_head list;
  70. struct bus_type *type;
  71. regmap_hw_write write;
  72. regmap_hw_gather_write gather_write;
  73. regmap_hw_read read;
  74. struct module *owner;
  75. u8 read_flag_mask;
  76. };
  77. struct regmap *regmap_init(struct device *dev,
  78. const struct regmap_bus *bus,
  79. const struct regmap_config *config);
  80. struct regmap *regmap_init_i2c(struct i2c_client *i2c,
  81. const struct regmap_config *config);
  82. struct regmap *regmap_init_spi(struct spi_device *dev,
  83. const struct regmap_config *config);
  84. void regmap_exit(struct regmap *map);
  85. int regmap_write(struct regmap *map, unsigned int reg, unsigned int val);
  86. int regmap_raw_write(struct regmap *map, unsigned int reg,
  87. const void *val, size_t val_len);
  88. int regmap_read(struct regmap *map, unsigned int reg, unsigned int *val);
  89. int regmap_raw_read(struct regmap *map, unsigned int reg,
  90. void *val, size_t val_len);
  91. int regmap_bulk_read(struct regmap *map, unsigned int reg, void *val,
  92. size_t val_count);
  93. int regmap_update_bits(struct regmap *map, unsigned int reg,
  94. unsigned int mask, unsigned int val);
  95. #endif