ad8801.c 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * IIO DAC driver for Analog Devices AD8801 DAC
  4. *
  5. * Copyright (C) 2016 Gwenhael Goavec-Merou
  6. */
  7. #include <linux/iio/iio.h>
  8. #include <linux/module.h>
  9. #include <linux/regulator/consumer.h>
  10. #include <linux/spi/spi.h>
  11. #include <linux/sysfs.h>
  12. #define AD8801_CFG_ADDR_OFFSET 8
  13. enum ad8801_device_ids {
  14. ID_AD8801,
  15. ID_AD8803,
  16. };
  17. struct ad8801_state {
  18. struct spi_device *spi;
  19. unsigned char dac_cache[8]; /* Value write on each channel */
  20. unsigned int vrefh_mv;
  21. unsigned int vrefl_mv;
  22. struct regulator *vrefh_reg;
  23. struct regulator *vrefl_reg;
  24. __be16 data __aligned(IIO_DMA_MINALIGN);
  25. };
  26. static int ad8801_spi_write(struct ad8801_state *state,
  27. u8 channel, unsigned char value)
  28. {
  29. state->data = cpu_to_be16((channel << AD8801_CFG_ADDR_OFFSET) | value);
  30. return spi_write(state->spi, &state->data, sizeof(state->data));
  31. }
  32. static int ad8801_write_raw(struct iio_dev *indio_dev,
  33. struct iio_chan_spec const *chan, int val, int val2, long mask)
  34. {
  35. struct ad8801_state *state = iio_priv(indio_dev);
  36. int ret;
  37. switch (mask) {
  38. case IIO_CHAN_INFO_RAW:
  39. if (val >= 256 || val < 0)
  40. return -EINVAL;
  41. ret = ad8801_spi_write(state, chan->channel, val);
  42. if (ret == 0)
  43. state->dac_cache[chan->channel] = val;
  44. break;
  45. default:
  46. ret = -EINVAL;
  47. }
  48. return ret;
  49. }
  50. static int ad8801_read_raw(struct iio_dev *indio_dev,
  51. struct iio_chan_spec const *chan, int *val, int *val2, long info)
  52. {
  53. struct ad8801_state *state = iio_priv(indio_dev);
  54. switch (info) {
  55. case IIO_CHAN_INFO_RAW:
  56. *val = state->dac_cache[chan->channel];
  57. return IIO_VAL_INT;
  58. case IIO_CHAN_INFO_SCALE:
  59. *val = state->vrefh_mv - state->vrefl_mv;
  60. *val2 = 8;
  61. return IIO_VAL_FRACTIONAL_LOG2;
  62. case IIO_CHAN_INFO_OFFSET:
  63. *val = state->vrefl_mv;
  64. return IIO_VAL_INT;
  65. default:
  66. return -EINVAL;
  67. }
  68. return -EINVAL;
  69. }
  70. static const struct iio_info ad8801_info = {
  71. .read_raw = ad8801_read_raw,
  72. .write_raw = ad8801_write_raw,
  73. };
  74. #define AD8801_CHANNEL(chan) { \
  75. .type = IIO_VOLTAGE, \
  76. .indexed = 1, \
  77. .output = 1, \
  78. .channel = chan, \
  79. .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), \
  80. .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE) | \
  81. BIT(IIO_CHAN_INFO_OFFSET), \
  82. }
  83. static const struct iio_chan_spec ad8801_channels[] = {
  84. AD8801_CHANNEL(0),
  85. AD8801_CHANNEL(1),
  86. AD8801_CHANNEL(2),
  87. AD8801_CHANNEL(3),
  88. AD8801_CHANNEL(4),
  89. AD8801_CHANNEL(5),
  90. AD8801_CHANNEL(6),
  91. AD8801_CHANNEL(7),
  92. };
  93. static int ad8801_probe(struct spi_device *spi)
  94. {
  95. struct iio_dev *indio_dev;
  96. struct ad8801_state *state;
  97. const struct spi_device_id *id;
  98. int ret;
  99. indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*state));
  100. if (indio_dev == NULL)
  101. return -ENOMEM;
  102. state = iio_priv(indio_dev);
  103. state->spi = spi;
  104. id = spi_get_device_id(spi);
  105. state->vrefh_reg = devm_regulator_get(&spi->dev, "vrefh");
  106. if (IS_ERR(state->vrefh_reg))
  107. return dev_err_probe(&spi->dev, PTR_ERR(state->vrefh_reg),
  108. "Vrefh regulator not specified\n");
  109. ret = regulator_enable(state->vrefh_reg);
  110. if (ret) {
  111. dev_err(&spi->dev, "Failed to enable vrefh regulator: %d\n",
  112. ret);
  113. return ret;
  114. }
  115. ret = regulator_get_voltage(state->vrefh_reg);
  116. if (ret < 0) {
  117. dev_err(&spi->dev, "Failed to read vrefh regulator: %d\n",
  118. ret);
  119. goto error_disable_vrefh_reg;
  120. }
  121. state->vrefh_mv = ret / 1000;
  122. if (id->driver_data == ID_AD8803) {
  123. state->vrefl_reg = devm_regulator_get(&spi->dev, "vrefl");
  124. if (IS_ERR(state->vrefl_reg)) {
  125. ret = dev_err_probe(&spi->dev, PTR_ERR(state->vrefl_reg),
  126. "Vrefl regulator not specified\n");
  127. goto error_disable_vrefh_reg;
  128. }
  129. ret = regulator_enable(state->vrefl_reg);
  130. if (ret) {
  131. dev_err(&spi->dev, "Failed to enable vrefl regulator: %d\n",
  132. ret);
  133. goto error_disable_vrefh_reg;
  134. }
  135. ret = regulator_get_voltage(state->vrefl_reg);
  136. if (ret < 0) {
  137. dev_err(&spi->dev, "Failed to read vrefl regulator: %d\n",
  138. ret);
  139. goto error_disable_vrefl_reg;
  140. }
  141. state->vrefl_mv = ret / 1000;
  142. } else {
  143. state->vrefl_mv = 0;
  144. state->vrefl_reg = NULL;
  145. }
  146. spi_set_drvdata(spi, indio_dev);
  147. indio_dev->info = &ad8801_info;
  148. indio_dev->modes = INDIO_DIRECT_MODE;
  149. indio_dev->channels = ad8801_channels;
  150. indio_dev->num_channels = ARRAY_SIZE(ad8801_channels);
  151. indio_dev->name = id->name;
  152. ret = iio_device_register(indio_dev);
  153. if (ret) {
  154. dev_err(&spi->dev, "Failed to register iio device: %d\n",
  155. ret);
  156. goto error_disable_vrefl_reg;
  157. }
  158. return 0;
  159. error_disable_vrefl_reg:
  160. if (state->vrefl_reg)
  161. regulator_disable(state->vrefl_reg);
  162. error_disable_vrefh_reg:
  163. regulator_disable(state->vrefh_reg);
  164. return ret;
  165. }
  166. static void ad8801_remove(struct spi_device *spi)
  167. {
  168. struct iio_dev *indio_dev = spi_get_drvdata(spi);
  169. struct ad8801_state *state = iio_priv(indio_dev);
  170. iio_device_unregister(indio_dev);
  171. if (state->vrefl_reg)
  172. regulator_disable(state->vrefl_reg);
  173. regulator_disable(state->vrefh_reg);
  174. }
  175. static const struct spi_device_id ad8801_ids[] = {
  176. {"ad8801", ID_AD8801},
  177. {"ad8803", ID_AD8803},
  178. {}
  179. };
  180. MODULE_DEVICE_TABLE(spi, ad8801_ids);
  181. static struct spi_driver ad8801_driver = {
  182. .driver = {
  183. .name = "ad8801",
  184. },
  185. .probe = ad8801_probe,
  186. .remove = ad8801_remove,
  187. .id_table = ad8801_ids,
  188. };
  189. module_spi_driver(ad8801_driver);
  190. MODULE_AUTHOR("Gwenhael Goavec-Merou <[email protected]>");
  191. MODULE_DESCRIPTION("Analog Devices AD8801/AD8803 DAC");
  192. MODULE_LICENSE("GPL v2");