ad3552r.c 30 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Analog Devices AD3552R
  4. * Digital to Analog converter driver
  5. *
  6. * Copyright 2021 Analog Devices Inc.
  7. */
  8. #include <asm/unaligned.h>
  9. #include <linux/device.h>
  10. #include <linux/iio/triggered_buffer.h>
  11. #include <linux/iio/trigger_consumer.h>
  12. #include <linux/iopoll.h>
  13. #include <linux/kernel.h>
  14. #include <linux/regulator/consumer.h>
  15. #include <linux/spi/spi.h>
  16. /* Register addresses */
  17. /* Primary address space */
  18. #define AD3552R_REG_ADDR_INTERFACE_CONFIG_A 0x00
  19. #define AD3552R_MASK_SOFTWARE_RESET (BIT(7) | BIT(0))
  20. #define AD3552R_MASK_ADDR_ASCENSION BIT(5)
  21. #define AD3552R_MASK_SDO_ACTIVE BIT(4)
  22. #define AD3552R_REG_ADDR_INTERFACE_CONFIG_B 0x01
  23. #define AD3552R_MASK_SINGLE_INST BIT(7)
  24. #define AD3552R_MASK_SHORT_INSTRUCTION BIT(3)
  25. #define AD3552R_REG_ADDR_DEVICE_CONFIG 0x02
  26. #define AD3552R_MASK_DEVICE_STATUS(n) BIT(4 + (n))
  27. #define AD3552R_MASK_CUSTOM_MODES GENMASK(3, 2)
  28. #define AD3552R_MASK_OPERATING_MODES GENMASK(1, 0)
  29. #define AD3552R_REG_ADDR_CHIP_TYPE 0x03
  30. #define AD3552R_MASK_CLASS GENMASK(7, 0)
  31. #define AD3552R_REG_ADDR_PRODUCT_ID_L 0x04
  32. #define AD3552R_REG_ADDR_PRODUCT_ID_H 0x05
  33. #define AD3552R_REG_ADDR_CHIP_GRADE 0x06
  34. #define AD3552R_MASK_GRADE GENMASK(7, 4)
  35. #define AD3552R_MASK_DEVICE_REVISION GENMASK(3, 0)
  36. #define AD3552R_REG_ADDR_SCRATCH_PAD 0x0A
  37. #define AD3552R_REG_ADDR_SPI_REVISION 0x0B
  38. #define AD3552R_REG_ADDR_VENDOR_L 0x0C
  39. #define AD3552R_REG_ADDR_VENDOR_H 0x0D
  40. #define AD3552R_REG_ADDR_STREAM_MODE 0x0E
  41. #define AD3552R_MASK_LENGTH GENMASK(7, 0)
  42. #define AD3552R_REG_ADDR_TRANSFER_REGISTER 0x0F
  43. #define AD3552R_MASK_MULTI_IO_MODE GENMASK(7, 6)
  44. #define AD3552R_MASK_STREAM_LENGTH_KEEP_VALUE BIT(2)
  45. #define AD3552R_REG_ADDR_INTERFACE_CONFIG_C 0x10
  46. #define AD3552R_MASK_CRC_ENABLE (GENMASK(7, 6) |\
  47. GENMASK(1, 0))
  48. #define AD3552R_MASK_STRICT_REGISTER_ACCESS BIT(5)
  49. #define AD3552R_REG_ADDR_INTERFACE_STATUS_A 0x11
  50. #define AD3552R_MASK_INTERFACE_NOT_READY BIT(7)
  51. #define AD3552R_MASK_CLOCK_COUNTING_ERROR BIT(5)
  52. #define AD3552R_MASK_INVALID_OR_NO_CRC BIT(3)
  53. #define AD3552R_MASK_WRITE_TO_READ_ONLY_REGISTER BIT(2)
  54. #define AD3552R_MASK_PARTIAL_REGISTER_ACCESS BIT(1)
  55. #define AD3552R_MASK_REGISTER_ADDRESS_INVALID BIT(0)
  56. #define AD3552R_REG_ADDR_INTERFACE_CONFIG_D 0x14
  57. #define AD3552R_MASK_ALERT_ENABLE_PULLUP BIT(6)
  58. #define AD3552R_MASK_MEM_CRC_EN BIT(4)
  59. #define AD3552R_MASK_SDO_DRIVE_STRENGTH GENMASK(3, 2)
  60. #define AD3552R_MASK_DUAL_SPI_SYNCHROUNOUS_EN BIT(1)
  61. #define AD3552R_MASK_SPI_CONFIG_DDR BIT(0)
  62. #define AD3552R_REG_ADDR_SH_REFERENCE_CONFIG 0x15
  63. #define AD3552R_MASK_IDUMP_FAST_MODE BIT(6)
  64. #define AD3552R_MASK_SAMPLE_HOLD_DIFFERENTIAL_USER_EN BIT(5)
  65. #define AD3552R_MASK_SAMPLE_HOLD_USER_TRIM GENMASK(4, 3)
  66. #define AD3552R_MASK_SAMPLE_HOLD_USER_ENABLE BIT(2)
  67. #define AD3552R_MASK_REFERENCE_VOLTAGE_SEL GENMASK(1, 0)
  68. #define AD3552R_REG_ADDR_ERR_ALARM_MASK 0x16
  69. #define AD3552R_MASK_REF_RANGE_ALARM BIT(6)
  70. #define AD3552R_MASK_CLOCK_COUNT_ERR_ALARM BIT(5)
  71. #define AD3552R_MASK_MEM_CRC_ERR_ALARM BIT(4)
  72. #define AD3552R_MASK_SPI_CRC_ERR_ALARM BIT(3)
  73. #define AD3552R_MASK_WRITE_TO_READ_ONLY_ALARM BIT(2)
  74. #define AD3552R_MASK_PARTIAL_REGISTER_ACCESS_ALARM BIT(1)
  75. #define AD3552R_MASK_REGISTER_ADDRESS_INVALID_ALARM BIT(0)
  76. #define AD3552R_REG_ADDR_ERR_STATUS 0x17
  77. #define AD3552R_MASK_REF_RANGE_ERR_STATUS BIT(6)
  78. #define AD3552R_MASK_DUAL_SPI_STREAM_EXCEEDS_DAC_ERR_STATUS BIT(5)
  79. #define AD3552R_MASK_MEM_CRC_ERR_STATUS BIT(4)
  80. #define AD3552R_MASK_RESET_STATUS BIT(0)
  81. #define AD3552R_REG_ADDR_POWERDOWN_CONFIG 0x18
  82. #define AD3552R_MASK_CH_DAC_POWERDOWN(ch) BIT(4 + (ch))
  83. #define AD3552R_MASK_CH_AMPLIFIER_POWERDOWN(ch) BIT(ch)
  84. #define AD3552R_REG_ADDR_CH0_CH1_OUTPUT_RANGE 0x19
  85. #define AD3552R_MASK_CH_OUTPUT_RANGE_SEL(ch) ((ch) ? GENMASK(7, 4) :\
  86. GENMASK(3, 0))
  87. #define AD3552R_REG_ADDR_CH_OFFSET(ch) (0x1B + (ch) * 2)
  88. #define AD3552R_MASK_CH_OFFSET_BITS_0_7 GENMASK(7, 0)
  89. #define AD3552R_REG_ADDR_CH_GAIN(ch) (0x1C + (ch) * 2)
  90. #define AD3552R_MASK_CH_RANGE_OVERRIDE BIT(7)
  91. #define AD3552R_MASK_CH_GAIN_SCALING_N GENMASK(6, 5)
  92. #define AD3552R_MASK_CH_GAIN_SCALING_P GENMASK(4, 3)
  93. #define AD3552R_MASK_CH_OFFSET_POLARITY BIT(2)
  94. #define AD3552R_MASK_CH_OFFSET_BIT_8 BIT(0)
  95. /*
  96. * Secondary region
  97. * For multibyte registers specify the highest address because the access is
  98. * done in descending order
  99. */
  100. #define AD3552R_SECONDARY_REGION_START 0x28
  101. #define AD3552R_REG_ADDR_HW_LDAC_16B 0x28
  102. #define AD3552R_REG_ADDR_CH_DAC_16B(ch) (0x2C - (1 - ch) * 2)
  103. #define AD3552R_REG_ADDR_DAC_PAGE_MASK_16B 0x2E
  104. #define AD3552R_REG_ADDR_CH_SELECT_16B 0x2F
  105. #define AD3552R_REG_ADDR_INPUT_PAGE_MASK_16B 0x31
  106. #define AD3552R_REG_ADDR_SW_LDAC_16B 0x32
  107. #define AD3552R_REG_ADDR_CH_INPUT_16B(ch) (0x36 - (1 - ch) * 2)
  108. /* 3 bytes registers */
  109. #define AD3552R_REG_START_24B 0x37
  110. #define AD3552R_REG_ADDR_HW_LDAC_24B 0x37
  111. #define AD3552R_REG_ADDR_CH_DAC_24B(ch) (0x3D - (1 - ch) * 3)
  112. #define AD3552R_REG_ADDR_DAC_PAGE_MASK_24B 0x40
  113. #define AD3552R_REG_ADDR_CH_SELECT_24B 0x41
  114. #define AD3552R_REG_ADDR_INPUT_PAGE_MASK_24B 0x44
  115. #define AD3552R_REG_ADDR_SW_LDAC_24B 0x45
  116. #define AD3552R_REG_ADDR_CH_INPUT_24B(ch) (0x4B - (1 - ch) * 3)
  117. /* Useful defines */
  118. #define AD3552R_NUM_CH 2
  119. #define AD3552R_MASK_CH(ch) BIT(ch)
  120. #define AD3552R_MASK_ALL_CH GENMASK(1, 0)
  121. #define AD3552R_MAX_REG_SIZE 3
  122. #define AD3552R_READ_BIT BIT(7)
  123. #define AD3552R_ADDR_MASK GENMASK(6, 0)
  124. #define AD3552R_MASK_DAC_12B 0xFFF0
  125. #define AD3552R_DEFAULT_CONFIG_B_VALUE 0x8
  126. #define AD3552R_SCRATCH_PAD_TEST_VAL1 0x34
  127. #define AD3552R_SCRATCH_PAD_TEST_VAL2 0xB2
  128. #define AD3552R_GAIN_SCALE 1000
  129. #define AD3552R_LDAC_PULSE_US 100
  130. enum ad3552r_ch_vref_select {
  131. /* Internal source with Vref I/O floating */
  132. AD3552R_INTERNAL_VREF_PIN_FLOATING,
  133. /* Internal source with Vref I/O at 2.5V */
  134. AD3552R_INTERNAL_VREF_PIN_2P5V,
  135. /* External source with Vref I/O as input */
  136. AD3552R_EXTERNAL_VREF_PIN_INPUT
  137. };
  138. enum ad3542r_id {
  139. AD3542R_ID = 0x4009,
  140. AD3552R_ID = 0x4008,
  141. };
  142. enum ad3552r_ch_output_range {
  143. /* Range from 0 V to 2.5 V. Requires Rfb1x connection */
  144. AD3552R_CH_OUTPUT_RANGE_0__2P5V,
  145. /* Range from 0 V to 5 V. Requires Rfb1x connection */
  146. AD3552R_CH_OUTPUT_RANGE_0__5V,
  147. /* Range from 0 V to 10 V. Requires Rfb2x connection */
  148. AD3552R_CH_OUTPUT_RANGE_0__10V,
  149. /* Range from -5 V to 5 V. Requires Rfb2x connection */
  150. AD3552R_CH_OUTPUT_RANGE_NEG_5__5V,
  151. /* Range from -10 V to 10 V. Requires Rfb4x connection */
  152. AD3552R_CH_OUTPUT_RANGE_NEG_10__10V,
  153. };
  154. static const s32 ad3552r_ch_ranges[][2] = {
  155. [AD3552R_CH_OUTPUT_RANGE_0__2P5V] = {0, 2500},
  156. [AD3552R_CH_OUTPUT_RANGE_0__5V] = {0, 5000},
  157. [AD3552R_CH_OUTPUT_RANGE_0__10V] = {0, 10000},
  158. [AD3552R_CH_OUTPUT_RANGE_NEG_5__5V] = {-5000, 5000},
  159. [AD3552R_CH_OUTPUT_RANGE_NEG_10__10V] = {-10000, 10000}
  160. };
  161. enum ad3542r_ch_output_range {
  162. /* Range from 0 V to 2.5 V. Requires Rfb1x connection */
  163. AD3542R_CH_OUTPUT_RANGE_0__2P5V,
  164. /* Range from 0 V to 3 V. Requires Rfb1x connection */
  165. AD3542R_CH_OUTPUT_RANGE_0__3V,
  166. /* Range from 0 V to 5 V. Requires Rfb1x connection */
  167. AD3542R_CH_OUTPUT_RANGE_0__5V,
  168. /* Range from 0 V to 10 V. Requires Rfb2x connection */
  169. AD3542R_CH_OUTPUT_RANGE_0__10V,
  170. /* Range from -2.5 V to 7.5 V. Requires Rfb2x connection */
  171. AD3542R_CH_OUTPUT_RANGE_NEG_2P5__7P5V,
  172. /* Range from -5 V to 5 V. Requires Rfb2x connection */
  173. AD3542R_CH_OUTPUT_RANGE_NEG_5__5V,
  174. };
  175. static const s32 ad3542r_ch_ranges[][2] = {
  176. [AD3542R_CH_OUTPUT_RANGE_0__2P5V] = {0, 2500},
  177. [AD3542R_CH_OUTPUT_RANGE_0__3V] = {0, 3000},
  178. [AD3542R_CH_OUTPUT_RANGE_0__5V] = {0, 5000},
  179. [AD3542R_CH_OUTPUT_RANGE_0__10V] = {0, 10000},
  180. [AD3542R_CH_OUTPUT_RANGE_NEG_2P5__7P5V] = {-2500, 7500},
  181. [AD3542R_CH_OUTPUT_RANGE_NEG_5__5V] = {-5000, 5000}
  182. };
  183. enum ad3552r_ch_gain_scaling {
  184. /* Gain scaling of 1 */
  185. AD3552R_CH_GAIN_SCALING_1,
  186. /* Gain scaling of 0.5 */
  187. AD3552R_CH_GAIN_SCALING_0_5,
  188. /* Gain scaling of 0.25 */
  189. AD3552R_CH_GAIN_SCALING_0_25,
  190. /* Gain scaling of 0.125 */
  191. AD3552R_CH_GAIN_SCALING_0_125,
  192. };
  193. /* Gain * AD3552R_GAIN_SCALE */
  194. static const s32 gains_scaling_table[] = {
  195. [AD3552R_CH_GAIN_SCALING_1] = 1000,
  196. [AD3552R_CH_GAIN_SCALING_0_5] = 500,
  197. [AD3552R_CH_GAIN_SCALING_0_25] = 250,
  198. [AD3552R_CH_GAIN_SCALING_0_125] = 125
  199. };
  200. enum ad3552r_dev_attributes {
  201. /* - Direct register values */
  202. /* From 0-3 */
  203. AD3552R_SDO_DRIVE_STRENGTH,
  204. /*
  205. * 0 -> Internal Vref, vref_io pin floating (default)
  206. * 1 -> Internal Vref, vref_io driven by internal vref
  207. * 2 or 3 -> External Vref
  208. */
  209. AD3552R_VREF_SELECT,
  210. /* Read registers in ascending order if set. Else descending */
  211. AD3552R_ADDR_ASCENSION,
  212. };
  213. enum ad3552r_ch_attributes {
  214. /* DAC powerdown */
  215. AD3552R_CH_DAC_POWERDOWN,
  216. /* DAC amplifier powerdown */
  217. AD3552R_CH_AMPLIFIER_POWERDOWN,
  218. /* Select the output range. Select from enum ad3552r_ch_output_range */
  219. AD3552R_CH_OUTPUT_RANGE_SEL,
  220. /*
  221. * Over-rider the range selector in order to manually set the output
  222. * voltage range
  223. */
  224. AD3552R_CH_RANGE_OVERRIDE,
  225. /* Manually set the offset voltage */
  226. AD3552R_CH_GAIN_OFFSET,
  227. /* Sets the polarity of the offset. */
  228. AD3552R_CH_GAIN_OFFSET_POLARITY,
  229. /* PDAC gain scaling */
  230. AD3552R_CH_GAIN_SCALING_P,
  231. /* NDAC gain scaling */
  232. AD3552R_CH_GAIN_SCALING_N,
  233. /* Rfb value */
  234. AD3552R_CH_RFB,
  235. /* Channel select. When set allow Input -> DAC and Mask -> DAC */
  236. AD3552R_CH_SELECT,
  237. };
  238. struct ad3552r_ch_data {
  239. s32 scale_int;
  240. s32 scale_dec;
  241. s32 offset_int;
  242. s32 offset_dec;
  243. s16 gain_offset;
  244. u16 rfb;
  245. u8 n;
  246. u8 p;
  247. u8 range;
  248. bool range_override;
  249. };
  250. struct ad3552r_desc {
  251. /* Used to look the spi bus for atomic operations where needed */
  252. struct mutex lock;
  253. struct gpio_desc *gpio_reset;
  254. struct gpio_desc *gpio_ldac;
  255. struct spi_device *spi;
  256. struct ad3552r_ch_data ch_data[AD3552R_NUM_CH];
  257. struct iio_chan_spec channels[AD3552R_NUM_CH + 1];
  258. unsigned long enabled_ch;
  259. unsigned int num_ch;
  260. enum ad3542r_id chip_id;
  261. };
  262. static const u16 addr_mask_map[][2] = {
  263. [AD3552R_ADDR_ASCENSION] = {
  264. AD3552R_REG_ADDR_INTERFACE_CONFIG_A,
  265. AD3552R_MASK_ADDR_ASCENSION
  266. },
  267. [AD3552R_SDO_DRIVE_STRENGTH] = {
  268. AD3552R_REG_ADDR_INTERFACE_CONFIG_D,
  269. AD3552R_MASK_SDO_DRIVE_STRENGTH
  270. },
  271. [AD3552R_VREF_SELECT] = {
  272. AD3552R_REG_ADDR_SH_REFERENCE_CONFIG,
  273. AD3552R_MASK_REFERENCE_VOLTAGE_SEL
  274. },
  275. };
  276. /* 0 -> reg addr, 1->ch0 mask, 2->ch1 mask */
  277. static const u16 addr_mask_map_ch[][3] = {
  278. [AD3552R_CH_DAC_POWERDOWN] = {
  279. AD3552R_REG_ADDR_POWERDOWN_CONFIG,
  280. AD3552R_MASK_CH_DAC_POWERDOWN(0),
  281. AD3552R_MASK_CH_DAC_POWERDOWN(1)
  282. },
  283. [AD3552R_CH_AMPLIFIER_POWERDOWN] = {
  284. AD3552R_REG_ADDR_POWERDOWN_CONFIG,
  285. AD3552R_MASK_CH_AMPLIFIER_POWERDOWN(0),
  286. AD3552R_MASK_CH_AMPLIFIER_POWERDOWN(1)
  287. },
  288. [AD3552R_CH_OUTPUT_RANGE_SEL] = {
  289. AD3552R_REG_ADDR_CH0_CH1_OUTPUT_RANGE,
  290. AD3552R_MASK_CH_OUTPUT_RANGE_SEL(0),
  291. AD3552R_MASK_CH_OUTPUT_RANGE_SEL(1)
  292. },
  293. [AD3552R_CH_SELECT] = {
  294. AD3552R_REG_ADDR_CH_SELECT_16B,
  295. AD3552R_MASK_CH(0),
  296. AD3552R_MASK_CH(1)
  297. }
  298. };
  299. static u8 _ad3552r_reg_len(u8 addr)
  300. {
  301. switch (addr) {
  302. case AD3552R_REG_ADDR_HW_LDAC_16B:
  303. case AD3552R_REG_ADDR_CH_SELECT_16B:
  304. case AD3552R_REG_ADDR_SW_LDAC_16B:
  305. case AD3552R_REG_ADDR_HW_LDAC_24B:
  306. case AD3552R_REG_ADDR_CH_SELECT_24B:
  307. case AD3552R_REG_ADDR_SW_LDAC_24B:
  308. return 1;
  309. default:
  310. break;
  311. }
  312. if (addr > AD3552R_REG_ADDR_HW_LDAC_24B)
  313. return 3;
  314. if (addr > AD3552R_REG_ADDR_HW_LDAC_16B)
  315. return 2;
  316. return 1;
  317. }
  318. /* SPI transfer to device */
  319. static int ad3552r_transfer(struct ad3552r_desc *dac, u8 addr, u32 len,
  320. u8 *data, bool is_read)
  321. {
  322. /* Maximum transfer: Addr (1B) + 2 * (Data Reg (3B)) + SW LDAC(1B) */
  323. u8 buf[8];
  324. buf[0] = addr & AD3552R_ADDR_MASK;
  325. buf[0] |= is_read ? AD3552R_READ_BIT : 0;
  326. if (is_read)
  327. return spi_write_then_read(dac->spi, buf, 1, data, len);
  328. memcpy(buf + 1, data, len);
  329. return spi_write_then_read(dac->spi, buf, len + 1, NULL, 0);
  330. }
  331. static int ad3552r_write_reg(struct ad3552r_desc *dac, u8 addr, u16 val)
  332. {
  333. u8 reg_len;
  334. u8 buf[AD3552R_MAX_REG_SIZE] = { 0 };
  335. reg_len = _ad3552r_reg_len(addr);
  336. if (reg_len == 2)
  337. /* Only DAC register are 2 bytes wide */
  338. val &= AD3552R_MASK_DAC_12B;
  339. if (reg_len == 1)
  340. buf[0] = val & 0xFF;
  341. else
  342. /* reg_len can be 2 or 3, but 3rd bytes needs to be set to 0 */
  343. put_unaligned_be16(val, buf);
  344. return ad3552r_transfer(dac, addr, reg_len, buf, false);
  345. }
  346. static int ad3552r_read_reg(struct ad3552r_desc *dac, u8 addr, u16 *val)
  347. {
  348. int err;
  349. u8 reg_len, buf[AD3552R_MAX_REG_SIZE] = { 0 };
  350. reg_len = _ad3552r_reg_len(addr);
  351. err = ad3552r_transfer(dac, addr, reg_len, buf, true);
  352. if (err)
  353. return err;
  354. if (reg_len == 1)
  355. *val = buf[0];
  356. else
  357. /* reg_len can be 2 or 3, but only first 2 bytes are relevant */
  358. *val = get_unaligned_be16(buf);
  359. return 0;
  360. }
  361. static u16 ad3552r_field_prep(u16 val, u16 mask)
  362. {
  363. return (val << __ffs(mask)) & mask;
  364. }
  365. /* Update field of a register, shift val if needed */
  366. static int ad3552r_update_reg_field(struct ad3552r_desc *dac, u8 addr, u16 mask,
  367. u16 val)
  368. {
  369. int ret;
  370. u16 reg;
  371. ret = ad3552r_read_reg(dac, addr, &reg);
  372. if (ret < 0)
  373. return ret;
  374. reg &= ~mask;
  375. reg |= ad3552r_field_prep(val, mask);
  376. return ad3552r_write_reg(dac, addr, reg);
  377. }
  378. static int ad3552r_set_ch_value(struct ad3552r_desc *dac,
  379. enum ad3552r_ch_attributes attr,
  380. u8 ch,
  381. u16 val)
  382. {
  383. /* Update register related to attributes in chip */
  384. return ad3552r_update_reg_field(dac, addr_mask_map_ch[attr][0],
  385. addr_mask_map_ch[attr][ch + 1], val);
  386. }
  387. #define AD3552R_CH_DAC(_idx) ((struct iio_chan_spec) { \
  388. .type = IIO_VOLTAGE, \
  389. .output = true, \
  390. .indexed = true, \
  391. .channel = _idx, \
  392. .scan_index = _idx, \
  393. .scan_type = { \
  394. .sign = 'u', \
  395. .realbits = 16, \
  396. .storagebits = 16, \
  397. .endianness = IIO_BE, \
  398. }, \
  399. .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \
  400. BIT(IIO_CHAN_INFO_SCALE) | \
  401. BIT(IIO_CHAN_INFO_ENABLE) | \
  402. BIT(IIO_CHAN_INFO_OFFSET), \
  403. })
  404. static int ad3552r_read_raw(struct iio_dev *indio_dev,
  405. struct iio_chan_spec const *chan,
  406. int *val,
  407. int *val2,
  408. long mask)
  409. {
  410. struct ad3552r_desc *dac = iio_priv(indio_dev);
  411. u16 tmp_val;
  412. int err;
  413. u8 ch = chan->channel;
  414. switch (mask) {
  415. case IIO_CHAN_INFO_RAW:
  416. mutex_lock(&dac->lock);
  417. err = ad3552r_read_reg(dac, AD3552R_REG_ADDR_CH_DAC_24B(ch),
  418. &tmp_val);
  419. mutex_unlock(&dac->lock);
  420. if (err < 0)
  421. return err;
  422. *val = tmp_val;
  423. return IIO_VAL_INT;
  424. case IIO_CHAN_INFO_ENABLE:
  425. mutex_lock(&dac->lock);
  426. err = ad3552r_read_reg(dac, AD3552R_REG_ADDR_POWERDOWN_CONFIG,
  427. &tmp_val);
  428. mutex_unlock(&dac->lock);
  429. if (err < 0)
  430. return err;
  431. *val = !((tmp_val & AD3552R_MASK_CH_DAC_POWERDOWN(ch)) >>
  432. __ffs(AD3552R_MASK_CH_DAC_POWERDOWN(ch)));
  433. return IIO_VAL_INT;
  434. case IIO_CHAN_INFO_SCALE:
  435. *val = dac->ch_data[ch].scale_int;
  436. *val2 = dac->ch_data[ch].scale_dec;
  437. return IIO_VAL_INT_PLUS_MICRO;
  438. case IIO_CHAN_INFO_OFFSET:
  439. *val = dac->ch_data[ch].offset_int;
  440. *val2 = dac->ch_data[ch].offset_dec;
  441. return IIO_VAL_INT_PLUS_MICRO;
  442. default:
  443. return -EINVAL;
  444. }
  445. }
  446. static int ad3552r_write_raw(struct iio_dev *indio_dev,
  447. struct iio_chan_spec const *chan,
  448. int val,
  449. int val2,
  450. long mask)
  451. {
  452. struct ad3552r_desc *dac = iio_priv(indio_dev);
  453. int err;
  454. mutex_lock(&dac->lock);
  455. switch (mask) {
  456. case IIO_CHAN_INFO_RAW:
  457. err = ad3552r_write_reg(dac,
  458. AD3552R_REG_ADDR_CH_DAC_24B(chan->channel),
  459. val);
  460. break;
  461. case IIO_CHAN_INFO_ENABLE:
  462. err = ad3552r_set_ch_value(dac, AD3552R_CH_DAC_POWERDOWN,
  463. chan->channel, !val);
  464. break;
  465. default:
  466. err = -EINVAL;
  467. break;
  468. }
  469. mutex_unlock(&dac->lock);
  470. return err;
  471. }
  472. static const struct iio_info ad3552r_iio_info = {
  473. .read_raw = ad3552r_read_raw,
  474. .write_raw = ad3552r_write_raw
  475. };
  476. static int32_t ad3552r_trigger_hw_ldac(struct gpio_desc *ldac)
  477. {
  478. gpiod_set_value_cansleep(ldac, 0);
  479. usleep_range(AD3552R_LDAC_PULSE_US, AD3552R_LDAC_PULSE_US + 10);
  480. gpiod_set_value_cansleep(ldac, 1);
  481. return 0;
  482. }
  483. static int ad3552r_write_all_channels(struct ad3552r_desc *dac, u8 *data)
  484. {
  485. int err, len;
  486. u8 addr, buff[AD3552R_NUM_CH * AD3552R_MAX_REG_SIZE + 1];
  487. addr = AD3552R_REG_ADDR_CH_INPUT_24B(1);
  488. /* CH1 */
  489. memcpy(buff, data + 2, 2);
  490. buff[2] = 0;
  491. /* CH0 */
  492. memcpy(buff + 3, data, 2);
  493. buff[5] = 0;
  494. len = 6;
  495. if (!dac->gpio_ldac) {
  496. /* Software LDAC */
  497. buff[6] = AD3552R_MASK_ALL_CH;
  498. ++len;
  499. }
  500. err = ad3552r_transfer(dac, addr, len, buff, false);
  501. if (err)
  502. return err;
  503. if (dac->gpio_ldac)
  504. return ad3552r_trigger_hw_ldac(dac->gpio_ldac);
  505. return 0;
  506. }
  507. static int ad3552r_write_codes(struct ad3552r_desc *dac, u32 mask, u8 *data)
  508. {
  509. int err;
  510. u8 addr, buff[AD3552R_MAX_REG_SIZE];
  511. if (mask == AD3552R_MASK_ALL_CH) {
  512. if (memcmp(data, data + 2, 2) != 0)
  513. return ad3552r_write_all_channels(dac, data);
  514. addr = AD3552R_REG_ADDR_INPUT_PAGE_MASK_24B;
  515. } else {
  516. addr = AD3552R_REG_ADDR_CH_INPUT_24B(__ffs(mask));
  517. }
  518. memcpy(buff, data, 2);
  519. buff[2] = 0;
  520. err = ad3552r_transfer(dac, addr, 3, data, false);
  521. if (err)
  522. return err;
  523. if (dac->gpio_ldac)
  524. return ad3552r_trigger_hw_ldac(dac->gpio_ldac);
  525. return ad3552r_write_reg(dac, AD3552R_REG_ADDR_SW_LDAC_24B, mask);
  526. }
  527. static irqreturn_t ad3552r_trigger_handler(int irq, void *p)
  528. {
  529. struct iio_poll_func *pf = p;
  530. struct iio_dev *indio_dev = pf->indio_dev;
  531. struct iio_buffer *buf = indio_dev->buffer;
  532. struct ad3552r_desc *dac = iio_priv(indio_dev);
  533. /* Maximum size of a scan */
  534. u8 buff[AD3552R_NUM_CH * AD3552R_MAX_REG_SIZE];
  535. int err;
  536. memset(buff, 0, sizeof(buff));
  537. err = iio_pop_from_buffer(buf, buff);
  538. if (err)
  539. goto end;
  540. mutex_lock(&dac->lock);
  541. ad3552r_write_codes(dac, *indio_dev->active_scan_mask, buff);
  542. mutex_unlock(&dac->lock);
  543. end:
  544. iio_trigger_notify_done(indio_dev->trig);
  545. return IRQ_HANDLED;
  546. }
  547. static int ad3552r_check_scratch_pad(struct ad3552r_desc *dac)
  548. {
  549. const u16 val1 = AD3552R_SCRATCH_PAD_TEST_VAL1;
  550. const u16 val2 = AD3552R_SCRATCH_PAD_TEST_VAL2;
  551. u16 val;
  552. int err;
  553. err = ad3552r_write_reg(dac, AD3552R_REG_ADDR_SCRATCH_PAD, val1);
  554. if (err < 0)
  555. return err;
  556. err = ad3552r_read_reg(dac, AD3552R_REG_ADDR_SCRATCH_PAD, &val);
  557. if (err < 0)
  558. return err;
  559. if (val1 != val)
  560. return -ENODEV;
  561. err = ad3552r_write_reg(dac, AD3552R_REG_ADDR_SCRATCH_PAD, val2);
  562. if (err < 0)
  563. return err;
  564. err = ad3552r_read_reg(dac, AD3552R_REG_ADDR_SCRATCH_PAD, &val);
  565. if (err < 0)
  566. return err;
  567. if (val2 != val)
  568. return -ENODEV;
  569. return 0;
  570. }
  571. struct reg_addr_pool {
  572. struct ad3552r_desc *dac;
  573. u8 addr;
  574. };
  575. static int ad3552r_read_reg_wrapper(struct reg_addr_pool *addr)
  576. {
  577. int err;
  578. u16 val;
  579. err = ad3552r_read_reg(addr->dac, addr->addr, &val);
  580. if (err)
  581. return err;
  582. return val;
  583. }
  584. static int ad3552r_reset(struct ad3552r_desc *dac)
  585. {
  586. struct reg_addr_pool addr;
  587. int ret;
  588. int val;
  589. dac->gpio_reset = devm_gpiod_get_optional(&dac->spi->dev, "reset",
  590. GPIOD_OUT_LOW);
  591. if (IS_ERR(dac->gpio_reset))
  592. return dev_err_probe(&dac->spi->dev, PTR_ERR(dac->gpio_reset),
  593. "Error while getting gpio reset");
  594. if (dac->gpio_reset) {
  595. /* Perform hardware reset */
  596. usleep_range(10, 20);
  597. gpiod_set_value_cansleep(dac->gpio_reset, 1);
  598. } else {
  599. /* Perform software reset if no GPIO provided */
  600. ret = ad3552r_update_reg_field(dac,
  601. AD3552R_REG_ADDR_INTERFACE_CONFIG_A,
  602. AD3552R_MASK_SOFTWARE_RESET,
  603. AD3552R_MASK_SOFTWARE_RESET);
  604. if (ret < 0)
  605. return ret;
  606. }
  607. addr.dac = dac;
  608. addr.addr = AD3552R_REG_ADDR_INTERFACE_CONFIG_B;
  609. ret = readx_poll_timeout(ad3552r_read_reg_wrapper, &addr, val,
  610. val == AD3552R_DEFAULT_CONFIG_B_VALUE ||
  611. val < 0,
  612. 5000, 50000);
  613. if (val < 0)
  614. ret = val;
  615. if (ret) {
  616. dev_err(&dac->spi->dev, "Error while resetting");
  617. return ret;
  618. }
  619. ret = readx_poll_timeout(ad3552r_read_reg_wrapper, &addr, val,
  620. !(val & AD3552R_MASK_INTERFACE_NOT_READY) ||
  621. val < 0,
  622. 5000, 50000);
  623. if (val < 0)
  624. ret = val;
  625. if (ret) {
  626. dev_err(&dac->spi->dev, "Error while resetting");
  627. return ret;
  628. }
  629. return ad3552r_update_reg_field(dac,
  630. addr_mask_map[AD3552R_ADDR_ASCENSION][0],
  631. addr_mask_map[AD3552R_ADDR_ASCENSION][1],
  632. val);
  633. }
  634. static void ad3552r_get_custom_range(struct ad3552r_desc *dac, s32 i, s32 *v_min,
  635. s32 *v_max)
  636. {
  637. s64 vref, tmp, common, offset, gn, gp;
  638. /*
  639. * From datasheet formula (In Volts):
  640. * Vmin = 2.5 + [(GainN + Offset / 1024) * 2.5 * Rfb * 1.03]
  641. * Vmax = 2.5 - [(GainP + Offset / 1024) * 2.5 * Rfb * 1.03]
  642. * Calculus are converted to milivolts
  643. */
  644. vref = 2500;
  645. /* 2.5 * 1.03 * 1000 (To mV) */
  646. common = 2575 * dac->ch_data[i].rfb;
  647. offset = dac->ch_data[i].gain_offset;
  648. gn = gains_scaling_table[dac->ch_data[i].n];
  649. tmp = (1024 * gn + AD3552R_GAIN_SCALE * offset) * common;
  650. tmp = div_s64(tmp, 1024 * AD3552R_GAIN_SCALE);
  651. *v_max = vref + tmp;
  652. gp = gains_scaling_table[dac->ch_data[i].p];
  653. tmp = (1024 * gp - AD3552R_GAIN_SCALE * offset) * common;
  654. tmp = div_s64(tmp, 1024 * AD3552R_GAIN_SCALE);
  655. *v_min = vref - tmp;
  656. }
  657. static void ad3552r_calc_gain_and_offset(struct ad3552r_desc *dac, s32 ch)
  658. {
  659. s32 idx, v_max, v_min, span, rem;
  660. s64 tmp;
  661. if (dac->ch_data[ch].range_override) {
  662. ad3552r_get_custom_range(dac, ch, &v_min, &v_max);
  663. } else {
  664. /* Normal range */
  665. idx = dac->ch_data[ch].range;
  666. if (dac->chip_id == AD3542R_ID) {
  667. v_min = ad3542r_ch_ranges[idx][0];
  668. v_max = ad3542r_ch_ranges[idx][1];
  669. } else {
  670. v_min = ad3552r_ch_ranges[idx][0];
  671. v_max = ad3552r_ch_ranges[idx][1];
  672. }
  673. }
  674. /*
  675. * From datasheet formula:
  676. * Vout = Span * (D / 65536) + Vmin
  677. * Converted to scale and offset:
  678. * Scale = Span / 65536
  679. * Offset = 65536 * Vmin / Span
  680. *
  681. * Reminders are in micros in order to be printed as
  682. * IIO_VAL_INT_PLUS_MICRO
  683. */
  684. span = v_max - v_min;
  685. dac->ch_data[ch].scale_int = div_s64_rem(span, 65536, &rem);
  686. /* Do operations in microvolts */
  687. dac->ch_data[ch].scale_dec = DIV_ROUND_CLOSEST((s64)rem * 1000000,
  688. 65536);
  689. dac->ch_data[ch].offset_int = div_s64_rem(v_min * 65536, span, &rem);
  690. tmp = (s64)rem * 1000000;
  691. dac->ch_data[ch].offset_dec = div_s64(tmp, span);
  692. }
  693. static int ad3552r_find_range(u16 id, s32 *vals)
  694. {
  695. int i, len;
  696. const s32 (*ranges)[2];
  697. if (id == AD3542R_ID) {
  698. len = ARRAY_SIZE(ad3542r_ch_ranges);
  699. ranges = ad3542r_ch_ranges;
  700. } else {
  701. len = ARRAY_SIZE(ad3552r_ch_ranges);
  702. ranges = ad3552r_ch_ranges;
  703. }
  704. for (i = 0; i < len; i++)
  705. if (vals[0] == ranges[i][0] * 1000 &&
  706. vals[1] == ranges[i][1] * 1000)
  707. return i;
  708. return -EINVAL;
  709. }
  710. static int ad3552r_configure_custom_gain(struct ad3552r_desc *dac,
  711. struct fwnode_handle *child,
  712. u32 ch)
  713. {
  714. struct device *dev = &dac->spi->dev;
  715. struct fwnode_handle *gain_child;
  716. u32 val;
  717. int err;
  718. u8 addr;
  719. u16 reg = 0, offset;
  720. gain_child = fwnode_get_named_child_node(child,
  721. "custom-output-range-config");
  722. if (!gain_child) {
  723. dev_err(dev,
  724. "mandatory custom-output-range-config property missing\n");
  725. return -EINVAL;
  726. }
  727. dac->ch_data[ch].range_override = 1;
  728. reg |= ad3552r_field_prep(1, AD3552R_MASK_CH_RANGE_OVERRIDE);
  729. err = fwnode_property_read_u32(gain_child, "adi,gain-scaling-p", &val);
  730. if (err) {
  731. dev_err(dev, "mandatory adi,gain-scaling-p property missing\n");
  732. goto put_child;
  733. }
  734. reg |= ad3552r_field_prep(val, AD3552R_MASK_CH_GAIN_SCALING_P);
  735. dac->ch_data[ch].p = val;
  736. err = fwnode_property_read_u32(gain_child, "adi,gain-scaling-n", &val);
  737. if (err) {
  738. dev_err(dev, "mandatory adi,gain-scaling-n property missing\n");
  739. goto put_child;
  740. }
  741. reg |= ad3552r_field_prep(val, AD3552R_MASK_CH_GAIN_SCALING_N);
  742. dac->ch_data[ch].n = val;
  743. err = fwnode_property_read_u32(gain_child, "adi,rfb-ohms", &val);
  744. if (err) {
  745. dev_err(dev, "mandatory adi,rfb-ohms property missing\n");
  746. goto put_child;
  747. }
  748. dac->ch_data[ch].rfb = val;
  749. err = fwnode_property_read_u32(gain_child, "adi,gain-offset", &val);
  750. if (err) {
  751. dev_err(dev, "mandatory adi,gain-offset property missing\n");
  752. goto put_child;
  753. }
  754. dac->ch_data[ch].gain_offset = val;
  755. offset = abs((s32)val);
  756. reg |= ad3552r_field_prep((offset >> 8), AD3552R_MASK_CH_OFFSET_BIT_8);
  757. reg |= ad3552r_field_prep((s32)val < 0, AD3552R_MASK_CH_OFFSET_POLARITY);
  758. addr = AD3552R_REG_ADDR_CH_GAIN(ch);
  759. err = ad3552r_write_reg(dac, addr,
  760. offset & AD3552R_MASK_CH_OFFSET_BITS_0_7);
  761. if (err) {
  762. dev_err(dev, "Error writing register\n");
  763. goto put_child;
  764. }
  765. err = ad3552r_write_reg(dac, addr, reg);
  766. if (err) {
  767. dev_err(dev, "Error writing register\n");
  768. goto put_child;
  769. }
  770. put_child:
  771. fwnode_handle_put(gain_child);
  772. return err;
  773. }
  774. static void ad3552r_reg_disable(void *reg)
  775. {
  776. regulator_disable(reg);
  777. }
  778. static int ad3552r_configure_device(struct ad3552r_desc *dac)
  779. {
  780. struct device *dev = &dac->spi->dev;
  781. struct fwnode_handle *child;
  782. struct regulator *vref;
  783. int err, cnt = 0, voltage, delta = 100000;
  784. u32 vals[2], val, ch;
  785. dac->gpio_ldac = devm_gpiod_get_optional(dev, "ldac", GPIOD_OUT_HIGH);
  786. if (IS_ERR(dac->gpio_ldac))
  787. return dev_err_probe(dev, PTR_ERR(dac->gpio_ldac),
  788. "Error getting gpio ldac");
  789. vref = devm_regulator_get_optional(dev, "vref");
  790. if (IS_ERR(vref)) {
  791. if (PTR_ERR(vref) != -ENODEV)
  792. return dev_err_probe(dev, PTR_ERR(vref),
  793. "Error getting vref");
  794. if (device_property_read_bool(dev, "adi,vref-out-en"))
  795. val = AD3552R_INTERNAL_VREF_PIN_2P5V;
  796. else
  797. val = AD3552R_INTERNAL_VREF_PIN_FLOATING;
  798. } else {
  799. err = regulator_enable(vref);
  800. if (err) {
  801. dev_err(dev, "Failed to enable external vref supply\n");
  802. return err;
  803. }
  804. err = devm_add_action_or_reset(dev, ad3552r_reg_disable, vref);
  805. if (err) {
  806. regulator_disable(vref);
  807. return err;
  808. }
  809. voltage = regulator_get_voltage(vref);
  810. if (voltage > 2500000 + delta || voltage < 2500000 - delta) {
  811. dev_warn(dev, "vref-supply must be 2.5V");
  812. return -EINVAL;
  813. }
  814. val = AD3552R_EXTERNAL_VREF_PIN_INPUT;
  815. }
  816. err = ad3552r_update_reg_field(dac,
  817. addr_mask_map[AD3552R_VREF_SELECT][0],
  818. addr_mask_map[AD3552R_VREF_SELECT][1],
  819. val);
  820. if (err)
  821. return err;
  822. err = device_property_read_u32(dev, "adi,sdo-drive-strength", &val);
  823. if (!err) {
  824. if (val > 3) {
  825. dev_err(dev, "adi,sdo-drive-strength must be less than 4\n");
  826. return -EINVAL;
  827. }
  828. err = ad3552r_update_reg_field(dac,
  829. addr_mask_map[AD3552R_SDO_DRIVE_STRENGTH][0],
  830. addr_mask_map[AD3552R_SDO_DRIVE_STRENGTH][1],
  831. val);
  832. if (err)
  833. return err;
  834. }
  835. dac->num_ch = device_get_child_node_count(dev);
  836. if (!dac->num_ch) {
  837. dev_err(dev, "No channels defined\n");
  838. return -ENODEV;
  839. }
  840. device_for_each_child_node(dev, child) {
  841. err = fwnode_property_read_u32(child, "reg", &ch);
  842. if (err) {
  843. dev_err(dev, "mandatory reg property missing\n");
  844. goto put_child;
  845. }
  846. if (ch >= AD3552R_NUM_CH) {
  847. dev_err(dev, "reg must be less than %d\n",
  848. AD3552R_NUM_CH);
  849. err = -EINVAL;
  850. goto put_child;
  851. }
  852. if (fwnode_property_present(child, "adi,output-range-microvolt")) {
  853. err = fwnode_property_read_u32_array(child,
  854. "adi,output-range-microvolt",
  855. vals,
  856. 2);
  857. if (err) {
  858. dev_err(dev,
  859. "adi,output-range-microvolt property could not be parsed\n");
  860. goto put_child;
  861. }
  862. err = ad3552r_find_range(dac->chip_id, vals);
  863. if (err < 0) {
  864. dev_err(dev,
  865. "Invalid adi,output-range-microvolt value\n");
  866. goto put_child;
  867. }
  868. val = err;
  869. err = ad3552r_set_ch_value(dac,
  870. AD3552R_CH_OUTPUT_RANGE_SEL,
  871. ch, val);
  872. if (err)
  873. goto put_child;
  874. dac->ch_data[ch].range = val;
  875. } else if (dac->chip_id == AD3542R_ID) {
  876. dev_err(dev,
  877. "adi,output-range-microvolt is required for ad3542r\n");
  878. err = -EINVAL;
  879. goto put_child;
  880. } else {
  881. err = ad3552r_configure_custom_gain(dac, child, ch);
  882. if (err)
  883. goto put_child;
  884. }
  885. ad3552r_calc_gain_and_offset(dac, ch);
  886. dac->enabled_ch |= BIT(ch);
  887. err = ad3552r_set_ch_value(dac, AD3552R_CH_SELECT, ch, 1);
  888. if (err < 0)
  889. goto put_child;
  890. dac->channels[cnt] = AD3552R_CH_DAC(ch);
  891. ++cnt;
  892. }
  893. /* Disable unused channels */
  894. for_each_clear_bit(ch, &dac->enabled_ch, AD3552R_NUM_CH) {
  895. err = ad3552r_set_ch_value(dac, AD3552R_CH_AMPLIFIER_POWERDOWN,
  896. ch, 1);
  897. if (err)
  898. return err;
  899. }
  900. dac->num_ch = cnt;
  901. return 0;
  902. put_child:
  903. fwnode_handle_put(child);
  904. return err;
  905. }
  906. static int ad3552r_init(struct ad3552r_desc *dac)
  907. {
  908. int err;
  909. u16 val, id;
  910. err = ad3552r_reset(dac);
  911. if (err) {
  912. dev_err(&dac->spi->dev, "Reset failed\n");
  913. return err;
  914. }
  915. err = ad3552r_check_scratch_pad(dac);
  916. if (err) {
  917. dev_err(&dac->spi->dev, "Scratch pad test failed\n");
  918. return err;
  919. }
  920. err = ad3552r_read_reg(dac, AD3552R_REG_ADDR_PRODUCT_ID_L, &val);
  921. if (err) {
  922. dev_err(&dac->spi->dev, "Fail read PRODUCT_ID_L\n");
  923. return err;
  924. }
  925. id = val;
  926. err = ad3552r_read_reg(dac, AD3552R_REG_ADDR_PRODUCT_ID_H, &val);
  927. if (err) {
  928. dev_err(&dac->spi->dev, "Fail read PRODUCT_ID_H\n");
  929. return err;
  930. }
  931. id |= val << 8;
  932. if (id != dac->chip_id) {
  933. dev_err(&dac->spi->dev, "Product id not matching\n");
  934. return -ENODEV;
  935. }
  936. return ad3552r_configure_device(dac);
  937. }
  938. static int ad3552r_probe(struct spi_device *spi)
  939. {
  940. const struct spi_device_id *id = spi_get_device_id(spi);
  941. struct ad3552r_desc *dac;
  942. struct iio_dev *indio_dev;
  943. int err;
  944. indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*dac));
  945. if (!indio_dev)
  946. return -ENOMEM;
  947. dac = iio_priv(indio_dev);
  948. dac->spi = spi;
  949. dac->chip_id = id->driver_data;
  950. mutex_init(&dac->lock);
  951. err = ad3552r_init(dac);
  952. if (err)
  953. return err;
  954. /* Config triggered buffer device */
  955. if (dac->chip_id == AD3552R_ID)
  956. indio_dev->name = "ad3552r";
  957. else
  958. indio_dev->name = "ad3542r";
  959. indio_dev->dev.parent = &spi->dev;
  960. indio_dev->info = &ad3552r_iio_info;
  961. indio_dev->num_channels = dac->num_ch;
  962. indio_dev->channels = dac->channels;
  963. indio_dev->modes = INDIO_DIRECT_MODE;
  964. err = devm_iio_triggered_buffer_setup_ext(&indio_dev->dev, indio_dev, NULL,
  965. &ad3552r_trigger_handler,
  966. IIO_BUFFER_DIRECTION_OUT,
  967. NULL,
  968. NULL);
  969. if (err)
  970. return err;
  971. return devm_iio_device_register(&spi->dev, indio_dev);
  972. }
  973. static const struct spi_device_id ad3552r_id[] = {
  974. { "ad3542r", AD3542R_ID },
  975. { "ad3552r", AD3552R_ID },
  976. { }
  977. };
  978. MODULE_DEVICE_TABLE(spi, ad3552r_id);
  979. static const struct of_device_id ad3552r_of_match[] = {
  980. { .compatible = "adi,ad3542r"},
  981. { .compatible = "adi,ad3552r"},
  982. { }
  983. };
  984. MODULE_DEVICE_TABLE(of, ad3552r_of_match);
  985. static struct spi_driver ad3552r_driver = {
  986. .driver = {
  987. .name = "ad3552r",
  988. .of_match_table = ad3552r_of_match,
  989. },
  990. .probe = ad3552r_probe,
  991. .id_table = ad3552r_id
  992. };
  993. module_spi_driver(ad3552r_driver);
  994. MODULE_AUTHOR("Mihail Chindris <[email protected]>");
  995. MODULE_DESCRIPTION("Analog Device AD3552R DAC");
  996. MODULE_LICENSE("GPL v2");