ltc2688.c 26 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * LTC2688 16 channel, 16 bit Voltage Output SoftSpan DAC driver
  4. *
  5. * Copyright 2022 Analog Devices Inc.
  6. */
  7. #include <linux/bitfield.h>
  8. #include <linux/bits.h>
  9. #include <linux/cleanup.h>
  10. #include <linux/clk.h>
  11. #include <linux/device.h>
  12. #include <linux/gpio/consumer.h>
  13. #include <linux/iio/iio.h>
  14. #include <linux/limits.h>
  15. #include <linux/kernel.h>
  16. #include <linux/module.h>
  17. #include <linux/mod_devicetable.h>
  18. #include <linux/mutex.h>
  19. #include <linux/of.h>
  20. #include <linux/property.h>
  21. #include <linux/regmap.h>
  22. #include <linux/regulator/consumer.h>
  23. #include <linux/spi/spi.h>
  24. #define LTC2688_DAC_CHANNELS 16
  25. #define LTC2688_CMD_CH_CODE(x) (0x00 + (x))
  26. #define LTC2688_CMD_CH_SETTING(x) (0x10 + (x))
  27. #define LTC2688_CMD_CH_OFFSET(x) (0X20 + (x))
  28. #define LTC2688_CMD_CH_GAIN(x) (0x30 + (x))
  29. #define LTC2688_CMD_CH_CODE_UPDATE(x) (0x40 + (x))
  30. #define LTC2688_CMD_CONFIG 0x70
  31. #define LTC2688_CMD_POWERDOWN 0x71
  32. #define LTC2688_CMD_A_B_SELECT 0x72
  33. #define LTC2688_CMD_SW_TOGGLE 0x73
  34. #define LTC2688_CMD_TOGGLE_DITHER_EN 0x74
  35. #define LTC2688_CMD_THERMAL_STAT 0x77
  36. #define LTC2688_CMD_UPDATE_ALL 0x7C
  37. #define LTC2688_CMD_NOOP 0xFF
  38. #define LTC2688_READ_OPERATION 0x80
  39. /* Channel Settings */
  40. #define LTC2688_CH_SPAN_MSK GENMASK(2, 0)
  41. #define LTC2688_CH_OVERRANGE_MSK BIT(3)
  42. #define LTC2688_CH_TD_SEL_MSK GENMASK(5, 4)
  43. #define LTC2688_CH_TGP_MAX 3
  44. #define LTC2688_CH_DIT_PER_MSK GENMASK(8, 6)
  45. #define LTC2688_CH_DIT_PH_MSK GENMASK(10, 9)
  46. #define LTC2688_CH_MODE_MSK BIT(11)
  47. #define LTC2688_DITHER_RAW_MASK GENMASK(15, 2)
  48. #define LTC2688_CH_CALIBBIAS_MASK GENMASK(15, 2)
  49. #define LTC2688_DITHER_RAW_MAX_VAL (BIT(14) - 1)
  50. #define LTC2688_CH_CALIBBIAS_MAX_VAL (BIT(14) - 1)
  51. /* Configuration register */
  52. #define LTC2688_CONFIG_RST BIT(15)
  53. #define LTC2688_CONFIG_EXT_REF BIT(1)
  54. #define LTC2688_DITHER_FREQ_AVAIL_N 5
  55. enum {
  56. LTC2688_SPAN_RANGE_0V_5V,
  57. LTC2688_SPAN_RANGE_0V_10V,
  58. LTC2688_SPAN_RANGE_M5V_5V,
  59. LTC2688_SPAN_RANGE_M10V_10V,
  60. LTC2688_SPAN_RANGE_M15V_15V,
  61. LTC2688_SPAN_RANGE_MAX
  62. };
  63. enum {
  64. LTC2688_MODE_DEFAULT,
  65. LTC2688_MODE_DITHER_TOGGLE,
  66. };
  67. struct ltc2688_chan {
  68. long dither_frequency[LTC2688_DITHER_FREQ_AVAIL_N];
  69. bool overrange;
  70. bool toggle_chan;
  71. u8 mode;
  72. };
  73. struct ltc2688_state {
  74. struct spi_device *spi;
  75. struct regmap *regmap;
  76. struct ltc2688_chan channels[LTC2688_DAC_CHANNELS];
  77. struct iio_chan_spec *iio_chan;
  78. /* lock to protect against multiple access to the device and shared data */
  79. struct mutex lock;
  80. int vref;
  81. /*
  82. * DMA (thus cache coherency maintenance) may require the
  83. * transfer buffers to live in their own cache lines.
  84. */
  85. u8 tx_data[6] __aligned(IIO_DMA_MINALIGN);
  86. u8 rx_data[3];
  87. };
  88. static int ltc2688_spi_read(void *context, const void *reg, size_t reg_size,
  89. void *val, size_t val_size)
  90. {
  91. struct ltc2688_state *st = context;
  92. struct spi_transfer xfers[] = {
  93. {
  94. .tx_buf = st->tx_data,
  95. .len = reg_size + val_size,
  96. .cs_change = 1,
  97. }, {
  98. .tx_buf = st->tx_data + 3,
  99. .rx_buf = st->rx_data,
  100. .len = reg_size + val_size,
  101. },
  102. };
  103. int ret;
  104. memcpy(st->tx_data, reg, reg_size);
  105. ret = spi_sync_transfer(st->spi, xfers, ARRAY_SIZE(xfers));
  106. if (ret)
  107. return ret;
  108. memcpy(val, &st->rx_data[1], val_size);
  109. return 0;
  110. }
  111. static int ltc2688_spi_write(void *context, const void *data, size_t count)
  112. {
  113. struct ltc2688_state *st = context;
  114. return spi_write(st->spi, data, count);
  115. }
  116. static int ltc2688_span_get(const struct ltc2688_state *st, int c)
  117. {
  118. int ret, reg, span;
  119. ret = regmap_read(st->regmap, LTC2688_CMD_CH_SETTING(c), &reg);
  120. if (ret)
  121. return ret;
  122. span = FIELD_GET(LTC2688_CH_SPAN_MSK, reg);
  123. /* sanity check to make sure we don't get any weird value from the HW */
  124. if (span >= LTC2688_SPAN_RANGE_MAX)
  125. return -EIO;
  126. return span;
  127. }
  128. static const int ltc2688_span_helper[LTC2688_SPAN_RANGE_MAX][2] = {
  129. {0, 5000}, {0, 10000}, {-5000, 5000}, {-10000, 10000}, {-15000, 15000},
  130. };
  131. static int ltc2688_scale_get(const struct ltc2688_state *st, int c, int *val)
  132. {
  133. const struct ltc2688_chan *chan = &st->channels[c];
  134. int span, fs;
  135. span = ltc2688_span_get(st, c);
  136. if (span < 0)
  137. return span;
  138. fs = ltc2688_span_helper[span][1] - ltc2688_span_helper[span][0];
  139. if (chan->overrange)
  140. fs = mult_frac(fs, 105, 100);
  141. *val = DIV_ROUND_CLOSEST(fs * st->vref, 4096);
  142. return 0;
  143. }
  144. static int ltc2688_offset_get(const struct ltc2688_state *st, int c, int *val)
  145. {
  146. int span;
  147. span = ltc2688_span_get(st, c);
  148. if (span < 0)
  149. return span;
  150. if (ltc2688_span_helper[span][0] < 0)
  151. *val = -32768;
  152. else
  153. *val = 0;
  154. return 0;
  155. }
  156. enum {
  157. LTC2688_INPUT_A,
  158. LTC2688_INPUT_B,
  159. LTC2688_INPUT_B_AVAIL,
  160. LTC2688_DITHER_OFF,
  161. LTC2688_DITHER_FREQ_AVAIL,
  162. };
  163. static int ltc2688_dac_code_write(struct ltc2688_state *st, u32 chan, u32 input,
  164. u16 code)
  165. {
  166. struct ltc2688_chan *c = &st->channels[chan];
  167. int ret, reg;
  168. /* 2 LSBs set to 0 if writing dither amplitude */
  169. if (!c->toggle_chan && input == LTC2688_INPUT_B) {
  170. if (code > LTC2688_DITHER_RAW_MAX_VAL)
  171. return -EINVAL;
  172. code = FIELD_PREP(LTC2688_DITHER_RAW_MASK, code);
  173. }
  174. guard(mutex)(&st->lock);
  175. /* select the correct input register to read from */
  176. ret = regmap_update_bits(st->regmap, LTC2688_CMD_A_B_SELECT, BIT(chan),
  177. input << chan);
  178. if (ret)
  179. return ret;
  180. /*
  181. * If in dither/toggle mode the dac should be updated by an
  182. * external signal (or sw toggle) and not here.
  183. */
  184. if (c->mode == LTC2688_MODE_DEFAULT)
  185. reg = LTC2688_CMD_CH_CODE_UPDATE(chan);
  186. else
  187. reg = LTC2688_CMD_CH_CODE(chan);
  188. return regmap_write(st->regmap, reg, code);
  189. }
  190. static int ltc2688_dac_code_read(struct ltc2688_state *st, u32 chan, u32 input,
  191. u32 *code)
  192. {
  193. struct ltc2688_chan *c = &st->channels[chan];
  194. int ret;
  195. guard(mutex)(&st->lock);
  196. ret = regmap_update_bits(st->regmap, LTC2688_CMD_A_B_SELECT, BIT(chan),
  197. input << chan);
  198. if (ret)
  199. return ret;
  200. ret = regmap_read(st->regmap, LTC2688_CMD_CH_CODE(chan), code);
  201. if (ret)
  202. return ret;
  203. if (!c->toggle_chan && input == LTC2688_INPUT_B)
  204. *code = FIELD_GET(LTC2688_DITHER_RAW_MASK, *code);
  205. return 0;
  206. }
  207. static const int ltc2688_raw_range[] = {0, 1, U16_MAX};
  208. static int ltc2688_read_avail(struct iio_dev *indio_dev,
  209. struct iio_chan_spec const *chan,
  210. const int **vals, int *type, int *length,
  211. long info)
  212. {
  213. switch (info) {
  214. case IIO_CHAN_INFO_RAW:
  215. *vals = ltc2688_raw_range;
  216. *type = IIO_VAL_INT;
  217. return IIO_AVAIL_RANGE;
  218. default:
  219. return -EINVAL;
  220. }
  221. }
  222. static int ltc2688_read_raw(struct iio_dev *indio_dev,
  223. struct iio_chan_spec const *chan, int *val,
  224. int *val2, long info)
  225. {
  226. struct ltc2688_state *st = iio_priv(indio_dev);
  227. int ret;
  228. switch (info) {
  229. case IIO_CHAN_INFO_RAW:
  230. ret = ltc2688_dac_code_read(st, chan->channel, LTC2688_INPUT_A,
  231. val);
  232. if (ret)
  233. return ret;
  234. return IIO_VAL_INT;
  235. case IIO_CHAN_INFO_OFFSET:
  236. ret = ltc2688_offset_get(st, chan->channel, val);
  237. if (ret)
  238. return ret;
  239. return IIO_VAL_INT;
  240. case IIO_CHAN_INFO_SCALE:
  241. ret = ltc2688_scale_get(st, chan->channel, val);
  242. if (ret)
  243. return ret;
  244. *val2 = 16;
  245. return IIO_VAL_FRACTIONAL_LOG2;
  246. case IIO_CHAN_INFO_CALIBBIAS:
  247. ret = regmap_read(st->regmap,
  248. LTC2688_CMD_CH_OFFSET(chan->channel), val);
  249. if (ret)
  250. return ret;
  251. *val = FIELD_GET(LTC2688_CH_CALIBBIAS_MASK, *val);
  252. return IIO_VAL_INT;
  253. case IIO_CHAN_INFO_CALIBSCALE:
  254. ret = regmap_read(st->regmap,
  255. LTC2688_CMD_CH_GAIN(chan->channel), val);
  256. if (ret)
  257. return ret;
  258. return IIO_VAL_INT;
  259. default:
  260. return -EINVAL;
  261. }
  262. }
  263. static int ltc2688_write_raw(struct iio_dev *indio_dev,
  264. struct iio_chan_spec const *chan, int val,
  265. int val2, long info)
  266. {
  267. struct ltc2688_state *st = iio_priv(indio_dev);
  268. switch (info) {
  269. case IIO_CHAN_INFO_RAW:
  270. if (val > U16_MAX || val < 0)
  271. return -EINVAL;
  272. return ltc2688_dac_code_write(st, chan->channel,
  273. LTC2688_INPUT_A, val);
  274. case IIO_CHAN_INFO_CALIBBIAS:
  275. if (val > LTC2688_CH_CALIBBIAS_MAX_VAL)
  276. return -EINVAL;
  277. return regmap_write(st->regmap,
  278. LTC2688_CMD_CH_OFFSET(chan->channel),
  279. FIELD_PREP(LTC2688_CH_CALIBBIAS_MASK, val));
  280. case IIO_CHAN_INFO_CALIBSCALE:
  281. return regmap_write(st->regmap,
  282. LTC2688_CMD_CH_GAIN(chan->channel), val);
  283. default:
  284. return -EINVAL;
  285. }
  286. }
  287. static ssize_t ltc2688_dither_toggle_set(struct iio_dev *indio_dev,
  288. uintptr_t private,
  289. const struct iio_chan_spec *chan,
  290. const char *buf, size_t len)
  291. {
  292. struct ltc2688_state *st = iio_priv(indio_dev);
  293. struct ltc2688_chan *c = &st->channels[chan->channel];
  294. int ret;
  295. bool en;
  296. ret = kstrtobool(buf, &en);
  297. if (ret)
  298. return ret;
  299. guard(mutex)(&st->lock);
  300. ret = regmap_update_bits(st->regmap, LTC2688_CMD_TOGGLE_DITHER_EN,
  301. BIT(chan->channel), en << chan->channel);
  302. if (ret)
  303. return ret;
  304. c->mode = en ? LTC2688_MODE_DITHER_TOGGLE : LTC2688_MODE_DEFAULT;
  305. return len;
  306. }
  307. static ssize_t ltc2688_reg_bool_get(struct iio_dev *indio_dev,
  308. uintptr_t private,
  309. const struct iio_chan_spec *chan,
  310. char *buf)
  311. {
  312. const struct ltc2688_state *st = iio_priv(indio_dev);
  313. int ret;
  314. u32 val;
  315. ret = regmap_read(st->regmap, private, &val);
  316. if (ret)
  317. return ret;
  318. return sysfs_emit(buf, "%u\n", !!(val & BIT(chan->channel)));
  319. }
  320. static ssize_t ltc2688_reg_bool_set(struct iio_dev *indio_dev,
  321. uintptr_t private,
  322. const struct iio_chan_spec *chan,
  323. const char *buf, size_t len)
  324. {
  325. const struct ltc2688_state *st = iio_priv(indio_dev);
  326. int ret;
  327. bool en;
  328. ret = kstrtobool(buf, &en);
  329. if (ret)
  330. return ret;
  331. ret = regmap_update_bits(st->regmap, private, BIT(chan->channel),
  332. en << chan->channel);
  333. if (ret)
  334. return ret;
  335. return len;
  336. }
  337. static ssize_t ltc2688_dither_freq_avail(const struct ltc2688_state *st,
  338. const struct ltc2688_chan *chan,
  339. char *buf)
  340. {
  341. int sz = 0;
  342. u32 f;
  343. for (f = 0; f < ARRAY_SIZE(chan->dither_frequency); f++)
  344. sz += sysfs_emit_at(buf, sz, "%ld ", chan->dither_frequency[f]);
  345. buf[sz - 1] = '\n';
  346. return sz;
  347. }
  348. static ssize_t ltc2688_dither_freq_get(struct iio_dev *indio_dev,
  349. uintptr_t private,
  350. const struct iio_chan_spec *chan,
  351. char *buf)
  352. {
  353. const struct ltc2688_state *st = iio_priv(indio_dev);
  354. const struct ltc2688_chan *c = &st->channels[chan->channel];
  355. u32 reg, freq;
  356. int ret;
  357. if (private == LTC2688_DITHER_FREQ_AVAIL)
  358. return ltc2688_dither_freq_avail(st, c, buf);
  359. ret = regmap_read(st->regmap, LTC2688_CMD_CH_SETTING(chan->channel),
  360. &reg);
  361. if (ret)
  362. return ret;
  363. freq = FIELD_GET(LTC2688_CH_DIT_PER_MSK, reg);
  364. if (freq >= ARRAY_SIZE(c->dither_frequency))
  365. return -EIO;
  366. return sysfs_emit(buf, "%ld\n", c->dither_frequency[freq]);
  367. }
  368. static ssize_t ltc2688_dither_freq_set(struct iio_dev *indio_dev,
  369. uintptr_t private,
  370. const struct iio_chan_spec *chan,
  371. const char *buf, size_t len)
  372. {
  373. const struct ltc2688_state *st = iio_priv(indio_dev);
  374. const struct ltc2688_chan *c = &st->channels[chan->channel];
  375. long val;
  376. u32 freq;
  377. int ret;
  378. if (private == LTC2688_DITHER_FREQ_AVAIL)
  379. return -EINVAL;
  380. ret = kstrtol(buf, 10, &val);
  381. if (ret)
  382. return ret;
  383. for (freq = 0; freq < ARRAY_SIZE(c->dither_frequency); freq++) {
  384. if (val == c->dither_frequency[freq])
  385. break;
  386. }
  387. if (freq == ARRAY_SIZE(c->dither_frequency))
  388. return -EINVAL;
  389. ret = regmap_update_bits(st->regmap,
  390. LTC2688_CMD_CH_SETTING(chan->channel),
  391. LTC2688_CH_DIT_PER_MSK,
  392. FIELD_PREP(LTC2688_CH_DIT_PER_MSK, freq));
  393. if (ret)
  394. return ret;
  395. return len;
  396. }
  397. static ssize_t ltc2688_dac_input_read(struct iio_dev *indio_dev,
  398. uintptr_t private,
  399. const struct iio_chan_spec *chan,
  400. char *buf)
  401. {
  402. struct ltc2688_state *st = iio_priv(indio_dev);
  403. int ret;
  404. u32 val;
  405. if (private == LTC2688_INPUT_B_AVAIL)
  406. return sysfs_emit(buf, "[%u %u %u]\n", ltc2688_raw_range[0],
  407. ltc2688_raw_range[1],
  408. ltc2688_raw_range[2] / 4);
  409. if (private == LTC2688_DITHER_OFF)
  410. return sysfs_emit(buf, "0\n");
  411. ret = ltc2688_dac_code_read(st, chan->channel, private, &val);
  412. if (ret)
  413. return ret;
  414. return sysfs_emit(buf, "%u\n", val);
  415. }
  416. static ssize_t ltc2688_dac_input_write(struct iio_dev *indio_dev,
  417. uintptr_t private,
  418. const struct iio_chan_spec *chan,
  419. const char *buf, size_t len)
  420. {
  421. struct ltc2688_state *st = iio_priv(indio_dev);
  422. int ret;
  423. u16 val;
  424. if (private == LTC2688_INPUT_B_AVAIL || private == LTC2688_DITHER_OFF)
  425. return -EINVAL;
  426. ret = kstrtou16(buf, 10, &val);
  427. if (ret)
  428. return ret;
  429. ret = ltc2688_dac_code_write(st, chan->channel, private, val);
  430. if (ret)
  431. return ret;
  432. return len;
  433. }
  434. static int ltc2688_get_dither_phase(struct iio_dev *dev,
  435. const struct iio_chan_spec *chan)
  436. {
  437. struct ltc2688_state *st = iio_priv(dev);
  438. int ret, regval;
  439. ret = regmap_read(st->regmap, LTC2688_CMD_CH_SETTING(chan->channel),
  440. &regval);
  441. if (ret)
  442. return ret;
  443. return FIELD_GET(LTC2688_CH_DIT_PH_MSK, regval);
  444. }
  445. static int ltc2688_set_dither_phase(struct iio_dev *dev,
  446. const struct iio_chan_spec *chan,
  447. unsigned int phase)
  448. {
  449. struct ltc2688_state *st = iio_priv(dev);
  450. return regmap_update_bits(st->regmap,
  451. LTC2688_CMD_CH_SETTING(chan->channel),
  452. LTC2688_CH_DIT_PH_MSK,
  453. FIELD_PREP(LTC2688_CH_DIT_PH_MSK, phase));
  454. }
  455. static int ltc2688_reg_access(struct iio_dev *indio_dev,
  456. unsigned int reg,
  457. unsigned int writeval,
  458. unsigned int *readval)
  459. {
  460. struct ltc2688_state *st = iio_priv(indio_dev);
  461. if (readval)
  462. return regmap_read(st->regmap, reg, readval);
  463. return regmap_write(st->regmap, reg, writeval);
  464. }
  465. static const char * const ltc2688_dither_phase[] = {
  466. "0", "1.5708", "3.14159", "4.71239",
  467. };
  468. static const struct iio_enum ltc2688_dither_phase_enum = {
  469. .items = ltc2688_dither_phase,
  470. .num_items = ARRAY_SIZE(ltc2688_dither_phase),
  471. .set = ltc2688_set_dither_phase,
  472. .get = ltc2688_get_dither_phase,
  473. };
  474. #define LTC2688_CHAN_EXT_INFO(_name, _what, _shared, _read, _write) { \
  475. .name = _name, \
  476. .read = (_read), \
  477. .write = (_write), \
  478. .private = (_what), \
  479. .shared = (_shared), \
  480. }
  481. /*
  482. * For toggle mode we only expose the symbol attr (sw_toggle) in case a TGPx is
  483. * not provided in dts.
  484. */
  485. static const struct iio_chan_spec_ext_info ltc2688_toggle_sym_ext_info[] = {
  486. LTC2688_CHAN_EXT_INFO("raw0", LTC2688_INPUT_A, IIO_SEPARATE,
  487. ltc2688_dac_input_read, ltc2688_dac_input_write),
  488. LTC2688_CHAN_EXT_INFO("raw1", LTC2688_INPUT_B, IIO_SEPARATE,
  489. ltc2688_dac_input_read, ltc2688_dac_input_write),
  490. LTC2688_CHAN_EXT_INFO("toggle_en", LTC2688_CMD_TOGGLE_DITHER_EN,
  491. IIO_SEPARATE, ltc2688_reg_bool_get,
  492. ltc2688_dither_toggle_set),
  493. LTC2688_CHAN_EXT_INFO("powerdown", LTC2688_CMD_POWERDOWN, IIO_SEPARATE,
  494. ltc2688_reg_bool_get, ltc2688_reg_bool_set),
  495. LTC2688_CHAN_EXT_INFO("symbol", LTC2688_CMD_SW_TOGGLE, IIO_SEPARATE,
  496. ltc2688_reg_bool_get, ltc2688_reg_bool_set),
  497. { }
  498. };
  499. static const struct iio_chan_spec_ext_info ltc2688_toggle_ext_info[] = {
  500. LTC2688_CHAN_EXT_INFO("raw0", LTC2688_INPUT_A, IIO_SEPARATE,
  501. ltc2688_dac_input_read, ltc2688_dac_input_write),
  502. LTC2688_CHAN_EXT_INFO("raw1", LTC2688_INPUT_B, IIO_SEPARATE,
  503. ltc2688_dac_input_read, ltc2688_dac_input_write),
  504. LTC2688_CHAN_EXT_INFO("toggle_en", LTC2688_CMD_TOGGLE_DITHER_EN,
  505. IIO_SEPARATE, ltc2688_reg_bool_get,
  506. ltc2688_dither_toggle_set),
  507. LTC2688_CHAN_EXT_INFO("powerdown", LTC2688_CMD_POWERDOWN, IIO_SEPARATE,
  508. ltc2688_reg_bool_get, ltc2688_reg_bool_set),
  509. { }
  510. };
  511. static const struct iio_chan_spec_ext_info ltc2688_dither_ext_info[] = {
  512. LTC2688_CHAN_EXT_INFO("dither_raw", LTC2688_INPUT_B, IIO_SEPARATE,
  513. ltc2688_dac_input_read, ltc2688_dac_input_write),
  514. LTC2688_CHAN_EXT_INFO("dither_raw_available", LTC2688_INPUT_B_AVAIL,
  515. IIO_SEPARATE, ltc2688_dac_input_read,
  516. ltc2688_dac_input_write),
  517. LTC2688_CHAN_EXT_INFO("dither_offset", LTC2688_DITHER_OFF, IIO_SEPARATE,
  518. ltc2688_dac_input_read, ltc2688_dac_input_write),
  519. /*
  520. * Not IIO_ENUM because the available freq needs to be computed at
  521. * probe. We could still use it, but it didn't felt much right.
  522. */
  523. LTC2688_CHAN_EXT_INFO("dither_frequency", 0, IIO_SEPARATE,
  524. ltc2688_dither_freq_get, ltc2688_dither_freq_set),
  525. LTC2688_CHAN_EXT_INFO("dither_frequency_available",
  526. LTC2688_DITHER_FREQ_AVAIL, IIO_SEPARATE,
  527. ltc2688_dither_freq_get, ltc2688_dither_freq_set),
  528. IIO_ENUM("dither_phase", IIO_SEPARATE, &ltc2688_dither_phase_enum),
  529. IIO_ENUM_AVAILABLE("dither_phase", IIO_SEPARATE,
  530. &ltc2688_dither_phase_enum),
  531. LTC2688_CHAN_EXT_INFO("dither_en", LTC2688_CMD_TOGGLE_DITHER_EN,
  532. IIO_SEPARATE, ltc2688_reg_bool_get,
  533. ltc2688_dither_toggle_set),
  534. LTC2688_CHAN_EXT_INFO("powerdown", LTC2688_CMD_POWERDOWN, IIO_SEPARATE,
  535. ltc2688_reg_bool_get, ltc2688_reg_bool_set),
  536. { }
  537. };
  538. static const struct iio_chan_spec_ext_info ltc2688_ext_info[] = {
  539. LTC2688_CHAN_EXT_INFO("powerdown", LTC2688_CMD_POWERDOWN, IIO_SEPARATE,
  540. ltc2688_reg_bool_get, ltc2688_reg_bool_set),
  541. { }
  542. };
  543. #define LTC2688_CHANNEL(_chan) { \
  544. .type = IIO_VOLTAGE, \
  545. .indexed = 1, \
  546. .output = 1, \
  547. .channel = (_chan), \
  548. .info_mask_separate = BIT(IIO_CHAN_INFO_CALIBSCALE) | \
  549. BIT(IIO_CHAN_INFO_SCALE) | BIT(IIO_CHAN_INFO_OFFSET) | \
  550. BIT(IIO_CHAN_INFO_CALIBBIAS) | BIT(IIO_CHAN_INFO_RAW), \
  551. .info_mask_separate_available = BIT(IIO_CHAN_INFO_RAW), \
  552. .ext_info = ltc2688_ext_info, \
  553. }
  554. static const struct iio_chan_spec ltc2688_channels[] = {
  555. LTC2688_CHANNEL(0),
  556. LTC2688_CHANNEL(1),
  557. LTC2688_CHANNEL(2),
  558. LTC2688_CHANNEL(3),
  559. LTC2688_CHANNEL(4),
  560. LTC2688_CHANNEL(5),
  561. LTC2688_CHANNEL(6),
  562. LTC2688_CHANNEL(7),
  563. LTC2688_CHANNEL(8),
  564. LTC2688_CHANNEL(9),
  565. LTC2688_CHANNEL(10),
  566. LTC2688_CHANNEL(11),
  567. LTC2688_CHANNEL(12),
  568. LTC2688_CHANNEL(13),
  569. LTC2688_CHANNEL(14),
  570. LTC2688_CHANNEL(15),
  571. };
  572. static void ltc2688_clk_disable(void *clk)
  573. {
  574. clk_disable_unprepare(clk);
  575. }
  576. static const int ltc2688_period[LTC2688_DITHER_FREQ_AVAIL_N] = {
  577. 4, 8, 16, 32, 64,
  578. };
  579. static int ltc2688_tgp_clk_setup(struct ltc2688_state *st,
  580. struct ltc2688_chan *chan,
  581. struct fwnode_handle *node, int tgp)
  582. {
  583. struct device *dev = &st->spi->dev;
  584. unsigned long rate;
  585. struct clk *clk;
  586. int ret, f;
  587. clk = devm_get_clk_from_child(dev, to_of_node(node), NULL);
  588. if (IS_ERR(clk))
  589. return dev_err_probe(dev, PTR_ERR(clk), "failed to get tgp clk.\n");
  590. ret = clk_prepare_enable(clk);
  591. if (ret)
  592. return dev_err_probe(dev, ret, "failed to enable tgp clk.\n");
  593. ret = devm_add_action_or_reset(dev, ltc2688_clk_disable, clk);
  594. if (ret)
  595. return ret;
  596. if (chan->toggle_chan)
  597. return 0;
  598. /* calculate available dither frequencies */
  599. rate = clk_get_rate(clk);
  600. for (f = 0; f < ARRAY_SIZE(chan->dither_frequency); f++)
  601. chan->dither_frequency[f] = DIV_ROUND_CLOSEST(rate, ltc2688_period[f]);
  602. return 0;
  603. }
  604. static int ltc2688_span_lookup(const struct ltc2688_state *st, int min, int max)
  605. {
  606. u32 span;
  607. for (span = 0; span < ARRAY_SIZE(ltc2688_span_helper); span++) {
  608. if (min == ltc2688_span_helper[span][0] &&
  609. max == ltc2688_span_helper[span][1])
  610. return span;
  611. }
  612. return -EINVAL;
  613. }
  614. static int ltc2688_channel_config(struct ltc2688_state *st)
  615. {
  616. struct device *dev = &st->spi->dev;
  617. u32 reg, clk_input, val, tmp[2];
  618. int ret, span;
  619. device_for_each_child_node_scoped(dev, child) {
  620. struct ltc2688_chan *chan;
  621. ret = fwnode_property_read_u32(child, "reg", &reg);
  622. if (ret)
  623. return dev_err_probe(dev, ret,
  624. "Failed to get reg property\n");
  625. if (reg >= LTC2688_DAC_CHANNELS)
  626. return dev_err_probe(dev, -EINVAL,
  627. "reg bigger than: %d\n",
  628. LTC2688_DAC_CHANNELS);
  629. val = 0;
  630. chan = &st->channels[reg];
  631. if (fwnode_property_read_bool(child, "adi,toggle-mode")) {
  632. chan->toggle_chan = true;
  633. /* assume sw toggle ABI */
  634. st->iio_chan[reg].ext_info = ltc2688_toggle_sym_ext_info;
  635. /*
  636. * Clear IIO_CHAN_INFO_RAW bit as toggle channels expose
  637. * out_voltage_raw{0|1} files.
  638. */
  639. __clear_bit(IIO_CHAN_INFO_RAW,
  640. &st->iio_chan[reg].info_mask_separate);
  641. }
  642. ret = fwnode_property_read_u32_array(child, "adi,output-range-microvolt",
  643. tmp, ARRAY_SIZE(tmp));
  644. if (!ret) {
  645. span = ltc2688_span_lookup(st, (int)tmp[0] / 1000,
  646. tmp[1] / 1000);
  647. if (span < 0)
  648. return dev_err_probe(dev, span,
  649. "output range not valid:[%d %d]\n",
  650. tmp[0], tmp[1]);
  651. val |= FIELD_PREP(LTC2688_CH_SPAN_MSK, span);
  652. }
  653. ret = fwnode_property_read_u32(child, "adi,toggle-dither-input",
  654. &clk_input);
  655. if (!ret) {
  656. if (clk_input >= LTC2688_CH_TGP_MAX) {
  657. return dev_err_probe(dev, -EINVAL,
  658. "toggle-dither-input inv value(%d)\n",
  659. clk_input);
  660. }
  661. ret = ltc2688_tgp_clk_setup(st, chan, child, clk_input);
  662. if (ret)
  663. return ret;
  664. /*
  665. * 0 means software toggle which is the default mode.
  666. * Hence the +1.
  667. */
  668. val |= FIELD_PREP(LTC2688_CH_TD_SEL_MSK, clk_input + 1);
  669. /*
  670. * If a TGPx is given, we automatically assume a dither
  671. * capable channel (unless toggle is already enabled).
  672. * On top of this we just set here the dither bit in the
  673. * channel settings. It won't have any effect until the
  674. * global toggle/dither bit is enabled.
  675. */
  676. if (!chan->toggle_chan) {
  677. val |= FIELD_PREP(LTC2688_CH_MODE_MSK, 1);
  678. st->iio_chan[reg].ext_info = ltc2688_dither_ext_info;
  679. } else {
  680. /* wait, no sw toggle after all */
  681. st->iio_chan[reg].ext_info = ltc2688_toggle_ext_info;
  682. }
  683. }
  684. if (fwnode_property_read_bool(child, "adi,overrange")) {
  685. chan->overrange = true;
  686. val |= LTC2688_CH_OVERRANGE_MSK;
  687. }
  688. if (!val)
  689. continue;
  690. ret = regmap_write(st->regmap, LTC2688_CMD_CH_SETTING(reg),
  691. val);
  692. if (ret)
  693. return dev_err_probe(dev, ret,
  694. "failed to set chan settings\n");
  695. }
  696. return 0;
  697. }
  698. static int ltc2688_setup(struct ltc2688_state *st, bool has_external_vref)
  699. {
  700. struct device *dev = &st->spi->dev;
  701. struct gpio_desc *gpio;
  702. int ret;
  703. /*
  704. * If we have a reset pin, use that to reset the board, If not, use
  705. * the reset bit.
  706. */
  707. gpio = devm_gpiod_get_optional(dev, "clr", GPIOD_OUT_HIGH);
  708. if (IS_ERR(gpio))
  709. return dev_err_probe(dev, PTR_ERR(gpio), "Failed to get reset gpio");
  710. if (gpio) {
  711. usleep_range(1000, 1200);
  712. /* bring device out of reset */
  713. gpiod_set_value_cansleep(gpio, 0);
  714. } else {
  715. ret = regmap_set_bits(st->regmap, LTC2688_CMD_CONFIG,
  716. LTC2688_CONFIG_RST);
  717. if (ret)
  718. return ret;
  719. }
  720. usleep_range(10000, 12000);
  721. /*
  722. * Duplicate the default channel configuration as it can change during
  723. * @ltc2688_channel_config()
  724. */
  725. st->iio_chan = devm_kmemdup(dev, ltc2688_channels,
  726. sizeof(ltc2688_channels), GFP_KERNEL);
  727. if (!st->iio_chan)
  728. return -ENOMEM;
  729. ret = ltc2688_channel_config(st);
  730. if (ret)
  731. return ret;
  732. if (!has_external_vref)
  733. return 0;
  734. return regmap_set_bits(st->regmap, LTC2688_CMD_CONFIG,
  735. LTC2688_CONFIG_EXT_REF);
  736. }
  737. static bool ltc2688_reg_readable(struct device *dev, unsigned int reg)
  738. {
  739. switch (reg) {
  740. case LTC2688_CMD_CH_CODE(0) ... LTC2688_CMD_CH_GAIN(15):
  741. return true;
  742. case LTC2688_CMD_CONFIG ... LTC2688_CMD_THERMAL_STAT:
  743. return true;
  744. default:
  745. return false;
  746. }
  747. }
  748. static bool ltc2688_reg_writable(struct device *dev, unsigned int reg)
  749. {
  750. /*
  751. * There's a jump from 0x76 to 0x78 in the write codes and the thermal
  752. * status code is 0x77 (which is read only) so that we need to check
  753. * that special condition.
  754. */
  755. if (reg <= LTC2688_CMD_UPDATE_ALL && reg != LTC2688_CMD_THERMAL_STAT)
  756. return true;
  757. return false;
  758. }
  759. static const struct regmap_bus ltc2688_regmap_bus = {
  760. .read = ltc2688_spi_read,
  761. .write = ltc2688_spi_write,
  762. .read_flag_mask = LTC2688_READ_OPERATION,
  763. .reg_format_endian_default = REGMAP_ENDIAN_BIG,
  764. .val_format_endian_default = REGMAP_ENDIAN_BIG,
  765. };
  766. static const struct regmap_config ltc2688_regmap_config = {
  767. .reg_bits = 8,
  768. .val_bits = 16,
  769. .readable_reg = ltc2688_reg_readable,
  770. .writeable_reg = ltc2688_reg_writable,
  771. /* ignoring the no op command */
  772. .max_register = LTC2688_CMD_UPDATE_ALL,
  773. };
  774. static const struct iio_info ltc2688_info = {
  775. .write_raw = ltc2688_write_raw,
  776. .read_raw = ltc2688_read_raw,
  777. .read_avail = ltc2688_read_avail,
  778. .debugfs_reg_access = ltc2688_reg_access,
  779. };
  780. static int ltc2688_probe(struct spi_device *spi)
  781. {
  782. static const char * const regulators[] = { "vcc", "iovcc" };
  783. struct ltc2688_state *st;
  784. struct iio_dev *indio_dev;
  785. struct device *dev = &spi->dev;
  786. bool has_external_vref;
  787. int ret;
  788. indio_dev = devm_iio_device_alloc(dev, sizeof(*st));
  789. if (!indio_dev)
  790. return -ENOMEM;
  791. st = iio_priv(indio_dev);
  792. st->spi = spi;
  793. /* Just write this once. No need to do it in every regmap read. */
  794. st->tx_data[3] = LTC2688_CMD_NOOP;
  795. ret = devm_mutex_init(dev, &st->lock);
  796. if (ret)
  797. return ret;
  798. st->regmap = devm_regmap_init(dev, &ltc2688_regmap_bus, st,
  799. &ltc2688_regmap_config);
  800. if (IS_ERR(st->regmap))
  801. return dev_err_probe(dev, PTR_ERR(st->regmap),
  802. "Failed to init regmap");
  803. ret = devm_regulator_bulk_get_enable(dev, ARRAY_SIZE(regulators),
  804. regulators);
  805. if (ret)
  806. return dev_err_probe(dev, ret, "Failed to enable regulators\n");
  807. ret = devm_regulator_get_enable_read_voltage(dev, "vref");
  808. if (ret < 0 && ret != -ENODEV)
  809. return dev_err_probe(dev, ret,
  810. "Failed to get vref regulator voltage\n");
  811. has_external_vref = ret != -ENODEV;
  812. st->vref = has_external_vref ? ret / 1000 : 0;
  813. ret = ltc2688_setup(st, has_external_vref);
  814. if (ret)
  815. return ret;
  816. indio_dev->name = "ltc2688";
  817. indio_dev->info = &ltc2688_info;
  818. indio_dev->modes = INDIO_DIRECT_MODE;
  819. indio_dev->channels = st->iio_chan;
  820. indio_dev->num_channels = ARRAY_SIZE(ltc2688_channels);
  821. return devm_iio_device_register(dev, indio_dev);
  822. }
  823. static const struct of_device_id ltc2688_of_id[] = {
  824. { .compatible = "adi,ltc2688" },
  825. { }
  826. };
  827. MODULE_DEVICE_TABLE(of, ltc2688_of_id);
  828. static const struct spi_device_id ltc2688_id[] = {
  829. { "ltc2688" },
  830. { }
  831. };
  832. MODULE_DEVICE_TABLE(spi, ltc2688_id);
  833. static struct spi_driver ltc2688_driver = {
  834. .driver = {
  835. .name = "ltc2688",
  836. .of_match_table = ltc2688_of_id,
  837. },
  838. .probe = ltc2688_probe,
  839. .id_table = ltc2688_id,
  840. };
  841. module_spi_driver(ltc2688_driver);
  842. MODULE_AUTHOR("Nuno Sá <nuno.sa@analog.com>");
  843. MODULE_DESCRIPTION("Analog Devices LTC2688 DAC");
  844. MODULE_LICENSE("GPL");