ad7476.c 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278
  1. /*
  2. * AD7466/7/8 AD7476/5/7/8 (A) SPI ADC driver
  3. *
  4. * Copyright 2010 Analog Devices Inc.
  5. *
  6. * Licensed under the GPL-2 or later.
  7. */
  8. #include <linux/device.h>
  9. #include <linux/kernel.h>
  10. #include <linux/slab.h>
  11. #include <linux/sysfs.h>
  12. #include <linux/spi/spi.h>
  13. #include <linux/regulator/consumer.h>
  14. #include <linux/err.h>
  15. #include <linux/module.h>
  16. #include <linux/iio/iio.h>
  17. #include <linux/iio/sysfs.h>
  18. #include <linux/iio/buffer.h>
  19. #include <linux/iio/trigger_consumer.h>
  20. #include <linux/iio/triggered_buffer.h>
  21. #define RES_MASK(bits) ((1 << (bits)) - 1)
  22. struct ad7476_chip_info {
  23. unsigned int int_vref_uv;
  24. struct iio_chan_spec channel[2];
  25. };
  26. struct ad7476_state {
  27. struct spi_device *spi;
  28. const struct ad7476_chip_info *chip_info;
  29. struct regulator *reg;
  30. struct spi_transfer xfer;
  31. struct spi_message msg;
  32. /*
  33. * DMA (thus cache coherency maintenance) requires the
  34. * transfer buffers to live in their own cache lines.
  35. * Make the buffer large enough for one 16 bit sample and one 64 bit
  36. * aligned 64 bit timestamp.
  37. */
  38. unsigned char data[ALIGN(2, sizeof(s64)) + sizeof(s64)]
  39. ____cacheline_aligned;
  40. };
  41. enum ad7476_supported_device_ids {
  42. ID_AD7466,
  43. ID_AD7467,
  44. ID_AD7468,
  45. ID_AD7495
  46. };
  47. static irqreturn_t ad7476_trigger_handler(int irq, void *p)
  48. {
  49. struct iio_poll_func *pf = p;
  50. struct iio_dev *indio_dev = pf->indio_dev;
  51. struct ad7476_state *st = iio_priv(indio_dev);
  52. s64 time_ns;
  53. int b_sent;
  54. b_sent = spi_sync(st->spi, &st->msg);
  55. if (b_sent < 0)
  56. goto done;
  57. time_ns = iio_get_time_ns();
  58. if (indio_dev->scan_timestamp)
  59. ((s64 *)st->data)[1] = time_ns;
  60. iio_push_to_buffer(indio_dev->buffer, st->data);
  61. done:
  62. iio_trigger_notify_done(indio_dev->trig);
  63. return IRQ_HANDLED;
  64. }
  65. static int ad7476_scan_direct(struct ad7476_state *st)
  66. {
  67. int ret;
  68. ret = spi_sync(st->spi, &st->msg);
  69. if (ret)
  70. return ret;
  71. return be16_to_cpup((__be16 *)st->data);
  72. }
  73. static int ad7476_read_raw(struct iio_dev *indio_dev,
  74. struct iio_chan_spec const *chan,
  75. int *val,
  76. int *val2,
  77. long m)
  78. {
  79. int ret;
  80. struct ad7476_state *st = iio_priv(indio_dev);
  81. int scale_uv;
  82. switch (m) {
  83. case IIO_CHAN_INFO_RAW:
  84. mutex_lock(&indio_dev->mlock);
  85. if (iio_buffer_enabled(indio_dev))
  86. ret = -EBUSY;
  87. else
  88. ret = ad7476_scan_direct(st);
  89. mutex_unlock(&indio_dev->mlock);
  90. if (ret < 0)
  91. return ret;
  92. *val = (ret >> st->chip_info->channel[0].scan_type.shift) &
  93. RES_MASK(st->chip_info->channel[0].scan_type.realbits);
  94. return IIO_VAL_INT;
  95. case IIO_CHAN_INFO_SCALE:
  96. if (!st->chip_info->int_vref_uv) {
  97. scale_uv = regulator_get_voltage(st->reg);
  98. if (scale_uv < 0)
  99. return scale_uv;
  100. } else {
  101. scale_uv = st->chip_info->int_vref_uv;
  102. }
  103. scale_uv >>= chan->scan_type.realbits;
  104. *val = scale_uv / 1000;
  105. *val2 = (scale_uv % 1000) * 1000;
  106. return IIO_VAL_INT_PLUS_MICRO;
  107. }
  108. return -EINVAL;
  109. }
  110. #define AD7476_CHAN(bits) \
  111. { \
  112. .type = IIO_VOLTAGE, \
  113. .indexed = 1, \
  114. .info_mask = IIO_CHAN_INFO_RAW_SEPARATE_BIT | \
  115. IIO_CHAN_INFO_SCALE_SHARED_BIT, \
  116. .scan_type = { \
  117. .sign = 'u', \
  118. .realbits = bits, \
  119. .storagebits = 16, \
  120. .shift = 13 - bits, \
  121. }, \
  122. }
  123. static const struct ad7476_chip_info ad7476_chip_info_tbl[] = {
  124. [ID_AD7466] = {
  125. .channel[0] = AD7476_CHAN(12),
  126. .channel[1] = IIO_CHAN_SOFT_TIMESTAMP(1),
  127. },
  128. [ID_AD7467] = {
  129. .channel[0] = AD7476_CHAN(10),
  130. .channel[1] = IIO_CHAN_SOFT_TIMESTAMP(1),
  131. },
  132. [ID_AD7468] = {
  133. .channel[0] = AD7476_CHAN(8),
  134. .channel[1] = IIO_CHAN_SOFT_TIMESTAMP(1),
  135. },
  136. [ID_AD7495] = {
  137. .channel[0] = AD7476_CHAN(12),
  138. .channel[1] = IIO_CHAN_SOFT_TIMESTAMP(1),
  139. .int_vref_uv = 2500000,
  140. },
  141. };
  142. static const struct iio_info ad7476_info = {
  143. .driver_module = THIS_MODULE,
  144. .read_raw = &ad7476_read_raw,
  145. };
  146. static int __devinit ad7476_probe(struct spi_device *spi)
  147. {
  148. struct ad7476_state *st;
  149. struct iio_dev *indio_dev;
  150. int ret;
  151. indio_dev = iio_device_alloc(sizeof(*st));
  152. if (indio_dev == NULL) {
  153. ret = -ENOMEM;
  154. goto error_ret;
  155. }
  156. st = iio_priv(indio_dev);
  157. st->chip_info =
  158. &ad7476_chip_info_tbl[spi_get_device_id(spi)->driver_data];
  159. st->reg = regulator_get(&spi->dev, "vcc");
  160. if (IS_ERR(st->reg)) {
  161. ret = PTR_ERR(st->reg);
  162. goto error_free_dev;
  163. }
  164. ret = regulator_enable(st->reg);
  165. if (ret)
  166. goto error_put_reg;
  167. spi_set_drvdata(spi, indio_dev);
  168. st->spi = spi;
  169. /* Establish that the iio_dev is a child of the spi device */
  170. indio_dev->dev.parent = &spi->dev;
  171. indio_dev->name = spi_get_device_id(spi)->name;
  172. indio_dev->modes = INDIO_DIRECT_MODE;
  173. indio_dev->channels = st->chip_info->channel;
  174. indio_dev->num_channels = 2;
  175. indio_dev->info = &ad7476_info;
  176. /* Setup default message */
  177. st->xfer.rx_buf = &st->data;
  178. st->xfer.len = st->chip_info->channel[0].scan_type.storagebits / 8;
  179. spi_message_init(&st->msg);
  180. spi_message_add_tail(&st->xfer, &st->msg);
  181. ret = iio_triggered_buffer_setup(indio_dev, NULL,
  182. &ad7476_trigger_handler, NULL);
  183. if (ret)
  184. goto error_disable_reg;
  185. ret = iio_device_register(indio_dev);
  186. if (ret)
  187. goto error_ring_unregister;
  188. return 0;
  189. error_ring_unregister:
  190. iio_triggered_buffer_cleanup(indio_dev);
  191. error_disable_reg:
  192. regulator_disable(st->reg);
  193. error_put_reg:
  194. regulator_put(st->reg);
  195. error_free_dev:
  196. iio_device_free(indio_dev);
  197. error_ret:
  198. return ret;
  199. }
  200. static int __devexit ad7476_remove(struct spi_device *spi)
  201. {
  202. struct iio_dev *indio_dev = spi_get_drvdata(spi);
  203. struct ad7476_state *st = iio_priv(indio_dev);
  204. iio_device_unregister(indio_dev);
  205. iio_triggered_buffer_cleanup(indio_dev);
  206. regulator_disable(st->reg);
  207. regulator_put(st->reg);
  208. iio_device_free(indio_dev);
  209. return 0;
  210. }
  211. static const struct spi_device_id ad7476_id[] = {
  212. {"ad7466", ID_AD7466},
  213. {"ad7467", ID_AD7467},
  214. {"ad7468", ID_AD7468},
  215. {"ad7475", ID_AD7466},
  216. {"ad7476", ID_AD7466},
  217. {"ad7476a", ID_AD7466},
  218. {"ad7477", ID_AD7467},
  219. {"ad7477a", ID_AD7467},
  220. {"ad7478", ID_AD7468},
  221. {"ad7478a", ID_AD7468},
  222. {"ad7495", ID_AD7495},
  223. {}
  224. };
  225. MODULE_DEVICE_TABLE(spi, ad7476_id);
  226. static struct spi_driver ad7476_driver = {
  227. .driver = {
  228. .name = "ad7476",
  229. .owner = THIS_MODULE,
  230. },
  231. .probe = ad7476_probe,
  232. .remove = __devexit_p(ad7476_remove),
  233. .id_table = ad7476_id,
  234. };
  235. module_spi_driver(ad7476_driver);
  236. MODULE_AUTHOR("Michael Hennerich <hennerich@blackfin.uclinux.org>");
  237. MODULE_DESCRIPTION("Analog Devices AD7475/6/7/8(A) AD7466/7/8 ADC");
  238. MODULE_LICENSE("GPL v2");