regmap-i2c.c 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316
  1. /*
  2. * Register map access API - I2C support
  3. *
  4. * Copyright 2011 Wolfson Microelectronics plc
  5. *
  6. * Author: Mark Brown <broonie@opensource.wolfsonmicro.com>
  7. *
  8. * This program is free software; you can redistribute it and/or modify
  9. * it under the terms of the GNU General Public License version 2 as
  10. * published by the Free Software Foundation.
  11. */
  12. #include <linux/regmap.h>
  13. #include <linux/i2c.h>
  14. #include <linux/module.h>
  15. #include "internal.h"
  16. static int regmap_smbus_byte_reg_read(void *context, unsigned int reg,
  17. unsigned int *val)
  18. {
  19. struct device *dev = context;
  20. struct i2c_client *i2c = to_i2c_client(dev);
  21. int ret;
  22. if (reg > 0xff)
  23. return -EINVAL;
  24. ret = i2c_smbus_read_byte_data(i2c, reg);
  25. if (ret < 0)
  26. return ret;
  27. *val = ret;
  28. return 0;
  29. }
  30. static int regmap_smbus_byte_reg_write(void *context, unsigned int reg,
  31. unsigned int val)
  32. {
  33. struct device *dev = context;
  34. struct i2c_client *i2c = to_i2c_client(dev);
  35. if (val > 0xff || reg > 0xff)
  36. return -EINVAL;
  37. return i2c_smbus_write_byte_data(i2c, reg, val);
  38. }
  39. static struct regmap_bus regmap_smbus_byte = {
  40. .reg_write = regmap_smbus_byte_reg_write,
  41. .reg_read = regmap_smbus_byte_reg_read,
  42. };
  43. static int regmap_smbus_word_reg_read(void *context, unsigned int reg,
  44. unsigned int *val)
  45. {
  46. struct device *dev = context;
  47. struct i2c_client *i2c = to_i2c_client(dev);
  48. int ret;
  49. if (reg > 0xff)
  50. return -EINVAL;
  51. ret = i2c_smbus_read_word_data(i2c, reg);
  52. if (ret < 0)
  53. return ret;
  54. *val = ret;
  55. return 0;
  56. }
  57. static int regmap_smbus_word_reg_write(void *context, unsigned int reg,
  58. unsigned int val)
  59. {
  60. struct device *dev = context;
  61. struct i2c_client *i2c = to_i2c_client(dev);
  62. if (val > 0xffff || reg > 0xff)
  63. return -EINVAL;
  64. return i2c_smbus_write_word_data(i2c, reg, val);
  65. }
  66. static struct regmap_bus regmap_smbus_word = {
  67. .reg_write = regmap_smbus_word_reg_write,
  68. .reg_read = regmap_smbus_word_reg_read,
  69. };
  70. static int regmap_smbus_word_read_swapped(void *context, unsigned int reg,
  71. unsigned int *val)
  72. {
  73. struct device *dev = context;
  74. struct i2c_client *i2c = to_i2c_client(dev);
  75. int ret;
  76. if (reg > 0xff)
  77. return -EINVAL;
  78. ret = i2c_smbus_read_word_swapped(i2c, reg);
  79. if (ret < 0)
  80. return ret;
  81. *val = ret;
  82. return 0;
  83. }
  84. static int regmap_smbus_word_write_swapped(void *context, unsigned int reg,
  85. unsigned int val)
  86. {
  87. struct device *dev = context;
  88. struct i2c_client *i2c = to_i2c_client(dev);
  89. if (val > 0xffff || reg > 0xff)
  90. return -EINVAL;
  91. return i2c_smbus_write_word_swapped(i2c, reg, val);
  92. }
  93. static struct regmap_bus regmap_smbus_word_swapped = {
  94. .reg_write = regmap_smbus_word_write_swapped,
  95. .reg_read = regmap_smbus_word_read_swapped,
  96. };
  97. static int regmap_i2c_write(void *context, const void *data, size_t count)
  98. {
  99. struct device *dev = context;
  100. struct i2c_client *i2c = to_i2c_client(dev);
  101. int ret;
  102. ret = i2c_master_send(i2c, data, count);
  103. if (ret == count)
  104. return 0;
  105. else if (ret < 0)
  106. return ret;
  107. else
  108. return -EIO;
  109. }
  110. static int regmap_i2c_gather_write(void *context,
  111. const void *reg, size_t reg_size,
  112. const void *val, size_t val_size)
  113. {
  114. struct device *dev = context;
  115. struct i2c_client *i2c = to_i2c_client(dev);
  116. struct i2c_msg xfer[2];
  117. int ret;
  118. /* If the I2C controller can't do a gather tell the core, it
  119. * will substitute in a linear write for us.
  120. */
  121. if (!i2c_check_functionality(i2c->adapter, I2C_FUNC_NOSTART))
  122. return -ENOTSUPP;
  123. xfer[0].addr = i2c->addr;
  124. xfer[0].flags = 0;
  125. xfer[0].len = reg_size;
  126. xfer[0].buf = (void *)reg;
  127. xfer[1].addr = i2c->addr;
  128. xfer[1].flags = I2C_M_NOSTART;
  129. xfer[1].len = val_size;
  130. xfer[1].buf = (void *)val;
  131. ret = i2c_transfer(i2c->adapter, xfer, 2);
  132. if (ret == 2)
  133. return 0;
  134. if (ret < 0)
  135. return ret;
  136. else
  137. return -EIO;
  138. }
  139. static int regmap_i2c_read(void *context,
  140. const void *reg, size_t reg_size,
  141. void *val, size_t val_size)
  142. {
  143. struct device *dev = context;
  144. struct i2c_client *i2c = to_i2c_client(dev);
  145. struct i2c_msg xfer[2];
  146. int ret;
  147. xfer[0].addr = i2c->addr;
  148. xfer[0].flags = 0;
  149. xfer[0].len = reg_size;
  150. xfer[0].buf = (void *)reg;
  151. xfer[1].addr = i2c->addr;
  152. xfer[1].flags = I2C_M_RD;
  153. xfer[1].len = val_size;
  154. xfer[1].buf = val;
  155. ret = i2c_transfer(i2c->adapter, xfer, 2);
  156. if (ret == 2)
  157. return 0;
  158. else if (ret < 0)
  159. return ret;
  160. else
  161. return -EIO;
  162. }
  163. static struct regmap_bus regmap_i2c = {
  164. .write = regmap_i2c_write,
  165. .gather_write = regmap_i2c_gather_write,
  166. .read = regmap_i2c_read,
  167. .reg_format_endian_default = REGMAP_ENDIAN_BIG,
  168. .val_format_endian_default = REGMAP_ENDIAN_BIG,
  169. };
  170. static int regmap_i2c_smbus_i2c_write(void *context, const void *data,
  171. size_t count)
  172. {
  173. struct device *dev = context;
  174. struct i2c_client *i2c = to_i2c_client(dev);
  175. if (count < 1)
  176. return -EINVAL;
  177. if (count >= I2C_SMBUS_BLOCK_MAX)
  178. return -E2BIG;
  179. --count;
  180. return i2c_smbus_write_i2c_block_data(i2c, ((u8 *)data)[0], count,
  181. ((u8 *)data + 1));
  182. }
  183. static int regmap_i2c_smbus_i2c_read(void *context, const void *reg,
  184. size_t reg_size, void *val,
  185. size_t val_size)
  186. {
  187. struct device *dev = context;
  188. struct i2c_client *i2c = to_i2c_client(dev);
  189. int ret;
  190. if (reg_size != 1 || val_size < 1)
  191. return -EINVAL;
  192. if (val_size >= I2C_SMBUS_BLOCK_MAX)
  193. return -E2BIG;
  194. ret = i2c_smbus_read_i2c_block_data(i2c, ((u8 *)reg)[0], val_size, val);
  195. if (ret == val_size)
  196. return 0;
  197. else if (ret < 0)
  198. return ret;
  199. else
  200. return -EIO;
  201. }
  202. static struct regmap_bus regmap_i2c_smbus_i2c_block = {
  203. .write = regmap_i2c_smbus_i2c_write,
  204. .read = regmap_i2c_smbus_i2c_read,
  205. .max_raw_read = I2C_SMBUS_BLOCK_MAX,
  206. .max_raw_write = I2C_SMBUS_BLOCK_MAX,
  207. };
  208. static const struct regmap_bus *regmap_get_i2c_bus(struct i2c_client *i2c,
  209. const struct regmap_config *config)
  210. {
  211. if (i2c_check_functionality(i2c->adapter, I2C_FUNC_I2C))
  212. return &regmap_i2c;
  213. else if (config->val_bits == 8 && config->reg_bits == 8 &&
  214. i2c_check_functionality(i2c->adapter,
  215. I2C_FUNC_SMBUS_I2C_BLOCK))
  216. return &regmap_i2c_smbus_i2c_block;
  217. else if (config->val_bits == 16 && config->reg_bits == 8 &&
  218. i2c_check_functionality(i2c->adapter,
  219. I2C_FUNC_SMBUS_WORD_DATA))
  220. switch (regmap_get_val_endian(&i2c->dev, NULL, config)) {
  221. case REGMAP_ENDIAN_LITTLE:
  222. return &regmap_smbus_word;
  223. case REGMAP_ENDIAN_BIG:
  224. return &regmap_smbus_word_swapped;
  225. default: /* everything else is not supported */
  226. break;
  227. }
  228. else if (config->val_bits == 8 && config->reg_bits == 8 &&
  229. i2c_check_functionality(i2c->adapter,
  230. I2C_FUNC_SMBUS_BYTE_DATA))
  231. return &regmap_smbus_byte;
  232. return ERR_PTR(-ENOTSUPP);
  233. }
  234. struct regmap *__regmap_init_i2c(struct i2c_client *i2c,
  235. const struct regmap_config *config,
  236. struct lock_class_key *lock_key,
  237. const char *lock_name)
  238. {
  239. const struct regmap_bus *bus = regmap_get_i2c_bus(i2c, config);
  240. if (IS_ERR(bus))
  241. return ERR_CAST(bus);
  242. return __regmap_init(&i2c->dev, bus, &i2c->dev, config,
  243. lock_key, lock_name);
  244. }
  245. EXPORT_SYMBOL_GPL(__regmap_init_i2c);
  246. struct regmap *__devm_regmap_init_i2c(struct i2c_client *i2c,
  247. const struct regmap_config *config,
  248. struct lock_class_key *lock_key,
  249. const char *lock_name)
  250. {
  251. const struct regmap_bus *bus = regmap_get_i2c_bus(i2c, config);
  252. if (IS_ERR(bus))
  253. return ERR_CAST(bus);
  254. return __devm_regmap_init(&i2c->dev, bus, &i2c->dev, config,
  255. lock_key, lock_name);
  256. }
  257. EXPORT_SYMBOL_GPL(__devm_regmap_init_i2c);
  258. MODULE_LICENSE("GPL");