ltc2632.c 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314
  1. /*
  2. * LTC2632 Digital to analog convertors spi driver
  3. *
  4. * Copyright 2017 Maxime Roussin-Bélanger
  5. *
  6. * Licensed under the GPL-2.
  7. */
  8. #include <linux/device.h>
  9. #include <linux/spi/spi.h>
  10. #include <linux/module.h>
  11. #include <linux/iio/iio.h>
  12. #define LTC2632_DAC_CHANNELS 2
  13. #define LTC2632_ADDR_DAC0 0x0
  14. #define LTC2632_ADDR_DAC1 0x1
  15. #define LTC2632_CMD_WRITE_INPUT_N 0x0
  16. #define LTC2632_CMD_UPDATE_DAC_N 0x1
  17. #define LTC2632_CMD_WRITE_INPUT_N_UPDATE_ALL 0x2
  18. #define LTC2632_CMD_WRITE_INPUT_N_UPDATE_N 0x3
  19. #define LTC2632_CMD_POWERDOWN_DAC_N 0x4
  20. #define LTC2632_CMD_POWERDOWN_CHIP 0x5
  21. #define LTC2632_CMD_INTERNAL_REFER 0x6
  22. #define LTC2632_CMD_EXTERNAL_REFER 0x7
  23. /**
  24. * struct ltc2632_chip_info - chip specific information
  25. * @channels: channel spec for the DAC
  26. * @vref_mv: reference voltage
  27. */
  28. struct ltc2632_chip_info {
  29. const struct iio_chan_spec *channels;
  30. const int vref_mv;
  31. };
  32. /**
  33. * struct ltc2632_state - driver instance specific data
  34. * @spi_dev: pointer to the spi_device struct
  35. * @powerdown_cache_mask used to show current channel powerdown state
  36. */
  37. struct ltc2632_state {
  38. struct spi_device *spi_dev;
  39. unsigned int powerdown_cache_mask;
  40. };
  41. enum ltc2632_supported_device_ids {
  42. ID_LTC2632L12,
  43. ID_LTC2632L10,
  44. ID_LTC2632L8,
  45. ID_LTC2632H12,
  46. ID_LTC2632H10,
  47. ID_LTC2632H8,
  48. };
  49. static int ltc2632_spi_write(struct spi_device *spi,
  50. u8 cmd, u8 addr, u16 val, u8 shift)
  51. {
  52. u32 data;
  53. u8 msg[3];
  54. /*
  55. * The input shift register is 24 bits wide.
  56. * The next four are the command bits, C3 to C0,
  57. * followed by the 4-bit DAC address, A3 to A0, and then the
  58. * 12-, 10-, 8-bit data-word. The data-word comprises the 12-,
  59. * 10-, 8-bit input code followed by 4, 6, or 8 don't care bits.
  60. */
  61. data = (cmd << 20) | (addr << 16) | (val << shift);
  62. msg[0] = data >> 16;
  63. msg[1] = data >> 8;
  64. msg[2] = data;
  65. return spi_write(spi, msg, sizeof(msg));
  66. }
  67. static int ltc2632_read_raw(struct iio_dev *indio_dev,
  68. struct iio_chan_spec const *chan,
  69. int *val,
  70. int *val2,
  71. long m)
  72. {
  73. struct ltc2632_chip_info *chip_info;
  74. const struct ltc2632_state *st = iio_priv(indio_dev);
  75. const struct spi_device_id *spi_dev_id = spi_get_device_id(st->spi_dev);
  76. chip_info = (struct ltc2632_chip_info *)spi_dev_id->driver_data;
  77. switch (m) {
  78. case IIO_CHAN_INFO_SCALE:
  79. *val = chip_info->vref_mv;
  80. *val2 = chan->scan_type.realbits;
  81. return IIO_VAL_FRACTIONAL_LOG2;
  82. }
  83. return -EINVAL;
  84. }
  85. static int ltc2632_write_raw(struct iio_dev *indio_dev,
  86. struct iio_chan_spec const *chan,
  87. int val,
  88. int val2,
  89. long mask)
  90. {
  91. struct ltc2632_state *st = iio_priv(indio_dev);
  92. switch (mask) {
  93. case IIO_CHAN_INFO_RAW:
  94. if (val >= (1 << chan->scan_type.realbits) || val < 0)
  95. return -EINVAL;
  96. return ltc2632_spi_write(st->spi_dev,
  97. LTC2632_CMD_WRITE_INPUT_N_UPDATE_N,
  98. chan->address, val,
  99. chan->scan_type.shift);
  100. default:
  101. return -EINVAL;
  102. }
  103. }
  104. static ssize_t ltc2632_read_dac_powerdown(struct iio_dev *indio_dev,
  105. uintptr_t private,
  106. const struct iio_chan_spec *chan,
  107. char *buf)
  108. {
  109. struct ltc2632_state *st = iio_priv(indio_dev);
  110. return sprintf(buf, "%d\n",
  111. !!(st->powerdown_cache_mask & (1 << chan->channel)));
  112. }
  113. static ssize_t ltc2632_write_dac_powerdown(struct iio_dev *indio_dev,
  114. uintptr_t private,
  115. const struct iio_chan_spec *chan,
  116. const char *buf,
  117. size_t len)
  118. {
  119. bool pwr_down;
  120. int ret;
  121. struct ltc2632_state *st = iio_priv(indio_dev);
  122. ret = strtobool(buf, &pwr_down);
  123. if (ret)
  124. return ret;
  125. if (pwr_down)
  126. st->powerdown_cache_mask |= (1 << chan->channel);
  127. else
  128. st->powerdown_cache_mask &= ~(1 << chan->channel);
  129. ret = ltc2632_spi_write(st->spi_dev,
  130. LTC2632_CMD_POWERDOWN_DAC_N,
  131. chan->channel, 0, 0);
  132. return ret ? ret : len;
  133. }
  134. static const struct iio_info ltc2632_info = {
  135. .write_raw = ltc2632_write_raw,
  136. .read_raw = ltc2632_read_raw,
  137. .driver_module = THIS_MODULE,
  138. };
  139. static const struct iio_chan_spec_ext_info ltc2632_ext_info[] = {
  140. {
  141. .name = "powerdown",
  142. .read = ltc2632_read_dac_powerdown,
  143. .write = ltc2632_write_dac_powerdown,
  144. .shared = IIO_SEPARATE,
  145. },
  146. { },
  147. };
  148. #define LTC2632_CHANNEL(_chan, _bits) { \
  149. .type = IIO_VOLTAGE, \
  150. .indexed = 1, \
  151. .output = 1, \
  152. .channel = (_chan), \
  153. .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), \
  154. .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE), \
  155. .address = (_chan), \
  156. .scan_type = { \
  157. .realbits = (_bits), \
  158. .shift = 16 - (_bits), \
  159. }, \
  160. .ext_info = ltc2632_ext_info, \
  161. }
  162. #define DECLARE_LTC2632_CHANNELS(_name, _bits) \
  163. const struct iio_chan_spec _name ## _channels[] = { \
  164. LTC2632_CHANNEL(0, _bits), \
  165. LTC2632_CHANNEL(1, _bits), \
  166. }
  167. static DECLARE_LTC2632_CHANNELS(ltc2632l12, 12);
  168. static DECLARE_LTC2632_CHANNELS(ltc2632l10, 10);
  169. static DECLARE_LTC2632_CHANNELS(ltc2632l8, 8);
  170. static DECLARE_LTC2632_CHANNELS(ltc2632h12, 12);
  171. static DECLARE_LTC2632_CHANNELS(ltc2632h10, 10);
  172. static DECLARE_LTC2632_CHANNELS(ltc2632h8, 8);
  173. static const struct ltc2632_chip_info ltc2632_chip_info_tbl[] = {
  174. [ID_LTC2632L12] = {
  175. .channels = ltc2632l12_channels,
  176. .vref_mv = 2500,
  177. },
  178. [ID_LTC2632L10] = {
  179. .channels = ltc2632l10_channels,
  180. .vref_mv = 2500,
  181. },
  182. [ID_LTC2632L8] = {
  183. .channels = ltc2632l8_channels,
  184. .vref_mv = 2500,
  185. },
  186. [ID_LTC2632H12] = {
  187. .channels = ltc2632h12_channels,
  188. .vref_mv = 4096,
  189. },
  190. [ID_LTC2632H10] = {
  191. .channels = ltc2632h10_channels,
  192. .vref_mv = 4096,
  193. },
  194. [ID_LTC2632H8] = {
  195. .channels = ltc2632h8_channels,
  196. .vref_mv = 4096,
  197. },
  198. };
  199. static int ltc2632_probe(struct spi_device *spi)
  200. {
  201. struct ltc2632_state *st;
  202. struct iio_dev *indio_dev;
  203. struct ltc2632_chip_info *chip_info;
  204. int ret;
  205. indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*st));
  206. if (!indio_dev)
  207. return -ENOMEM;
  208. st = iio_priv(indio_dev);
  209. spi_set_drvdata(spi, indio_dev);
  210. st->spi_dev = spi;
  211. chip_info = (struct ltc2632_chip_info *)
  212. spi_get_device_id(spi)->driver_data;
  213. indio_dev->dev.parent = &spi->dev;
  214. indio_dev->name = dev_of_node(&spi->dev) ? dev_of_node(&spi->dev)->name
  215. : spi_get_device_id(spi)->name;
  216. indio_dev->info = &ltc2632_info;
  217. indio_dev->modes = INDIO_DIRECT_MODE;
  218. indio_dev->channels = chip_info->channels;
  219. indio_dev->num_channels = LTC2632_DAC_CHANNELS;
  220. ret = ltc2632_spi_write(spi, LTC2632_CMD_INTERNAL_REFER, 0, 0, 0);
  221. if (ret) {
  222. dev_err(&spi->dev,
  223. "Set internal reference command failed, %d\n", ret);
  224. return ret;
  225. }
  226. return devm_iio_device_register(&spi->dev, indio_dev);
  227. }
  228. static const struct spi_device_id ltc2632_id[] = {
  229. { "ltc2632-l12", (kernel_ulong_t)&ltc2632_chip_info_tbl[ID_LTC2632L12] },
  230. { "ltc2632-l10", (kernel_ulong_t)&ltc2632_chip_info_tbl[ID_LTC2632L10] },
  231. { "ltc2632-l8", (kernel_ulong_t)&ltc2632_chip_info_tbl[ID_LTC2632L8] },
  232. { "ltc2632-h12", (kernel_ulong_t)&ltc2632_chip_info_tbl[ID_LTC2632H12] },
  233. { "ltc2632-h10", (kernel_ulong_t)&ltc2632_chip_info_tbl[ID_LTC2632H10] },
  234. { "ltc2632-h8", (kernel_ulong_t)&ltc2632_chip_info_tbl[ID_LTC2632H8] },
  235. {}
  236. };
  237. MODULE_DEVICE_TABLE(spi, ltc2632_id);
  238. static struct spi_driver ltc2632_driver = {
  239. .driver = {
  240. .name = "ltc2632",
  241. },
  242. .probe = ltc2632_probe,
  243. .id_table = ltc2632_id,
  244. };
  245. module_spi_driver(ltc2632_driver);
  246. static const struct of_device_id ltc2632_of_match[] = {
  247. {
  248. .compatible = "lltc,ltc2632-l12",
  249. .data = &ltc2632_chip_info_tbl[ID_LTC2632L12]
  250. }, {
  251. .compatible = "lltc,ltc2632-l10",
  252. .data = &ltc2632_chip_info_tbl[ID_LTC2632L10]
  253. }, {
  254. .compatible = "lltc,ltc2632-l8",
  255. .data = &ltc2632_chip_info_tbl[ID_LTC2632L8]
  256. }, {
  257. .compatible = "lltc,ltc2632-h12",
  258. .data = &ltc2632_chip_info_tbl[ID_LTC2632H12]
  259. }, {
  260. .compatible = "lltc,ltc2632-h10",
  261. .data = &ltc2632_chip_info_tbl[ID_LTC2632H10]
  262. }, {
  263. .compatible = "lltc,ltc2632-h8",
  264. .data = &ltc2632_chip_info_tbl[ID_LTC2632H8]
  265. },
  266. {}
  267. };
  268. MODULE_DEVICE_TABLE(of, ltc2632_of_match);
  269. MODULE_AUTHOR("Maxime Roussin-Belanger <maxime.roussinbelanger@gmail.com>");
  270. MODULE_DESCRIPTION("LTC2632 DAC SPI driver");
  271. MODULE_LICENSE("GPL v2");