ti-adc161s626.c 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /*
  3. * ti-adc161s626.c - Texas Instruments ADC161S626 1-channel differential ADC
  4. *
  5. * ADC Devices Supported:
  6. * adc141s626 - 14-bit ADC
  7. * adc161s626 - 16-bit ADC
  8. *
  9. * Copyright (C) 2016-2018
  10. * Author: Matt Ranostay <matt.ranostay@konsulko.com>
  11. */
  12. #include <linux/module.h>
  13. #include <linux/init.h>
  14. #include <linux/err.h>
  15. #include <linux/spi/spi.h>
  16. #include <linux/iio/iio.h>
  17. #include <linux/iio/trigger.h>
  18. #include <linux/iio/buffer.h>
  19. #include <linux/iio/trigger_consumer.h>
  20. #include <linux/iio/triggered_buffer.h>
  21. #include <linux/regulator/consumer.h>
  22. #define TI_ADC_DRV_NAME "ti-adc161s626"
  23. enum {
  24. TI_ADC141S626,
  25. TI_ADC161S626,
  26. };
  27. static const struct iio_chan_spec ti_adc141s626_channels[] = {
  28. {
  29. .type = IIO_VOLTAGE,
  30. .channel = 0,
  31. .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |
  32. BIT(IIO_CHAN_INFO_SCALE) |
  33. BIT(IIO_CHAN_INFO_OFFSET),
  34. .scan_index = 0,
  35. .scan_type = {
  36. .sign = 's',
  37. .realbits = 14,
  38. .storagebits = 16,
  39. },
  40. },
  41. IIO_CHAN_SOFT_TIMESTAMP(1),
  42. };
  43. static const struct iio_chan_spec ti_adc161s626_channels[] = {
  44. {
  45. .type = IIO_VOLTAGE,
  46. .channel = 0,
  47. .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |
  48. BIT(IIO_CHAN_INFO_SCALE) |
  49. BIT(IIO_CHAN_INFO_OFFSET),
  50. .scan_index = 0,
  51. .scan_type = {
  52. .sign = 's',
  53. .realbits = 16,
  54. .storagebits = 16,
  55. },
  56. },
  57. IIO_CHAN_SOFT_TIMESTAMP(1),
  58. };
  59. struct ti_adc_data {
  60. struct iio_dev *indio_dev;
  61. struct spi_device *spi;
  62. struct regulator *ref;
  63. u8 read_size;
  64. u8 shift;
  65. u8 buffer[16] ____cacheline_aligned;
  66. };
  67. static int ti_adc_read_measurement(struct ti_adc_data *data,
  68. struct iio_chan_spec const *chan, int *val)
  69. {
  70. int ret;
  71. switch (data->read_size) {
  72. case 2: {
  73. __be16 buf;
  74. ret = spi_read(data->spi, (void *) &buf, 2);
  75. if (ret)
  76. return ret;
  77. *val = be16_to_cpu(buf);
  78. break;
  79. }
  80. case 3: {
  81. __be32 buf;
  82. ret = spi_read(data->spi, (void *) &buf, 3);
  83. if (ret)
  84. return ret;
  85. *val = be32_to_cpu(buf) >> 8;
  86. break;
  87. }
  88. default:
  89. return -EINVAL;
  90. }
  91. *val = sign_extend32(*val >> data->shift, chan->scan_type.realbits - 1);
  92. return 0;
  93. }
  94. static irqreturn_t ti_adc_trigger_handler(int irq, void *private)
  95. {
  96. struct iio_poll_func *pf = private;
  97. struct iio_dev *indio_dev = pf->indio_dev;
  98. struct ti_adc_data *data = iio_priv(indio_dev);
  99. int ret;
  100. ret = ti_adc_read_measurement(data, &indio_dev->channels[0],
  101. (int *) &data->buffer);
  102. if (!ret)
  103. iio_push_to_buffers_with_timestamp(indio_dev,
  104. data->buffer,
  105. iio_get_time_ns(indio_dev));
  106. iio_trigger_notify_done(indio_dev->trig);
  107. return IRQ_HANDLED;
  108. }
  109. static int ti_adc_read_raw(struct iio_dev *indio_dev,
  110. struct iio_chan_spec const *chan,
  111. int *val, int *val2, long mask)
  112. {
  113. struct ti_adc_data *data = iio_priv(indio_dev);
  114. int ret;
  115. switch (mask) {
  116. case IIO_CHAN_INFO_RAW:
  117. ret = iio_device_claim_direct_mode(indio_dev);
  118. if (ret)
  119. return ret;
  120. ret = ti_adc_read_measurement(data, chan, val);
  121. iio_device_release_direct_mode(indio_dev);
  122. if (ret)
  123. return ret;
  124. return IIO_VAL_INT;
  125. case IIO_CHAN_INFO_SCALE:
  126. ret = regulator_get_voltage(data->ref);
  127. if (ret < 0)
  128. return ret;
  129. *val = ret / 1000;
  130. *val2 = chan->scan_type.realbits;
  131. return IIO_VAL_FRACTIONAL_LOG2;
  132. case IIO_CHAN_INFO_OFFSET:
  133. *val = 1 << (chan->scan_type.realbits - 1);
  134. return IIO_VAL_INT;
  135. }
  136. return 0;
  137. }
  138. static const struct iio_info ti_adc_info = {
  139. .read_raw = ti_adc_read_raw,
  140. };
  141. static int ti_adc_probe(struct spi_device *spi)
  142. {
  143. struct iio_dev *indio_dev;
  144. struct ti_adc_data *data;
  145. int ret;
  146. indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*data));
  147. if (!indio_dev)
  148. return -ENOMEM;
  149. indio_dev->info = &ti_adc_info;
  150. indio_dev->dev.parent = &spi->dev;
  151. indio_dev->dev.of_node = spi->dev.of_node;
  152. indio_dev->name = TI_ADC_DRV_NAME;
  153. indio_dev->modes = INDIO_DIRECT_MODE;
  154. spi_set_drvdata(spi, indio_dev);
  155. data = iio_priv(indio_dev);
  156. data->spi = spi;
  157. switch (spi_get_device_id(spi)->driver_data) {
  158. case TI_ADC141S626:
  159. indio_dev->channels = ti_adc141s626_channels;
  160. indio_dev->num_channels = ARRAY_SIZE(ti_adc141s626_channels);
  161. data->shift = 0;
  162. data->read_size = 2;
  163. break;
  164. case TI_ADC161S626:
  165. indio_dev->channels = ti_adc161s626_channels;
  166. indio_dev->num_channels = ARRAY_SIZE(ti_adc161s626_channels);
  167. data->shift = 6;
  168. data->read_size = 3;
  169. break;
  170. }
  171. data->ref = devm_regulator_get(&spi->dev, "vdda");
  172. if (!IS_ERR(data->ref)) {
  173. ret = regulator_enable(data->ref);
  174. if (ret < 0)
  175. return ret;
  176. }
  177. ret = iio_triggered_buffer_setup(indio_dev, NULL,
  178. ti_adc_trigger_handler, NULL);
  179. if (ret)
  180. goto error_regulator_disable;
  181. ret = iio_device_register(indio_dev);
  182. if (ret)
  183. goto error_unreg_buffer;
  184. return 0;
  185. error_unreg_buffer:
  186. iio_triggered_buffer_cleanup(indio_dev);
  187. error_regulator_disable:
  188. regulator_disable(data->ref);
  189. return ret;
  190. }
  191. static int ti_adc_remove(struct spi_device *spi)
  192. {
  193. struct iio_dev *indio_dev = spi_get_drvdata(spi);
  194. struct ti_adc_data *data = iio_priv(indio_dev);
  195. iio_device_unregister(indio_dev);
  196. iio_triggered_buffer_cleanup(indio_dev);
  197. regulator_disable(data->ref);
  198. return 0;
  199. }
  200. static const struct of_device_id ti_adc_dt_ids[] = {
  201. { .compatible = "ti,adc141s626", },
  202. { .compatible = "ti,adc161s626", },
  203. {}
  204. };
  205. MODULE_DEVICE_TABLE(of, ti_adc_dt_ids);
  206. static const struct spi_device_id ti_adc_id[] = {
  207. {"adc141s626", TI_ADC141S626},
  208. {"adc161s626", TI_ADC161S626},
  209. {},
  210. };
  211. MODULE_DEVICE_TABLE(spi, ti_adc_id);
  212. static struct spi_driver ti_adc_driver = {
  213. .driver = {
  214. .name = TI_ADC_DRV_NAME,
  215. .of_match_table = of_match_ptr(ti_adc_dt_ids),
  216. },
  217. .probe = ti_adc_probe,
  218. .remove = ti_adc_remove,
  219. .id_table = ti_adc_id,
  220. };
  221. module_spi_driver(ti_adc_driver);
  222. MODULE_AUTHOR("Matt Ranostay <matt.ranostay@konsulko.com>");
  223. MODULE_DESCRIPTION("Texas Instruments ADC1x1S 1-channel differential ADC");
  224. MODULE_LICENSE("GPL");