ad5755.c 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * AD5755, AD5755-1, AD5757, AD5735, AD5737 Digital to analog converters driver
  4. *
  5. * Copyright 2012 Analog Devices Inc.
  6. */
  7. #include <linux/device.h>
  8. #include <linux/err.h>
  9. #include <linux/module.h>
  10. #include <linux/kernel.h>
  11. #include <linux/spi/spi.h>
  12. #include <linux/slab.h>
  13. #include <linux/sysfs.h>
  14. #include <linux/delay.h>
  15. #include <linux/property.h>
  16. #include <linux/iio/iio.h>
  17. #include <linux/iio/sysfs.h>
  18. #define AD5755_NUM_CHANNELS 4
  19. #define AD5755_ADDR(x) ((x) << 16)
  20. #define AD5755_WRITE_REG_DATA(chan) (chan)
  21. #define AD5755_WRITE_REG_GAIN(chan) (0x08 | (chan))
  22. #define AD5755_WRITE_REG_OFFSET(chan) (0x10 | (chan))
  23. #define AD5755_WRITE_REG_CTRL(chan) (0x1c | (chan))
  24. #define AD5755_READ_REG_DATA(chan) (chan)
  25. #define AD5755_READ_REG_CTRL(chan) (0x4 | (chan))
  26. #define AD5755_READ_REG_GAIN(chan) (0x8 | (chan))
  27. #define AD5755_READ_REG_OFFSET(chan) (0xc | (chan))
  28. #define AD5755_READ_REG_CLEAR(chan) (0x10 | (chan))
  29. #define AD5755_READ_REG_SLEW(chan) (0x14 | (chan))
  30. #define AD5755_READ_REG_STATUS 0x18
  31. #define AD5755_READ_REG_MAIN 0x19
  32. #define AD5755_READ_REG_DC_DC 0x1a
  33. #define AD5755_CTRL_REG_SLEW 0x0
  34. #define AD5755_CTRL_REG_MAIN 0x1
  35. #define AD5755_CTRL_REG_DAC 0x2
  36. #define AD5755_CTRL_REG_DC_DC 0x3
  37. #define AD5755_CTRL_REG_SW 0x4
  38. #define AD5755_READ_FLAG 0x800000
  39. #define AD5755_NOOP 0x1CE000
  40. #define AD5755_DAC_INT_EN BIT(8)
  41. #define AD5755_DAC_CLR_EN BIT(7)
  42. #define AD5755_DAC_OUT_EN BIT(6)
  43. #define AD5755_DAC_INT_CURRENT_SENSE_RESISTOR BIT(5)
  44. #define AD5755_DAC_DC_DC_EN BIT(4)
  45. #define AD5755_DAC_VOLTAGE_OVERRANGE_EN BIT(3)
  46. #define AD5755_DC_DC_MAXV 0
  47. #define AD5755_DC_DC_FREQ_SHIFT 2
  48. #define AD5755_DC_DC_PHASE_SHIFT 4
  49. #define AD5755_EXT_DC_DC_COMP_RES BIT(6)
  50. #define AD5755_SLEW_STEP_SIZE_SHIFT 0
  51. #define AD5755_SLEW_RATE_SHIFT 3
  52. #define AD5755_SLEW_ENABLE BIT(12)
  53. enum ad5755_mode {
  54. AD5755_MODE_VOLTAGE_0V_5V = 0,
  55. AD5755_MODE_VOLTAGE_0V_10V = 1,
  56. AD5755_MODE_VOLTAGE_PLUSMINUS_5V = 2,
  57. AD5755_MODE_VOLTAGE_PLUSMINUS_10V = 3,
  58. AD5755_MODE_CURRENT_4mA_20mA = 4,
  59. AD5755_MODE_CURRENT_0mA_20mA = 5,
  60. AD5755_MODE_CURRENT_0mA_24mA = 6,
  61. };
  62. enum ad5755_dc_dc_phase {
  63. AD5755_DC_DC_PHASE_ALL_SAME_EDGE = 0,
  64. AD5755_DC_DC_PHASE_A_B_SAME_EDGE_C_D_OPP_EDGE = 1,
  65. AD5755_DC_DC_PHASE_A_C_SAME_EDGE_B_D_OPP_EDGE = 2,
  66. AD5755_DC_DC_PHASE_90_DEGREE = 3,
  67. };
  68. enum ad5755_dc_dc_freq {
  69. AD5755_DC_DC_FREQ_250kHZ = 0,
  70. AD5755_DC_DC_FREQ_410kHZ = 1,
  71. AD5755_DC_DC_FREQ_650kHZ = 2,
  72. };
  73. enum ad5755_dc_dc_maxv {
  74. AD5755_DC_DC_MAXV_23V = 0,
  75. AD5755_DC_DC_MAXV_24V5 = 1,
  76. AD5755_DC_DC_MAXV_27V = 2,
  77. AD5755_DC_DC_MAXV_29V5 = 3,
  78. };
  79. enum ad5755_slew_rate {
  80. AD5755_SLEW_RATE_64k = 0,
  81. AD5755_SLEW_RATE_32k = 1,
  82. AD5755_SLEW_RATE_16k = 2,
  83. AD5755_SLEW_RATE_8k = 3,
  84. AD5755_SLEW_RATE_4k = 4,
  85. AD5755_SLEW_RATE_2k = 5,
  86. AD5755_SLEW_RATE_1k = 6,
  87. AD5755_SLEW_RATE_500 = 7,
  88. AD5755_SLEW_RATE_250 = 8,
  89. AD5755_SLEW_RATE_125 = 9,
  90. AD5755_SLEW_RATE_64 = 10,
  91. AD5755_SLEW_RATE_32 = 11,
  92. AD5755_SLEW_RATE_16 = 12,
  93. AD5755_SLEW_RATE_8 = 13,
  94. AD5755_SLEW_RATE_4 = 14,
  95. AD5755_SLEW_RATE_0_5 = 15,
  96. };
  97. enum ad5755_slew_step_size {
  98. AD5755_SLEW_STEP_SIZE_1 = 0,
  99. AD5755_SLEW_STEP_SIZE_2 = 1,
  100. AD5755_SLEW_STEP_SIZE_4 = 2,
  101. AD5755_SLEW_STEP_SIZE_8 = 3,
  102. AD5755_SLEW_STEP_SIZE_16 = 4,
  103. AD5755_SLEW_STEP_SIZE_32 = 5,
  104. AD5755_SLEW_STEP_SIZE_64 = 6,
  105. AD5755_SLEW_STEP_SIZE_128 = 7,
  106. AD5755_SLEW_STEP_SIZE_256 = 8,
  107. };
  108. /**
  109. * struct ad5755_platform_data - AD5755 DAC driver platform data
  110. * @ext_dc_dc_compenstation_resistor: Whether an external DC-DC converter
  111. * compensation register is used.
  112. * @dc_dc_phase: DC-DC converter phase.
  113. * @dc_dc_freq: DC-DC converter frequency.
  114. * @dc_dc_maxv: DC-DC maximum allowed boost voltage.
  115. * @dac: Per DAC instance parameters.
  116. * @dac.mode: The mode to be used for the DAC output.
  117. * @dac.ext_current_sense_resistor: Whether an external current sense resistor
  118. * is used.
  119. * @dac.enable_voltage_overrange: Whether to enable 20% voltage output overrange.
  120. * @dac.slew.enable: Whether to enable digital slew.
  121. * @dac.slew.rate: Slew rate of the digital slew.
  122. * @dac.slew.step_size: Slew step size of the digital slew.
  123. **/
  124. struct ad5755_platform_data {
  125. bool ext_dc_dc_compenstation_resistor;
  126. enum ad5755_dc_dc_phase dc_dc_phase;
  127. enum ad5755_dc_dc_freq dc_dc_freq;
  128. enum ad5755_dc_dc_maxv dc_dc_maxv;
  129. struct {
  130. enum ad5755_mode mode;
  131. bool ext_current_sense_resistor;
  132. bool enable_voltage_overrange;
  133. struct {
  134. bool enable;
  135. enum ad5755_slew_rate rate;
  136. enum ad5755_slew_step_size step_size;
  137. } slew;
  138. } dac[4];
  139. };
  140. /**
  141. * struct ad5755_chip_info - chip specific information
  142. * @channel_template: channel specification
  143. * @calib_shift: shift for the calibration data registers
  144. * @has_voltage_out: whether the chip has voltage outputs
  145. */
  146. struct ad5755_chip_info {
  147. const struct iio_chan_spec channel_template;
  148. unsigned int calib_shift;
  149. bool has_voltage_out;
  150. };
  151. /**
  152. * struct ad5755_state - driver instance specific data
  153. * @spi: spi device the driver is attached to
  154. * @chip_info: chip model specific constants, available modes etc
  155. * @pwr_down: bitmask which contains hether a channel is powered down or not
  156. * @ctrl: software shadow of the channel ctrl registers
  157. * @channels: iio channel spec for the device
  158. * @lock: lock to protect the data buffer during SPI ops
  159. * @data: spi transfer buffers
  160. */
  161. struct ad5755_state {
  162. struct spi_device *spi;
  163. const struct ad5755_chip_info *chip_info;
  164. unsigned int pwr_down;
  165. unsigned int ctrl[AD5755_NUM_CHANNELS];
  166. struct iio_chan_spec channels[AD5755_NUM_CHANNELS];
  167. struct mutex lock;
  168. /*
  169. * DMA (thus cache coherency maintenance) may require the
  170. * transfer buffers to live in their own cache lines.
  171. */
  172. union {
  173. __be32 d32;
  174. u8 d8[4];
  175. } data[2] __aligned(IIO_DMA_MINALIGN);
  176. };
  177. enum ad5755_type {
  178. ID_AD5755,
  179. ID_AD5757,
  180. ID_AD5735,
  181. ID_AD5737,
  182. };
  183. static const int ad5755_dcdc_freq_table[][2] = {
  184. { 250000, AD5755_DC_DC_FREQ_250kHZ },
  185. { 410000, AD5755_DC_DC_FREQ_410kHZ },
  186. { 650000, AD5755_DC_DC_FREQ_650kHZ }
  187. };
  188. static const int ad5755_dcdc_maxv_table[][2] = {
  189. { 23000000, AD5755_DC_DC_MAXV_23V },
  190. { 24500000, AD5755_DC_DC_MAXV_24V5 },
  191. { 27000000, AD5755_DC_DC_MAXV_27V },
  192. { 29500000, AD5755_DC_DC_MAXV_29V5 },
  193. };
  194. static const int ad5755_slew_rate_table[][2] = {
  195. { 64000, AD5755_SLEW_RATE_64k },
  196. { 32000, AD5755_SLEW_RATE_32k },
  197. { 16000, AD5755_SLEW_RATE_16k },
  198. { 8000, AD5755_SLEW_RATE_8k },
  199. { 4000, AD5755_SLEW_RATE_4k },
  200. { 2000, AD5755_SLEW_RATE_2k },
  201. { 1000, AD5755_SLEW_RATE_1k },
  202. { 500, AD5755_SLEW_RATE_500 },
  203. { 250, AD5755_SLEW_RATE_250 },
  204. { 125, AD5755_SLEW_RATE_125 },
  205. { 64, AD5755_SLEW_RATE_64 },
  206. { 32, AD5755_SLEW_RATE_32 },
  207. { 16, AD5755_SLEW_RATE_16 },
  208. { 8, AD5755_SLEW_RATE_8 },
  209. { 4, AD5755_SLEW_RATE_4 },
  210. { 0, AD5755_SLEW_RATE_0_5 },
  211. };
  212. static const int ad5755_slew_step_table[][2] = {
  213. { 256, AD5755_SLEW_STEP_SIZE_256 },
  214. { 128, AD5755_SLEW_STEP_SIZE_128 },
  215. { 64, AD5755_SLEW_STEP_SIZE_64 },
  216. { 32, AD5755_SLEW_STEP_SIZE_32 },
  217. { 16, AD5755_SLEW_STEP_SIZE_16 },
  218. { 4, AD5755_SLEW_STEP_SIZE_4 },
  219. { 2, AD5755_SLEW_STEP_SIZE_2 },
  220. { 1, AD5755_SLEW_STEP_SIZE_1 },
  221. };
  222. static int ad5755_write_unlocked(struct iio_dev *indio_dev,
  223. unsigned int reg, unsigned int val)
  224. {
  225. struct ad5755_state *st = iio_priv(indio_dev);
  226. st->data[0].d32 = cpu_to_be32((reg << 16) | val);
  227. return spi_write(st->spi, &st->data[0].d8[1], 3);
  228. }
  229. static int ad5755_write_ctrl_unlocked(struct iio_dev *indio_dev,
  230. unsigned int channel, unsigned int reg, unsigned int val)
  231. {
  232. return ad5755_write_unlocked(indio_dev,
  233. AD5755_WRITE_REG_CTRL(channel), (reg << 13) | val);
  234. }
  235. static int ad5755_write(struct iio_dev *indio_dev, unsigned int reg,
  236. unsigned int val)
  237. {
  238. struct ad5755_state *st = iio_priv(indio_dev);
  239. int ret;
  240. mutex_lock(&st->lock);
  241. ret = ad5755_write_unlocked(indio_dev, reg, val);
  242. mutex_unlock(&st->lock);
  243. return ret;
  244. }
  245. static int ad5755_write_ctrl(struct iio_dev *indio_dev, unsigned int channel,
  246. unsigned int reg, unsigned int val)
  247. {
  248. struct ad5755_state *st = iio_priv(indio_dev);
  249. int ret;
  250. mutex_lock(&st->lock);
  251. ret = ad5755_write_ctrl_unlocked(indio_dev, channel, reg, val);
  252. mutex_unlock(&st->lock);
  253. return ret;
  254. }
  255. static int ad5755_read(struct iio_dev *indio_dev, unsigned int addr)
  256. {
  257. struct ad5755_state *st = iio_priv(indio_dev);
  258. int ret;
  259. struct spi_transfer t[] = {
  260. {
  261. .tx_buf = &st->data[0].d8[1],
  262. .len = 3,
  263. .cs_change = 1,
  264. }, {
  265. .tx_buf = &st->data[1].d8[1],
  266. .rx_buf = &st->data[1].d8[1],
  267. .len = 3,
  268. },
  269. };
  270. mutex_lock(&st->lock);
  271. st->data[0].d32 = cpu_to_be32(AD5755_READ_FLAG | (addr << 16));
  272. st->data[1].d32 = cpu_to_be32(AD5755_NOOP);
  273. ret = spi_sync_transfer(st->spi, t, ARRAY_SIZE(t));
  274. if (ret >= 0)
  275. ret = be32_to_cpu(st->data[1].d32) & 0xffff;
  276. mutex_unlock(&st->lock);
  277. return ret;
  278. }
  279. static int ad5755_update_dac_ctrl(struct iio_dev *indio_dev,
  280. unsigned int channel, unsigned int set, unsigned int clr)
  281. {
  282. struct ad5755_state *st = iio_priv(indio_dev);
  283. int ret;
  284. st->ctrl[channel] |= set;
  285. st->ctrl[channel] &= ~clr;
  286. ret = ad5755_write_ctrl_unlocked(indio_dev, channel,
  287. AD5755_CTRL_REG_DAC, st->ctrl[channel]);
  288. return ret;
  289. }
  290. static int ad5755_set_channel_pwr_down(struct iio_dev *indio_dev,
  291. unsigned int channel, bool pwr_down)
  292. {
  293. struct ad5755_state *st = iio_priv(indio_dev);
  294. unsigned int mask = BIT(channel);
  295. mutex_lock(&st->lock);
  296. if ((bool)(st->pwr_down & mask) == pwr_down)
  297. goto out_unlock;
  298. if (!pwr_down) {
  299. st->pwr_down &= ~mask;
  300. ad5755_update_dac_ctrl(indio_dev, channel,
  301. AD5755_DAC_INT_EN | AD5755_DAC_DC_DC_EN, 0);
  302. udelay(200);
  303. ad5755_update_dac_ctrl(indio_dev, channel,
  304. AD5755_DAC_OUT_EN, 0);
  305. } else {
  306. st->pwr_down |= mask;
  307. ad5755_update_dac_ctrl(indio_dev, channel,
  308. 0, AD5755_DAC_INT_EN | AD5755_DAC_OUT_EN |
  309. AD5755_DAC_DC_DC_EN);
  310. }
  311. out_unlock:
  312. mutex_unlock(&st->lock);
  313. return 0;
  314. }
  315. static const int ad5755_min_max_table[][2] = {
  316. [AD5755_MODE_VOLTAGE_0V_5V] = { 0, 5000 },
  317. [AD5755_MODE_VOLTAGE_0V_10V] = { 0, 10000 },
  318. [AD5755_MODE_VOLTAGE_PLUSMINUS_5V] = { -5000, 5000 },
  319. [AD5755_MODE_VOLTAGE_PLUSMINUS_10V] = { -10000, 10000 },
  320. [AD5755_MODE_CURRENT_4mA_20mA] = { 4, 20 },
  321. [AD5755_MODE_CURRENT_0mA_20mA] = { 0, 20 },
  322. [AD5755_MODE_CURRENT_0mA_24mA] = { 0, 24 },
  323. };
  324. static void ad5755_get_min_max(struct ad5755_state *st,
  325. struct iio_chan_spec const *chan, int *min, int *max)
  326. {
  327. enum ad5755_mode mode = st->ctrl[chan->channel] & 7;
  328. *min = ad5755_min_max_table[mode][0];
  329. *max = ad5755_min_max_table[mode][1];
  330. }
  331. static inline int ad5755_get_offset(struct ad5755_state *st,
  332. struct iio_chan_spec const *chan)
  333. {
  334. int min, max;
  335. ad5755_get_min_max(st, chan, &min, &max);
  336. return (min * (1 << chan->scan_type.realbits)) / (max - min);
  337. }
  338. static int ad5755_chan_reg_info(struct ad5755_state *st,
  339. struct iio_chan_spec const *chan, long info, bool write,
  340. unsigned int *reg, unsigned int *shift, unsigned int *offset)
  341. {
  342. switch (info) {
  343. case IIO_CHAN_INFO_RAW:
  344. if (write)
  345. *reg = AD5755_WRITE_REG_DATA(chan->address);
  346. else
  347. *reg = AD5755_READ_REG_DATA(chan->address);
  348. *shift = chan->scan_type.shift;
  349. *offset = 0;
  350. break;
  351. case IIO_CHAN_INFO_CALIBBIAS:
  352. if (write)
  353. *reg = AD5755_WRITE_REG_OFFSET(chan->address);
  354. else
  355. *reg = AD5755_READ_REG_OFFSET(chan->address);
  356. *shift = st->chip_info->calib_shift;
  357. *offset = 32768;
  358. break;
  359. case IIO_CHAN_INFO_CALIBSCALE:
  360. if (write)
  361. *reg = AD5755_WRITE_REG_GAIN(chan->address);
  362. else
  363. *reg = AD5755_READ_REG_GAIN(chan->address);
  364. *shift = st->chip_info->calib_shift;
  365. *offset = 0;
  366. break;
  367. default:
  368. return -EINVAL;
  369. }
  370. return 0;
  371. }
  372. static int ad5755_read_raw(struct iio_dev *indio_dev,
  373. const struct iio_chan_spec *chan, int *val, int *val2, long info)
  374. {
  375. struct ad5755_state *st = iio_priv(indio_dev);
  376. unsigned int reg, shift, offset;
  377. int min, max;
  378. int ret;
  379. switch (info) {
  380. case IIO_CHAN_INFO_SCALE:
  381. ad5755_get_min_max(st, chan, &min, &max);
  382. *val = max - min;
  383. *val2 = chan->scan_type.realbits;
  384. return IIO_VAL_FRACTIONAL_LOG2;
  385. case IIO_CHAN_INFO_OFFSET:
  386. *val = ad5755_get_offset(st, chan);
  387. return IIO_VAL_INT;
  388. default:
  389. ret = ad5755_chan_reg_info(st, chan, info, false,
  390. &reg, &shift, &offset);
  391. if (ret)
  392. return ret;
  393. ret = ad5755_read(indio_dev, reg);
  394. if (ret < 0)
  395. return ret;
  396. *val = (ret - offset) >> shift;
  397. return IIO_VAL_INT;
  398. }
  399. return -EINVAL;
  400. }
  401. static int ad5755_write_raw(struct iio_dev *indio_dev,
  402. const struct iio_chan_spec *chan, int val, int val2, long info)
  403. {
  404. struct ad5755_state *st = iio_priv(indio_dev);
  405. unsigned int shift, reg, offset;
  406. int ret;
  407. ret = ad5755_chan_reg_info(st, chan, info, true,
  408. &reg, &shift, &offset);
  409. if (ret)
  410. return ret;
  411. val <<= shift;
  412. val += offset;
  413. if (val < 0 || val > 0xffff)
  414. return -EINVAL;
  415. return ad5755_write(indio_dev, reg, val);
  416. }
  417. static ssize_t ad5755_read_powerdown(struct iio_dev *indio_dev, uintptr_t priv,
  418. const struct iio_chan_spec *chan, char *buf)
  419. {
  420. struct ad5755_state *st = iio_priv(indio_dev);
  421. return sysfs_emit(buf, "%d\n",
  422. (bool)(st->pwr_down & (1 << chan->channel)));
  423. }
  424. static ssize_t ad5755_write_powerdown(struct iio_dev *indio_dev, uintptr_t priv,
  425. struct iio_chan_spec const *chan, const char *buf, size_t len)
  426. {
  427. bool pwr_down;
  428. int ret;
  429. ret = kstrtobool(buf, &pwr_down);
  430. if (ret)
  431. return ret;
  432. ret = ad5755_set_channel_pwr_down(indio_dev, chan->channel, pwr_down);
  433. return ret ? ret : len;
  434. }
  435. static const struct iio_info ad5755_info = {
  436. .read_raw = ad5755_read_raw,
  437. .write_raw = ad5755_write_raw,
  438. };
  439. static const struct iio_chan_spec_ext_info ad5755_ext_info[] = {
  440. {
  441. .name = "powerdown",
  442. .read = ad5755_read_powerdown,
  443. .write = ad5755_write_powerdown,
  444. .shared = IIO_SEPARATE,
  445. },
  446. { },
  447. };
  448. #define AD5755_CHANNEL(_bits) { \
  449. .indexed = 1, \
  450. .output = 1, \
  451. .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \
  452. BIT(IIO_CHAN_INFO_SCALE) | \
  453. BIT(IIO_CHAN_INFO_OFFSET) | \
  454. BIT(IIO_CHAN_INFO_CALIBSCALE) | \
  455. BIT(IIO_CHAN_INFO_CALIBBIAS), \
  456. .scan_type = { \
  457. .sign = 'u', \
  458. .realbits = (_bits), \
  459. .storagebits = 16, \
  460. .shift = 16 - (_bits), \
  461. }, \
  462. .ext_info = ad5755_ext_info, \
  463. }
  464. static const struct ad5755_chip_info ad5755_chip_info_tbl[] = {
  465. [ID_AD5735] = {
  466. .channel_template = AD5755_CHANNEL(14),
  467. .has_voltage_out = true,
  468. .calib_shift = 4,
  469. },
  470. [ID_AD5737] = {
  471. .channel_template = AD5755_CHANNEL(14),
  472. .has_voltage_out = false,
  473. .calib_shift = 4,
  474. },
  475. [ID_AD5755] = {
  476. .channel_template = AD5755_CHANNEL(16),
  477. .has_voltage_out = true,
  478. .calib_shift = 0,
  479. },
  480. [ID_AD5757] = {
  481. .channel_template = AD5755_CHANNEL(16),
  482. .has_voltage_out = false,
  483. .calib_shift = 0,
  484. },
  485. };
  486. static bool ad5755_is_valid_mode(struct ad5755_state *st, enum ad5755_mode mode)
  487. {
  488. switch (mode) {
  489. case AD5755_MODE_VOLTAGE_0V_5V:
  490. case AD5755_MODE_VOLTAGE_0V_10V:
  491. case AD5755_MODE_VOLTAGE_PLUSMINUS_5V:
  492. case AD5755_MODE_VOLTAGE_PLUSMINUS_10V:
  493. return st->chip_info->has_voltage_out;
  494. case AD5755_MODE_CURRENT_4mA_20mA:
  495. case AD5755_MODE_CURRENT_0mA_20mA:
  496. case AD5755_MODE_CURRENT_0mA_24mA:
  497. return true;
  498. default:
  499. return false;
  500. }
  501. }
  502. static int ad5755_setup_pdata(struct iio_dev *indio_dev,
  503. const struct ad5755_platform_data *pdata)
  504. {
  505. struct ad5755_state *st = iio_priv(indio_dev);
  506. unsigned int val;
  507. unsigned int i;
  508. int ret;
  509. if (pdata->dc_dc_phase > AD5755_DC_DC_PHASE_90_DEGREE ||
  510. pdata->dc_dc_freq > AD5755_DC_DC_FREQ_650kHZ ||
  511. pdata->dc_dc_maxv > AD5755_DC_DC_MAXV_29V5)
  512. return -EINVAL;
  513. val = pdata->dc_dc_maxv << AD5755_DC_DC_MAXV;
  514. val |= pdata->dc_dc_freq << AD5755_DC_DC_FREQ_SHIFT;
  515. val |= pdata->dc_dc_phase << AD5755_DC_DC_PHASE_SHIFT;
  516. if (pdata->ext_dc_dc_compenstation_resistor)
  517. val |= AD5755_EXT_DC_DC_COMP_RES;
  518. ret = ad5755_write_ctrl(indio_dev, 0, AD5755_CTRL_REG_DC_DC, val);
  519. if (ret < 0)
  520. return ret;
  521. for (i = 0; i < ARRAY_SIZE(pdata->dac); ++i) {
  522. val = pdata->dac[i].slew.step_size <<
  523. AD5755_SLEW_STEP_SIZE_SHIFT;
  524. val |= pdata->dac[i].slew.rate <<
  525. AD5755_SLEW_RATE_SHIFT;
  526. if (pdata->dac[i].slew.enable)
  527. val |= AD5755_SLEW_ENABLE;
  528. ret = ad5755_write_ctrl(indio_dev, i,
  529. AD5755_CTRL_REG_SLEW, val);
  530. if (ret < 0)
  531. return ret;
  532. }
  533. for (i = 0; i < ARRAY_SIZE(pdata->dac); ++i) {
  534. if (!ad5755_is_valid_mode(st, pdata->dac[i].mode))
  535. return -EINVAL;
  536. val = 0;
  537. if (!pdata->dac[i].ext_current_sense_resistor)
  538. val |= AD5755_DAC_INT_CURRENT_SENSE_RESISTOR;
  539. if (pdata->dac[i].enable_voltage_overrange)
  540. val |= AD5755_DAC_VOLTAGE_OVERRANGE_EN;
  541. val |= pdata->dac[i].mode;
  542. ret = ad5755_update_dac_ctrl(indio_dev, i, val, 0);
  543. if (ret < 0)
  544. return ret;
  545. }
  546. return 0;
  547. }
  548. static bool ad5755_is_voltage_mode(enum ad5755_mode mode)
  549. {
  550. switch (mode) {
  551. case AD5755_MODE_VOLTAGE_0V_5V:
  552. case AD5755_MODE_VOLTAGE_0V_10V:
  553. case AD5755_MODE_VOLTAGE_PLUSMINUS_5V:
  554. case AD5755_MODE_VOLTAGE_PLUSMINUS_10V:
  555. return true;
  556. default:
  557. return false;
  558. }
  559. }
  560. static int ad5755_init_channels(struct iio_dev *indio_dev,
  561. const struct ad5755_platform_data *pdata)
  562. {
  563. struct ad5755_state *st = iio_priv(indio_dev);
  564. struct iio_chan_spec *channels = st->channels;
  565. unsigned int i;
  566. for (i = 0; i < AD5755_NUM_CHANNELS; ++i) {
  567. channels[i] = st->chip_info->channel_template;
  568. channels[i].channel = i;
  569. channels[i].address = i;
  570. if (pdata && ad5755_is_voltage_mode(pdata->dac[i].mode))
  571. channels[i].type = IIO_VOLTAGE;
  572. else
  573. channels[i].type = IIO_CURRENT;
  574. }
  575. indio_dev->channels = channels;
  576. return 0;
  577. }
  578. #define AD5755_DEFAULT_DAC_PDATA { \
  579. .mode = AD5755_MODE_CURRENT_4mA_20mA, \
  580. .ext_current_sense_resistor = true, \
  581. .enable_voltage_overrange = false, \
  582. .slew = { \
  583. .enable = false, \
  584. .rate = AD5755_SLEW_RATE_64k, \
  585. .step_size = AD5755_SLEW_STEP_SIZE_1, \
  586. }, \
  587. }
  588. static const struct ad5755_platform_data ad5755_default_pdata = {
  589. .ext_dc_dc_compenstation_resistor = false,
  590. .dc_dc_phase = AD5755_DC_DC_PHASE_ALL_SAME_EDGE,
  591. .dc_dc_freq = AD5755_DC_DC_FREQ_410kHZ,
  592. .dc_dc_maxv = AD5755_DC_DC_MAXV_23V,
  593. .dac = {
  594. [0] = AD5755_DEFAULT_DAC_PDATA,
  595. [1] = AD5755_DEFAULT_DAC_PDATA,
  596. [2] = AD5755_DEFAULT_DAC_PDATA,
  597. [3] = AD5755_DEFAULT_DAC_PDATA,
  598. },
  599. };
  600. static struct ad5755_platform_data *ad5755_parse_fw(struct device *dev)
  601. {
  602. struct fwnode_handle *pp;
  603. struct ad5755_platform_data *pdata;
  604. unsigned int tmp;
  605. unsigned int tmparray[3];
  606. int devnr, i;
  607. if (!dev_fwnode(dev))
  608. return NULL;
  609. pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL);
  610. if (!pdata)
  611. return NULL;
  612. pdata->ext_dc_dc_compenstation_resistor =
  613. device_property_read_bool(dev, "adi,ext-dc-dc-compenstation-resistor");
  614. pdata->dc_dc_phase = AD5755_DC_DC_PHASE_ALL_SAME_EDGE;
  615. device_property_read_u32(dev, "adi,dc-dc-phase", &pdata->dc_dc_phase);
  616. pdata->dc_dc_freq = AD5755_DC_DC_FREQ_410kHZ;
  617. if (!device_property_read_u32(dev, "adi,dc-dc-freq-hz", &tmp)) {
  618. for (i = 0; i < ARRAY_SIZE(ad5755_dcdc_freq_table); i++) {
  619. if (tmp == ad5755_dcdc_freq_table[i][0]) {
  620. pdata->dc_dc_freq = ad5755_dcdc_freq_table[i][1];
  621. break;
  622. }
  623. }
  624. if (i == ARRAY_SIZE(ad5755_dcdc_freq_table))
  625. dev_err(dev,
  626. "adi,dc-dc-freq out of range selecting 410kHz\n");
  627. }
  628. pdata->dc_dc_maxv = AD5755_DC_DC_MAXV_23V;
  629. if (!device_property_read_u32(dev, "adi,dc-dc-max-microvolt", &tmp)) {
  630. for (i = 0; i < ARRAY_SIZE(ad5755_dcdc_maxv_table); i++) {
  631. if (tmp == ad5755_dcdc_maxv_table[i][0]) {
  632. pdata->dc_dc_maxv = ad5755_dcdc_maxv_table[i][1];
  633. break;
  634. }
  635. }
  636. if (i == ARRAY_SIZE(ad5755_dcdc_maxv_table))
  637. dev_err(dev,
  638. "adi,dc-dc-maxv out of range selecting 23V\n");
  639. }
  640. devnr = 0;
  641. device_for_each_child_node(dev, pp) {
  642. if (devnr >= AD5755_NUM_CHANNELS) {
  643. dev_err(dev,
  644. "There are too many channels defined in DT\n");
  645. goto error_out;
  646. }
  647. pdata->dac[devnr].mode = AD5755_MODE_CURRENT_4mA_20mA;
  648. fwnode_property_read_u32(pp, "adi,mode", &pdata->dac[devnr].mode);
  649. pdata->dac[devnr].ext_current_sense_resistor =
  650. fwnode_property_read_bool(pp, "adi,ext-current-sense-resistor");
  651. pdata->dac[devnr].enable_voltage_overrange =
  652. fwnode_property_read_bool(pp, "adi,enable-voltage-overrange");
  653. if (!fwnode_property_read_u32_array(pp, "adi,slew", tmparray, 3)) {
  654. pdata->dac[devnr].slew.enable = tmparray[0];
  655. pdata->dac[devnr].slew.rate = AD5755_SLEW_RATE_64k;
  656. for (i = 0; i < ARRAY_SIZE(ad5755_slew_rate_table); i++) {
  657. if (tmparray[1] == ad5755_slew_rate_table[i][0]) {
  658. pdata->dac[devnr].slew.rate =
  659. ad5755_slew_rate_table[i][1];
  660. break;
  661. }
  662. }
  663. if (i == ARRAY_SIZE(ad5755_slew_rate_table))
  664. dev_err(dev,
  665. "channel %d slew rate out of range selecting 64kHz\n",
  666. devnr);
  667. pdata->dac[devnr].slew.step_size = AD5755_SLEW_STEP_SIZE_1;
  668. for (i = 0; i < ARRAY_SIZE(ad5755_slew_step_table); i++) {
  669. if (tmparray[2] == ad5755_slew_step_table[i][0]) {
  670. pdata->dac[devnr].slew.step_size =
  671. ad5755_slew_step_table[i][1];
  672. break;
  673. }
  674. }
  675. if (i == ARRAY_SIZE(ad5755_slew_step_table))
  676. dev_err(dev,
  677. "channel %d slew step size out of range selecting 1 LSB\n",
  678. devnr);
  679. } else {
  680. pdata->dac[devnr].slew.enable = false;
  681. pdata->dac[devnr].slew.rate = AD5755_SLEW_RATE_64k;
  682. pdata->dac[devnr].slew.step_size =
  683. AD5755_SLEW_STEP_SIZE_1;
  684. }
  685. devnr++;
  686. }
  687. return pdata;
  688. error_out:
  689. fwnode_handle_put(pp);
  690. devm_kfree(dev, pdata);
  691. return NULL;
  692. }
  693. static int ad5755_probe(struct spi_device *spi)
  694. {
  695. enum ad5755_type type = spi_get_device_id(spi)->driver_data;
  696. const struct ad5755_platform_data *pdata;
  697. struct iio_dev *indio_dev;
  698. struct ad5755_state *st;
  699. int ret;
  700. indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*st));
  701. if (indio_dev == NULL) {
  702. dev_err(&spi->dev, "Failed to allocate iio device\n");
  703. return -ENOMEM;
  704. }
  705. st = iio_priv(indio_dev);
  706. spi_set_drvdata(spi, indio_dev);
  707. st->chip_info = &ad5755_chip_info_tbl[type];
  708. st->spi = spi;
  709. st->pwr_down = 0xf;
  710. indio_dev->name = spi_get_device_id(spi)->name;
  711. indio_dev->info = &ad5755_info;
  712. indio_dev->modes = INDIO_DIRECT_MODE;
  713. indio_dev->num_channels = AD5755_NUM_CHANNELS;
  714. mutex_init(&st->lock);
  715. pdata = ad5755_parse_fw(&spi->dev);
  716. if (!pdata) {
  717. dev_warn(&spi->dev, "no firmware provided parameters? using default\n");
  718. pdata = &ad5755_default_pdata;
  719. }
  720. ret = ad5755_init_channels(indio_dev, pdata);
  721. if (ret)
  722. return ret;
  723. ret = ad5755_setup_pdata(indio_dev, pdata);
  724. if (ret)
  725. return ret;
  726. return devm_iio_device_register(&spi->dev, indio_dev);
  727. }
  728. static const struct spi_device_id ad5755_id[] = {
  729. { "ad5755", ID_AD5755 },
  730. { "ad5755-1", ID_AD5755 },
  731. { "ad5757", ID_AD5757 },
  732. { "ad5735", ID_AD5735 },
  733. { "ad5737", ID_AD5737 },
  734. {}
  735. };
  736. MODULE_DEVICE_TABLE(spi, ad5755_id);
  737. static const struct of_device_id ad5755_of_match[] = {
  738. { .compatible = "adi,ad5755" },
  739. { .compatible = "adi,ad5755-1" },
  740. { .compatible = "adi,ad5757" },
  741. { .compatible = "adi,ad5735" },
  742. { .compatible = "adi,ad5737" },
  743. { }
  744. };
  745. MODULE_DEVICE_TABLE(of, ad5755_of_match);
  746. static struct spi_driver ad5755_driver = {
  747. .driver = {
  748. .name = "ad5755",
  749. },
  750. .probe = ad5755_probe,
  751. .id_table = ad5755_id,
  752. };
  753. module_spi_driver(ad5755_driver);
  754. MODULE_AUTHOR("Lars-Peter Clausen <[email protected]>");
  755. MODULE_DESCRIPTION("Analog Devices AD5755/55-1/57/35/37 DAC");
  756. MODULE_LICENSE("GPL v2");