ad7293.c 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * AD7293 driver
  4. *
  5. * Copyright 2021 Analog Devices Inc.
  6. */
  7. #include <linux/bitfield.h>
  8. #include <linux/bits.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/mod_devicetable.h>
  14. #include <linux/module.h>
  15. #include <linux/regulator/consumer.h>
  16. #include <linux/spi/spi.h>
  17. #include <asm/unaligned.h>
  18. #define AD7293_R1B BIT(16)
  19. #define AD7293_R2B BIT(17)
  20. #define AD7293_PAGE_ADDR_MSK GENMASK(15, 8)
  21. #define AD7293_PAGE(x) FIELD_PREP(AD7293_PAGE_ADDR_MSK, x)
  22. /* AD7293 Register Map Common */
  23. #define AD7293_REG_NO_OP (AD7293_R1B | AD7293_PAGE(0x0) | 0x0)
  24. #define AD7293_REG_PAGE_SELECT (AD7293_R1B | AD7293_PAGE(0x0) | 0x1)
  25. #define AD7293_REG_CONV_CMD (AD7293_R2B | AD7293_PAGE(0x0) | 0x2)
  26. #define AD7293_REG_RESULT (AD7293_R1B | AD7293_PAGE(0x0) | 0x3)
  27. #define AD7293_REG_DAC_EN (AD7293_R1B | AD7293_PAGE(0x0) | 0x4)
  28. #define AD7293_REG_DEVICE_ID (AD7293_R2B | AD7293_PAGE(0x0) | 0xC)
  29. #define AD7293_REG_SOFT_RESET (AD7293_R2B | AD7293_PAGE(0x0) | 0xF)
  30. /* AD7293 Register Map Page 0x0 */
  31. #define AD7293_REG_VIN0 (AD7293_R2B | AD7293_PAGE(0x0) | 0x10)
  32. #define AD7293_REG_VIN1 (AD7293_R2B | AD7293_PAGE(0x0) | 0x11)
  33. #define AD7293_REG_VIN2 (AD7293_R2B | AD7293_PAGE(0x0) | 0x12)
  34. #define AD7293_REG_VIN3 (AD7293_R2B | AD7293_PAGE(0x0) | 0x13)
  35. #define AD7293_REG_TSENSE_INT (AD7293_R2B | AD7293_PAGE(0x0) | 0x20)
  36. #define AD7293_REG_TSENSE_D0 (AD7293_R2B | AD7293_PAGE(0x0) | 0x21)
  37. #define AD7293_REG_TSENSE_D1 (AD7293_R2B | AD7293_PAGE(0x0) | 0x22)
  38. #define AD7293_REG_ISENSE_0 (AD7293_R2B | AD7293_PAGE(0x0) | 0x28)
  39. #define AD7293_REG_ISENSE_1 (AD7293_R2B | AD7293_PAGE(0x0) | 0x29)
  40. #define AD7293_REG_ISENSE_2 (AD7293_R2B | AD7293_PAGE(0x0) | 0x2A)
  41. #define AD7293_REG_ISENSE_3 (AD7293_R2B | AD7293_PAGE(0x0) | 0x2B)
  42. #define AD7293_REG_UNI_VOUT0 (AD7293_R2B | AD7293_PAGE(0x0) | 0x30)
  43. #define AD7293_REG_UNI_VOUT1 (AD7293_R2B | AD7293_PAGE(0x0) | 0x31)
  44. #define AD7293_REG_UNI_VOUT2 (AD7293_R2B | AD7293_PAGE(0x0) | 0x32)
  45. #define AD7293_REG_UNI_VOUT3 (AD7293_R2B | AD7293_PAGE(0x0) | 0x33)
  46. #define AD7293_REG_BI_VOUT0 (AD7293_R2B | AD7293_PAGE(0x0) | 0x34)
  47. #define AD7293_REG_BI_VOUT1 (AD7293_R2B | AD7293_PAGE(0x0) | 0x35)
  48. #define AD7293_REG_BI_VOUT2 (AD7293_R2B | AD7293_PAGE(0x0) | 0x36)
  49. #define AD7293_REG_BI_VOUT3 (AD7293_R2B | AD7293_PAGE(0x0) | 0x37)
  50. /* AD7293 Register Map Page 0x2 */
  51. #define AD7293_REG_DIGITAL_OUT_EN (AD7293_R2B | AD7293_PAGE(0x2) | 0x11)
  52. #define AD7293_REG_DIGITAL_INOUT_FUNC (AD7293_R2B | AD7293_PAGE(0x2) | 0x12)
  53. #define AD7293_REG_DIGITAL_FUNC_POL (AD7293_R2B | AD7293_PAGE(0x2) | 0x13)
  54. #define AD7293_REG_GENERAL (AD7293_R2B | AD7293_PAGE(0x2) | 0x14)
  55. #define AD7293_REG_VINX_RANGE0 (AD7293_R2B | AD7293_PAGE(0x2) | 0x15)
  56. #define AD7293_REG_VINX_RANGE1 (AD7293_R2B | AD7293_PAGE(0x2) | 0x16)
  57. #define AD7293_REG_VINX_DIFF_SE (AD7293_R2B | AD7293_PAGE(0x2) | 0x17)
  58. #define AD7293_REG_VINX_FILTER (AD7293_R2B | AD7293_PAGE(0x2) | 0x18)
  59. #define AD7293_REG_BG_EN (AD7293_R2B | AD7293_PAGE(0x2) | 0x19)
  60. #define AD7293_REG_CONV_DELAY (AD7293_R2B | AD7293_PAGE(0x2) | 0x1A)
  61. #define AD7293_REG_TSENSE_BG_EN (AD7293_R2B | AD7293_PAGE(0x2) | 0x1B)
  62. #define AD7293_REG_ISENSE_BG_EN (AD7293_R2B | AD7293_PAGE(0x2) | 0x1C)
  63. #define AD7293_REG_ISENSE_GAIN (AD7293_R2B | AD7293_PAGE(0x2) | 0x1D)
  64. #define AD7293_REG_DAC_SNOOZE_O (AD7293_R2B | AD7293_PAGE(0x2) | 0x1F)
  65. #define AD7293_REG_DAC_SNOOZE_1 (AD7293_R2B | AD7293_PAGE(0x2) | 0x20)
  66. #define AD7293_REG_RSX_MON_BG_EN (AD7293_R2B | AD7293_PAGE(0x2) | 0x23)
  67. #define AD7293_REG_INTEGR_CL (AD7293_R2B | AD7293_PAGE(0x2) | 0x28)
  68. #define AD7293_REG_PA_ON_CTRL (AD7293_R2B | AD7293_PAGE(0x2) | 0x29)
  69. #define AD7293_REG_RAMP_TIME_0 (AD7293_R2B | AD7293_PAGE(0x2) | 0x2A)
  70. #define AD7293_REG_RAMP_TIME_1 (AD7293_R2B | AD7293_PAGE(0x2) | 0x2B)
  71. #define AD7293_REG_RAMP_TIME_2 (AD7293_R2B | AD7293_PAGE(0x2) | 0x2C)
  72. #define AD7293_REG_RAMP_TIME_3 (AD7293_R2B | AD7293_PAGE(0x2) | 0x2D)
  73. #define AD7293_REG_CL_FR_IT (AD7293_R2B | AD7293_PAGE(0x2) | 0x2E)
  74. #define AD7293_REG_INTX_AVSS_AVDD (AD7293_R2B | AD7293_PAGE(0x2) | 0x2F)
  75. /* AD7293 Register Map Page 0x3 */
  76. #define AD7293_REG_VINX_SEQ (AD7293_R2B | AD7293_PAGE(0x3) | 0x10)
  77. #define AD7293_REG_ISENSEX_TSENSEX_SEQ (AD7293_R2B | AD7293_PAGE(0x3) | 0x11)
  78. #define AD7293_REG_RSX_MON_BI_VOUTX_SEQ (AD7293_R2B | AD7293_PAGE(0x3) | 0x12)
  79. /* AD7293 Register Map Page 0xE */
  80. #define AD7293_REG_VIN0_OFFSET (AD7293_R1B | AD7293_PAGE(0xE) | 0x10)
  81. #define AD7293_REG_VIN1_OFFSET (AD7293_R1B | AD7293_PAGE(0xE) | 0x11)
  82. #define AD7293_REG_VIN2_OFFSET (AD7293_R1B | AD7293_PAGE(0xE) | 0x12)
  83. #define AD7293_REG_VIN3_OFFSET (AD7293_R1B | AD7293_PAGE(0xE) | 0x13)
  84. #define AD7293_REG_TSENSE_INT_OFFSET (AD7293_R1B | AD7293_PAGE(0xE) | 0x20)
  85. #define AD7293_REG_TSENSE_D0_OFFSET (AD7293_R1B | AD7293_PAGE(0xE) | 0x21)
  86. #define AD7293_REG_TSENSE_D1_OFFSET (AD7293_R1B | AD7293_PAGE(0xE) | 0x22)
  87. #define AD7293_REG_ISENSE0_OFFSET (AD7293_R1B | AD7293_PAGE(0xE) | 0x28)
  88. #define AD7293_REG_ISENSE1_OFFSET (AD7293_R1B | AD7293_PAGE(0xE) | 0x29)
  89. #define AD7293_REG_ISENSE2_OFFSET (AD7293_R1B | AD7293_PAGE(0xE) | 0x2A)
  90. #define AD7293_REG_ISENSE3_OFFSET (AD7293_R1B | AD7293_PAGE(0xE) | 0x2B)
  91. #define AD7293_REG_UNI_VOUT0_OFFSET (AD7293_R1B | AD7293_PAGE(0xE) | 0x30)
  92. #define AD7293_REG_UNI_VOUT1_OFFSET (AD7293_R1B | AD7293_PAGE(0xE) | 0x31)
  93. #define AD7293_REG_UNI_VOUT2_OFFSET (AD7293_R1B | AD7293_PAGE(0xE) | 0x32)
  94. #define AD7293_REG_UNI_VOUT3_OFFSET (AD7293_R1B | AD7293_PAGE(0xE) | 0x33)
  95. #define AD7293_REG_BI_VOUT0_OFFSET (AD7293_R1B | AD7293_PAGE(0xE) | 0x34)
  96. #define AD7293_REG_BI_VOUT1_OFFSET (AD7293_R1B | AD7293_PAGE(0xE) | 0x35)
  97. #define AD7293_REG_BI_VOUT2_OFFSET (AD7293_R1B | AD7293_PAGE(0xE) | 0x36)
  98. #define AD7293_REG_BI_VOUT3_OFFSET (AD7293_R1B | AD7293_PAGE(0xE) | 0x37)
  99. /* AD7293 Miscellaneous Definitions */
  100. #define AD7293_READ BIT(7)
  101. #define AD7293_TRANSF_LEN_MSK GENMASK(17, 16)
  102. #define AD7293_REG_ADDR_MSK GENMASK(7, 0)
  103. #define AD7293_REG_VOUT_OFFSET_MSK GENMASK(5, 4)
  104. #define AD7293_REG_DATA_RAW_MSK GENMASK(15, 4)
  105. #define AD7293_REG_VINX_RANGE_GET_CH_MSK(x, ch) (((x) >> (ch)) & 0x1)
  106. #define AD7293_REG_VINX_RANGE_SET_CH_MSK(x, ch) (((x) & 0x1) << (ch))
  107. #define AD7293_CHIP_ID 0x18
  108. enum ad7293_ch_type {
  109. AD7293_ADC_VINX,
  110. AD7293_ADC_TSENSE,
  111. AD7293_ADC_ISENSE,
  112. AD7293_DAC,
  113. };
  114. enum ad7293_max_offset {
  115. AD7293_TSENSE_MIN_OFFSET_CH = 4,
  116. AD7293_ISENSE_MIN_OFFSET_CH = 7,
  117. AD7293_VOUT_MIN_OFFSET_CH = 11,
  118. AD7293_VOUT_MAX_OFFSET_CH = 18,
  119. };
  120. static const int dac_offset_table[] = {0, 1, 2};
  121. static const int isense_gain_table[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
  122. static const int adc_range_table[] = {0, 1, 2, 3};
  123. struct ad7293_state {
  124. struct spi_device *spi;
  125. /* Protect against concurrent accesses to the device, page selection and data content */
  126. struct mutex lock;
  127. struct gpio_desc *gpio_reset;
  128. struct regulator *reg_avdd;
  129. struct regulator *reg_vdrive;
  130. u8 page_select;
  131. u8 data[3] __aligned(IIO_DMA_MINALIGN);
  132. };
  133. static int ad7293_page_select(struct ad7293_state *st, unsigned int reg)
  134. {
  135. int ret;
  136. if (st->page_select != FIELD_GET(AD7293_PAGE_ADDR_MSK, reg)) {
  137. st->data[0] = FIELD_GET(AD7293_REG_ADDR_MSK, AD7293_REG_PAGE_SELECT);
  138. st->data[1] = FIELD_GET(AD7293_PAGE_ADDR_MSK, reg);
  139. ret = spi_write(st->spi, &st->data[0], 2);
  140. if (ret)
  141. return ret;
  142. st->page_select = FIELD_GET(AD7293_PAGE_ADDR_MSK, reg);
  143. }
  144. return 0;
  145. }
  146. static int __ad7293_spi_read(struct ad7293_state *st, unsigned int reg,
  147. u16 *val)
  148. {
  149. int ret;
  150. unsigned int length;
  151. struct spi_transfer t = {0};
  152. length = FIELD_GET(AD7293_TRANSF_LEN_MSK, reg);
  153. ret = ad7293_page_select(st, reg);
  154. if (ret)
  155. return ret;
  156. st->data[0] = AD7293_READ | FIELD_GET(AD7293_REG_ADDR_MSK, reg);
  157. st->data[1] = 0x0;
  158. st->data[2] = 0x0;
  159. t.tx_buf = &st->data[0];
  160. t.rx_buf = &st->data[0];
  161. t.len = length + 1;
  162. ret = spi_sync_transfer(st->spi, &t, 1);
  163. if (ret)
  164. return ret;
  165. if (length == 1)
  166. *val = st->data[1];
  167. else
  168. *val = get_unaligned_be16(&st->data[1]);
  169. return 0;
  170. }
  171. static int ad7293_spi_read(struct ad7293_state *st, unsigned int reg,
  172. u16 *val)
  173. {
  174. int ret;
  175. mutex_lock(&st->lock);
  176. ret = __ad7293_spi_read(st, reg, val);
  177. mutex_unlock(&st->lock);
  178. return ret;
  179. }
  180. static int __ad7293_spi_write(struct ad7293_state *st, unsigned int reg,
  181. u16 val)
  182. {
  183. int ret;
  184. unsigned int length;
  185. length = FIELD_GET(AD7293_TRANSF_LEN_MSK, reg);
  186. ret = ad7293_page_select(st, reg);
  187. if (ret)
  188. return ret;
  189. st->data[0] = FIELD_GET(AD7293_REG_ADDR_MSK, reg);
  190. if (length == 1)
  191. st->data[1] = val;
  192. else
  193. put_unaligned_be16(val, &st->data[1]);
  194. return spi_write(st->spi, &st->data[0], length + 1);
  195. }
  196. static int ad7293_spi_write(struct ad7293_state *st, unsigned int reg,
  197. u16 val)
  198. {
  199. int ret;
  200. mutex_lock(&st->lock);
  201. ret = __ad7293_spi_write(st, reg, val);
  202. mutex_unlock(&st->lock);
  203. return ret;
  204. }
  205. static int __ad7293_spi_update_bits(struct ad7293_state *st, unsigned int reg,
  206. u16 mask, u16 val)
  207. {
  208. int ret;
  209. u16 data, temp;
  210. ret = __ad7293_spi_read(st, reg, &data);
  211. if (ret)
  212. return ret;
  213. temp = (data & ~mask) | (val & mask);
  214. return __ad7293_spi_write(st, reg, temp);
  215. }
  216. static int ad7293_spi_update_bits(struct ad7293_state *st, unsigned int reg,
  217. u16 mask, u16 val)
  218. {
  219. int ret;
  220. mutex_lock(&st->lock);
  221. ret = __ad7293_spi_update_bits(st, reg, mask, val);
  222. mutex_unlock(&st->lock);
  223. return ret;
  224. }
  225. static int ad7293_adc_get_scale(struct ad7293_state *st, unsigned int ch,
  226. u16 *range)
  227. {
  228. int ret;
  229. u16 data;
  230. mutex_lock(&st->lock);
  231. ret = __ad7293_spi_read(st, AD7293_REG_VINX_RANGE1, &data);
  232. if (ret)
  233. goto exit;
  234. *range = AD7293_REG_VINX_RANGE_GET_CH_MSK(data, ch);
  235. ret = __ad7293_spi_read(st, AD7293_REG_VINX_RANGE0, &data);
  236. if (ret)
  237. goto exit;
  238. *range |= AD7293_REG_VINX_RANGE_GET_CH_MSK(data, ch) << 1;
  239. exit:
  240. mutex_unlock(&st->lock);
  241. return ret;
  242. }
  243. static int ad7293_adc_set_scale(struct ad7293_state *st, unsigned int ch,
  244. u16 range)
  245. {
  246. int ret;
  247. unsigned int ch_msk = BIT(ch);
  248. mutex_lock(&st->lock);
  249. ret = __ad7293_spi_update_bits(st, AD7293_REG_VINX_RANGE1, ch_msk,
  250. AD7293_REG_VINX_RANGE_SET_CH_MSK(range, ch));
  251. if (ret)
  252. goto exit;
  253. ret = __ad7293_spi_update_bits(st, AD7293_REG_VINX_RANGE0, ch_msk,
  254. AD7293_REG_VINX_RANGE_SET_CH_MSK((range >> 1), ch));
  255. exit:
  256. mutex_unlock(&st->lock);
  257. return ret;
  258. }
  259. static int ad7293_get_offset(struct ad7293_state *st, unsigned int ch,
  260. u16 *offset)
  261. {
  262. if (ch < AD7293_TSENSE_MIN_OFFSET_CH)
  263. return ad7293_spi_read(st, AD7293_REG_VIN0_OFFSET + ch, offset);
  264. else if (ch < AD7293_ISENSE_MIN_OFFSET_CH)
  265. return ad7293_spi_read(st, AD7293_REG_TSENSE_INT_OFFSET + (ch - 4), offset);
  266. else if (ch < AD7293_VOUT_MIN_OFFSET_CH)
  267. return ad7293_spi_read(st, AD7293_REG_ISENSE0_OFFSET + (ch - 7), offset);
  268. else if (ch <= AD7293_VOUT_MAX_OFFSET_CH)
  269. return ad7293_spi_read(st, AD7293_REG_UNI_VOUT0_OFFSET + (ch - 11), offset);
  270. return -EINVAL;
  271. }
  272. static int ad7293_set_offset(struct ad7293_state *st, unsigned int ch,
  273. u16 offset)
  274. {
  275. if (ch < AD7293_TSENSE_MIN_OFFSET_CH)
  276. return ad7293_spi_write(st, AD7293_REG_VIN0_OFFSET + ch,
  277. offset);
  278. else if (ch < AD7293_ISENSE_MIN_OFFSET_CH)
  279. return ad7293_spi_write(st,
  280. AD7293_REG_TSENSE_INT_OFFSET +
  281. (ch - AD7293_TSENSE_MIN_OFFSET_CH),
  282. offset);
  283. else if (ch < AD7293_VOUT_MIN_OFFSET_CH)
  284. return ad7293_spi_write(st,
  285. AD7293_REG_ISENSE0_OFFSET +
  286. (ch - AD7293_ISENSE_MIN_OFFSET_CH),
  287. offset);
  288. else if (ch <= AD7293_VOUT_MAX_OFFSET_CH)
  289. return ad7293_spi_update_bits(st,
  290. AD7293_REG_UNI_VOUT0_OFFSET +
  291. (ch - AD7293_VOUT_MIN_OFFSET_CH),
  292. AD7293_REG_VOUT_OFFSET_MSK,
  293. FIELD_PREP(AD7293_REG_VOUT_OFFSET_MSK, offset));
  294. return -EINVAL;
  295. }
  296. static int ad7293_isense_set_scale(struct ad7293_state *st, unsigned int ch,
  297. u16 gain)
  298. {
  299. unsigned int ch_msk = (0xf << (4 * ch));
  300. return ad7293_spi_update_bits(st, AD7293_REG_ISENSE_GAIN, ch_msk,
  301. gain << (4 * ch));
  302. }
  303. static int ad7293_isense_get_scale(struct ad7293_state *st, unsigned int ch,
  304. u16 *gain)
  305. {
  306. int ret;
  307. ret = ad7293_spi_read(st, AD7293_REG_ISENSE_GAIN, gain);
  308. if (ret)
  309. return ret;
  310. *gain = (*gain >> (4 * ch)) & 0xf;
  311. return ret;
  312. }
  313. static int ad7293_dac_write_raw(struct ad7293_state *st, unsigned int ch,
  314. u16 raw)
  315. {
  316. int ret;
  317. mutex_lock(&st->lock);
  318. ret = __ad7293_spi_update_bits(st, AD7293_REG_DAC_EN, BIT(ch), BIT(ch));
  319. if (ret)
  320. goto exit;
  321. ret = __ad7293_spi_write(st, AD7293_REG_UNI_VOUT0 + ch,
  322. FIELD_PREP(AD7293_REG_DATA_RAW_MSK, raw));
  323. exit:
  324. mutex_unlock(&st->lock);
  325. return ret;
  326. }
  327. static int ad7293_ch_read_raw(struct ad7293_state *st, enum ad7293_ch_type type,
  328. unsigned int ch, u16 *raw)
  329. {
  330. int ret;
  331. unsigned int reg_wr, reg_rd, data_wr;
  332. switch (type) {
  333. case AD7293_ADC_VINX:
  334. reg_wr = AD7293_REG_VINX_SEQ;
  335. reg_rd = AD7293_REG_VIN0 + ch;
  336. data_wr = BIT(ch);
  337. break;
  338. case AD7293_ADC_TSENSE:
  339. reg_wr = AD7293_REG_ISENSEX_TSENSEX_SEQ;
  340. reg_rd = AD7293_REG_TSENSE_INT + ch;
  341. data_wr = BIT(ch);
  342. break;
  343. case AD7293_ADC_ISENSE:
  344. reg_wr = AD7293_REG_ISENSEX_TSENSEX_SEQ;
  345. reg_rd = AD7293_REG_ISENSE_0 + ch;
  346. data_wr = BIT(ch) << 8;
  347. break;
  348. case AD7293_DAC:
  349. reg_rd = AD7293_REG_UNI_VOUT0 + ch;
  350. break;
  351. default:
  352. return -EINVAL;
  353. }
  354. mutex_lock(&st->lock);
  355. if (type != AD7293_DAC) {
  356. if (type == AD7293_ADC_TSENSE) {
  357. ret = __ad7293_spi_write(st, AD7293_REG_TSENSE_BG_EN,
  358. BIT(ch));
  359. if (ret)
  360. goto exit;
  361. usleep_range(9000, 9900);
  362. } else if (type == AD7293_ADC_ISENSE) {
  363. ret = __ad7293_spi_write(st, AD7293_REG_ISENSE_BG_EN,
  364. BIT(ch));
  365. if (ret)
  366. goto exit;
  367. usleep_range(2000, 7000);
  368. }
  369. ret = __ad7293_spi_write(st, reg_wr, data_wr);
  370. if (ret)
  371. goto exit;
  372. ret = __ad7293_spi_write(st, AD7293_REG_CONV_CMD, 0x82);
  373. if (ret)
  374. goto exit;
  375. }
  376. ret = __ad7293_spi_read(st, reg_rd, raw);
  377. *raw = FIELD_GET(AD7293_REG_DATA_RAW_MSK, *raw);
  378. exit:
  379. mutex_unlock(&st->lock);
  380. return ret;
  381. }
  382. static int ad7293_read_raw(struct iio_dev *indio_dev,
  383. struct iio_chan_spec const *chan,
  384. int *val, int *val2, long info)
  385. {
  386. struct ad7293_state *st = iio_priv(indio_dev);
  387. int ret;
  388. u16 data;
  389. switch (info) {
  390. case IIO_CHAN_INFO_RAW:
  391. switch (chan->type) {
  392. case IIO_VOLTAGE:
  393. if (chan->output)
  394. ret = ad7293_ch_read_raw(st, AD7293_DAC,
  395. chan->channel, &data);
  396. else
  397. ret = ad7293_ch_read_raw(st, AD7293_ADC_VINX,
  398. chan->channel, &data);
  399. break;
  400. case IIO_CURRENT:
  401. ret = ad7293_ch_read_raw(st, AD7293_ADC_ISENSE,
  402. chan->channel, &data);
  403. break;
  404. case IIO_TEMP:
  405. ret = ad7293_ch_read_raw(st, AD7293_ADC_TSENSE,
  406. chan->channel, &data);
  407. break;
  408. default:
  409. return -EINVAL;
  410. }
  411. if (ret)
  412. return ret;
  413. *val = data;
  414. return IIO_VAL_INT;
  415. case IIO_CHAN_INFO_OFFSET:
  416. switch (chan->type) {
  417. case IIO_VOLTAGE:
  418. if (chan->output) {
  419. ret = ad7293_get_offset(st,
  420. chan->channel + AD7293_VOUT_MIN_OFFSET_CH,
  421. &data);
  422. data = FIELD_GET(AD7293_REG_VOUT_OFFSET_MSK, data);
  423. } else {
  424. ret = ad7293_get_offset(st, chan->channel, &data);
  425. }
  426. break;
  427. case IIO_CURRENT:
  428. ret = ad7293_get_offset(st,
  429. chan->channel + AD7293_ISENSE_MIN_OFFSET_CH,
  430. &data);
  431. break;
  432. case IIO_TEMP:
  433. ret = ad7293_get_offset(st,
  434. chan->channel + AD7293_TSENSE_MIN_OFFSET_CH,
  435. &data);
  436. break;
  437. default:
  438. return -EINVAL;
  439. }
  440. if (ret)
  441. return ret;
  442. *val = data;
  443. return IIO_VAL_INT;
  444. case IIO_CHAN_INFO_SCALE:
  445. switch (chan->type) {
  446. case IIO_VOLTAGE:
  447. ret = ad7293_adc_get_scale(st, chan->channel, &data);
  448. if (ret)
  449. return ret;
  450. *val = data;
  451. return IIO_VAL_INT;
  452. case IIO_CURRENT:
  453. ret = ad7293_isense_get_scale(st, chan->channel, &data);
  454. if (ret)
  455. return ret;
  456. *val = data;
  457. return IIO_VAL_INT;
  458. case IIO_TEMP:
  459. *val = 1;
  460. *val2 = 8;
  461. return IIO_VAL_FRACTIONAL;
  462. default:
  463. return -EINVAL;
  464. }
  465. default:
  466. return -EINVAL;
  467. }
  468. }
  469. static int ad7293_write_raw(struct iio_dev *indio_dev,
  470. struct iio_chan_spec const *chan,
  471. int val, int val2, long info)
  472. {
  473. struct ad7293_state *st = iio_priv(indio_dev);
  474. switch (info) {
  475. case IIO_CHAN_INFO_RAW:
  476. switch (chan->type) {
  477. case IIO_VOLTAGE:
  478. if (!chan->output)
  479. return -EINVAL;
  480. return ad7293_dac_write_raw(st, chan->channel, val);
  481. default:
  482. return -EINVAL;
  483. }
  484. case IIO_CHAN_INFO_OFFSET:
  485. switch (chan->type) {
  486. case IIO_VOLTAGE:
  487. if (chan->output)
  488. return ad7293_set_offset(st,
  489. chan->channel +
  490. AD7293_VOUT_MIN_OFFSET_CH,
  491. val);
  492. else
  493. return ad7293_set_offset(st, chan->channel, val);
  494. case IIO_CURRENT:
  495. return ad7293_set_offset(st,
  496. chan->channel +
  497. AD7293_ISENSE_MIN_OFFSET_CH,
  498. val);
  499. case IIO_TEMP:
  500. return ad7293_set_offset(st,
  501. chan->channel +
  502. AD7293_TSENSE_MIN_OFFSET_CH,
  503. val);
  504. default:
  505. return -EINVAL;
  506. }
  507. case IIO_CHAN_INFO_SCALE:
  508. switch (chan->type) {
  509. case IIO_VOLTAGE:
  510. return ad7293_adc_set_scale(st, chan->channel, val);
  511. case IIO_CURRENT:
  512. return ad7293_isense_set_scale(st, chan->channel, val);
  513. default:
  514. return -EINVAL;
  515. }
  516. default:
  517. return -EINVAL;
  518. }
  519. }
  520. static int ad7293_reg_access(struct iio_dev *indio_dev,
  521. unsigned int reg,
  522. unsigned int write_val,
  523. unsigned int *read_val)
  524. {
  525. struct ad7293_state *st = iio_priv(indio_dev);
  526. int ret;
  527. if (read_val) {
  528. u16 temp;
  529. ret = ad7293_spi_read(st, reg, &temp);
  530. *read_val = temp;
  531. } else {
  532. ret = ad7293_spi_write(st, reg, (u16)write_val);
  533. }
  534. return ret;
  535. }
  536. static int ad7293_read_avail(struct iio_dev *indio_dev,
  537. struct iio_chan_spec const *chan,
  538. const int **vals, int *type, int *length,
  539. long info)
  540. {
  541. switch (info) {
  542. case IIO_CHAN_INFO_OFFSET:
  543. *vals = dac_offset_table;
  544. *type = IIO_VAL_INT;
  545. *length = ARRAY_SIZE(dac_offset_table);
  546. return IIO_AVAIL_LIST;
  547. case IIO_CHAN_INFO_SCALE:
  548. *type = IIO_VAL_INT;
  549. switch (chan->type) {
  550. case IIO_VOLTAGE:
  551. *vals = adc_range_table;
  552. *length = ARRAY_SIZE(adc_range_table);
  553. return IIO_AVAIL_LIST;
  554. case IIO_CURRENT:
  555. *vals = isense_gain_table;
  556. *length = ARRAY_SIZE(isense_gain_table);
  557. return IIO_AVAIL_LIST;
  558. default:
  559. return -EINVAL;
  560. }
  561. default:
  562. return -EINVAL;
  563. }
  564. }
  565. #define AD7293_CHAN_ADC(_channel) { \
  566. .type = IIO_VOLTAGE, \
  567. .output = 0, \
  568. .indexed = 1, \
  569. .channel = _channel, \
  570. .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \
  571. BIT(IIO_CHAN_INFO_SCALE) | \
  572. BIT(IIO_CHAN_INFO_OFFSET), \
  573. .info_mask_shared_by_type_available = BIT(IIO_CHAN_INFO_SCALE) \
  574. }
  575. #define AD7293_CHAN_DAC(_channel) { \
  576. .type = IIO_VOLTAGE, \
  577. .output = 1, \
  578. .indexed = 1, \
  579. .channel = _channel, \
  580. .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \
  581. BIT(IIO_CHAN_INFO_OFFSET), \
  582. .info_mask_shared_by_type_available = BIT(IIO_CHAN_INFO_OFFSET) \
  583. }
  584. #define AD7293_CHAN_ISENSE(_channel) { \
  585. .type = IIO_CURRENT, \
  586. .output = 0, \
  587. .indexed = 1, \
  588. .channel = _channel, \
  589. .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \
  590. BIT(IIO_CHAN_INFO_OFFSET) | \
  591. BIT(IIO_CHAN_INFO_SCALE), \
  592. .info_mask_shared_by_type_available = BIT(IIO_CHAN_INFO_SCALE) \
  593. }
  594. #define AD7293_CHAN_TEMP(_channel) { \
  595. .type = IIO_TEMP, \
  596. .output = 0, \
  597. .indexed = 1, \
  598. .channel = _channel, \
  599. .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \
  600. BIT(IIO_CHAN_INFO_OFFSET), \
  601. .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE) \
  602. }
  603. static const struct iio_chan_spec ad7293_channels[] = {
  604. AD7293_CHAN_ADC(0),
  605. AD7293_CHAN_ADC(1),
  606. AD7293_CHAN_ADC(2),
  607. AD7293_CHAN_ADC(3),
  608. AD7293_CHAN_ISENSE(0),
  609. AD7293_CHAN_ISENSE(1),
  610. AD7293_CHAN_ISENSE(2),
  611. AD7293_CHAN_ISENSE(3),
  612. AD7293_CHAN_TEMP(0),
  613. AD7293_CHAN_TEMP(1),
  614. AD7293_CHAN_TEMP(2),
  615. AD7293_CHAN_DAC(0),
  616. AD7293_CHAN_DAC(1),
  617. AD7293_CHAN_DAC(2),
  618. AD7293_CHAN_DAC(3),
  619. AD7293_CHAN_DAC(4),
  620. AD7293_CHAN_DAC(5),
  621. AD7293_CHAN_DAC(6),
  622. AD7293_CHAN_DAC(7)
  623. };
  624. static int ad7293_soft_reset(struct ad7293_state *st)
  625. {
  626. int ret;
  627. ret = __ad7293_spi_write(st, AD7293_REG_SOFT_RESET, 0x7293);
  628. if (ret)
  629. return ret;
  630. return __ad7293_spi_write(st, AD7293_REG_SOFT_RESET, 0x0000);
  631. }
  632. static int ad7293_reset(struct ad7293_state *st)
  633. {
  634. if (st->gpio_reset) {
  635. gpiod_set_value(st->gpio_reset, 0);
  636. usleep_range(100, 1000);
  637. gpiod_set_value(st->gpio_reset, 1);
  638. usleep_range(100, 1000);
  639. return 0;
  640. }
  641. /* Perform a software reset */
  642. return ad7293_soft_reset(st);
  643. }
  644. static int ad7293_properties_parse(struct ad7293_state *st)
  645. {
  646. struct spi_device *spi = st->spi;
  647. st->gpio_reset = devm_gpiod_get_optional(&st->spi->dev, "reset",
  648. GPIOD_OUT_HIGH);
  649. if (IS_ERR(st->gpio_reset))
  650. return dev_err_probe(&spi->dev, PTR_ERR(st->gpio_reset),
  651. "failed to get the reset GPIO\n");
  652. st->reg_avdd = devm_regulator_get(&spi->dev, "avdd");
  653. if (IS_ERR(st->reg_avdd))
  654. return dev_err_probe(&spi->dev, PTR_ERR(st->reg_avdd),
  655. "failed to get the AVDD voltage\n");
  656. st->reg_vdrive = devm_regulator_get(&spi->dev, "vdrive");
  657. if (IS_ERR(st->reg_vdrive))
  658. return dev_err_probe(&spi->dev, PTR_ERR(st->reg_vdrive),
  659. "failed to get the VDRIVE voltage\n");
  660. return 0;
  661. }
  662. static void ad7293_reg_disable(void *data)
  663. {
  664. regulator_disable(data);
  665. }
  666. static int ad7293_init(struct ad7293_state *st)
  667. {
  668. int ret;
  669. u16 chip_id;
  670. struct spi_device *spi = st->spi;
  671. ret = ad7293_properties_parse(st);
  672. if (ret)
  673. return ret;
  674. ret = ad7293_reset(st);
  675. if (ret)
  676. return ret;
  677. ret = regulator_enable(st->reg_avdd);
  678. if (ret) {
  679. dev_err(&spi->dev,
  680. "Failed to enable specified AVDD Voltage!\n");
  681. return ret;
  682. }
  683. ret = devm_add_action_or_reset(&spi->dev, ad7293_reg_disable,
  684. st->reg_avdd);
  685. if (ret)
  686. return ret;
  687. ret = regulator_enable(st->reg_vdrive);
  688. if (ret) {
  689. dev_err(&spi->dev,
  690. "Failed to enable specified VDRIVE Voltage!\n");
  691. return ret;
  692. }
  693. ret = devm_add_action_or_reset(&spi->dev, ad7293_reg_disable,
  694. st->reg_vdrive);
  695. if (ret)
  696. return ret;
  697. ret = regulator_get_voltage(st->reg_avdd);
  698. if (ret < 0) {
  699. dev_err(&spi->dev, "Failed to read avdd regulator: %d\n", ret);
  700. return ret;
  701. }
  702. if (ret > 5500000 || ret < 4500000)
  703. return -EINVAL;
  704. ret = regulator_get_voltage(st->reg_vdrive);
  705. if (ret < 0) {
  706. dev_err(&spi->dev,
  707. "Failed to read vdrive regulator: %d\n", ret);
  708. return ret;
  709. }
  710. if (ret > 5500000 || ret < 1700000)
  711. return -EINVAL;
  712. /* Check Chip ID */
  713. ret = __ad7293_spi_read(st, AD7293_REG_DEVICE_ID, &chip_id);
  714. if (ret)
  715. return ret;
  716. if (chip_id != AD7293_CHIP_ID) {
  717. dev_err(&spi->dev, "Invalid Chip ID.\n");
  718. return -EINVAL;
  719. }
  720. return 0;
  721. }
  722. static const struct iio_info ad7293_info = {
  723. .read_raw = ad7293_read_raw,
  724. .write_raw = ad7293_write_raw,
  725. .read_avail = &ad7293_read_avail,
  726. .debugfs_reg_access = &ad7293_reg_access,
  727. };
  728. static int ad7293_probe(struct spi_device *spi)
  729. {
  730. struct iio_dev *indio_dev;
  731. struct ad7293_state *st;
  732. int ret;
  733. indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*st));
  734. if (!indio_dev)
  735. return -ENOMEM;
  736. st = iio_priv(indio_dev);
  737. indio_dev->info = &ad7293_info;
  738. indio_dev->name = "ad7293";
  739. indio_dev->channels = ad7293_channels;
  740. indio_dev->num_channels = ARRAY_SIZE(ad7293_channels);
  741. st->spi = spi;
  742. st->page_select = 0;
  743. mutex_init(&st->lock);
  744. ret = ad7293_init(st);
  745. if (ret)
  746. return ret;
  747. return devm_iio_device_register(&spi->dev, indio_dev);
  748. }
  749. static const struct spi_device_id ad7293_id[] = {
  750. { "ad7293", 0 },
  751. {}
  752. };
  753. MODULE_DEVICE_TABLE(spi, ad7293_id);
  754. static const struct of_device_id ad7293_of_match[] = {
  755. { .compatible = "adi,ad7293" },
  756. {}
  757. };
  758. MODULE_DEVICE_TABLE(of, ad7293_of_match);
  759. static struct spi_driver ad7293_driver = {
  760. .driver = {
  761. .name = "ad7293",
  762. .of_match_table = ad7293_of_match,
  763. },
  764. .probe = ad7293_probe,
  765. .id_table = ad7293_id,
  766. };
  767. module_spi_driver(ad7293_driver);
  768. MODULE_AUTHOR("Antoniu Miclaus <[email protected]");
  769. MODULE_DESCRIPTION("Analog Devices AD7293");
  770. MODULE_LICENSE("GPL v2");