ltc2497.c 6.8 KB

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