ad5624r_spi.c 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320
  1. /*
  2. * AD5624R, AD5644R, AD5664R Digital to analog convertors spi driver
  3. *
  4. * Copyright 2010-2011 Analog Devices Inc.
  5. *
  6. * Licensed under the GPL-2.
  7. */
  8. #include <linux/interrupt.h>
  9. #include <linux/fs.h>
  10. #include <linux/device.h>
  11. #include <linux/kernel.h>
  12. #include <linux/spi/spi.h>
  13. #include <linux/slab.h>
  14. #include <linux/sysfs.h>
  15. #include <linux/regulator/consumer.h>
  16. #include <linux/module.h>
  17. #include <linux/iio/iio.h>
  18. #include <linux/iio/sysfs.h>
  19. #include "ad5624r.h"
  20. static int ad5624r_spi_write(struct spi_device *spi,
  21. u8 cmd, u8 addr, u16 val, u8 len)
  22. {
  23. u32 data;
  24. u8 msg[3];
  25. /*
  26. * The input shift register is 24 bits wide. The first two bits are
  27. * don't care bits. The next three are the command bits, C2 to C0,
  28. * followed by the 3-bit DAC address, A2 to A0, and then the
  29. * 16-, 14-, 12-bit data-word. The data-word comprises the 16-,
  30. * 14-, 12-bit input code followed by 0, 2, or 4 don't care bits,
  31. * for the AD5664R, AD5644R, and AD5624R, respectively.
  32. */
  33. data = (0 << 22) | (cmd << 19) | (addr << 16) | (val << (16 - len));
  34. msg[0] = data >> 16;
  35. msg[1] = data >> 8;
  36. msg[2] = data;
  37. return spi_write(spi, msg, 3);
  38. }
  39. static int ad5624r_read_raw(struct iio_dev *indio_dev,
  40. struct iio_chan_spec const *chan,
  41. int *val,
  42. int *val2,
  43. long m)
  44. {
  45. struct ad5624r_state *st = iio_priv(indio_dev);
  46. unsigned long scale_uv;
  47. switch (m) {
  48. case IIO_CHAN_INFO_SCALE:
  49. scale_uv = (st->vref_mv * 1000) >> chan->scan_type.realbits;
  50. *val = scale_uv / 1000;
  51. *val2 = (scale_uv % 1000) * 1000;
  52. return IIO_VAL_INT_PLUS_MICRO;
  53. }
  54. return -EINVAL;
  55. }
  56. static int ad5624r_write_raw(struct iio_dev *indio_dev,
  57. struct iio_chan_spec const *chan,
  58. int val,
  59. int val2,
  60. long mask)
  61. {
  62. struct ad5624r_state *st = iio_priv(indio_dev);
  63. int ret;
  64. switch (mask) {
  65. case IIO_CHAN_INFO_RAW:
  66. if (val >= (1 << chan->scan_type.realbits) || val < 0)
  67. return -EINVAL;
  68. return ad5624r_spi_write(st->us,
  69. AD5624R_CMD_WRITE_INPUT_N_UPDATE_N,
  70. chan->address, val,
  71. chan->scan_type.shift);
  72. default:
  73. ret = -EINVAL;
  74. }
  75. return -EINVAL;
  76. }
  77. static const char * const ad5624r_powerdown_modes[] = {
  78. "1kohm_to_gnd",
  79. "100kohm_to_gnd",
  80. "three_state"
  81. };
  82. static int ad5624r_get_powerdown_mode(struct iio_dev *indio_dev,
  83. const struct iio_chan_spec *chan)
  84. {
  85. struct ad5624r_state *st = iio_priv(indio_dev);
  86. return st->pwr_down_mode;
  87. }
  88. static int ad5624r_set_powerdown_mode(struct iio_dev *indio_dev,
  89. const struct iio_chan_spec *chan, unsigned int mode)
  90. {
  91. struct ad5624r_state *st = iio_priv(indio_dev);
  92. st->pwr_down_mode = mode;
  93. return 0;
  94. }
  95. static const struct iio_enum ad5624r_powerdown_mode_enum = {
  96. .items = ad5624r_powerdown_modes,
  97. .num_items = ARRAY_SIZE(ad5624r_powerdown_modes),
  98. .get = ad5624r_get_powerdown_mode,
  99. .set = ad5624r_set_powerdown_mode,
  100. };
  101. static ssize_t ad5624r_read_dac_powerdown(struct iio_dev *indio_dev,
  102. uintptr_t private, const struct iio_chan_spec *chan, char *buf)
  103. {
  104. struct ad5624r_state *st = iio_priv(indio_dev);
  105. return sprintf(buf, "%d\n",
  106. !!(st->pwr_down_mask & (1 << chan->channel)));
  107. }
  108. static ssize_t ad5624r_write_dac_powerdown(struct iio_dev *indio_dev,
  109. uintptr_t private, const struct iio_chan_spec *chan, const char *buf,
  110. size_t len)
  111. {
  112. bool pwr_down;
  113. int ret;
  114. struct ad5624r_state *st = iio_priv(indio_dev);
  115. ret = strtobool(buf, &pwr_down);
  116. if (ret)
  117. return ret;
  118. if (pwr_down)
  119. st->pwr_down_mask |= (1 << chan->channel);
  120. else
  121. st->pwr_down_mask &= ~(1 << chan->channel);
  122. ret = ad5624r_spi_write(st->us, AD5624R_CMD_POWERDOWN_DAC, 0,
  123. (st->pwr_down_mode << 4) |
  124. st->pwr_down_mask, 16);
  125. return ret ? ret : len;
  126. }
  127. static const struct iio_info ad5624r_info = {
  128. .write_raw = ad5624r_write_raw,
  129. .read_raw = ad5624r_read_raw,
  130. .driver_module = THIS_MODULE,
  131. };
  132. static const struct iio_chan_spec_ext_info ad5624r_ext_info[] = {
  133. {
  134. .name = "powerdown",
  135. .read = ad5624r_read_dac_powerdown,
  136. .write = ad5624r_write_dac_powerdown,
  137. .shared = IIO_SEPARATE,
  138. },
  139. IIO_ENUM("powerdown_mode", IIO_SHARED_BY_TYPE,
  140. &ad5624r_powerdown_mode_enum),
  141. IIO_ENUM_AVAILABLE("powerdown_mode", &ad5624r_powerdown_mode_enum),
  142. { },
  143. };
  144. #define AD5624R_CHANNEL(_chan, _bits) { \
  145. .type = IIO_VOLTAGE, \
  146. .indexed = 1, \
  147. .output = 1, \
  148. .channel = (_chan), \
  149. .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), \
  150. .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE), \
  151. .address = (_chan), \
  152. .scan_type = IIO_ST('u', (_bits), 16, 16 - (_bits)), \
  153. .ext_info = ad5624r_ext_info, \
  154. }
  155. #define DECLARE_AD5624R_CHANNELS(_name, _bits) \
  156. const struct iio_chan_spec _name##_channels[] = { \
  157. AD5624R_CHANNEL(0, _bits), \
  158. AD5624R_CHANNEL(1, _bits), \
  159. AD5624R_CHANNEL(2, _bits), \
  160. AD5624R_CHANNEL(3, _bits), \
  161. }
  162. static DECLARE_AD5624R_CHANNELS(ad5624r, 12);
  163. static DECLARE_AD5624R_CHANNELS(ad5644r, 14);
  164. static DECLARE_AD5624R_CHANNELS(ad5664r, 16);
  165. static const struct ad5624r_chip_info ad5624r_chip_info_tbl[] = {
  166. [ID_AD5624R3] = {
  167. .channels = ad5624r_channels,
  168. .int_vref_mv = 1250,
  169. },
  170. [ID_AD5624R5] = {
  171. .channels = ad5624r_channels,
  172. .int_vref_mv = 2500,
  173. },
  174. [ID_AD5644R3] = {
  175. .channels = ad5644r_channels,
  176. .int_vref_mv = 1250,
  177. },
  178. [ID_AD5644R5] = {
  179. .channels = ad5644r_channels,
  180. .int_vref_mv = 2500,
  181. },
  182. [ID_AD5664R3] = {
  183. .channels = ad5664r_channels,
  184. .int_vref_mv = 1250,
  185. },
  186. [ID_AD5664R5] = {
  187. .channels = ad5664r_channels,
  188. .int_vref_mv = 2500,
  189. },
  190. };
  191. static int ad5624r_probe(struct spi_device *spi)
  192. {
  193. struct ad5624r_state *st;
  194. struct iio_dev *indio_dev;
  195. int ret, voltage_uv = 0;
  196. indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*st));
  197. if (!indio_dev)
  198. return -ENOMEM;
  199. st = iio_priv(indio_dev);
  200. st->reg = devm_regulator_get(&spi->dev, "vcc");
  201. if (!IS_ERR(st->reg)) {
  202. ret = regulator_enable(st->reg);
  203. if (ret)
  204. return ret;
  205. ret = regulator_get_voltage(st->reg);
  206. if (ret < 0)
  207. goto error_disable_reg;
  208. voltage_uv = ret;
  209. }
  210. spi_set_drvdata(spi, indio_dev);
  211. st->chip_info =
  212. &ad5624r_chip_info_tbl[spi_get_device_id(spi)->driver_data];
  213. if (voltage_uv)
  214. st->vref_mv = voltage_uv / 1000;
  215. else
  216. st->vref_mv = st->chip_info->int_vref_mv;
  217. st->us = spi;
  218. indio_dev->dev.parent = &spi->dev;
  219. indio_dev->name = spi_get_device_id(spi)->name;
  220. indio_dev->info = &ad5624r_info;
  221. indio_dev->modes = INDIO_DIRECT_MODE;
  222. indio_dev->channels = st->chip_info->channels;
  223. indio_dev->num_channels = AD5624R_DAC_CHANNELS;
  224. ret = ad5624r_spi_write(spi, AD5624R_CMD_INTERNAL_REFER_SETUP, 0,
  225. !!voltage_uv, 16);
  226. if (ret)
  227. goto error_disable_reg;
  228. ret = iio_device_register(indio_dev);
  229. if (ret)
  230. goto error_disable_reg;
  231. return 0;
  232. error_disable_reg:
  233. if (!IS_ERR(st->reg))
  234. regulator_disable(st->reg);
  235. return ret;
  236. }
  237. static int ad5624r_remove(struct spi_device *spi)
  238. {
  239. struct iio_dev *indio_dev = spi_get_drvdata(spi);
  240. struct ad5624r_state *st = iio_priv(indio_dev);
  241. iio_device_unregister(indio_dev);
  242. if (!IS_ERR(st->reg))
  243. regulator_disable(st->reg);
  244. return 0;
  245. }
  246. static const struct spi_device_id ad5624r_id[] = {
  247. {"ad5624r3", ID_AD5624R3},
  248. {"ad5644r3", ID_AD5644R3},
  249. {"ad5664r3", ID_AD5664R3},
  250. {"ad5624r5", ID_AD5624R5},
  251. {"ad5644r5", ID_AD5644R5},
  252. {"ad5664r5", ID_AD5664R5},
  253. {}
  254. };
  255. MODULE_DEVICE_TABLE(spi, ad5624r_id);
  256. static struct spi_driver ad5624r_driver = {
  257. .driver = {
  258. .name = "ad5624r",
  259. .owner = THIS_MODULE,
  260. },
  261. .probe = ad5624r_probe,
  262. .remove = ad5624r_remove,
  263. .id_table = ad5624r_id,
  264. };
  265. module_spi_driver(ad5624r_driver);
  266. MODULE_AUTHOR("Barry Song <21cnbao@gmail.com>");
  267. MODULE_DESCRIPTION("Analog Devices AD5624/44/64R DAC spi driver");
  268. MODULE_LICENSE("GPL v2");