ad5766.c 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Analog Devices AD5766, AD5767
  4. * Digital to Analog Converters driver
  5. * Copyright 2019-2020 Analog Devices Inc.
  6. */
  7. #include <linux/bitfield.h>
  8. #include <linux/bitops.h>
  9. #include <linux/delay.h>
  10. #include <linux/device.h>
  11. #include <linux/gpio/consumer.h>
  12. #include <linux/iio/iio.h>
  13. #include <linux/iio/triggered_buffer.h>
  14. #include <linux/iio/trigger_consumer.h>
  15. #include <linux/module.h>
  16. #include <linux/spi/spi.h>
  17. #include <asm/unaligned.h>
  18. #define AD5766_UPPER_WORD_SPI_MASK GENMASK(31, 16)
  19. #define AD5766_LOWER_WORD_SPI_MASK GENMASK(15, 0)
  20. #define AD5766_DITHER_SOURCE_MASK(ch) GENMASK(((2 * ch) + 1), (2 * ch))
  21. #define AD5766_DITHER_SOURCE(ch, source) BIT((ch * 2) + source)
  22. #define AD5766_DITHER_SCALE_MASK(x) AD5766_DITHER_SOURCE_MASK(x)
  23. #define AD5766_DITHER_SCALE(ch, scale) (scale << (ch * 2))
  24. #define AD5766_DITHER_ENABLE_MASK(ch) BIT(ch)
  25. #define AD5766_DITHER_ENABLE(ch, state) ((!state) << ch)
  26. #define AD5766_DITHER_INVERT_MASK(ch) BIT(ch)
  27. #define AD5766_DITHER_INVERT(ch, state) (state << ch)
  28. #define AD5766_CMD_NOP_MUX_OUT 0x00
  29. #define AD5766_CMD_SDO_CNTRL 0x01
  30. #define AD5766_CMD_WR_IN_REG(x) (0x10 | ((x) & GENMASK(3, 0)))
  31. #define AD5766_CMD_WR_DAC_REG(x) (0x20 | ((x) & GENMASK(3, 0)))
  32. #define AD5766_CMD_SW_LDAC 0x30
  33. #define AD5766_CMD_SPAN_REG 0x40
  34. #define AD5766_CMD_WR_PWR_DITHER 0x51
  35. #define AD5766_CMD_WR_DAC_REG_ALL 0x60
  36. #define AD5766_CMD_SW_FULL_RESET 0x70
  37. #define AD5766_CMD_READBACK_REG(x) (0x80 | ((x) & GENMASK(3, 0)))
  38. #define AD5766_CMD_DITHER_SIG_1 0x90
  39. #define AD5766_CMD_DITHER_SIG_2 0xA0
  40. #define AD5766_CMD_INV_DITHER 0xB0
  41. #define AD5766_CMD_DITHER_SCALE_1 0xC0
  42. #define AD5766_CMD_DITHER_SCALE_2 0xD0
  43. #define AD5766_FULL_RESET_CODE 0x1234
  44. enum ad5766_type {
  45. ID_AD5766,
  46. ID_AD5767,
  47. };
  48. enum ad5766_voltage_range {
  49. AD5766_VOLTAGE_RANGE_M20V_0V,
  50. AD5766_VOLTAGE_RANGE_M16V_to_0V,
  51. AD5766_VOLTAGE_RANGE_M10V_to_0V,
  52. AD5766_VOLTAGE_RANGE_M12V_to_14V,
  53. AD5766_VOLTAGE_RANGE_M16V_to_10V,
  54. AD5766_VOLTAGE_RANGE_M10V_to_6V,
  55. AD5766_VOLTAGE_RANGE_M5V_to_5V,
  56. AD5766_VOLTAGE_RANGE_M10V_to_10V,
  57. };
  58. /**
  59. * struct ad5766_chip_info - chip specific information
  60. * @num_channels: number of channels
  61. * @channels: channel specification
  62. */
  63. struct ad5766_chip_info {
  64. unsigned int num_channels;
  65. const struct iio_chan_spec *channels;
  66. };
  67. enum {
  68. AD5766_DITHER_ENABLE,
  69. AD5766_DITHER_INVERT,
  70. AD5766_DITHER_SOURCE,
  71. };
  72. /*
  73. * Dither signal can also be scaled.
  74. * Available dither scale strings corresponding to "dither_scale" field in
  75. * "struct ad5766_state".
  76. */
  77. static const char * const ad5766_dither_scales[] = {
  78. "1",
  79. "0.75",
  80. "0.5",
  81. "0.25",
  82. };
  83. /**
  84. * struct ad5766_state - driver instance specific data
  85. * @spi: SPI device
  86. * @lock: Lock used to restrict concurrent access to SPI device
  87. * @chip_info: Chip model specific constants
  88. * @gpio_reset: Reset GPIO, used to reset the device
  89. * @crt_range: Current selected output range
  90. * @dither_enable: Power enable bit for each channel dither block (for
  91. * example, D15 = DAC 15,D8 = DAC 8, and D0 = DAC 0)
  92. * 0 - Normal operation, 1 - Power down
  93. * @dither_invert: Inverts the dither signal applied to the selected DAC
  94. * outputs
  95. * @dither_source: Selects between 2 possible sources:
  96. * 1: N0, 2: N1
  97. * Two bits are used for each channel
  98. * @dither_scale: Two bits are used for each of the 16 channels:
  99. * 0: 1 SCALING, 1: 0.75 SCALING, 2: 0.5 SCALING,
  100. * 3: 0.25 SCALING.
  101. * @data: SPI transfer buffers
  102. */
  103. struct ad5766_state {
  104. struct spi_device *spi;
  105. struct mutex lock;
  106. const struct ad5766_chip_info *chip_info;
  107. struct gpio_desc *gpio_reset;
  108. enum ad5766_voltage_range crt_range;
  109. u16 dither_enable;
  110. u16 dither_invert;
  111. u32 dither_source;
  112. u32 dither_scale;
  113. union {
  114. u32 d32;
  115. u16 w16[2];
  116. u8 b8[4];
  117. } data[3] __aligned(IIO_DMA_MINALIGN);
  118. };
  119. struct ad5766_span_tbl {
  120. int min;
  121. int max;
  122. };
  123. static const struct ad5766_span_tbl ad5766_span_tbl[] = {
  124. [AD5766_VOLTAGE_RANGE_M20V_0V] = {-20, 0},
  125. [AD5766_VOLTAGE_RANGE_M16V_to_0V] = {-16, 0},
  126. [AD5766_VOLTAGE_RANGE_M10V_to_0V] = {-10, 0},
  127. [AD5766_VOLTAGE_RANGE_M12V_to_14V] = {-12, 14},
  128. [AD5766_VOLTAGE_RANGE_M16V_to_10V] = {-16, 10},
  129. [AD5766_VOLTAGE_RANGE_M10V_to_6V] = {-10, 6},
  130. [AD5766_VOLTAGE_RANGE_M5V_to_5V] = {-5, 5},
  131. [AD5766_VOLTAGE_RANGE_M10V_to_10V] = {-10, 10},
  132. };
  133. static int __ad5766_spi_read(struct ad5766_state *st, u8 dac, int *val)
  134. {
  135. int ret;
  136. struct spi_transfer xfers[] = {
  137. {
  138. .tx_buf = &st->data[0].d32,
  139. .bits_per_word = 8,
  140. .len = 3,
  141. .cs_change = 1,
  142. }, {
  143. .tx_buf = &st->data[1].d32,
  144. .rx_buf = &st->data[2].d32,
  145. .bits_per_word = 8,
  146. .len = 3,
  147. },
  148. };
  149. st->data[0].d32 = AD5766_CMD_READBACK_REG(dac);
  150. st->data[1].d32 = AD5766_CMD_NOP_MUX_OUT;
  151. ret = spi_sync_transfer(st->spi, xfers, ARRAY_SIZE(xfers));
  152. if (ret)
  153. return ret;
  154. *val = st->data[2].w16[1];
  155. return ret;
  156. }
  157. static int __ad5766_spi_write(struct ad5766_state *st, u8 command, u16 data)
  158. {
  159. st->data[0].b8[0] = command;
  160. put_unaligned_be16(data, &st->data[0].b8[1]);
  161. return spi_write(st->spi, &st->data[0].b8[0], 3);
  162. }
  163. static int ad5766_read(struct iio_dev *indio_dev, u8 dac, int *val)
  164. {
  165. struct ad5766_state *st = iio_priv(indio_dev);
  166. int ret;
  167. mutex_lock(&st->lock);
  168. ret = __ad5766_spi_read(st, dac, val);
  169. mutex_unlock(&st->lock);
  170. return ret;
  171. }
  172. static int ad5766_write(struct iio_dev *indio_dev, u8 dac, u16 data)
  173. {
  174. struct ad5766_state *st = iio_priv(indio_dev);
  175. int ret;
  176. mutex_lock(&st->lock);
  177. ret = __ad5766_spi_write(st, AD5766_CMD_WR_DAC_REG(dac), data);
  178. mutex_unlock(&st->lock);
  179. return ret;
  180. }
  181. static int ad5766_reset(struct ad5766_state *st)
  182. {
  183. int ret;
  184. if (st->gpio_reset) {
  185. gpiod_set_value_cansleep(st->gpio_reset, 1);
  186. ndelay(100); /* t_reset >= 100ns */
  187. gpiod_set_value_cansleep(st->gpio_reset, 0);
  188. } else {
  189. ret = __ad5766_spi_write(st, AD5766_CMD_SW_FULL_RESET,
  190. AD5766_FULL_RESET_CODE);
  191. if (ret < 0)
  192. return ret;
  193. }
  194. /*
  195. * Minimum time between a reset and the subsequent successful write is
  196. * typically 25 ns
  197. */
  198. ndelay(25);
  199. return 0;
  200. }
  201. static int ad5766_read_raw(struct iio_dev *indio_dev,
  202. struct iio_chan_spec const *chan,
  203. int *val,
  204. int *val2,
  205. long m)
  206. {
  207. struct ad5766_state *st = iio_priv(indio_dev);
  208. int ret;
  209. switch (m) {
  210. case IIO_CHAN_INFO_RAW:
  211. ret = ad5766_read(indio_dev, chan->address, val);
  212. if (ret)
  213. return ret;
  214. return IIO_VAL_INT;
  215. case IIO_CHAN_INFO_OFFSET:
  216. *val = ad5766_span_tbl[st->crt_range].min;
  217. return IIO_VAL_INT;
  218. case IIO_CHAN_INFO_SCALE:
  219. *val = ad5766_span_tbl[st->crt_range].max -
  220. ad5766_span_tbl[st->crt_range].min;
  221. *val2 = st->chip_info->channels[0].scan_type.realbits;
  222. return IIO_VAL_FRACTIONAL_LOG2;
  223. default:
  224. return -EINVAL;
  225. }
  226. }
  227. static int ad5766_write_raw(struct iio_dev *indio_dev,
  228. struct iio_chan_spec const *chan,
  229. int val,
  230. int val2,
  231. long info)
  232. {
  233. switch (info) {
  234. case IIO_CHAN_INFO_RAW:
  235. {
  236. const int max_val = GENMASK(chan->scan_type.realbits - 1, 0);
  237. if (val > max_val || val < 0)
  238. return -EINVAL;
  239. val <<= chan->scan_type.shift;
  240. return ad5766_write(indio_dev, chan->address, val);
  241. }
  242. default:
  243. return -EINVAL;
  244. }
  245. }
  246. static const struct iio_info ad5766_info = {
  247. .read_raw = ad5766_read_raw,
  248. .write_raw = ad5766_write_raw,
  249. };
  250. static int ad5766_get_dither_source(struct iio_dev *dev,
  251. const struct iio_chan_spec *chan)
  252. {
  253. struct ad5766_state *st = iio_priv(dev);
  254. u32 source;
  255. source = st->dither_source & AD5766_DITHER_SOURCE_MASK(chan->channel);
  256. source = source >> (chan->channel * 2);
  257. source -= 1;
  258. return source;
  259. }
  260. static int ad5766_set_dither_source(struct iio_dev *dev,
  261. const struct iio_chan_spec *chan,
  262. unsigned int source)
  263. {
  264. struct ad5766_state *st = iio_priv(dev);
  265. uint16_t val;
  266. int ret;
  267. st->dither_source &= ~AD5766_DITHER_SOURCE_MASK(chan->channel);
  268. st->dither_source |= AD5766_DITHER_SOURCE(chan->channel, source);
  269. val = FIELD_GET(AD5766_LOWER_WORD_SPI_MASK, st->dither_source);
  270. ret = ad5766_write(dev, AD5766_CMD_DITHER_SIG_1, val);
  271. if (ret)
  272. return ret;
  273. val = FIELD_GET(AD5766_UPPER_WORD_SPI_MASK, st->dither_source);
  274. return ad5766_write(dev, AD5766_CMD_DITHER_SIG_2, val);
  275. }
  276. static int ad5766_get_dither_scale(struct iio_dev *dev,
  277. const struct iio_chan_spec *chan)
  278. {
  279. struct ad5766_state *st = iio_priv(dev);
  280. u32 scale;
  281. scale = st->dither_scale & AD5766_DITHER_SCALE_MASK(chan->channel);
  282. return (scale >> (chan->channel * 2));
  283. }
  284. static int ad5766_set_dither_scale(struct iio_dev *dev,
  285. const struct iio_chan_spec *chan,
  286. unsigned int scale)
  287. {
  288. int ret;
  289. struct ad5766_state *st = iio_priv(dev);
  290. uint16_t val;
  291. st->dither_scale &= ~AD5766_DITHER_SCALE_MASK(chan->channel);
  292. st->dither_scale |= AD5766_DITHER_SCALE(chan->channel, scale);
  293. val = FIELD_GET(AD5766_LOWER_WORD_SPI_MASK, st->dither_scale);
  294. ret = ad5766_write(dev, AD5766_CMD_DITHER_SCALE_1, val);
  295. if (ret)
  296. return ret;
  297. val = FIELD_GET(AD5766_UPPER_WORD_SPI_MASK, st->dither_scale);
  298. return ad5766_write(dev, AD5766_CMD_DITHER_SCALE_2, val);
  299. }
  300. static const struct iio_enum ad5766_dither_scale_enum = {
  301. .items = ad5766_dither_scales,
  302. .num_items = ARRAY_SIZE(ad5766_dither_scales),
  303. .set = ad5766_set_dither_scale,
  304. .get = ad5766_get_dither_scale,
  305. };
  306. static ssize_t ad5766_read_ext(struct iio_dev *indio_dev,
  307. uintptr_t private,
  308. const struct iio_chan_spec *chan,
  309. char *buf)
  310. {
  311. struct ad5766_state *st = iio_priv(indio_dev);
  312. switch (private) {
  313. case AD5766_DITHER_ENABLE:
  314. return sprintf(buf, "%u\n",
  315. !(st->dither_enable & BIT(chan->channel)));
  316. break;
  317. case AD5766_DITHER_INVERT:
  318. return sprintf(buf, "%u\n",
  319. !!(st->dither_invert & BIT(chan->channel)));
  320. break;
  321. case AD5766_DITHER_SOURCE:
  322. return sprintf(buf, "%d\n",
  323. ad5766_get_dither_source(indio_dev, chan));
  324. default:
  325. return -EINVAL;
  326. }
  327. }
  328. static ssize_t ad5766_write_ext(struct iio_dev *indio_dev,
  329. uintptr_t private,
  330. const struct iio_chan_spec *chan,
  331. const char *buf, size_t len)
  332. {
  333. struct ad5766_state *st = iio_priv(indio_dev);
  334. bool readin;
  335. int ret;
  336. ret = kstrtobool(buf, &readin);
  337. if (ret)
  338. return ret;
  339. switch (private) {
  340. case AD5766_DITHER_ENABLE:
  341. st->dither_enable &= ~AD5766_DITHER_ENABLE_MASK(chan->channel);
  342. st->dither_enable |= AD5766_DITHER_ENABLE(chan->channel,
  343. readin);
  344. ret = ad5766_write(indio_dev, AD5766_CMD_WR_PWR_DITHER,
  345. st->dither_enable);
  346. break;
  347. case AD5766_DITHER_INVERT:
  348. st->dither_invert &= ~AD5766_DITHER_INVERT_MASK(chan->channel);
  349. st->dither_invert |= AD5766_DITHER_INVERT(chan->channel,
  350. readin);
  351. ret = ad5766_write(indio_dev, AD5766_CMD_INV_DITHER,
  352. st->dither_invert);
  353. break;
  354. case AD5766_DITHER_SOURCE:
  355. ret = ad5766_set_dither_source(indio_dev, chan, readin);
  356. break;
  357. default:
  358. return -EINVAL;
  359. }
  360. return ret ? ret : len;
  361. }
  362. #define _AD5766_CHAN_EXT_INFO(_name, _what, _shared) { \
  363. .name = _name, \
  364. .read = ad5766_read_ext, \
  365. .write = ad5766_write_ext, \
  366. .private = _what, \
  367. .shared = _shared, \
  368. }
  369. static const struct iio_chan_spec_ext_info ad5766_ext_info[] = {
  370. _AD5766_CHAN_EXT_INFO("dither_enable", AD5766_DITHER_ENABLE,
  371. IIO_SEPARATE),
  372. _AD5766_CHAN_EXT_INFO("dither_invert", AD5766_DITHER_INVERT,
  373. IIO_SEPARATE),
  374. _AD5766_CHAN_EXT_INFO("dither_source", AD5766_DITHER_SOURCE,
  375. IIO_SEPARATE),
  376. IIO_ENUM("dither_scale", IIO_SEPARATE, &ad5766_dither_scale_enum),
  377. IIO_ENUM_AVAILABLE("dither_scale", IIO_SEPARATE,
  378. &ad5766_dither_scale_enum),
  379. {}
  380. };
  381. #define AD576x_CHANNEL(_chan, _bits) { \
  382. .type = IIO_VOLTAGE, \
  383. .indexed = 1, \
  384. .output = 1, \
  385. .channel = (_chan), \
  386. .address = (_chan), \
  387. .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), \
  388. .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_OFFSET) | \
  389. BIT(IIO_CHAN_INFO_SCALE), \
  390. .scan_index = (_chan), \
  391. .scan_type = { \
  392. .sign = 'u', \
  393. .realbits = (_bits), \
  394. .storagebits = 16, \
  395. .shift = 16 - (_bits), \
  396. }, \
  397. .ext_info = ad5766_ext_info, \
  398. }
  399. #define DECLARE_AD576x_CHANNELS(_name, _bits) \
  400. const struct iio_chan_spec _name[] = { \
  401. AD576x_CHANNEL(0, (_bits)), \
  402. AD576x_CHANNEL(1, (_bits)), \
  403. AD576x_CHANNEL(2, (_bits)), \
  404. AD576x_CHANNEL(3, (_bits)), \
  405. AD576x_CHANNEL(4, (_bits)), \
  406. AD576x_CHANNEL(5, (_bits)), \
  407. AD576x_CHANNEL(6, (_bits)), \
  408. AD576x_CHANNEL(7, (_bits)), \
  409. AD576x_CHANNEL(8, (_bits)), \
  410. AD576x_CHANNEL(9, (_bits)), \
  411. AD576x_CHANNEL(10, (_bits)), \
  412. AD576x_CHANNEL(11, (_bits)), \
  413. AD576x_CHANNEL(12, (_bits)), \
  414. AD576x_CHANNEL(13, (_bits)), \
  415. AD576x_CHANNEL(14, (_bits)), \
  416. AD576x_CHANNEL(15, (_bits)), \
  417. }
  418. static DECLARE_AD576x_CHANNELS(ad5766_channels, 16);
  419. static DECLARE_AD576x_CHANNELS(ad5767_channels, 12);
  420. static const struct ad5766_chip_info ad5766_chip_infos[] = {
  421. [ID_AD5766] = {
  422. .num_channels = ARRAY_SIZE(ad5766_channels),
  423. .channels = ad5766_channels,
  424. },
  425. [ID_AD5767] = {
  426. .num_channels = ARRAY_SIZE(ad5767_channels),
  427. .channels = ad5767_channels,
  428. },
  429. };
  430. static int ad5766_get_output_range(struct ad5766_state *st)
  431. {
  432. int i, ret, min, max, tmp[2];
  433. ret = device_property_read_u32_array(&st->spi->dev,
  434. "output-range-microvolts",
  435. tmp, 2);
  436. if (ret)
  437. return ret;
  438. min = tmp[0] / 1000000;
  439. max = tmp[1] / 1000000;
  440. for (i = 0; i < ARRAY_SIZE(ad5766_span_tbl); i++) {
  441. if (ad5766_span_tbl[i].min != min ||
  442. ad5766_span_tbl[i].max != max)
  443. continue;
  444. st->crt_range = i;
  445. return 0;
  446. }
  447. return -EINVAL;
  448. }
  449. static int ad5766_default_setup(struct ad5766_state *st)
  450. {
  451. uint16_t val;
  452. int ret, i;
  453. /* Always issue a reset before writing to the span register. */
  454. ret = ad5766_reset(st);
  455. if (ret)
  456. return ret;
  457. ret = ad5766_get_output_range(st);
  458. if (ret)
  459. return ret;
  460. /* Dither power down */
  461. st->dither_enable = GENMASK(15, 0);
  462. ret = __ad5766_spi_write(st, AD5766_CMD_WR_PWR_DITHER,
  463. st->dither_enable);
  464. if (ret)
  465. return ret;
  466. st->dither_source = 0;
  467. for (i = 0; i < ARRAY_SIZE(ad5766_channels); i++)
  468. st->dither_source |= AD5766_DITHER_SOURCE(i, 0);
  469. val = FIELD_GET(AD5766_LOWER_WORD_SPI_MASK, st->dither_source);
  470. ret = __ad5766_spi_write(st, AD5766_CMD_DITHER_SIG_1, val);
  471. if (ret)
  472. return ret;
  473. val = FIELD_GET(AD5766_UPPER_WORD_SPI_MASK, st->dither_source);
  474. ret = __ad5766_spi_write(st, AD5766_CMD_DITHER_SIG_2, val);
  475. if (ret)
  476. return ret;
  477. st->dither_scale = 0;
  478. val = FIELD_GET(AD5766_LOWER_WORD_SPI_MASK, st->dither_scale);
  479. ret = __ad5766_spi_write(st, AD5766_CMD_DITHER_SCALE_1, val);
  480. if (ret)
  481. return ret;
  482. val = FIELD_GET(AD5766_UPPER_WORD_SPI_MASK, st->dither_scale);
  483. ret = __ad5766_spi_write(st, AD5766_CMD_DITHER_SCALE_2, val);
  484. if (ret)
  485. return ret;
  486. st->dither_invert = 0;
  487. ret = __ad5766_spi_write(st, AD5766_CMD_INV_DITHER, st->dither_invert);
  488. if (ret)
  489. return ret;
  490. return __ad5766_spi_write(st, AD5766_CMD_SPAN_REG, st->crt_range);
  491. }
  492. static irqreturn_t ad5766_trigger_handler(int irq, void *p)
  493. {
  494. struct iio_poll_func *pf = p;
  495. struct iio_dev *indio_dev = pf->indio_dev;
  496. struct iio_buffer *buffer = indio_dev->buffer;
  497. struct ad5766_state *st = iio_priv(indio_dev);
  498. int ret, ch, i;
  499. u16 data[ARRAY_SIZE(ad5766_channels)];
  500. ret = iio_pop_from_buffer(buffer, data);
  501. if (ret)
  502. goto done;
  503. i = 0;
  504. mutex_lock(&st->lock);
  505. for_each_set_bit(ch, indio_dev->active_scan_mask,
  506. st->chip_info->num_channels - 1)
  507. __ad5766_spi_write(st, AD5766_CMD_WR_IN_REG(ch), data[i++]);
  508. __ad5766_spi_write(st, AD5766_CMD_SW_LDAC,
  509. *indio_dev->active_scan_mask);
  510. mutex_unlock(&st->lock);
  511. done:
  512. iio_trigger_notify_done(indio_dev->trig);
  513. return IRQ_HANDLED;
  514. }
  515. static int ad5766_probe(struct spi_device *spi)
  516. {
  517. enum ad5766_type type;
  518. struct iio_dev *indio_dev;
  519. struct ad5766_state *st;
  520. int ret;
  521. indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*st));
  522. if (!indio_dev)
  523. return -ENOMEM;
  524. st = iio_priv(indio_dev);
  525. mutex_init(&st->lock);
  526. st->spi = spi;
  527. type = spi_get_device_id(spi)->driver_data;
  528. st->chip_info = &ad5766_chip_infos[type];
  529. indio_dev->channels = st->chip_info->channels;
  530. indio_dev->num_channels = st->chip_info->num_channels;
  531. indio_dev->info = &ad5766_info;
  532. indio_dev->name = spi_get_device_id(spi)->name;
  533. indio_dev->modes = INDIO_DIRECT_MODE;
  534. st->gpio_reset = devm_gpiod_get_optional(&st->spi->dev, "reset",
  535. GPIOD_OUT_LOW);
  536. if (IS_ERR(st->gpio_reset))
  537. return PTR_ERR(st->gpio_reset);
  538. ret = ad5766_default_setup(st);
  539. if (ret)
  540. return ret;
  541. /* Configure trigger buffer */
  542. ret = devm_iio_triggered_buffer_setup_ext(&spi->dev, indio_dev, NULL,
  543. ad5766_trigger_handler,
  544. IIO_BUFFER_DIRECTION_OUT,
  545. NULL,
  546. NULL);
  547. if (ret)
  548. return ret;
  549. return devm_iio_device_register(&spi->dev, indio_dev);
  550. }
  551. static const struct of_device_id ad5766_dt_match[] = {
  552. { .compatible = "adi,ad5766" },
  553. { .compatible = "adi,ad5767" },
  554. {}
  555. };
  556. MODULE_DEVICE_TABLE(of, ad5766_dt_match);
  557. static const struct spi_device_id ad5766_spi_ids[] = {
  558. { "ad5766", ID_AD5766 },
  559. { "ad5767", ID_AD5767 },
  560. {}
  561. };
  562. MODULE_DEVICE_TABLE(spi, ad5766_spi_ids);
  563. static struct spi_driver ad5766_driver = {
  564. .driver = {
  565. .name = "ad5766",
  566. .of_match_table = ad5766_dt_match,
  567. },
  568. .probe = ad5766_probe,
  569. .id_table = ad5766_spi_ids,
  570. };
  571. module_spi_driver(ad5766_driver);
  572. MODULE_AUTHOR("Denis-Gabriel Gheorghescu <[email protected]>");
  573. MODULE_DESCRIPTION("Analog Devices AD5766/AD5767 DACs");
  574. MODULE_LICENSE("GPL v2");