ti-dac082s085.c 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * ti-dac082s085.c - Texas Instruments 8/10/12-bit 2/4-channel DAC driver
  4. *
  5. * Copyright (C) 2017 KUNBUS GmbH
  6. *
  7. * https://www.ti.com/lit/ds/symlink/dac082s085.pdf
  8. * https://www.ti.com/lit/ds/symlink/dac102s085.pdf
  9. * https://www.ti.com/lit/ds/symlink/dac122s085.pdf
  10. * https://www.ti.com/lit/ds/symlink/dac084s085.pdf
  11. * https://www.ti.com/lit/ds/symlink/dac104s085.pdf
  12. * https://www.ti.com/lit/ds/symlink/dac124s085.pdf
  13. */
  14. #include <linux/iio/iio.h>
  15. #include <linux/module.h>
  16. #include <linux/mod_devicetable.h>
  17. #include <linux/regulator/consumer.h>
  18. #include <linux/spi/spi.h>
  19. enum { dual_8bit, dual_10bit, dual_12bit, quad_8bit, quad_10bit, quad_12bit };
  20. struct ti_dac_spec {
  21. u8 num_channels;
  22. u8 resolution;
  23. };
  24. static const struct ti_dac_spec ti_dac_spec[] = {
  25. [dual_8bit] = { .num_channels = 2, .resolution = 8 },
  26. [dual_10bit] = { .num_channels = 2, .resolution = 10 },
  27. [dual_12bit] = { .num_channels = 2, .resolution = 12 },
  28. [quad_8bit] = { .num_channels = 4, .resolution = 8 },
  29. [quad_10bit] = { .num_channels = 4, .resolution = 10 },
  30. [quad_12bit] = { .num_channels = 4, .resolution = 12 },
  31. };
  32. /**
  33. * struct ti_dac_chip - TI DAC chip
  34. * @lock: protects write sequences
  35. * @vref: regulator generating Vref
  36. * @mesg: SPI message to perform a write
  37. * @xfer: SPI transfer used by @mesg
  38. * @val: cached value of each output
  39. * @powerdown: whether the chip is powered down
  40. * @powerdown_mode: selected by the user
  41. * @resolution: resolution of the chip
  42. * @buf: buffer for @xfer
  43. */
  44. struct ti_dac_chip {
  45. struct mutex lock;
  46. struct regulator *vref;
  47. struct spi_message mesg;
  48. struct spi_transfer xfer;
  49. u16 val[4];
  50. bool powerdown;
  51. u8 powerdown_mode;
  52. u8 resolution;
  53. u8 buf[2] __aligned(IIO_DMA_MINALIGN);
  54. };
  55. #define WRITE_NOT_UPDATE(chan) (0x00 | (chan) << 6)
  56. #define WRITE_AND_UPDATE(chan) (0x10 | (chan) << 6)
  57. #define WRITE_ALL_UPDATE 0x20
  58. #define POWERDOWN(mode) (0x30 | ((mode) + 1) << 6)
  59. static int ti_dac_cmd(struct ti_dac_chip *ti_dac, u8 cmd, u16 val)
  60. {
  61. u8 shift = 12 - ti_dac->resolution;
  62. ti_dac->buf[0] = cmd | (val >> (8 - shift));
  63. ti_dac->buf[1] = (val << shift) & 0xff;
  64. return spi_sync(ti_dac->mesg.spi, &ti_dac->mesg);
  65. }
  66. static const char * const ti_dac_powerdown_modes[] = {
  67. "2.5kohm_to_gnd", "100kohm_to_gnd", "three_state",
  68. };
  69. static int ti_dac_get_powerdown_mode(struct iio_dev *indio_dev,
  70. const struct iio_chan_spec *chan)
  71. {
  72. struct ti_dac_chip *ti_dac = iio_priv(indio_dev);
  73. return ti_dac->powerdown_mode;
  74. }
  75. static int ti_dac_set_powerdown_mode(struct iio_dev *indio_dev,
  76. const struct iio_chan_spec *chan,
  77. unsigned int mode)
  78. {
  79. struct ti_dac_chip *ti_dac = iio_priv(indio_dev);
  80. int ret = 0;
  81. if (ti_dac->powerdown_mode == mode)
  82. return 0;
  83. mutex_lock(&ti_dac->lock);
  84. if (ti_dac->powerdown) {
  85. ret = ti_dac_cmd(ti_dac, POWERDOWN(mode), 0);
  86. if (ret)
  87. goto out;
  88. }
  89. ti_dac->powerdown_mode = mode;
  90. out:
  91. mutex_unlock(&ti_dac->lock);
  92. return ret;
  93. }
  94. static const struct iio_enum ti_dac_powerdown_mode = {
  95. .items = ti_dac_powerdown_modes,
  96. .num_items = ARRAY_SIZE(ti_dac_powerdown_modes),
  97. .get = ti_dac_get_powerdown_mode,
  98. .set = ti_dac_set_powerdown_mode,
  99. };
  100. static ssize_t ti_dac_read_powerdown(struct iio_dev *indio_dev,
  101. uintptr_t private,
  102. const struct iio_chan_spec *chan,
  103. char *buf)
  104. {
  105. struct ti_dac_chip *ti_dac = iio_priv(indio_dev);
  106. return sysfs_emit(buf, "%d\n", ti_dac->powerdown);
  107. }
  108. static ssize_t ti_dac_write_powerdown(struct iio_dev *indio_dev,
  109. uintptr_t private,
  110. const struct iio_chan_spec *chan,
  111. const char *buf, size_t len)
  112. {
  113. struct ti_dac_chip *ti_dac = iio_priv(indio_dev);
  114. bool powerdown;
  115. int ret;
  116. ret = kstrtobool(buf, &powerdown);
  117. if (ret)
  118. return ret;
  119. if (ti_dac->powerdown == powerdown)
  120. return len;
  121. mutex_lock(&ti_dac->lock);
  122. if (powerdown)
  123. ret = ti_dac_cmd(ti_dac, POWERDOWN(ti_dac->powerdown_mode), 0);
  124. else
  125. ret = ti_dac_cmd(ti_dac, WRITE_AND_UPDATE(0), ti_dac->val[0]);
  126. if (!ret)
  127. ti_dac->powerdown = powerdown;
  128. mutex_unlock(&ti_dac->lock);
  129. return ret ? ret : len;
  130. }
  131. static const struct iio_chan_spec_ext_info ti_dac_ext_info[] = {
  132. {
  133. .name = "powerdown",
  134. .read = ti_dac_read_powerdown,
  135. .write = ti_dac_write_powerdown,
  136. .shared = IIO_SHARED_BY_TYPE,
  137. },
  138. IIO_ENUM("powerdown_mode", IIO_SHARED_BY_TYPE, &ti_dac_powerdown_mode),
  139. IIO_ENUM_AVAILABLE("powerdown_mode", IIO_SHARED_BY_TYPE, &ti_dac_powerdown_mode),
  140. { },
  141. };
  142. #define TI_DAC_CHANNEL(chan) { \
  143. .type = IIO_VOLTAGE, \
  144. .channel = (chan), \
  145. .address = (chan), \
  146. .indexed = true, \
  147. .output = true, \
  148. .datasheet_name = (const char[]){ 'A' + (chan), 0 }, \
  149. .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), \
  150. .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE), \
  151. .ext_info = ti_dac_ext_info, \
  152. }
  153. static const struct iio_chan_spec ti_dac_channels[] = {
  154. TI_DAC_CHANNEL(0),
  155. TI_DAC_CHANNEL(1),
  156. TI_DAC_CHANNEL(2),
  157. TI_DAC_CHANNEL(3),
  158. };
  159. static int ti_dac_read_raw(struct iio_dev *indio_dev,
  160. struct iio_chan_spec const *chan,
  161. int *val, int *val2, long mask)
  162. {
  163. struct ti_dac_chip *ti_dac = iio_priv(indio_dev);
  164. int ret;
  165. switch (mask) {
  166. case IIO_CHAN_INFO_RAW:
  167. *val = ti_dac->val[chan->channel];
  168. ret = IIO_VAL_INT;
  169. break;
  170. case IIO_CHAN_INFO_SCALE:
  171. ret = regulator_get_voltage(ti_dac->vref);
  172. if (ret < 0)
  173. return ret;
  174. *val = ret / 1000;
  175. *val2 = ti_dac->resolution;
  176. ret = IIO_VAL_FRACTIONAL_LOG2;
  177. break;
  178. default:
  179. ret = -EINVAL;
  180. }
  181. return ret;
  182. }
  183. static int ti_dac_write_raw(struct iio_dev *indio_dev,
  184. struct iio_chan_spec const *chan,
  185. int val, int val2, long mask)
  186. {
  187. struct ti_dac_chip *ti_dac = iio_priv(indio_dev);
  188. int ret;
  189. switch (mask) {
  190. case IIO_CHAN_INFO_RAW:
  191. if (ti_dac->val[chan->channel] == val)
  192. return 0;
  193. if (val >= (1 << ti_dac->resolution) || val < 0)
  194. return -EINVAL;
  195. if (ti_dac->powerdown)
  196. return -EBUSY;
  197. mutex_lock(&ti_dac->lock);
  198. ret = ti_dac_cmd(ti_dac, WRITE_AND_UPDATE(chan->channel), val);
  199. if (!ret)
  200. ti_dac->val[chan->channel] = val;
  201. mutex_unlock(&ti_dac->lock);
  202. break;
  203. default:
  204. ret = -EINVAL;
  205. }
  206. return ret;
  207. }
  208. static int ti_dac_write_raw_get_fmt(struct iio_dev *indio_dev,
  209. struct iio_chan_spec const *chan, long mask)
  210. {
  211. return IIO_VAL_INT;
  212. }
  213. static const struct iio_info ti_dac_info = {
  214. .read_raw = ti_dac_read_raw,
  215. .write_raw = ti_dac_write_raw,
  216. .write_raw_get_fmt = ti_dac_write_raw_get_fmt,
  217. };
  218. static int ti_dac_probe(struct spi_device *spi)
  219. {
  220. struct device *dev = &spi->dev;
  221. const struct ti_dac_spec *spec;
  222. struct ti_dac_chip *ti_dac;
  223. struct iio_dev *indio_dev;
  224. int ret;
  225. indio_dev = devm_iio_device_alloc(dev, sizeof(*ti_dac));
  226. if (!indio_dev)
  227. return -ENOMEM;
  228. indio_dev->info = &ti_dac_info;
  229. indio_dev->name = spi->modalias;
  230. indio_dev->modes = INDIO_DIRECT_MODE;
  231. indio_dev->channels = ti_dac_channels;
  232. spi_set_drvdata(spi, indio_dev);
  233. ti_dac = iio_priv(indio_dev);
  234. ti_dac->xfer.tx_buf = &ti_dac->buf;
  235. ti_dac->xfer.len = sizeof(ti_dac->buf);
  236. spi_message_init_with_transfers(&ti_dac->mesg, &ti_dac->xfer, 1);
  237. ti_dac->mesg.spi = spi;
  238. spec = &ti_dac_spec[spi_get_device_id(spi)->driver_data];
  239. indio_dev->num_channels = spec->num_channels;
  240. ti_dac->resolution = spec->resolution;
  241. ti_dac->vref = devm_regulator_get(dev, "vref");
  242. if (IS_ERR(ti_dac->vref))
  243. return PTR_ERR(ti_dac->vref);
  244. ret = regulator_enable(ti_dac->vref);
  245. if (ret < 0)
  246. return ret;
  247. mutex_init(&ti_dac->lock);
  248. ret = ti_dac_cmd(ti_dac, WRITE_ALL_UPDATE, 0);
  249. if (ret) {
  250. dev_err(dev, "failed to initialize outputs to 0\n");
  251. goto err;
  252. }
  253. ret = iio_device_register(indio_dev);
  254. if (ret)
  255. goto err;
  256. return 0;
  257. err:
  258. mutex_destroy(&ti_dac->lock);
  259. regulator_disable(ti_dac->vref);
  260. return ret;
  261. }
  262. static void ti_dac_remove(struct spi_device *spi)
  263. {
  264. struct iio_dev *indio_dev = spi_get_drvdata(spi);
  265. struct ti_dac_chip *ti_dac = iio_priv(indio_dev);
  266. iio_device_unregister(indio_dev);
  267. mutex_destroy(&ti_dac->lock);
  268. regulator_disable(ti_dac->vref);
  269. }
  270. static const struct of_device_id ti_dac_of_id[] = {
  271. { .compatible = "ti,dac082s085" },
  272. { .compatible = "ti,dac102s085" },
  273. { .compatible = "ti,dac122s085" },
  274. { .compatible = "ti,dac084s085" },
  275. { .compatible = "ti,dac104s085" },
  276. { .compatible = "ti,dac124s085" },
  277. { }
  278. };
  279. MODULE_DEVICE_TABLE(of, ti_dac_of_id);
  280. static const struct spi_device_id ti_dac_spi_id[] = {
  281. { "dac082s085", dual_8bit },
  282. { "dac102s085", dual_10bit },
  283. { "dac122s085", dual_12bit },
  284. { "dac084s085", quad_8bit },
  285. { "dac104s085", quad_10bit },
  286. { "dac124s085", quad_12bit },
  287. { }
  288. };
  289. MODULE_DEVICE_TABLE(spi, ti_dac_spi_id);
  290. static struct spi_driver ti_dac_driver = {
  291. .driver = {
  292. .name = "ti-dac082s085",
  293. .of_match_table = ti_dac_of_id,
  294. },
  295. .probe = ti_dac_probe,
  296. .remove = ti_dac_remove,
  297. .id_table = ti_dac_spi_id,
  298. };
  299. module_spi_driver(ti_dac_driver);
  300. MODULE_AUTHOR("Lukas Wunner <[email protected]>");
  301. MODULE_DESCRIPTION("Texas Instruments 8/10/12-bit 2/4-channel DAC driver");
  302. MODULE_LICENSE("GPL v2");