1 // SPDX-License-Identifier: GPL-2.0-only
3 * Analog Devices AD3552R
4 * Digital to Analog converter driver
6 * Copyright 2021 Analog Devices Inc.
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>
17 /* Register addresses */
18 /* Primary address space */
19 #define AD3552R_REG_ADDR_INTERFACE_CONFIG_A 0x00
20 #define AD3552R_MASK_SOFTWARE_RESET (BIT(7) | BIT(0))
21 #define AD3552R_MASK_ADDR_ASCENSION BIT(5)
22 #define AD3552R_MASK_SDO_ACTIVE BIT(4)
23 #define AD3552R_REG_ADDR_INTERFACE_CONFIG_B 0x01
24 #define AD3552R_MASK_SINGLE_INST BIT(7)
25 #define AD3552R_MASK_SHORT_INSTRUCTION BIT(3)
26 #define AD3552R_REG_ADDR_DEVICE_CONFIG 0x02
27 #define AD3552R_MASK_DEVICE_STATUS(n) BIT(4 + (n))
28 #define AD3552R_MASK_CUSTOM_MODES GENMASK(3, 2)
29 #define AD3552R_MASK_OPERATING_MODES GENMASK(1, 0)
30 #define AD3552R_REG_ADDR_CHIP_TYPE 0x03
31 #define AD3552R_MASK_CLASS GENMASK(7, 0)
32 #define AD3552R_REG_ADDR_PRODUCT_ID_L 0x04
33 #define AD3552R_REG_ADDR_PRODUCT_ID_H 0x05
34 #define AD3552R_REG_ADDR_CHIP_GRADE 0x06
35 #define AD3552R_MASK_GRADE GENMASK(7, 4)
36 #define AD3552R_MASK_DEVICE_REVISION GENMASK(3, 0)
37 #define AD3552R_REG_ADDR_SCRATCH_PAD 0x0A
38 #define AD3552R_REG_ADDR_SPI_REVISION 0x0B
39 #define AD3552R_REG_ADDR_VENDOR_L 0x0C
40 #define AD3552R_REG_ADDR_VENDOR_H 0x0D
41 #define AD3552R_REG_ADDR_STREAM_MODE 0x0E
42 #define AD3552R_MASK_LENGTH GENMASK(7, 0)
43 #define AD3552R_REG_ADDR_TRANSFER_REGISTER 0x0F
44 #define AD3552R_MASK_MULTI_IO_MODE GENMASK(7, 6)
45 #define AD3552R_MASK_STREAM_LENGTH_KEEP_VALUE BIT(2)
46 #define AD3552R_REG_ADDR_INTERFACE_CONFIG_C 0x10
47 #define AD3552R_MASK_CRC_ENABLE (GENMASK(7, 6) |\
49 #define AD3552R_MASK_STRICT_REGISTER_ACCESS BIT(5)
50 #define AD3552R_REG_ADDR_INTERFACE_STATUS_A 0x11
51 #define AD3552R_MASK_INTERFACE_NOT_READY BIT(7)
52 #define AD3552R_MASK_CLOCK_COUNTING_ERROR BIT(5)
53 #define AD3552R_MASK_INVALID_OR_NO_CRC BIT(3)
54 #define AD3552R_MASK_WRITE_TO_READ_ONLY_REGISTER BIT(2)
55 #define AD3552R_MASK_PARTIAL_REGISTER_ACCESS BIT(1)
56 #define AD3552R_MASK_REGISTER_ADDRESS_INVALID BIT(0)
57 #define AD3552R_REG_ADDR_INTERFACE_CONFIG_D 0x14
58 #define AD3552R_MASK_ALERT_ENABLE_PULLUP BIT(6)
59 #define AD3552R_MASK_MEM_CRC_EN BIT(4)
60 #define AD3552R_MASK_SDO_DRIVE_STRENGTH GENMASK(3, 2)
61 #define AD3552R_MASK_DUAL_SPI_SYNCHROUNOUS_EN BIT(1)
62 #define AD3552R_MASK_SPI_CONFIG_DDR BIT(0)
63 #define AD3552R_REG_ADDR_SH_REFERENCE_CONFIG 0x15
64 #define AD3552R_MASK_IDUMP_FAST_MODE BIT(6)
65 #define AD3552R_MASK_SAMPLE_HOLD_DIFFERENTIAL_USER_EN BIT(5)
66 #define AD3552R_MASK_SAMPLE_HOLD_USER_TRIM GENMASK(4, 3)
67 #define AD3552R_MASK_SAMPLE_HOLD_USER_ENABLE BIT(2)
68 #define AD3552R_MASK_REFERENCE_VOLTAGE_SEL GENMASK(1, 0)
69 #define AD3552R_REG_ADDR_ERR_ALARM_MASK 0x16
70 #define AD3552R_MASK_REF_RANGE_ALARM BIT(6)
71 #define AD3552R_MASK_CLOCK_COUNT_ERR_ALARM BIT(5)
72 #define AD3552R_MASK_MEM_CRC_ERR_ALARM BIT(4)
73 #define AD3552R_MASK_SPI_CRC_ERR_ALARM BIT(3)
74 #define AD3552R_MASK_WRITE_TO_READ_ONLY_ALARM BIT(2)
75 #define AD3552R_MASK_PARTIAL_REGISTER_ACCESS_ALARM BIT(1)
76 #define AD3552R_MASK_REGISTER_ADDRESS_INVALID_ALARM BIT(0)
77 #define AD3552R_REG_ADDR_ERR_STATUS 0x17
78 #define AD3552R_MASK_REF_RANGE_ERR_STATUS BIT(6)
79 #define AD3552R_MASK_DUAL_SPI_STREAM_EXCEEDS_DAC_ERR_STATUS BIT(5)
80 #define AD3552R_MASK_MEM_CRC_ERR_STATUS BIT(4)
81 #define AD3552R_MASK_RESET_STATUS BIT(0)
82 #define AD3552R_REG_ADDR_POWERDOWN_CONFIG 0x18
83 #define AD3552R_MASK_CH_DAC_POWERDOWN(ch) BIT(4 + (ch))
84 #define AD3552R_MASK_CH_AMPLIFIER_POWERDOWN(ch) BIT(ch)
85 #define AD3552R_REG_ADDR_CH0_CH1_OUTPUT_RANGE 0x19
86 #define AD3552R_MASK_CH_OUTPUT_RANGE_SEL(ch) ((ch) ? GENMASK(7, 4) :\
88 #define AD3552R_REG_ADDR_CH_OFFSET(ch) (0x1B + (ch) * 2)
89 #define AD3552R_MASK_CH_OFFSET_BITS_0_7 GENMASK(7, 0)
90 #define AD3552R_REG_ADDR_CH_GAIN(ch) (0x1C + (ch) * 2)
91 #define AD3552R_MASK_CH_RANGE_OVERRIDE BIT(7)
92 #define AD3552R_MASK_CH_GAIN_SCALING_N GENMASK(6, 5)
93 #define AD3552R_MASK_CH_GAIN_SCALING_P GENMASK(4, 3)
94 #define AD3552R_MASK_CH_OFFSET_POLARITY BIT(2)
95 #define AD3552R_MASK_CH_OFFSET_BIT_8 BIT(0)
98 * For multibyte registers specify the highest address because the access is
99 * done in descending order
101 #define AD3552R_SECONDARY_REGION_START 0x28
102 #define AD3552R_REG_ADDR_HW_LDAC_16B 0x28
103 #define AD3552R_REG_ADDR_CH_DAC_16B(ch) (0x2C - (1 - ch) * 2)
104 #define AD3552R_REG_ADDR_DAC_PAGE_MASK_16B 0x2E
105 #define AD3552R_REG_ADDR_CH_SELECT_16B 0x2F
106 #define AD3552R_REG_ADDR_INPUT_PAGE_MASK_16B 0x31
107 #define AD3552R_REG_ADDR_SW_LDAC_16B 0x32
108 #define AD3552R_REG_ADDR_CH_INPUT_16B(ch) (0x36 - (1 - ch) * 2)
109 /* 3 bytes registers */
110 #define AD3552R_REG_START_24B 0x37
111 #define AD3552R_REG_ADDR_HW_LDAC_24B 0x37
112 #define AD3552R_REG_ADDR_CH_DAC_24B(ch) (0x3D - (1 - ch) * 3)
113 #define AD3552R_REG_ADDR_DAC_PAGE_MASK_24B 0x40
114 #define AD3552R_REG_ADDR_CH_SELECT_24B 0x41
115 #define AD3552R_REG_ADDR_INPUT_PAGE_MASK_24B 0x44
116 #define AD3552R_REG_ADDR_SW_LDAC_24B 0x45
117 #define AD3552R_REG_ADDR_CH_INPUT_24B(ch) (0x4B - (1 - ch) * 3)
120 #define AD3552R_MAX_CH 2
121 #define AD3552R_MASK_CH(ch) BIT(ch)
122 #define AD3552R_MASK_ALL_CH GENMASK(1, 0)
123 #define AD3552R_MAX_REG_SIZE 3
124 #define AD3552R_READ_BIT BIT(7)
125 #define AD3552R_ADDR_MASK GENMASK(6, 0)
126 #define AD3552R_MASK_DAC_12B 0xFFF0
127 #define AD3552R_DEFAULT_CONFIG_B_VALUE 0x8
128 #define AD3552R_SCRATCH_PAD_TEST_VAL1 0x34
129 #define AD3552R_SCRATCH_PAD_TEST_VAL2 0xB2
130 #define AD3552R_GAIN_SCALE 1000
131 #define AD3552R_LDAC_PULSE_US 100
133 enum ad3552r_ch_vref_select {
134 /* Internal source with Vref I/O floating */
135 AD3552R_INTERNAL_VREF_PIN_FLOATING,
136 /* Internal source with Vref I/O at 2.5V */
137 AD3552R_INTERNAL_VREF_PIN_2P5V,
138 /* External source with Vref I/O as input */
139 AD3552R_EXTERNAL_VREF_PIN_INPUT
149 enum ad3552r_ch_output_range {
150 /* Range from 0 V to 2.5 V. Requires Rfb1x connection */
151 AD3552R_CH_OUTPUT_RANGE_0__2P5V,
152 /* Range from 0 V to 5 V. Requires Rfb1x connection */
153 AD3552R_CH_OUTPUT_RANGE_0__5V,
154 /* Range from 0 V to 10 V. Requires Rfb2x connection */
155 AD3552R_CH_OUTPUT_RANGE_0__10V,
156 /* Range from -5 V to 5 V. Requires Rfb2x connection */
157 AD3552R_CH_OUTPUT_RANGE_NEG_5__5V,
158 /* Range from -10 V to 10 V. Requires Rfb4x connection */
159 AD3552R_CH_OUTPUT_RANGE_NEG_10__10V,
162 static const s32 ad3552r_ch_ranges[][2] = {
163 [AD3552R_CH_OUTPUT_RANGE_0__2P5V] = {0, 2500},
164 [AD3552R_CH_OUTPUT_RANGE_0__5V] = {0, 5000},
165 [AD3552R_CH_OUTPUT_RANGE_0__10V] = {0, 10000},
166 [AD3552R_CH_OUTPUT_RANGE_NEG_5__5V] = {-5000, 5000},
167 [AD3552R_CH_OUTPUT_RANGE_NEG_10__10V] = {-10000, 10000}
170 enum ad3542r_ch_output_range {
171 /* Range from 0 V to 2.5 V. Requires Rfb1x connection */
172 AD3542R_CH_OUTPUT_RANGE_0__2P5V,
173 /* Range from 0 V to 3 V. Requires Rfb1x connection */
174 AD3542R_CH_OUTPUT_RANGE_0__3V,
175 /* Range from 0 V to 5 V. Requires Rfb1x connection */
176 AD3542R_CH_OUTPUT_RANGE_0__5V,
177 /* Range from 0 V to 10 V. Requires Rfb2x connection */
178 AD3542R_CH_OUTPUT_RANGE_0__10V,
179 /* Range from -2.5 V to 7.5 V. Requires Rfb2x connection */
180 AD3542R_CH_OUTPUT_RANGE_NEG_2P5__7P5V,
181 /* Range from -5 V to 5 V. Requires Rfb2x connection */
182 AD3542R_CH_OUTPUT_RANGE_NEG_5__5V,
185 static const s32 ad3542r_ch_ranges[][2] = {
186 [AD3542R_CH_OUTPUT_RANGE_0__2P5V] = {0, 2500},
187 [AD3542R_CH_OUTPUT_RANGE_0__3V] = {0, 3000},
188 [AD3542R_CH_OUTPUT_RANGE_0__5V] = {0, 5000},
189 [AD3542R_CH_OUTPUT_RANGE_0__10V] = {0, 10000},
190 [AD3542R_CH_OUTPUT_RANGE_NEG_2P5__7P5V] = {-2500, 7500},
191 [AD3542R_CH_OUTPUT_RANGE_NEG_5__5V] = {-5000, 5000}
194 enum ad3552r_ch_gain_scaling {
195 /* Gain scaling of 1 */
196 AD3552R_CH_GAIN_SCALING_1,
197 /* Gain scaling of 0.5 */
198 AD3552R_CH_GAIN_SCALING_0_5,
199 /* Gain scaling of 0.25 */
200 AD3552R_CH_GAIN_SCALING_0_25,
201 /* Gain scaling of 0.125 */
202 AD3552R_CH_GAIN_SCALING_0_125,
205 /* Gain * AD3552R_GAIN_SCALE */
206 static const s32 gains_scaling_table[] = {
207 [AD3552R_CH_GAIN_SCALING_1] = 1000,
208 [AD3552R_CH_GAIN_SCALING_0_5] = 500,
209 [AD3552R_CH_GAIN_SCALING_0_25] = 250,
210 [AD3552R_CH_GAIN_SCALING_0_125] = 125
213 enum ad3552r_dev_attributes {
214 /* - Direct register values */
216 AD3552R_SDO_DRIVE_STRENGTH,
218 * 0 -> Internal Vref, vref_io pin floating (default)
219 * 1 -> Internal Vref, vref_io driven by internal vref
220 * 2 or 3 -> External Vref
223 /* Read registers in ascending order if set. Else descending */
224 AD3552R_ADDR_ASCENSION,
227 enum ad3552r_ch_attributes {
229 AD3552R_CH_DAC_POWERDOWN,
230 /* DAC amplifier powerdown */
231 AD3552R_CH_AMPLIFIER_POWERDOWN,
232 /* Select the output range. Select from enum ad3552r_ch_output_range */
233 AD3552R_CH_OUTPUT_RANGE_SEL,
235 * Over-rider the range selector in order to manually set the output
238 AD3552R_CH_RANGE_OVERRIDE,
239 /* Manually set the offset voltage */
240 AD3552R_CH_GAIN_OFFSET,
241 /* Sets the polarity of the offset. */
242 AD3552R_CH_GAIN_OFFSET_POLARITY,
243 /* PDAC gain scaling */
244 AD3552R_CH_GAIN_SCALING_P,
245 /* NDAC gain scaling */
246 AD3552R_CH_GAIN_SCALING_N,
249 /* Channel select. When set allow Input -> DAC and Mask -> DAC */
253 struct ad3552r_ch_data {
266 struct ad3552r_model_data {
267 const char *model_name;
268 enum ad3552r_id chip_id;
269 unsigned int num_hw_channels;
270 const s32 (*ranges_table)[2];
272 bool requires_output_range;
275 struct ad3552r_desc {
276 const struct ad3552r_model_data *model_data;
277 /* Used to look the spi bus for atomic operations where needed */
279 struct gpio_desc *gpio_reset;
280 struct gpio_desc *gpio_ldac;
281 struct spi_device *spi;
282 struct ad3552r_ch_data ch_data[AD3552R_MAX_CH];
283 struct iio_chan_spec channels[AD3552R_MAX_CH + 1];
284 unsigned long enabled_ch;
288 static const u16 addr_mask_map[][2] = {
289 [AD3552R_ADDR_ASCENSION] = {
290 AD3552R_REG_ADDR_INTERFACE_CONFIG_A,
291 AD3552R_MASK_ADDR_ASCENSION
293 [AD3552R_SDO_DRIVE_STRENGTH] = {
294 AD3552R_REG_ADDR_INTERFACE_CONFIG_D,
295 AD3552R_MASK_SDO_DRIVE_STRENGTH
297 [AD3552R_VREF_SELECT] = {
298 AD3552R_REG_ADDR_SH_REFERENCE_CONFIG,
299 AD3552R_MASK_REFERENCE_VOLTAGE_SEL
303 /* 0 -> reg addr, 1->ch0 mask, 2->ch1 mask */
304 static const u16 addr_mask_map_ch[][3] = {
305 [AD3552R_CH_DAC_POWERDOWN] = {
306 AD3552R_REG_ADDR_POWERDOWN_CONFIG,
307 AD3552R_MASK_CH_DAC_POWERDOWN(0),
308 AD3552R_MASK_CH_DAC_POWERDOWN(1)
310 [AD3552R_CH_AMPLIFIER_POWERDOWN] = {
311 AD3552R_REG_ADDR_POWERDOWN_CONFIG,
312 AD3552R_MASK_CH_AMPLIFIER_POWERDOWN(0),
313 AD3552R_MASK_CH_AMPLIFIER_POWERDOWN(1)
315 [AD3552R_CH_OUTPUT_RANGE_SEL] = {
316 AD3552R_REG_ADDR_CH0_CH1_OUTPUT_RANGE,
317 AD3552R_MASK_CH_OUTPUT_RANGE_SEL(0),
318 AD3552R_MASK_CH_OUTPUT_RANGE_SEL(1)
320 [AD3552R_CH_SELECT] = {
321 AD3552R_REG_ADDR_CH_SELECT_16B,
327 static u8 _ad3552r_reg_len(u8 addr)
330 case AD3552R_REG_ADDR_HW_LDAC_16B:
331 case AD3552R_REG_ADDR_CH_SELECT_16B:
332 case AD3552R_REG_ADDR_SW_LDAC_16B:
333 case AD3552R_REG_ADDR_HW_LDAC_24B:
334 case AD3552R_REG_ADDR_CH_SELECT_24B:
335 case AD3552R_REG_ADDR_SW_LDAC_24B:
341 if (addr > AD3552R_REG_ADDR_HW_LDAC_24B)
343 if (addr > AD3552R_REG_ADDR_HW_LDAC_16B)
349 /* SPI transfer to device */
350 static int ad3552r_transfer(struct ad3552r_desc *dac, u8 addr, u32 len,
351 u8 *data, bool is_read)
353 /* Maximum transfer: Addr (1B) + 2 * (Data Reg (3B)) + SW LDAC(1B) */
356 buf[0] = addr & AD3552R_ADDR_MASK;
357 buf[0] |= is_read ? AD3552R_READ_BIT : 0;
359 return spi_write_then_read(dac->spi, buf, 1, data, len);
361 memcpy(buf + 1, data, len);
362 return spi_write_then_read(dac->spi, buf, len + 1, NULL, 0);
365 static int ad3552r_write_reg(struct ad3552r_desc *dac, u8 addr, u16 val)
368 u8 buf[AD3552R_MAX_REG_SIZE] = { 0 };
370 reg_len = _ad3552r_reg_len(addr);
372 /* Only DAC register are 2 bytes wide */
373 val &= AD3552R_MASK_DAC_12B;
377 /* reg_len can be 2 or 3, but 3rd bytes needs to be set to 0 */
378 put_unaligned_be16(val, buf);
380 return ad3552r_transfer(dac, addr, reg_len, buf, false);
383 static int ad3552r_read_reg(struct ad3552r_desc *dac, u8 addr, u16 *val)
386 u8 reg_len, buf[AD3552R_MAX_REG_SIZE] = { 0 };
388 reg_len = _ad3552r_reg_len(addr);
389 err = ad3552r_transfer(dac, addr, reg_len, buf, true);
396 /* reg_len can be 2 or 3, but only first 2 bytes are relevant */
397 *val = get_unaligned_be16(buf);
402 static u16 ad3552r_field_prep(u16 val, u16 mask)
404 return (val << __ffs(mask)) & mask;
407 /* Update field of a register, shift val if needed */
408 static int ad3552r_update_reg_field(struct ad3552r_desc *dac, u8 addr, u16 mask,
414 ret = ad3552r_read_reg(dac, addr, ®);
419 reg |= ad3552r_field_prep(val, mask);
421 return ad3552r_write_reg(dac, addr, reg);
424 static int ad3552r_set_ch_value(struct ad3552r_desc *dac,
425 enum ad3552r_ch_attributes attr,
429 /* Update register related to attributes in chip */
430 return ad3552r_update_reg_field(dac, addr_mask_map_ch[attr][0],
431 addr_mask_map_ch[attr][ch + 1], val);
434 #define AD3552R_CH_DAC(_idx) ((struct iio_chan_spec) { \
435 .type = IIO_VOLTAGE, \
439 .scan_index = _idx, \
444 .endianness = IIO_BE, \
446 .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \
447 BIT(IIO_CHAN_INFO_SCALE) | \
448 BIT(IIO_CHAN_INFO_ENABLE) | \
449 BIT(IIO_CHAN_INFO_OFFSET), \
452 static int ad3552r_read_raw(struct iio_dev *indio_dev,
453 struct iio_chan_spec const *chan,
458 struct ad3552r_desc *dac = iio_priv(indio_dev);
461 u8 ch = chan->channel;
464 case IIO_CHAN_INFO_RAW:
465 mutex_lock(&dac->lock);
466 err = ad3552r_read_reg(dac, AD3552R_REG_ADDR_CH_DAC_24B(ch),
468 mutex_unlock(&dac->lock);
473 case IIO_CHAN_INFO_ENABLE:
474 mutex_lock(&dac->lock);
475 err = ad3552r_read_reg(dac, AD3552R_REG_ADDR_POWERDOWN_CONFIG,
477 mutex_unlock(&dac->lock);
480 *val = !((tmp_val & AD3552R_MASK_CH_DAC_POWERDOWN(ch)) >>
481 __ffs(AD3552R_MASK_CH_DAC_POWERDOWN(ch)));
483 case IIO_CHAN_INFO_SCALE:
484 *val = dac->ch_data[ch].scale_int;
485 *val2 = dac->ch_data[ch].scale_dec;
486 return IIO_VAL_INT_PLUS_MICRO;
487 case IIO_CHAN_INFO_OFFSET:
488 *val = dac->ch_data[ch].offset_int;
489 *val2 = dac->ch_data[ch].offset_dec;
490 return IIO_VAL_INT_PLUS_MICRO;
496 static int ad3552r_write_raw(struct iio_dev *indio_dev,
497 struct iio_chan_spec const *chan,
502 struct ad3552r_desc *dac = iio_priv(indio_dev);
505 mutex_lock(&dac->lock);
507 case IIO_CHAN_INFO_RAW:
508 err = ad3552r_write_reg(dac,
509 AD3552R_REG_ADDR_CH_DAC_24B(chan->channel),
512 case IIO_CHAN_INFO_ENABLE:
513 err = ad3552r_set_ch_value(dac, AD3552R_CH_DAC_POWERDOWN,
514 chan->channel, !val);
520 mutex_unlock(&dac->lock);
525 static const struct iio_info ad3552r_iio_info = {
526 .read_raw = ad3552r_read_raw,
527 .write_raw = ad3552r_write_raw
530 static int32_t ad3552r_trigger_hw_ldac(struct gpio_desc *ldac)
532 gpiod_set_value_cansleep(ldac, 0);
533 usleep_range(AD3552R_LDAC_PULSE_US, AD3552R_LDAC_PULSE_US + 10);
534 gpiod_set_value_cansleep(ldac, 1);
539 static int ad3552r_write_all_channels(struct ad3552r_desc *dac, u8 *data)
542 u8 addr, buff[AD3552R_MAX_CH * AD3552R_MAX_REG_SIZE + 1];
544 addr = AD3552R_REG_ADDR_CH_INPUT_24B(1);
546 memcpy(buff, data + 2, 2);
549 memcpy(buff + 3, data, 2);
552 if (!dac->gpio_ldac) {
554 buff[6] = AD3552R_MASK_ALL_CH;
557 err = ad3552r_transfer(dac, addr, len, buff, false);
562 return ad3552r_trigger_hw_ldac(dac->gpio_ldac);
567 static int ad3552r_write_codes(struct ad3552r_desc *dac, u32 mask, u8 *data)
570 u8 addr, buff[AD3552R_MAX_REG_SIZE];
572 if (mask == AD3552R_MASK_ALL_CH) {
573 if (memcmp(data, data + 2, 2) != 0)
574 return ad3552r_write_all_channels(dac, data);
576 addr = AD3552R_REG_ADDR_INPUT_PAGE_MASK_24B;
578 addr = AD3552R_REG_ADDR_CH_INPUT_24B(__ffs(mask));
581 memcpy(buff, data, 2);
583 err = ad3552r_transfer(dac, addr, 3, data, false);
588 return ad3552r_trigger_hw_ldac(dac->gpio_ldac);
590 return ad3552r_write_reg(dac, AD3552R_REG_ADDR_SW_LDAC_24B, mask);
593 static irqreturn_t ad3552r_trigger_handler(int irq, void *p)
595 struct iio_poll_func *pf = p;
596 struct iio_dev *indio_dev = pf->indio_dev;
597 struct iio_buffer *buf = indio_dev->buffer;
598 struct ad3552r_desc *dac = iio_priv(indio_dev);
599 /* Maximum size of a scan */
600 u8 buff[AD3552R_MAX_CH * AD3552R_MAX_REG_SIZE];
603 memset(buff, 0, sizeof(buff));
604 err = iio_pop_from_buffer(buf, buff);
608 mutex_lock(&dac->lock);
609 ad3552r_write_codes(dac, *indio_dev->active_scan_mask, buff);
610 mutex_unlock(&dac->lock);
612 iio_trigger_notify_done(indio_dev->trig);
617 static int ad3552r_check_scratch_pad(struct ad3552r_desc *dac)
619 const u16 val1 = AD3552R_SCRATCH_PAD_TEST_VAL1;
620 const u16 val2 = AD3552R_SCRATCH_PAD_TEST_VAL2;
624 err = ad3552r_write_reg(dac, AD3552R_REG_ADDR_SCRATCH_PAD, val1);
628 err = ad3552r_read_reg(dac, AD3552R_REG_ADDR_SCRATCH_PAD, &val);
635 err = ad3552r_write_reg(dac, AD3552R_REG_ADDR_SCRATCH_PAD, val2);
639 err = ad3552r_read_reg(dac, AD3552R_REG_ADDR_SCRATCH_PAD, &val);
649 struct reg_addr_pool {
650 struct ad3552r_desc *dac;
654 static int ad3552r_read_reg_wrapper(struct reg_addr_pool *addr)
659 err = ad3552r_read_reg(addr->dac, addr->addr, &val);
666 static int ad3552r_reset(struct ad3552r_desc *dac)
668 struct reg_addr_pool addr;
672 dac->gpio_reset = devm_gpiod_get_optional(&dac->spi->dev, "reset",
674 if (IS_ERR(dac->gpio_reset))
675 return dev_err_probe(&dac->spi->dev, PTR_ERR(dac->gpio_reset),
676 "Error while getting gpio reset");
678 if (dac->gpio_reset) {
679 /* Perform hardware reset */
680 usleep_range(10, 20);
681 gpiod_set_value_cansleep(dac->gpio_reset, 1);
683 /* Perform software reset if no GPIO provided */
684 ret = ad3552r_update_reg_field(dac,
685 AD3552R_REG_ADDR_INTERFACE_CONFIG_A,
686 AD3552R_MASK_SOFTWARE_RESET,
687 AD3552R_MASK_SOFTWARE_RESET);
694 addr.addr = AD3552R_REG_ADDR_INTERFACE_CONFIG_B;
695 ret = readx_poll_timeout(ad3552r_read_reg_wrapper, &addr, val,
696 val == AD3552R_DEFAULT_CONFIG_B_VALUE ||
702 dev_err(&dac->spi->dev, "Error while resetting");
706 ret = readx_poll_timeout(ad3552r_read_reg_wrapper, &addr, val,
707 !(val & AD3552R_MASK_INTERFACE_NOT_READY) ||
713 dev_err(&dac->spi->dev, "Error while resetting");
717 return ad3552r_update_reg_field(dac,
718 addr_mask_map[AD3552R_ADDR_ASCENSION][0],
719 addr_mask_map[AD3552R_ADDR_ASCENSION][1],
723 static void ad3552r_get_custom_range(struct ad3552r_desc *dac, s32 i, s32 *v_min,
726 s64 vref, tmp, common, offset, gn, gp;
728 * From datasheet formula (In Volts):
729 * Vmin = 2.5 + [(GainN + Offset / 1024) * 2.5 * Rfb * 1.03]
730 * Vmax = 2.5 - [(GainP + Offset / 1024) * 2.5 * Rfb * 1.03]
731 * Calculus are converted to milivolts
734 /* 2.5 * 1.03 * 1000 (To mV) */
735 common = 2575 * dac->ch_data[i].rfb;
736 offset = dac->ch_data[i].gain_offset;
738 gn = gains_scaling_table[dac->ch_data[i].n];
739 tmp = (1024 * gn + AD3552R_GAIN_SCALE * offset) * common;
740 tmp = div_s64(tmp, 1024 * AD3552R_GAIN_SCALE);
743 gp = gains_scaling_table[dac->ch_data[i].p];
744 tmp = (1024 * gp - AD3552R_GAIN_SCALE * offset) * common;
745 tmp = div_s64(tmp, 1024 * AD3552R_GAIN_SCALE);
749 static void ad3552r_calc_gain_and_offset(struct ad3552r_desc *dac, s32 ch)
751 s32 idx, v_max, v_min, span, rem;
754 if (dac->ch_data[ch].range_override) {
755 ad3552r_get_custom_range(dac, ch, &v_min, &v_max);
758 idx = dac->ch_data[ch].range;
759 v_min = dac->model_data->ranges_table[idx][0];
760 v_max = dac->model_data->ranges_table[idx][1];
764 * From datasheet formula:
765 * Vout = Span * (D / 65536) + Vmin
766 * Converted to scale and offset:
767 * Scale = Span / 65536
768 * Offset = 65536 * Vmin / Span
770 * Reminders are in micros in order to be printed as
771 * IIO_VAL_INT_PLUS_MICRO
773 span = v_max - v_min;
774 dac->ch_data[ch].scale_int = div_s64_rem(span, 65536, &rem);
775 /* Do operations in microvolts */
776 dac->ch_data[ch].scale_dec = DIV_ROUND_CLOSEST((s64)rem * 1000000,
779 dac->ch_data[ch].offset_int = div_s64_rem(v_min * 65536, span, &rem);
780 tmp = (s64)rem * 1000000;
781 dac->ch_data[ch].offset_dec = div_s64(tmp, span);
784 static int ad3552r_find_range(const struct ad3552r_model_data *model_data,
789 for (i = 0; i < model_data->num_ranges; i++)
790 if (vals[0] == model_data->ranges_table[i][0] * 1000 &&
791 vals[1] == model_data->ranges_table[i][1] * 1000)
797 static int ad3552r_configure_custom_gain(struct ad3552r_desc *dac,
798 struct fwnode_handle *child,
801 struct device *dev = &dac->spi->dev;
807 struct fwnode_handle *gain_child __free(fwnode_handle)
808 = fwnode_get_named_child_node(child,
809 "custom-output-range-config");
811 return dev_err_probe(dev, -EINVAL,
812 "mandatory custom-output-range-config property missing\n");
814 dac->ch_data[ch].range_override = 1;
815 reg |= ad3552r_field_prep(1, AD3552R_MASK_CH_RANGE_OVERRIDE);
817 err = fwnode_property_read_u32(gain_child, "adi,gain-scaling-p", &val);
819 return dev_err_probe(dev, err,
820 "mandatory adi,gain-scaling-p property missing\n");
821 reg |= ad3552r_field_prep(val, AD3552R_MASK_CH_GAIN_SCALING_P);
822 dac->ch_data[ch].p = val;
824 err = fwnode_property_read_u32(gain_child, "adi,gain-scaling-n", &val);
826 return dev_err_probe(dev, err,
827 "mandatory adi,gain-scaling-n property missing\n");
828 reg |= ad3552r_field_prep(val, AD3552R_MASK_CH_GAIN_SCALING_N);
829 dac->ch_data[ch].n = val;
831 err = fwnode_property_read_u32(gain_child, "adi,rfb-ohms", &val);
833 return dev_err_probe(dev, err,
834 "mandatory adi,rfb-ohms property missing\n");
835 dac->ch_data[ch].rfb = val;
837 err = fwnode_property_read_u32(gain_child, "adi,gain-offset", &val);
839 return dev_err_probe(dev, err,
840 "mandatory adi,gain-offset property missing\n");
841 dac->ch_data[ch].gain_offset = val;
843 offset = abs((s32)val);
844 reg |= ad3552r_field_prep((offset >> 8), AD3552R_MASK_CH_OFFSET_BIT_8);
846 reg |= ad3552r_field_prep((s32)val < 0, AD3552R_MASK_CH_OFFSET_POLARITY);
847 addr = AD3552R_REG_ADDR_CH_GAIN(ch);
848 err = ad3552r_write_reg(dac, addr,
849 offset & AD3552R_MASK_CH_OFFSET_BITS_0_7);
851 return dev_err_probe(dev, err, "Error writing register\n");
853 err = ad3552r_write_reg(dac, addr, reg);
855 return dev_err_probe(dev, err, "Error writing register\n");
860 static int ad3552r_configure_device(struct ad3552r_desc *dac)
862 struct device *dev = &dac->spi->dev;
863 int err, cnt = 0, voltage, delta = 100000;
864 u32 vals[2], val, ch;
866 dac->gpio_ldac = devm_gpiod_get_optional(dev, "ldac", GPIOD_OUT_HIGH);
867 if (IS_ERR(dac->gpio_ldac))
868 return dev_err_probe(dev, PTR_ERR(dac->gpio_ldac),
869 "Error getting gpio ldac");
871 voltage = devm_regulator_get_enable_read_voltage(dev, "vref");
872 if (voltage < 0 && voltage != -ENODEV)
873 return dev_err_probe(dev, voltage, "Error getting vref voltage\n");
875 if (voltage == -ENODEV) {
876 if (device_property_read_bool(dev, "adi,vref-out-en"))
877 val = AD3552R_INTERNAL_VREF_PIN_2P5V;
879 val = AD3552R_INTERNAL_VREF_PIN_FLOATING;
881 if (voltage > 2500000 + delta || voltage < 2500000 - delta) {
882 dev_warn(dev, "vref-supply must be 2.5V");
885 val = AD3552R_EXTERNAL_VREF_PIN_INPUT;
888 err = ad3552r_update_reg_field(dac,
889 addr_mask_map[AD3552R_VREF_SELECT][0],
890 addr_mask_map[AD3552R_VREF_SELECT][1],
895 err = device_property_read_u32(dev, "adi,sdo-drive-strength", &val);
898 dev_err(dev, "adi,sdo-drive-strength must be less than 4\n");
902 err = ad3552r_update_reg_field(dac,
903 addr_mask_map[AD3552R_SDO_DRIVE_STRENGTH][0],
904 addr_mask_map[AD3552R_SDO_DRIVE_STRENGTH][1],
910 dac->num_ch = device_get_child_node_count(dev);
912 dev_err(dev, "No channels defined\n");
916 device_for_each_child_node_scoped(dev, child) {
917 err = fwnode_property_read_u32(child, "reg", &ch);
919 return dev_err_probe(dev, err,
920 "mandatory reg property missing\n");
921 if (ch >= dac->model_data->num_hw_channels)
922 return dev_err_probe(dev, -EINVAL,
923 "reg must be less than %d\n",
924 dac->model_data->num_hw_channels);
926 if (fwnode_property_present(child, "adi,output-range-microvolt")) {
927 err = fwnode_property_read_u32_array(child,
928 "adi,output-range-microvolt",
932 return dev_err_probe(dev, err,
933 "adi,output-range-microvolt property could not be parsed\n");
935 err = ad3552r_find_range(dac->model_data, vals);
937 return dev_err_probe(dev, err,
938 "Invalid adi,output-range-microvolt value\n");
941 err = ad3552r_set_ch_value(dac,
942 AD3552R_CH_OUTPUT_RANGE_SEL,
947 dac->ch_data[ch].range = val;
948 } else if (dac->model_data->requires_output_range) {
949 return dev_err_probe(dev, -EINVAL,
950 "adi,output-range-microvolt is required for %s\n",
951 dac->model_data->model_name);
953 err = ad3552r_configure_custom_gain(dac, child, ch);
958 ad3552r_calc_gain_and_offset(dac, ch);
959 dac->enabled_ch |= BIT(ch);
961 err = ad3552r_set_ch_value(dac, AD3552R_CH_SELECT, ch, 1);
965 dac->channels[cnt] = AD3552R_CH_DAC(ch);
970 /* Disable unused channels */
971 for_each_clear_bit(ch, &dac->enabled_ch,
972 dac->model_data->num_hw_channels) {
973 err = ad3552r_set_ch_value(dac, AD3552R_CH_AMPLIFIER_POWERDOWN,
984 static int ad3552r_init(struct ad3552r_desc *dac)
989 err = ad3552r_reset(dac);
991 dev_err(&dac->spi->dev, "Reset failed\n");
995 err = ad3552r_check_scratch_pad(dac);
997 dev_err(&dac->spi->dev, "Scratch pad test failed\n");
1001 err = ad3552r_read_reg(dac, AD3552R_REG_ADDR_PRODUCT_ID_L, &val);
1003 dev_err(&dac->spi->dev, "Fail read PRODUCT_ID_L\n");
1008 err = ad3552r_read_reg(dac, AD3552R_REG_ADDR_PRODUCT_ID_H, &val);
1010 dev_err(&dac->spi->dev, "Fail read PRODUCT_ID_H\n");
1015 if (id != dac->model_data->chip_id) {
1016 dev_err(&dac->spi->dev, "Product id not matching\n");
1020 return ad3552r_configure_device(dac);
1023 static int ad3552r_probe(struct spi_device *spi)
1025 struct ad3552r_desc *dac;
1026 struct iio_dev *indio_dev;
1029 indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*dac));
1033 dac = iio_priv(indio_dev);
1035 dac->model_data = spi_get_device_match_data(spi);
1036 if (!dac->model_data)
1039 mutex_init(&dac->lock);
1041 err = ad3552r_init(dac);
1045 /* Config triggered buffer device */
1046 indio_dev->name = dac->model_data->model_name;
1047 indio_dev->dev.parent = &spi->dev;
1048 indio_dev->info = &ad3552r_iio_info;
1049 indio_dev->num_channels = dac->num_ch;
1050 indio_dev->channels = dac->channels;
1051 indio_dev->modes = INDIO_DIRECT_MODE;
1053 err = devm_iio_triggered_buffer_setup_ext(&indio_dev->dev, indio_dev, NULL,
1054 &ad3552r_trigger_handler,
1055 IIO_BUFFER_DIRECTION_OUT,
1061 return devm_iio_device_register(&spi->dev, indio_dev);
1064 static const struct ad3552r_model_data ad3541r_model_data = {
1065 .model_name = "ad3541r",
1066 .chip_id = AD3541R_ID,
1067 .num_hw_channels = 1,
1068 .ranges_table = ad3542r_ch_ranges,
1069 .num_ranges = ARRAY_SIZE(ad3542r_ch_ranges),
1070 .requires_output_range = true,
1073 static const struct ad3552r_model_data ad3542r_model_data = {
1074 .model_name = "ad3542r",
1075 .chip_id = AD3542R_ID,
1076 .num_hw_channels = 2,
1077 .ranges_table = ad3542r_ch_ranges,
1078 .num_ranges = ARRAY_SIZE(ad3542r_ch_ranges),
1079 .requires_output_range = true,
1082 static const struct ad3552r_model_data ad3551r_model_data = {
1083 .model_name = "ad3551r",
1084 .chip_id = AD3551R_ID,
1085 .num_hw_channels = 1,
1086 .ranges_table = ad3552r_ch_ranges,
1087 .num_ranges = ARRAY_SIZE(ad3552r_ch_ranges),
1088 .requires_output_range = false,
1091 static const struct ad3552r_model_data ad3552r_model_data = {
1092 .model_name = "ad3552r",
1093 .chip_id = AD3552R_ID,
1094 .num_hw_channels = 2,
1095 .ranges_table = ad3552r_ch_ranges,
1096 .num_ranges = ARRAY_SIZE(ad3552r_ch_ranges),
1097 .requires_output_range = false,
1100 static const struct spi_device_id ad3552r_id[] = {
1103 .driver_data = (kernel_ulong_t)&ad3541r_model_data
1107 .driver_data = (kernel_ulong_t)&ad3542r_model_data
1111 .driver_data = (kernel_ulong_t)&ad3551r_model_data
1115 .driver_data = (kernel_ulong_t)&ad3552r_model_data
1119 MODULE_DEVICE_TABLE(spi, ad3552r_id);
1121 static const struct of_device_id ad3552r_of_match[] = {
1122 { .compatible = "adi,ad3541r", .data = &ad3541r_model_data },
1123 { .compatible = "adi,ad3542r", .data = &ad3542r_model_data },
1124 { .compatible = "adi,ad3551r", .data = &ad3551r_model_data },
1125 { .compatible = "adi,ad3552r", .data = &ad3552r_model_data },
1128 MODULE_DEVICE_TABLE(of, ad3552r_of_match);
1130 static struct spi_driver ad3552r_driver = {
1133 .of_match_table = ad3552r_of_match,
1135 .probe = ad3552r_probe,
1136 .id_table = ad3552r_id
1138 module_spi_driver(ad3552r_driver);
1140 MODULE_AUTHOR("Mihail Chindris <mihail.chindris@analog.com>");
1141 MODULE_DESCRIPTION("Analog Device AD3552R DAC");
1142 MODULE_LICENSE("GPL v2");