ad5624r_spi.c 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328
  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. },
  138. IIO_ENUM("powerdown_mode", true, &ad5624r_powerdown_mode_enum),
  139. IIO_ENUM_AVAILABLE("powerdown_mode", &ad5624r_powerdown_mode_enum),
  140. { },
  141. };
  142. #define AD5624R_CHANNEL(_chan, _bits) { \
  143. .type = IIO_VOLTAGE, \
  144. .indexed = 1, \
  145. .output = 1, \
  146. .channel = (_chan), \
  147. .info_mask = IIO_CHAN_INFO_RAW_SEPARATE_BIT | \
  148. IIO_CHAN_INFO_SCALE_SHARED_BIT, \
  149. .address = (_chan), \
  150. .scan_type = IIO_ST('u', (_bits), 16, 16 - (_bits)), \
  151. .ext_info = ad5624r_ext_info, \
  152. }
  153. #define DECLARE_AD5624R_CHANNELS(_name, _bits) \
  154. const struct iio_chan_spec _name##_channels[] = { \
  155. AD5624R_CHANNEL(0, _bits), \
  156. AD5624R_CHANNEL(1, _bits), \
  157. AD5624R_CHANNEL(2, _bits), \
  158. AD5624R_CHANNEL(3, _bits), \
  159. }
  160. static DECLARE_AD5624R_CHANNELS(ad5624r, 12);
  161. static DECLARE_AD5624R_CHANNELS(ad5644r, 14);
  162. static DECLARE_AD5624R_CHANNELS(ad5664r, 16);
  163. static const struct ad5624r_chip_info ad5624r_chip_info_tbl[] = {
  164. [ID_AD5624R3] = {
  165. .channels = ad5624r_channels,
  166. .int_vref_mv = 1250,
  167. },
  168. [ID_AD5624R5] = {
  169. .channels = ad5624r_channels,
  170. .int_vref_mv = 2500,
  171. },
  172. [ID_AD5644R3] = {
  173. .channels = ad5644r_channels,
  174. .int_vref_mv = 1250,
  175. },
  176. [ID_AD5644R5] = {
  177. .channels = ad5644r_channels,
  178. .int_vref_mv = 2500,
  179. },
  180. [ID_AD5664R3] = {
  181. .channels = ad5664r_channels,
  182. .int_vref_mv = 1250,
  183. },
  184. [ID_AD5664R5] = {
  185. .channels = ad5664r_channels,
  186. .int_vref_mv = 2500,
  187. },
  188. };
  189. static int ad5624r_probe(struct spi_device *spi)
  190. {
  191. struct ad5624r_state *st;
  192. struct iio_dev *indio_dev;
  193. int ret, voltage_uv = 0;
  194. indio_dev = iio_device_alloc(sizeof(*st));
  195. if (indio_dev == NULL) {
  196. ret = -ENOMEM;
  197. goto error_ret;
  198. }
  199. st = iio_priv(indio_dev);
  200. st->reg = regulator_get(&spi->dev, "vcc");
  201. if (!IS_ERR(st->reg)) {
  202. ret = regulator_enable(st->reg);
  203. if (ret)
  204. goto error_put_reg;
  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. error_put_reg:
  236. if (!IS_ERR(st->reg))
  237. regulator_put(st->reg);
  238. iio_device_free(indio_dev);
  239. error_ret:
  240. return ret;
  241. }
  242. static int ad5624r_remove(struct spi_device *spi)
  243. {
  244. struct iio_dev *indio_dev = spi_get_drvdata(spi);
  245. struct ad5624r_state *st = iio_priv(indio_dev);
  246. iio_device_unregister(indio_dev);
  247. if (!IS_ERR(st->reg)) {
  248. regulator_disable(st->reg);
  249. regulator_put(st->reg);
  250. }
  251. iio_device_free(indio_dev);
  252. return 0;
  253. }
  254. static const struct spi_device_id ad5624r_id[] = {
  255. {"ad5624r3", ID_AD5624R3},
  256. {"ad5644r3", ID_AD5644R3},
  257. {"ad5664r3", ID_AD5664R3},
  258. {"ad5624r5", ID_AD5624R5},
  259. {"ad5644r5", ID_AD5644R5},
  260. {"ad5664r5", ID_AD5664R5},
  261. {}
  262. };
  263. MODULE_DEVICE_TABLE(spi, ad5624r_id);
  264. static struct spi_driver ad5624r_driver = {
  265. .driver = {
  266. .name = "ad5624r",
  267. .owner = THIS_MODULE,
  268. },
  269. .probe = ad5624r_probe,
  270. .remove = ad5624r_remove,
  271. .id_table = ad5624r_id,
  272. };
  273. module_spi_driver(ad5624r_driver);
  274. MODULE_AUTHOR("Barry Song <21cnbao@gmail.com>");
  275. MODULE_DESCRIPTION("Analog Devices AD5624/44/64R DAC spi driver");
  276. MODULE_LICENSE("GPL v2");