ltc2497.c 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294
  1. /*
  2. * ltc2497.c - Driver for Analog Devices/Linear Technology LTC2497 ADC
  3. *
  4. * Copyright (C) 2017 Analog Devices Inc.
  5. *
  6. * Licensed under the GPL-2.
  7. *
  8. * Datasheet: http://cds.linear.com/docs/en/datasheet/2497fd.pdf
  9. */
  10. #include <linux/delay.h>
  11. #include <linux/i2c.h>
  12. #include <linux/iio/iio.h>
  13. #include <linux/iio/driver.h>
  14. #include <linux/iio/sysfs.h>
  15. #include <linux/module.h>
  16. #include <linux/of.h>
  17. #include <linux/regulator/consumer.h>
  18. #define LTC2497_ENABLE 0xA0
  19. #define LTC2497_SGL BIT(4)
  20. #define LTC2497_DIFF 0
  21. #define LTC2497_SIGN BIT(3)
  22. #define LTC2497_CONFIG_DEFAULT LTC2497_ENABLE
  23. #define LTC2497_CONVERSION_TIME_MS 150ULL
  24. struct ltc2497_st {
  25. struct i2c_client *client;
  26. struct regulator *ref;
  27. ktime_t time_prev;
  28. u8 addr_prev;
  29. /*
  30. * DMA (thus cache coherency maintenance) requires the
  31. * transfer buffers to live in their own cache lines.
  32. */
  33. __be32 buf ____cacheline_aligned;
  34. };
  35. static int ltc2497_wait_conv(struct ltc2497_st *st)
  36. {
  37. s64 time_elapsed;
  38. time_elapsed = ktime_ms_delta(ktime_get(), st->time_prev);
  39. if (time_elapsed < LTC2497_CONVERSION_TIME_MS) {
  40. /* delay if conversion time not passed
  41. * since last read or write
  42. */
  43. if (msleep_interruptible(
  44. LTC2497_CONVERSION_TIME_MS - time_elapsed))
  45. return -ERESTARTSYS;
  46. return 0;
  47. }
  48. if (time_elapsed - LTC2497_CONVERSION_TIME_MS <= 0) {
  49. /* We're in automatic mode -
  50. * so the last reading is stil not outdated
  51. */
  52. return 0;
  53. }
  54. return 1;
  55. }
  56. static int ltc2497_read(struct ltc2497_st *st, u8 address, int *val)
  57. {
  58. struct i2c_client *client = st->client;
  59. int ret;
  60. ret = ltc2497_wait_conv(st);
  61. if (ret < 0)
  62. return ret;
  63. if (ret || st->addr_prev != address) {
  64. ret = i2c_smbus_write_byte(st->client,
  65. LTC2497_ENABLE | address);
  66. if (ret < 0)
  67. return ret;
  68. st->addr_prev = address;
  69. if (msleep_interruptible(LTC2497_CONVERSION_TIME_MS))
  70. return -ERESTARTSYS;
  71. }
  72. ret = i2c_master_recv(client, (char *)&st->buf, 3);
  73. if (ret < 0) {
  74. dev_err(&client->dev, "i2c_master_recv failed\n");
  75. return ret;
  76. }
  77. st->time_prev = ktime_get();
  78. /* convert and shift the result,
  79. * and finally convert from offset binary to signed integer
  80. */
  81. *val = (be32_to_cpu(st->buf) >> 14) - (1 << 17);
  82. return ret;
  83. }
  84. static int ltc2497_read_raw(struct iio_dev *indio_dev,
  85. struct iio_chan_spec const *chan,
  86. int *val, int *val2, long mask)
  87. {
  88. struct ltc2497_st *st = iio_priv(indio_dev);
  89. int ret;
  90. switch (mask) {
  91. case IIO_CHAN_INFO_RAW:
  92. mutex_lock(&indio_dev->mlock);
  93. ret = ltc2497_read(st, chan->address, val);
  94. mutex_unlock(&indio_dev->mlock);
  95. if (ret < 0)
  96. return ret;
  97. return IIO_VAL_INT;
  98. case IIO_CHAN_INFO_SCALE:
  99. ret = regulator_get_voltage(st->ref);
  100. if (ret < 0)
  101. return ret;
  102. *val = ret / 1000;
  103. *val2 = 17;
  104. return IIO_VAL_FRACTIONAL_LOG2;
  105. default:
  106. return -EINVAL;
  107. }
  108. }
  109. #define LTC2497_CHAN(_chan, _addr, _ds_name) { \
  110. .type = IIO_VOLTAGE, \
  111. .indexed = 1, \
  112. .channel = (_chan), \
  113. .address = (_addr | (_chan / 2) | ((_chan & 1) ? LTC2497_SIGN : 0)), \
  114. .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), \
  115. .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE), \
  116. .datasheet_name = (_ds_name), \
  117. }
  118. #define LTC2497_CHAN_DIFF(_chan, _addr) { \
  119. .type = IIO_VOLTAGE, \
  120. .indexed = 1, \
  121. .channel = (_chan) * 2 + ((_addr) & LTC2497_SIGN ? 1 : 0), \
  122. .channel2 = (_chan) * 2 + ((_addr) & LTC2497_SIGN ? 0 : 1),\
  123. .address = (_addr | _chan), \
  124. .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), \
  125. .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE), \
  126. .differential = 1, \
  127. }
  128. static const struct iio_chan_spec ltc2497_channel[] = {
  129. LTC2497_CHAN(0, LTC2497_SGL, "CH0"),
  130. LTC2497_CHAN(1, LTC2497_SGL, "CH1"),
  131. LTC2497_CHAN(2, LTC2497_SGL, "CH2"),
  132. LTC2497_CHAN(3, LTC2497_SGL, "CH3"),
  133. LTC2497_CHAN(4, LTC2497_SGL, "CH4"),
  134. LTC2497_CHAN(5, LTC2497_SGL, "CH5"),
  135. LTC2497_CHAN(6, LTC2497_SGL, "CH6"),
  136. LTC2497_CHAN(7, LTC2497_SGL, "CH7"),
  137. LTC2497_CHAN(8, LTC2497_SGL, "CH8"),
  138. LTC2497_CHAN(9, LTC2497_SGL, "CH9"),
  139. LTC2497_CHAN(10, LTC2497_SGL, "CH10"),
  140. LTC2497_CHAN(11, LTC2497_SGL, "CH11"),
  141. LTC2497_CHAN(12, LTC2497_SGL, "CH12"),
  142. LTC2497_CHAN(13, LTC2497_SGL, "CH13"),
  143. LTC2497_CHAN(14, LTC2497_SGL, "CH14"),
  144. LTC2497_CHAN(15, LTC2497_SGL, "CH15"),
  145. LTC2497_CHAN_DIFF(0, LTC2497_DIFF),
  146. LTC2497_CHAN_DIFF(1, LTC2497_DIFF),
  147. LTC2497_CHAN_DIFF(2, LTC2497_DIFF),
  148. LTC2497_CHAN_DIFF(3, LTC2497_DIFF),
  149. LTC2497_CHAN_DIFF(4, LTC2497_DIFF),
  150. LTC2497_CHAN_DIFF(5, LTC2497_DIFF),
  151. LTC2497_CHAN_DIFF(6, LTC2497_DIFF),
  152. LTC2497_CHAN_DIFF(7, LTC2497_DIFF),
  153. LTC2497_CHAN_DIFF(0, LTC2497_DIFF | LTC2497_SIGN),
  154. LTC2497_CHAN_DIFF(1, LTC2497_DIFF | LTC2497_SIGN),
  155. LTC2497_CHAN_DIFF(2, LTC2497_DIFF | LTC2497_SIGN),
  156. LTC2497_CHAN_DIFF(3, LTC2497_DIFF | LTC2497_SIGN),
  157. LTC2497_CHAN_DIFF(4, LTC2497_DIFF | LTC2497_SIGN),
  158. LTC2497_CHAN_DIFF(5, LTC2497_DIFF | LTC2497_SIGN),
  159. LTC2497_CHAN_DIFF(6, LTC2497_DIFF | LTC2497_SIGN),
  160. LTC2497_CHAN_DIFF(7, LTC2497_DIFF | LTC2497_SIGN),
  161. };
  162. static const struct iio_info ltc2497_info = {
  163. .read_raw = ltc2497_read_raw,
  164. };
  165. static int ltc2497_probe(struct i2c_client *client,
  166. const struct i2c_device_id *id)
  167. {
  168. struct iio_dev *indio_dev;
  169. struct ltc2497_st *st;
  170. struct iio_map *plat_data;
  171. int ret;
  172. if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C |
  173. I2C_FUNC_SMBUS_WRITE_BYTE))
  174. return -EOPNOTSUPP;
  175. indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*st));
  176. if (!indio_dev)
  177. return -ENOMEM;
  178. st = iio_priv(indio_dev);
  179. i2c_set_clientdata(client, indio_dev);
  180. st->client = client;
  181. indio_dev->dev.parent = &client->dev;
  182. indio_dev->name = id->name;
  183. indio_dev->info = &ltc2497_info;
  184. indio_dev->modes = INDIO_DIRECT_MODE;
  185. indio_dev->channels = ltc2497_channel;
  186. indio_dev->num_channels = ARRAY_SIZE(ltc2497_channel);
  187. st->ref = devm_regulator_get(&client->dev, "vref");
  188. if (IS_ERR(st->ref))
  189. return PTR_ERR(st->ref);
  190. ret = regulator_enable(st->ref);
  191. if (ret < 0)
  192. return ret;
  193. if (client->dev.platform_data) {
  194. plat_data = ((struct iio_map *)client->dev.platform_data);
  195. ret = iio_map_array_register(indio_dev, plat_data);
  196. if (ret) {
  197. dev_err(&indio_dev->dev, "iio map err: %d\n", ret);
  198. goto err_regulator_disable;
  199. }
  200. }
  201. ret = i2c_smbus_write_byte(st->client, LTC2497_CONFIG_DEFAULT);
  202. if (ret < 0)
  203. goto err_array_unregister;
  204. st->addr_prev = LTC2497_CONFIG_DEFAULT;
  205. st->time_prev = ktime_get();
  206. ret = iio_device_register(indio_dev);
  207. if (ret < 0)
  208. goto err_array_unregister;
  209. return 0;
  210. err_array_unregister:
  211. iio_map_array_unregister(indio_dev);
  212. err_regulator_disable:
  213. regulator_disable(st->ref);
  214. return ret;
  215. }
  216. static int ltc2497_remove(struct i2c_client *client)
  217. {
  218. struct iio_dev *indio_dev = i2c_get_clientdata(client);
  219. struct ltc2497_st *st = iio_priv(indio_dev);
  220. iio_map_array_unregister(indio_dev);
  221. iio_device_unregister(indio_dev);
  222. regulator_disable(st->ref);
  223. return 0;
  224. }
  225. static const struct i2c_device_id ltc2497_id[] = {
  226. { "ltc2497", 0 },
  227. { }
  228. };
  229. MODULE_DEVICE_TABLE(i2c, ltc2497_id);
  230. static const struct of_device_id ltc2497_of_match[] = {
  231. { .compatible = "lltc,ltc2497", },
  232. {},
  233. };
  234. MODULE_DEVICE_TABLE(of, ltc2497_of_match);
  235. static struct i2c_driver ltc2497_driver = {
  236. .driver = {
  237. .name = "ltc2497",
  238. .of_match_table = of_match_ptr(ltc2497_of_match),
  239. },
  240. .probe = ltc2497_probe,
  241. .remove = ltc2497_remove,
  242. .id_table = ltc2497_id,
  243. };
  244. module_i2c_driver(ltc2497_driver);
  245. MODULE_AUTHOR("Michael Hennerich <michael.hennerich@analog.com>");
  246. MODULE_DESCRIPTION("Linear Technology LTC2497 ADC driver");
  247. MODULE_LICENSE("GPL v2");