ad5624r_spi.c 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322
  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. switch (m) {
  47. case IIO_CHAN_INFO_SCALE:
  48. *val = st->vref_mv;
  49. *val2 = chan->scan_type.realbits;
  50. return IIO_VAL_FRACTIONAL_LOG2;
  51. }
  52. return -EINVAL;
  53. }
  54. static int ad5624r_write_raw(struct iio_dev *indio_dev,
  55. struct iio_chan_spec const *chan,
  56. int val,
  57. int val2,
  58. long mask)
  59. {
  60. struct ad5624r_state *st = iio_priv(indio_dev);
  61. int ret;
  62. switch (mask) {
  63. case IIO_CHAN_INFO_RAW:
  64. if (val >= (1 << chan->scan_type.realbits) || val < 0)
  65. return -EINVAL;
  66. return ad5624r_spi_write(st->us,
  67. AD5624R_CMD_WRITE_INPUT_N_UPDATE_N,
  68. chan->address, val,
  69. chan->scan_type.shift);
  70. default:
  71. ret = -EINVAL;
  72. }
  73. return -EINVAL;
  74. }
  75. static const char * const ad5624r_powerdown_modes[] = {
  76. "1kohm_to_gnd",
  77. "100kohm_to_gnd",
  78. "three_state"
  79. };
  80. static int ad5624r_get_powerdown_mode(struct iio_dev *indio_dev,
  81. const struct iio_chan_spec *chan)
  82. {
  83. struct ad5624r_state *st = iio_priv(indio_dev);
  84. return st->pwr_down_mode;
  85. }
  86. static int ad5624r_set_powerdown_mode(struct iio_dev *indio_dev,
  87. const struct iio_chan_spec *chan, unsigned int mode)
  88. {
  89. struct ad5624r_state *st = iio_priv(indio_dev);
  90. st->pwr_down_mode = mode;
  91. return 0;
  92. }
  93. static const struct iio_enum ad5624r_powerdown_mode_enum = {
  94. .items = ad5624r_powerdown_modes,
  95. .num_items = ARRAY_SIZE(ad5624r_powerdown_modes),
  96. .get = ad5624r_get_powerdown_mode,
  97. .set = ad5624r_set_powerdown_mode,
  98. };
  99. static ssize_t ad5624r_read_dac_powerdown(struct iio_dev *indio_dev,
  100. uintptr_t private, const struct iio_chan_spec *chan, char *buf)
  101. {
  102. struct ad5624r_state *st = iio_priv(indio_dev);
  103. return sprintf(buf, "%d\n",
  104. !!(st->pwr_down_mask & (1 << chan->channel)));
  105. }
  106. static ssize_t ad5624r_write_dac_powerdown(struct iio_dev *indio_dev,
  107. uintptr_t private, const struct iio_chan_spec *chan, const char *buf,
  108. size_t len)
  109. {
  110. bool pwr_down;
  111. int ret;
  112. struct ad5624r_state *st = iio_priv(indio_dev);
  113. ret = strtobool(buf, &pwr_down);
  114. if (ret)
  115. return ret;
  116. if (pwr_down)
  117. st->pwr_down_mask |= (1 << chan->channel);
  118. else
  119. st->pwr_down_mask &= ~(1 << chan->channel);
  120. ret = ad5624r_spi_write(st->us, AD5624R_CMD_POWERDOWN_DAC, 0,
  121. (st->pwr_down_mode << 4) |
  122. st->pwr_down_mask, 16);
  123. return ret ? ret : len;
  124. }
  125. static const struct iio_info ad5624r_info = {
  126. .write_raw = ad5624r_write_raw,
  127. .read_raw = ad5624r_read_raw,
  128. .driver_module = THIS_MODULE,
  129. };
  130. static const struct iio_chan_spec_ext_info ad5624r_ext_info[] = {
  131. {
  132. .name = "powerdown",
  133. .read = ad5624r_read_dac_powerdown,
  134. .write = ad5624r_write_dac_powerdown,
  135. .shared = IIO_SEPARATE,
  136. },
  137. IIO_ENUM("powerdown_mode", IIO_SHARED_BY_TYPE,
  138. &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_separate = BIT(IIO_CHAN_INFO_RAW), \
  148. .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE), \
  149. .address = (_chan), \
  150. .scan_type = { \
  151. .sign = 'u', \
  152. .realbits = (_bits), \
  153. .storagebits = 16, \
  154. .shift = 16 - (_bits), \
  155. }, \
  156. .ext_info = ad5624r_ext_info, \
  157. }
  158. #define DECLARE_AD5624R_CHANNELS(_name, _bits) \
  159. const struct iio_chan_spec _name##_channels[] = { \
  160. AD5624R_CHANNEL(0, _bits), \
  161. AD5624R_CHANNEL(1, _bits), \
  162. AD5624R_CHANNEL(2, _bits), \
  163. AD5624R_CHANNEL(3, _bits), \
  164. }
  165. static DECLARE_AD5624R_CHANNELS(ad5624r, 12);
  166. static DECLARE_AD5624R_CHANNELS(ad5644r, 14);
  167. static DECLARE_AD5624R_CHANNELS(ad5664r, 16);
  168. static const struct ad5624r_chip_info ad5624r_chip_info_tbl[] = {
  169. [ID_AD5624R3] = {
  170. .channels = ad5624r_channels,
  171. .int_vref_mv = 1250,
  172. },
  173. [ID_AD5624R5] = {
  174. .channels = ad5624r_channels,
  175. .int_vref_mv = 2500,
  176. },
  177. [ID_AD5644R3] = {
  178. .channels = ad5644r_channels,
  179. .int_vref_mv = 1250,
  180. },
  181. [ID_AD5644R5] = {
  182. .channels = ad5644r_channels,
  183. .int_vref_mv = 2500,
  184. },
  185. [ID_AD5664R3] = {
  186. .channels = ad5664r_channels,
  187. .int_vref_mv = 1250,
  188. },
  189. [ID_AD5664R5] = {
  190. .channels = ad5664r_channels,
  191. .int_vref_mv = 2500,
  192. },
  193. };
  194. static int ad5624r_probe(struct spi_device *spi)
  195. {
  196. struct ad5624r_state *st;
  197. struct iio_dev *indio_dev;
  198. int ret, voltage_uv = 0;
  199. indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*st));
  200. if (!indio_dev)
  201. return -ENOMEM;
  202. st = iio_priv(indio_dev);
  203. st->reg = devm_regulator_get(&spi->dev, "vcc");
  204. if (!IS_ERR(st->reg)) {
  205. ret = regulator_enable(st->reg);
  206. if (ret)
  207. return ret;
  208. ret = regulator_get_voltage(st->reg);
  209. if (ret < 0)
  210. goto error_disable_reg;
  211. voltage_uv = ret;
  212. }
  213. spi_set_drvdata(spi, indio_dev);
  214. st->chip_info =
  215. &ad5624r_chip_info_tbl[spi_get_device_id(spi)->driver_data];
  216. if (voltage_uv)
  217. st->vref_mv = voltage_uv / 1000;
  218. else
  219. st->vref_mv = st->chip_info->int_vref_mv;
  220. st->us = spi;
  221. indio_dev->dev.parent = &spi->dev;
  222. indio_dev->name = spi_get_device_id(spi)->name;
  223. indio_dev->info = &ad5624r_info;
  224. indio_dev->modes = INDIO_DIRECT_MODE;
  225. indio_dev->channels = st->chip_info->channels;
  226. indio_dev->num_channels = AD5624R_DAC_CHANNELS;
  227. ret = ad5624r_spi_write(spi, AD5624R_CMD_INTERNAL_REFER_SETUP, 0,
  228. !!voltage_uv, 16);
  229. if (ret)
  230. goto error_disable_reg;
  231. ret = iio_device_register(indio_dev);
  232. if (ret)
  233. goto error_disable_reg;
  234. return 0;
  235. error_disable_reg:
  236. if (!IS_ERR(st->reg))
  237. regulator_disable(st->reg);
  238. return ret;
  239. }
  240. static int ad5624r_remove(struct spi_device *spi)
  241. {
  242. struct iio_dev *indio_dev = spi_get_drvdata(spi);
  243. struct ad5624r_state *st = iio_priv(indio_dev);
  244. iio_device_unregister(indio_dev);
  245. if (!IS_ERR(st->reg))
  246. regulator_disable(st->reg);
  247. return 0;
  248. }
  249. static const struct spi_device_id ad5624r_id[] = {
  250. {"ad5624r3", ID_AD5624R3},
  251. {"ad5644r3", ID_AD5644R3},
  252. {"ad5664r3", ID_AD5664R3},
  253. {"ad5624r5", ID_AD5624R5},
  254. {"ad5644r5", ID_AD5644R5},
  255. {"ad5664r5", ID_AD5664R5},
  256. {}
  257. };
  258. MODULE_DEVICE_TABLE(spi, ad5624r_id);
  259. static struct spi_driver ad5624r_driver = {
  260. .driver = {
  261. .name = "ad5624r",
  262. .owner = THIS_MODULE,
  263. },
  264. .probe = ad5624r_probe,
  265. .remove = ad5624r_remove,
  266. .id_table = ad5624r_id,
  267. };
  268. module_spi_driver(ad5624r_driver);
  269. MODULE_AUTHOR("Barry Song <21cnbao@gmail.com>");
  270. MODULE_DESCRIPTION("Analog Devices AD5624/44/64R DAC spi driver");
  271. MODULE_LICENSE("GPL v2");