1 // SPDX-License-Identifier: GPL-2.0
3 * Copyright (C) 2022 Analog Devices, Inc.
7 #include <linux/bitfield.h>
8 #include <linux/bitops.h>
9 #include <linux/crc8.h>
10 #include <linux/device.h>
11 #include <linux/gpio/driver.h>
12 #include <linux/interrupt.h>
13 #include <linux/module.h>
14 #include <linux/regmap.h>
15 #include <linux/regulator/consumer.h>
16 #include <linux/spi/spi.h>
17 #include <linux/units.h>
19 #include <asm/unaligned.h>
21 #include <linux/iio/buffer.h>
22 #include <linux/iio/iio.h>
23 #include <linux/iio/trigger.h>
24 #include <linux/iio/trigger_consumer.h>
25 #include <linux/iio/triggered_buffer.h>
27 #define AD74115_NAME "ad74115"
29 #define AD74115_CH_FUNC_SETUP_REG 0x01
31 #define AD74115_ADC_CONFIG_REG 0x02
32 #define AD74115_ADC_CONFIG_CONV2_RATE_MASK GENMASK(15, 13)
33 #define AD74115_ADC_CONFIG_CONV1_RATE_MASK GENMASK(12, 10)
34 #define AD74115_ADC_CONFIG_CONV2_RANGE_MASK GENMASK(9, 7)
35 #define AD74115_ADC_CONFIG_CONV1_RANGE_MASK GENMASK(6, 4)
37 #define AD74115_PWR_OPTIM_CONFIG_REG 0x03
39 #define AD74115_DIN_CONFIG1_REG 0x04
40 #define AD74115_DIN_COMPARATOR_EN_MASK BIT(13)
41 #define AD74115_DIN_SINK_MASK GENMASK(11, 7)
42 #define AD74115_DIN_DEBOUNCE_MASK GENMASK(4, 0)
44 #define AD74115_DIN_CONFIG2_REG 0x05
45 #define AD74115_COMP_THRESH_MASK GENMASK(6, 0)
47 #define AD74115_OUTPUT_CONFIG_REG 0x06
48 #define AD74115_OUTPUT_SLEW_EN_MASK GENMASK(6, 5)
49 #define AD74115_OUTPUT_SLEW_LIN_STEP_MASK GENMASK(4, 3)
50 #define AD74115_OUTPUT_SLEW_LIN_RATE_MASK GENMASK(2, 1)
52 #define AD74115_RTD3W4W_CONFIG_REG 0x07
54 #define AD74115_BURNOUT_CONFIG_REG 0x0a
55 #define AD74115_BURNOUT_EXT2_EN_MASK BIT(10)
56 #define AD74115_BURNOUT_EXT1_EN_MASK BIT(5)
57 #define AD74115_BURNOUT_VIOUT_EN_MASK BIT(0)
59 #define AD74115_DAC_CODE_REG 0x0b
61 #define AD74115_DAC_ACTIVE_REG 0x0d
63 #define AD74115_GPIO_CONFIG_X_REG(x) (0x35 + (x))
64 #define AD74115_GPIO_CONFIG_GPI_DATA BIT(5)
65 #define AD74115_GPIO_CONFIG_GPO_DATA BIT(4)
66 #define AD74115_GPIO_CONFIG_SELECT_MASK GENMASK(2, 0)
68 #define AD74115_CHARGE_PUMP_REG 0x3a
70 #define AD74115_ADC_CONV_CTRL_REG 0x3b
71 #define AD74115_ADC_CONV_SEQ_MASK GENMASK(13, 12)
73 #define AD74115_DIN_COMP_OUT_REG 0x40
75 #define AD74115_LIVE_STATUS_REG 0x42
76 #define AD74115_ADC_DATA_RDY_MASK BIT(3)
78 #define AD74115_READ_SELECT_REG 0x64
80 #define AD74115_CMD_KEY_REG 0x78
81 #define AD74115_CMD_KEY_RESET1 0x15fa
82 #define AD74115_CMD_KEY_RESET2 0xaf51
84 #define AD74115_CRC_POLYNOMIAL 0x7
85 DECLARE_CRC8_TABLE(ad74115_crc8_table);
87 #define AD74115_ADC_CODE_MAX ((int)GENMASK(15, 0))
88 #define AD74115_ADC_CODE_HALF (AD74115_ADC_CODE_MAX / 2)
90 #define AD74115_DAC_VOLTAGE_MAX 12000
91 #define AD74115_DAC_CURRENT_MAX 25
92 #define AD74115_DAC_CODE_MAX ((int)GENMASK(13, 0))
93 #define AD74115_DAC_CODE_HALF (AD74115_DAC_CODE_MAX / 2)
95 #define AD74115_COMP_THRESH_MAX 98
97 #define AD74115_SENSE_RESISTOR_OHMS 100
98 #define AD74115_REF_RESISTOR_OHMS 2100
100 #define AD74115_DIN_SINK_LOW_STEP 120
101 #define AD74115_DIN_SINK_HIGH_STEP 240
102 #define AD74115_DIN_SINK_MAX 31
104 #define AD74115_FRAME_SIZE 4
105 #define AD74115_GPIO_NUM 4
107 #define AD74115_CONV_TIME_US 1000000
109 enum ad74115_dac_ch {
111 AD74115_DAC_CH_COMPARATOR,
114 enum ad74115_adc_ch {
115 AD74115_ADC_CH_CONV1,
116 AD74115_ADC_CH_CONV2,
120 enum ad74115_ch_func {
121 AD74115_CH_FUNC_HIGH_IMPEDANCE,
122 AD74115_CH_FUNC_VOLTAGE_OUTPUT,
123 AD74115_CH_FUNC_CURRENT_OUTPUT,
124 AD74115_CH_FUNC_VOLTAGE_INPUT,
125 AD74115_CH_FUNC_CURRENT_INPUT_EXT_POWER,
126 AD74115_CH_FUNC_CURRENT_INPUT_LOOP_POWER,
127 AD74115_CH_FUNC_2_WIRE_RESISTANCE_INPUT,
128 AD74115_CH_FUNC_3_4_WIRE_RESISTANCE_INPUT,
129 AD74115_CH_FUNC_DIGITAL_INPUT_LOGIC,
130 AD74115_CH_FUNC_DIGITAL_INPUT_LOOP_POWER,
131 AD74115_CH_FUNC_CURRENT_OUTPUT_HART,
132 AD74115_CH_FUNC_CURRENT_INPUT_EXT_POWER_HART,
133 AD74115_CH_FUNC_CURRENT_INPUT_LOOP_POWER_HART,
134 AD74115_CH_FUNC_MAX = AD74115_CH_FUNC_CURRENT_INPUT_LOOP_POWER_HART,
138 enum ad74115_adc_range {
139 AD74115_ADC_RANGE_12V,
140 AD74115_ADC_RANGE_12V_BIPOLAR,
141 AD74115_ADC_RANGE_2_5V_BIPOLAR,
142 AD74115_ADC_RANGE_2_5V_NEG,
143 AD74115_ADC_RANGE_2_5V,
144 AD74115_ADC_RANGE_0_625V,
145 AD74115_ADC_RANGE_104MV_BIPOLAR,
146 AD74115_ADC_RANGE_12V_OTHER,
147 AD74115_ADC_RANGE_MAX = AD74115_ADC_RANGE_12V_OTHER,
148 AD74115_ADC_RANGE_NUM
151 enum ad74115_adc_conv_seq {
152 AD74115_ADC_CONV_SEQ_STANDBY = 0b00,
153 AD74115_ADC_CONV_SEQ_SINGLE = 0b01,
154 AD74115_ADC_CONV_SEQ_CONTINUOUS = 0b10,
157 enum ad74115_din_threshold_mode {
158 AD74115_DIN_THRESHOLD_MODE_AVDD,
159 AD74115_DIN_THRESHOLD_MODE_FIXED,
160 AD74115_DIN_THRESHOLD_MODE_MAX = AD74115_DIN_THRESHOLD_MODE_FIXED,
163 enum ad74115_slew_mode {
164 AD74115_SLEW_MODE_DISABLED,
165 AD74115_SLEW_MODE_LINEAR,
166 AD74115_SLEW_MODE_HART,
169 enum ad74115_slew_step {
170 AD74115_SLEW_STEP_0_8_PERCENT,
171 AD74115_SLEW_STEP_1_5_PERCENT,
172 AD74115_SLEW_STEP_6_1_PERCENT,
173 AD74115_SLEW_STEP_22_2_PERCENT,
176 enum ad74115_slew_rate {
177 AD74115_SLEW_RATE_4KHZ,
178 AD74115_SLEW_RATE_64KHZ,
179 AD74115_SLEW_RATE_150KHZ,
180 AD74115_SLEW_RATE_240KHZ,
183 enum ad74115_gpio_config {
184 AD74115_GPIO_CONFIG_OUTPUT_BUFFERED = 0b010,
185 AD74115_GPIO_CONFIG_INPUT = 0b011,
188 enum ad74115_gpio_mode {
189 AD74115_GPIO_MODE_LOGIC = 1,
190 AD74115_GPIO_MODE_SPECIAL = 2,
193 struct ad74115_channels {
194 struct iio_chan_spec *channels;
195 unsigned int num_channels;
198 struct ad74115_state {
199 struct spi_device *spi;
200 struct regmap *regmap;
201 struct iio_trigger *trig;
202 struct regulator *avdd;
205 * Synchronize consecutive operations when doing a one-shot
206 * conversion and when updating the ADC samples SPI message.
210 struct gpio_chip comp_gc;
213 unsigned int avdd_mv;
214 unsigned long gpio_valid_mask;
217 bool rtd_mode_4_wire;
218 enum ad74115_ch_func ch_func;
219 enum ad74115_din_threshold_mode din_threshold_mode;
221 struct completion adc_data_completion;
222 struct spi_message adc_samples_msg;
223 struct spi_transfer adc_samples_xfer[AD74115_ADC_CH_NUM + 1];
226 * DMA (thus cache coherency maintenance) requires the
227 * transfer buffers to live in their own cache lines.
229 u8 reg_tx_buf[AD74115_FRAME_SIZE] __aligned(IIO_DMA_MINALIGN);
230 u8 reg_rx_buf[AD74115_FRAME_SIZE];
231 u8 adc_samples_tx_buf[AD74115_FRAME_SIZE * AD74115_ADC_CH_NUM];
232 u8 adc_samples_rx_buf[AD74115_FRAME_SIZE * AD74115_ADC_CH_NUM];
235 struct ad74115_fw_prop {
242 const unsigned int *lookup_tbl;
243 unsigned int lookup_tbl_len;
246 #define AD74115_FW_PROP(_name, _max, _reg, _mask) \
254 #define AD74115_FW_PROP_TBL(_name, _tbl, _reg, _mask) \
259 .lookup_tbl = (_tbl), \
260 .lookup_tbl_len = ARRAY_SIZE(_tbl), \
263 #define AD74115_FW_PROP_BOOL(_name, _reg, _mask) \
266 .is_boolean = true, \
271 #define AD74115_FW_PROP_BOOL_NEG(_name, _reg, _mask) \
274 .is_boolean = true, \
280 static const int ad74115_dac_rate_tbl[] = {
300 static const unsigned int ad74115_dac_rate_step_tbl[][3] = {
301 { AD74115_SLEW_MODE_DISABLED },
302 { AD74115_SLEW_MODE_LINEAR, AD74115_SLEW_STEP_0_8_PERCENT, AD74115_SLEW_RATE_4KHZ },
303 { AD74115_SLEW_MODE_LINEAR, AD74115_SLEW_STEP_1_5_PERCENT, AD74115_SLEW_RATE_4KHZ },
304 { AD74115_SLEW_MODE_LINEAR, AD74115_SLEW_STEP_6_1_PERCENT, AD74115_SLEW_RATE_4KHZ },
305 { AD74115_SLEW_MODE_LINEAR, AD74115_SLEW_STEP_22_2_PERCENT, AD74115_SLEW_RATE_4KHZ },
306 { AD74115_SLEW_MODE_LINEAR, AD74115_SLEW_STEP_0_8_PERCENT, AD74115_SLEW_RATE_64KHZ },
307 { AD74115_SLEW_MODE_LINEAR, AD74115_SLEW_STEP_1_5_PERCENT, AD74115_SLEW_RATE_64KHZ },
308 { AD74115_SLEW_MODE_LINEAR, AD74115_SLEW_STEP_6_1_PERCENT, AD74115_SLEW_RATE_64KHZ },
309 { AD74115_SLEW_MODE_LINEAR, AD74115_SLEW_STEP_22_2_PERCENT, AD74115_SLEW_RATE_64KHZ },
310 { AD74115_SLEW_MODE_LINEAR, AD74115_SLEW_STEP_0_8_PERCENT, AD74115_SLEW_RATE_150KHZ },
311 { AD74115_SLEW_MODE_LINEAR, AD74115_SLEW_STEP_1_5_PERCENT, AD74115_SLEW_RATE_150KHZ },
312 { AD74115_SLEW_MODE_LINEAR, AD74115_SLEW_STEP_6_1_PERCENT, AD74115_SLEW_RATE_150KHZ },
313 { AD74115_SLEW_MODE_LINEAR, AD74115_SLEW_STEP_22_2_PERCENT, AD74115_SLEW_RATE_150KHZ },
314 { AD74115_SLEW_MODE_LINEAR, AD74115_SLEW_STEP_0_8_PERCENT, AD74115_SLEW_RATE_240KHZ },
315 { AD74115_SLEW_MODE_LINEAR, AD74115_SLEW_STEP_1_5_PERCENT, AD74115_SLEW_RATE_240KHZ },
316 { AD74115_SLEW_MODE_LINEAR, AD74115_SLEW_STEP_6_1_PERCENT, AD74115_SLEW_RATE_240KHZ },
317 { AD74115_SLEW_MODE_LINEAR, AD74115_SLEW_STEP_22_2_PERCENT, AD74115_SLEW_RATE_240KHZ },
320 static const unsigned int ad74115_rtd_excitation_current_ua_tbl[] = {
324 static const unsigned int ad74115_burnout_current_na_tbl[] = {
325 0, 50, 0, 500, 1000, 0, 10000, 0
328 static const unsigned int ad74115_viout_burnout_current_na_tbl[] = {
329 0, 0, 0, 0, 1000, 0, 10000, 0
332 static const unsigned int ad74115_gpio_mode_tbl[] = {
333 0, 0, 0, 1, 2, 3, 4, 5
336 static const unsigned int ad74115_adc_conv_rate_tbl[] = {
337 10, 20, 1200, 4800, 9600
340 static const unsigned int ad74115_debounce_tbl[] = {
341 0, 13, 18, 24, 32, 42, 56, 75,
342 100, 130, 180, 240, 320, 420, 560, 750,
343 1000, 1300, 1800, 2400, 3200, 4200, 5600, 7500,
344 10000, 13000, 18000, 24000, 32000, 42000, 56000, 75000,
347 static const unsigned int ad74115_adc_ch_data_regs_tbl[] = {
348 [AD74115_ADC_CH_CONV1] = 0x44,
349 [AD74115_ADC_CH_CONV2] = 0x46,
352 static const unsigned int ad74115_adc_ch_en_bit_tbl[] = {
353 [AD74115_ADC_CH_CONV1] = BIT(0),
354 [AD74115_ADC_CH_CONV2] = BIT(1),
357 static const bool ad74115_adc_bipolar_tbl[AD74115_ADC_RANGE_NUM] = {
358 [AD74115_ADC_RANGE_12V_BIPOLAR] = true,
359 [AD74115_ADC_RANGE_2_5V_BIPOLAR] = true,
360 [AD74115_ADC_RANGE_104MV_BIPOLAR] = true,
363 static const unsigned int ad74115_adc_conv_mul_tbl[AD74115_ADC_RANGE_NUM] = {
364 [AD74115_ADC_RANGE_12V] = 12000,
365 [AD74115_ADC_RANGE_12V_BIPOLAR] = 24000,
366 [AD74115_ADC_RANGE_2_5V_BIPOLAR] = 5000,
367 [AD74115_ADC_RANGE_2_5V_NEG] = 2500,
368 [AD74115_ADC_RANGE_2_5V] = 2500,
369 [AD74115_ADC_RANGE_0_625V] = 625,
370 [AD74115_ADC_RANGE_104MV_BIPOLAR] = 208,
371 [AD74115_ADC_RANGE_12V_OTHER] = 12000,
374 static const unsigned int ad74115_adc_gain_tbl[AD74115_ADC_RANGE_NUM][2] = {
375 [AD74115_ADC_RANGE_12V] = { 5, 24 },
376 [AD74115_ADC_RANGE_12V_BIPOLAR] = { 5, 24 },
377 [AD74115_ADC_RANGE_2_5V_BIPOLAR] = { 1, 1 },
378 [AD74115_ADC_RANGE_2_5V_NEG] = { 1, 1 },
379 [AD74115_ADC_RANGE_2_5V] = { 1, 1 },
380 [AD74115_ADC_RANGE_0_625V] = { 4, 1 },
381 [AD74115_ADC_RANGE_104MV_BIPOLAR] = { 24, 1 },
382 [AD74115_ADC_RANGE_12V_OTHER] = { 5, 24 },
385 static const int ad74115_adc_range_tbl[AD74115_ADC_RANGE_NUM][2] = {
386 [AD74115_ADC_RANGE_12V] = { 0, 12000000 },
387 [AD74115_ADC_RANGE_12V_BIPOLAR] = { -12000000, 12000000 },
388 [AD74115_ADC_RANGE_2_5V_BIPOLAR] = { -2500000, 2500000 },
389 [AD74115_ADC_RANGE_2_5V_NEG] = { -2500000, 0 },
390 [AD74115_ADC_RANGE_2_5V] = { 0, 2500000 },
391 [AD74115_ADC_RANGE_0_625V] = { 0, 625000 },
392 [AD74115_ADC_RANGE_104MV_BIPOLAR] = { -104000, 104000 },
393 [AD74115_ADC_RANGE_12V_OTHER] = { 0, 12000000 },
396 static int _ad74115_find_tbl_index(const unsigned int *tbl, unsigned int tbl_len,
397 unsigned int val, unsigned int *index)
401 for (i = 0; i < tbl_len; i++)
410 #define ad74115_find_tbl_index(tbl, val, index) \
411 _ad74115_find_tbl_index(tbl, ARRAY_SIZE(tbl), val, index)
413 static int ad74115_crc(u8 *buf)
415 return crc8(ad74115_crc8_table, buf, 3, 0);
418 static void ad74115_format_reg_write(u8 reg, u16 val, u8 *buf)
421 put_unaligned_be16(val, &buf[1]);
422 buf[3] = ad74115_crc(buf);
425 static int ad74115_reg_write(void *context, unsigned int reg, unsigned int val)
427 struct ad74115_state *st = context;
429 ad74115_format_reg_write(reg, val, st->reg_tx_buf);
431 return spi_write(st->spi, st->reg_tx_buf, AD74115_FRAME_SIZE);
434 static int ad74115_crc_check(struct ad74115_state *st, u8 *buf)
436 struct device *dev = &st->spi->dev;
437 u8 expected_crc = ad74115_crc(buf);
439 if (buf[3] != expected_crc) {
440 dev_err(dev, "Bad CRC %02x for %02x%02x%02x, expected %02x\n",
441 buf[3], buf[0], buf[1], buf[2], expected_crc);
448 static int ad74115_reg_read(void *context, unsigned int reg, unsigned int *val)
450 struct ad74115_state *st = context;
451 struct spi_transfer reg_read_xfer[] = {
453 .tx_buf = st->reg_tx_buf,
454 .len = sizeof(st->reg_tx_buf),
458 .rx_buf = st->reg_rx_buf,
459 .len = sizeof(st->reg_rx_buf),
464 ad74115_format_reg_write(AD74115_READ_SELECT_REG, reg, st->reg_tx_buf);
466 ret = spi_sync_transfer(st->spi, reg_read_xfer, ARRAY_SIZE(reg_read_xfer));
470 ret = ad74115_crc_check(st, st->reg_rx_buf);
474 *val = get_unaligned_be16(&st->reg_rx_buf[1]);
479 static const struct regmap_config ad74115_regmap_config = {
482 .reg_read = ad74115_reg_read,
483 .reg_write = ad74115_reg_write,
486 static int ad74115_gpio_config_set(struct ad74115_state *st, unsigned int offset,
487 enum ad74115_gpio_config cfg)
489 return regmap_update_bits(st->regmap, AD74115_GPIO_CONFIG_X_REG(offset),
490 AD74115_GPIO_CONFIG_SELECT_MASK,
491 FIELD_PREP(AD74115_GPIO_CONFIG_SELECT_MASK, cfg));
494 static int ad74115_gpio_init_valid_mask(struct gpio_chip *gc,
495 unsigned long *valid_mask,
498 struct ad74115_state *st = gpiochip_get_data(gc);
500 *valid_mask = st->gpio_valid_mask;
505 static int ad74115_gpio_get_direction(struct gpio_chip *gc, unsigned int offset)
507 struct ad74115_state *st = gpiochip_get_data(gc);
511 ret = regmap_read(st->regmap, AD74115_GPIO_CONFIG_X_REG(offset), &val);
515 return FIELD_GET(AD74115_GPIO_CONFIG_SELECT_MASK, val) == AD74115_GPIO_CONFIG_INPUT;
518 static int ad74115_gpio_direction_input(struct gpio_chip *gc, unsigned int offset)
520 struct ad74115_state *st = gpiochip_get_data(gc);
522 return ad74115_gpio_config_set(st, offset, AD74115_GPIO_CONFIG_INPUT);
525 static int ad74115_gpio_direction_output(struct gpio_chip *gc, unsigned int offset,
528 struct ad74115_state *st = gpiochip_get_data(gc);
530 return ad74115_gpio_config_set(st, offset, AD74115_GPIO_CONFIG_OUTPUT_BUFFERED);
533 static int ad74115_gpio_get(struct gpio_chip *gc, unsigned int offset)
535 struct ad74115_state *st = gpiochip_get_data(gc);
539 ret = regmap_read(st->regmap, AD74115_GPIO_CONFIG_X_REG(offset), &val);
543 return FIELD_GET(AD74115_GPIO_CONFIG_GPI_DATA, val);
546 static void ad74115_gpio_set(struct gpio_chip *gc, unsigned int offset, int value)
548 struct ad74115_state *st = gpiochip_get_data(gc);
549 struct device *dev = &st->spi->dev;
552 ret = regmap_update_bits(st->regmap, AD74115_GPIO_CONFIG_X_REG(offset),
553 AD74115_GPIO_CONFIG_GPO_DATA,
554 FIELD_PREP(AD74115_GPIO_CONFIG_GPO_DATA, value));
556 dev_err(dev, "Failed to set GPIO %u output value, err: %d\n",
560 static int ad74115_set_comp_debounce(struct ad74115_state *st, unsigned int val)
562 unsigned int len = ARRAY_SIZE(ad74115_debounce_tbl);
565 for (i = 0; i < len; i++)
566 if (val <= ad74115_debounce_tbl[i])
572 return regmap_update_bits(st->regmap, AD74115_DIN_CONFIG1_REG,
573 AD74115_DIN_DEBOUNCE_MASK,
574 FIELD_PREP(AD74115_DIN_DEBOUNCE_MASK, val));
577 static int ad74115_comp_gpio_get_direction(struct gpio_chip *chip,
580 return GPIO_LINE_DIRECTION_IN;
583 static int ad74115_comp_gpio_set_config(struct gpio_chip *chip,
585 unsigned long config)
587 struct ad74115_state *st = gpiochip_get_data(chip);
588 u32 param = pinconf_to_config_param(config);
589 u32 arg = pinconf_to_config_argument(config);
592 case PIN_CONFIG_INPUT_DEBOUNCE:
593 return ad74115_set_comp_debounce(st, arg);
599 static int ad74115_comp_gpio_get(struct gpio_chip *chip, unsigned int offset)
601 struct ad74115_state *st = gpiochip_get_data(chip);
605 ret = regmap_read(st->regmap, AD74115_DIN_COMP_OUT_REG, &val);
612 static irqreturn_t ad74115_trigger_handler(int irq, void *p)
614 struct iio_poll_func *pf = p;
615 struct iio_dev *indio_dev = pf->indio_dev;
616 struct ad74115_state *st = iio_priv(indio_dev);
619 ret = spi_sync(st->spi, &st->adc_samples_msg);
623 iio_push_to_buffers(indio_dev, st->adc_samples_rx_buf);
626 iio_trigger_notify_done(indio_dev->trig);
631 static irqreturn_t ad74115_adc_data_interrupt(int irq, void *data)
633 struct iio_dev *indio_dev = data;
634 struct ad74115_state *st = iio_priv(indio_dev);
636 if (iio_buffer_enabled(indio_dev))
637 iio_trigger_poll(st->trig);
639 complete(&st->adc_data_completion);
644 static int ad74115_set_adc_ch_en(struct ad74115_state *st,
645 enum ad74115_adc_ch channel, bool status)
647 unsigned int mask = ad74115_adc_ch_en_bit_tbl[channel];
649 return regmap_update_bits(st->regmap, AD74115_ADC_CONV_CTRL_REG, mask,
653 static int ad74115_set_adc_conv_seq(struct ad74115_state *st,
654 enum ad74115_adc_conv_seq conv_seq)
656 return regmap_update_bits(st->regmap, AD74115_ADC_CONV_CTRL_REG,
657 AD74115_ADC_CONV_SEQ_MASK,
658 FIELD_PREP(AD74115_ADC_CONV_SEQ_MASK, conv_seq));
661 static int ad74115_update_scan_mode(struct iio_dev *indio_dev,
662 const unsigned long *active_scan_mask)
664 struct ad74115_state *st = iio_priv(indio_dev);
665 struct spi_transfer *xfer = st->adc_samples_xfer;
666 u8 *rx_buf = st->adc_samples_rx_buf;
667 u8 *tx_buf = st->adc_samples_tx_buf;
671 mutex_lock(&st->lock);
673 spi_message_init(&st->adc_samples_msg);
675 for_each_clear_bit(i, active_scan_mask, AD74115_ADC_CH_NUM) {
676 ret = ad74115_set_adc_ch_en(st, i, false);
682 * The read select register is used to select which register's value
683 * will be sent by the slave on the next SPI frame.
685 * Create an SPI message that, on each step, writes to the read select
686 * register to select the ADC result of the next enabled channel, and
687 * reads the ADC result of the previous enabled channel.
690 * W: [WCH1] [WCH2] [WCH2] [WCH3] [ ]
691 * R: [ ] [RCH1] [RCH2] [RCH3] [RCH4]
693 for_each_set_bit(i, active_scan_mask, AD74115_ADC_CH_NUM) {
694 ret = ad74115_set_adc_ch_en(st, i, true);
698 if (xfer == st->adc_samples_xfer)
701 xfer->rx_buf = rx_buf;
703 xfer->tx_buf = tx_buf;
704 xfer->len = AD74115_FRAME_SIZE;
707 ad74115_format_reg_write(AD74115_READ_SELECT_REG,
708 ad74115_adc_ch_data_regs_tbl[i], tx_buf);
710 spi_message_add_tail(xfer, &st->adc_samples_msg);
712 tx_buf += AD74115_FRAME_SIZE;
713 if (xfer != st->adc_samples_xfer)
714 rx_buf += AD74115_FRAME_SIZE;
718 xfer->rx_buf = rx_buf;
720 xfer->len = AD74115_FRAME_SIZE;
723 spi_message_add_tail(xfer, &st->adc_samples_msg);
726 mutex_unlock(&st->lock);
731 static int ad74115_buffer_postenable(struct iio_dev *indio_dev)
733 struct ad74115_state *st = iio_priv(indio_dev);
735 return ad74115_set_adc_conv_seq(st, AD74115_ADC_CONV_SEQ_CONTINUOUS);
738 static int ad74115_buffer_predisable(struct iio_dev *indio_dev)
740 struct ad74115_state *st = iio_priv(indio_dev);
744 mutex_lock(&st->lock);
746 ret = ad74115_set_adc_conv_seq(st, AD74115_ADC_CONV_SEQ_STANDBY);
751 * update_scan_mode() is not called in the disable path, disable all
754 for (i = 0; i < AD74115_ADC_CH_NUM; i++) {
755 ret = ad74115_set_adc_ch_en(st, i, false);
761 mutex_unlock(&st->lock);
766 static const struct iio_buffer_setup_ops ad74115_buffer_ops = {
767 .postenable = &ad74115_buffer_postenable,
768 .predisable = &ad74115_buffer_predisable,
771 static const struct iio_trigger_ops ad74115_trigger_ops = {
772 .validate_device = iio_trigger_validate_own_device,
775 static int ad74115_get_adc_rate(struct ad74115_state *st,
776 enum ad74115_adc_ch channel, int *val)
781 ret = regmap_read(st->regmap, AD74115_ADC_CONFIG_REG, &i);
785 if (channel == AD74115_ADC_CH_CONV1)
786 i = FIELD_GET(AD74115_ADC_CONFIG_CONV1_RATE_MASK, i);
788 i = FIELD_GET(AD74115_ADC_CONFIG_CONV2_RATE_MASK, i);
790 *val = ad74115_adc_conv_rate_tbl[i];
795 static int _ad74115_get_adc_code(struct ad74115_state *st,
796 enum ad74115_adc_ch channel, int *val)
801 reinit_completion(&st->adc_data_completion);
803 ret = ad74115_set_adc_ch_en(st, channel, true);
807 ret = ad74115_set_adc_conv_seq(st, AD74115_ADC_CONV_SEQ_SINGLE);
812 ret = wait_for_completion_timeout(&st->adc_data_completion,
813 msecs_to_jiffies(1000));
817 unsigned int regval, wait_time;
820 ret = ad74115_get_adc_rate(st, channel, &rate);
824 wait_time = DIV_ROUND_CLOSEST(AD74115_CONV_TIME_US, rate);
826 ret = regmap_read_poll_timeout(st->regmap, AD74115_LIVE_STATUS_REG,
827 regval, regval & AD74115_ADC_DATA_RDY_MASK,
828 wait_time, 5 * wait_time);
833 * The ADC_DATA_RDY bit is W1C.
834 * See datasheet page 98, Table 62. Bit Descriptions for
836 * Although the datasheet mentions that the bit will auto-clear
837 * when writing to the ADC_CONV_CTRL register, this does not
840 ret = regmap_write_bits(st->regmap, AD74115_LIVE_STATUS_REG,
841 AD74115_ADC_DATA_RDY_MASK,
842 FIELD_PREP(AD74115_ADC_DATA_RDY_MASK, 1));
847 ret = regmap_read(st->regmap, ad74115_adc_ch_data_regs_tbl[channel], &uval);
851 ret = ad74115_set_adc_conv_seq(st, AD74115_ADC_CONV_SEQ_STANDBY);
855 ret = ad74115_set_adc_ch_en(st, channel, false);
864 static int ad74115_get_adc_code(struct iio_dev *indio_dev,
865 enum ad74115_adc_ch channel, int *val)
867 struct ad74115_state *st = iio_priv(indio_dev);
870 ret = iio_device_claim_direct_mode(indio_dev);
874 mutex_lock(&st->lock);
875 ret = _ad74115_get_adc_code(st, channel, val);
876 mutex_unlock(&st->lock);
878 iio_device_release_direct_mode(indio_dev);
883 static int ad74115_adc_code_to_resistance(int code, int *val, int *val2)
885 if (code == AD74115_ADC_CODE_MAX)
888 *val = code * AD74115_REF_RESISTOR_OHMS;
889 *val2 = AD74115_ADC_CODE_MAX - code;
891 return IIO_VAL_FRACTIONAL;
894 static int ad74115_set_dac_code(struct ad74115_state *st,
895 enum ad74115_dac_ch channel, int val)
900 if (channel == AD74115_DAC_CH_COMPARATOR) {
901 if (val > AD74115_COMP_THRESH_MAX)
904 return regmap_update_bits(st->regmap, AD74115_DIN_CONFIG2_REG,
905 AD74115_COMP_THRESH_MASK,
906 FIELD_PREP(AD74115_COMP_THRESH_MASK, val));
909 if (val > AD74115_DAC_CODE_MAX)
912 return regmap_write(st->regmap, AD74115_DAC_CODE_REG, val);
915 static int ad74115_get_dac_code(struct ad74115_state *st,
916 enum ad74115_dac_ch channel, int *val)
921 if (channel == AD74115_DAC_CH_COMPARATOR)
924 ret = regmap_read(st->regmap, AD74115_DAC_ACTIVE_REG, &uval);
933 static int ad74115_set_adc_rate(struct ad74115_state *st,
934 enum ad74115_adc_ch channel, int val)
939 ret = ad74115_find_tbl_index(ad74115_adc_conv_rate_tbl, val, &i);
943 if (channel == AD74115_ADC_CH_CONV1)
944 return regmap_update_bits(st->regmap, AD74115_ADC_CONFIG_REG,
945 AD74115_ADC_CONFIG_CONV1_RATE_MASK,
946 FIELD_PREP(AD74115_ADC_CONFIG_CONV1_RATE_MASK, i));
948 return regmap_update_bits(st->regmap, AD74115_ADC_CONFIG_REG,
949 AD74115_ADC_CONFIG_CONV2_RATE_MASK,
950 FIELD_PREP(AD74115_ADC_CONFIG_CONV2_RATE_MASK, i));
953 static int ad74115_get_dac_rate(struct ad74115_state *st, int *val)
955 unsigned int i, en_val, step_val, rate_val, tmp;
958 ret = regmap_read(st->regmap, AD74115_OUTPUT_CONFIG_REG, &tmp);
962 en_val = FIELD_GET(AD74115_OUTPUT_SLEW_EN_MASK, tmp);
963 step_val = FIELD_GET(AD74115_OUTPUT_SLEW_LIN_STEP_MASK, tmp);
964 rate_val = FIELD_GET(AD74115_OUTPUT_SLEW_LIN_RATE_MASK, tmp);
966 for (i = 0; i < ARRAY_SIZE(ad74115_dac_rate_step_tbl); i++)
967 if (en_val == ad74115_dac_rate_step_tbl[i][0] &&
968 step_val == ad74115_dac_rate_step_tbl[i][1] &&
969 rate_val == ad74115_dac_rate_step_tbl[i][2])
972 if (i == ARRAY_SIZE(ad74115_dac_rate_step_tbl))
975 *val = ad74115_dac_rate_tbl[i];
980 static int ad74115_set_dac_rate(struct ad74115_state *st, int val)
982 unsigned int i, en_val, step_val, rate_val, mask, tmp;
985 ret = ad74115_find_tbl_index(ad74115_dac_rate_tbl, val, &i);
989 en_val = ad74115_dac_rate_step_tbl[i][0];
990 step_val = ad74115_dac_rate_step_tbl[i][1];
991 rate_val = ad74115_dac_rate_step_tbl[i][2];
993 mask = AD74115_OUTPUT_SLEW_EN_MASK;
994 mask |= AD74115_OUTPUT_SLEW_LIN_STEP_MASK;
995 mask |= AD74115_OUTPUT_SLEW_LIN_RATE_MASK;
997 tmp = FIELD_PREP(AD74115_OUTPUT_SLEW_EN_MASK, en_val);
998 tmp |= FIELD_PREP(AD74115_OUTPUT_SLEW_LIN_STEP_MASK, step_val);
999 tmp |= FIELD_PREP(AD74115_OUTPUT_SLEW_LIN_RATE_MASK, rate_val);
1001 return regmap_update_bits(st->regmap, AD74115_OUTPUT_CONFIG_REG, mask, tmp);
1004 static int ad74115_get_dac_scale(struct ad74115_state *st,
1005 struct iio_chan_spec const *chan,
1006 int *val, int *val2)
1008 if (chan->channel == AD74115_DAC_CH_MAIN) {
1009 if (chan->type == IIO_VOLTAGE) {
1010 *val = AD74115_DAC_VOLTAGE_MAX;
1012 if (st->dac_bipolar)
1016 *val = AD74115_DAC_CURRENT_MAX;
1019 *val2 = AD74115_DAC_CODE_MAX;
1021 if (st->din_threshold_mode == AD74115_DIN_THRESHOLD_MODE_AVDD) {
1022 *val = 196 * st->avdd_mv;
1023 *val2 = 10 * AD74115_COMP_THRESH_MAX;
1026 *val2 = AD74115_COMP_THRESH_MAX;
1030 return IIO_VAL_FRACTIONAL;
1033 static int ad74115_get_dac_offset(struct ad74115_state *st,
1034 struct iio_chan_spec const *chan, int *val)
1036 if (chan->channel == AD74115_DAC_CH_MAIN) {
1037 if (chan->type == IIO_VOLTAGE && st->dac_bipolar)
1038 *val = -AD74115_DAC_CODE_HALF;
1042 if (st->din_threshold_mode == AD74115_DIN_THRESHOLD_MODE_AVDD)
1051 static int ad74115_get_adc_range(struct ad74115_state *st,
1052 enum ad74115_adc_ch channel, unsigned int *val)
1056 ret = regmap_read(st->regmap, AD74115_ADC_CONFIG_REG, val);
1060 if (channel == AD74115_ADC_CH_CONV1)
1061 *val = FIELD_GET(AD74115_ADC_CONFIG_CONV1_RANGE_MASK, *val);
1063 *val = FIELD_GET(AD74115_ADC_CONFIG_CONV2_RANGE_MASK, *val);
1068 static int ad74115_get_adc_resistance_scale(struct ad74115_state *st,
1070 int *val, int *val2)
1072 *val = ad74115_adc_gain_tbl[range][1] * AD74115_REF_RESISTOR_OHMS;
1073 *val2 = ad74115_adc_gain_tbl[range][0];
1075 if (ad74115_adc_bipolar_tbl[range])
1076 *val2 *= AD74115_ADC_CODE_HALF;
1078 *val2 *= AD74115_ADC_CODE_MAX;
1080 return IIO_VAL_FRACTIONAL;
1083 static int ad74115_get_adc_scale(struct ad74115_state *st,
1084 struct iio_chan_spec const *chan,
1085 int *val, int *val2)
1090 ret = ad74115_get_adc_range(st, chan->channel, &range);
1094 if (chan->type == IIO_RESISTANCE)
1095 return ad74115_get_adc_resistance_scale(st, range, val, val2);
1097 *val = ad74115_adc_conv_mul_tbl[range];
1098 *val2 = AD74115_ADC_CODE_MAX;
1100 if (chan->type == IIO_CURRENT)
1101 *val2 *= AD74115_SENSE_RESISTOR_OHMS;
1103 return IIO_VAL_FRACTIONAL;
1106 static int ad74115_get_adc_resistance_offset(struct ad74115_state *st,
1108 int *val, int *val2)
1110 unsigned int d = 10 * AD74115_REF_RESISTOR_OHMS
1111 * ad74115_adc_gain_tbl[range][1];
1115 if (ad74115_adc_bipolar_tbl[range])
1116 *val -= AD74115_ADC_CODE_HALF;
1120 if (!st->rtd_mode_4_wire) {
1121 /* Add 0.2 Ohm to the final result for 3-wire RTD. */
1122 unsigned int v = 2 * ad74115_adc_gain_tbl[range][0];
1124 if (ad74115_adc_bipolar_tbl[range])
1125 v *= AD74115_ADC_CODE_HALF;
1127 v *= AD74115_ADC_CODE_MAX;
1134 return IIO_VAL_FRACTIONAL;
1137 static int ad74115_get_adc_offset(struct ad74115_state *st,
1138 struct iio_chan_spec const *chan,
1139 int *val, int *val2)
1144 ret = ad74115_get_adc_range(st, chan->channel, &range);
1148 if (chan->type == IIO_RESISTANCE)
1149 return ad74115_get_adc_resistance_offset(st, range, val, val2);
1151 if (ad74115_adc_bipolar_tbl[range])
1152 *val = -AD74115_ADC_CODE_HALF;
1153 else if (range == AD74115_ADC_RANGE_2_5V_NEG)
1154 *val = -AD74115_ADC_CODE_MAX;
1161 static int ad74115_read_raw(struct iio_dev *indio_dev,
1162 struct iio_chan_spec const *chan,
1163 int *val, int *val2, long info)
1165 struct ad74115_state *st = iio_priv(indio_dev);
1169 case IIO_CHAN_INFO_RAW:
1171 return ad74115_get_dac_code(st, chan->channel, val);
1173 return ad74115_get_adc_code(indio_dev, chan->channel, val);
1174 case IIO_CHAN_INFO_PROCESSED:
1175 ret = ad74115_get_adc_code(indio_dev, chan->channel, val);
1179 return ad74115_adc_code_to_resistance(*val, val, val2);
1180 case IIO_CHAN_INFO_SCALE:
1182 return ad74115_get_dac_scale(st, chan, val, val2);
1184 return ad74115_get_adc_scale(st, chan, val, val2);
1185 case IIO_CHAN_INFO_OFFSET:
1187 return ad74115_get_dac_offset(st, chan, val);
1189 return ad74115_get_adc_offset(st, chan, val, val2);
1190 case IIO_CHAN_INFO_SAMP_FREQ:
1192 return ad74115_get_dac_rate(st, val);
1194 return ad74115_get_adc_rate(st, chan->channel, val);
1200 static int ad74115_write_raw(struct iio_dev *indio_dev,
1201 struct iio_chan_spec const *chan, int val, int val2,
1204 struct ad74115_state *st = iio_priv(indio_dev);
1207 case IIO_CHAN_INFO_RAW:
1211 return ad74115_set_dac_code(st, chan->channel, val);
1212 case IIO_CHAN_INFO_SAMP_FREQ:
1214 return ad74115_set_dac_rate(st, val);
1216 return ad74115_set_adc_rate(st, chan->channel, val);
1222 static int ad74115_read_avail(struct iio_dev *indio_dev,
1223 struct iio_chan_spec const *chan,
1224 const int **vals, int *type, int *length, long info)
1227 case IIO_CHAN_INFO_SAMP_FREQ:
1229 *vals = ad74115_dac_rate_tbl;
1230 *length = ARRAY_SIZE(ad74115_dac_rate_tbl);
1232 *vals = ad74115_adc_conv_rate_tbl;
1233 *length = ARRAY_SIZE(ad74115_adc_conv_rate_tbl);
1236 *type = IIO_VAL_INT;
1238 return IIO_AVAIL_LIST;
1244 static int ad74115_reg_access(struct iio_dev *indio_dev, unsigned int reg,
1245 unsigned int writeval, unsigned int *readval)
1247 struct ad74115_state *st = iio_priv(indio_dev);
1250 return regmap_read(st->regmap, reg, readval);
1252 return regmap_write(st->regmap, reg, writeval);
1255 static const struct iio_info ad74115_info = {
1256 .read_raw = ad74115_read_raw,
1257 .write_raw = ad74115_write_raw,
1258 .read_avail = ad74115_read_avail,
1259 .update_scan_mode = ad74115_update_scan_mode,
1260 .debugfs_reg_access = ad74115_reg_access,
1263 #define AD74115_DAC_CHANNEL(_type, index) \
1266 .channel = (index), \
1270 .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) \
1271 | BIT(IIO_CHAN_INFO_SCALE) \
1272 | BIT(IIO_CHAN_INFO_OFFSET), \
1275 #define _AD74115_ADC_CHANNEL(_type, index, extra_mask_separate) \
1278 .channel = (index), \
1280 .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) \
1281 | BIT(IIO_CHAN_INFO_SAMP_FREQ) \
1282 | (extra_mask_separate), \
1283 .info_mask_separate_available = \
1284 BIT(IIO_CHAN_INFO_SAMP_FREQ), \
1285 .scan_index = index, \
1289 .storagebits = 32, \
1291 .endianness = IIO_BE, \
1295 #define AD74115_ADC_CHANNEL(_type, index) \
1296 _AD74115_ADC_CHANNEL(_type, index, BIT(IIO_CHAN_INFO_SCALE) \
1297 | BIT(IIO_CHAN_INFO_OFFSET))
1299 static struct iio_chan_spec ad74115_voltage_input_channels[] = {
1300 AD74115_ADC_CHANNEL(IIO_VOLTAGE, AD74115_ADC_CH_CONV1),
1301 AD74115_ADC_CHANNEL(IIO_VOLTAGE, AD74115_ADC_CH_CONV2),
1304 static struct iio_chan_spec ad74115_voltage_output_channels[] = {
1305 AD74115_DAC_CHANNEL(IIO_VOLTAGE, AD74115_DAC_CH_MAIN),
1306 AD74115_ADC_CHANNEL(IIO_CURRENT, AD74115_ADC_CH_CONV1),
1307 AD74115_ADC_CHANNEL(IIO_VOLTAGE, AD74115_ADC_CH_CONV2),
1310 static struct iio_chan_spec ad74115_current_input_channels[] = {
1311 AD74115_ADC_CHANNEL(IIO_CURRENT, AD74115_ADC_CH_CONV1),
1312 AD74115_ADC_CHANNEL(IIO_VOLTAGE, AD74115_ADC_CH_CONV2),
1315 static struct iio_chan_spec ad74115_current_output_channels[] = {
1316 AD74115_DAC_CHANNEL(IIO_CURRENT, AD74115_DAC_CH_MAIN),
1317 AD74115_ADC_CHANNEL(IIO_VOLTAGE, AD74115_ADC_CH_CONV1),
1318 AD74115_ADC_CHANNEL(IIO_VOLTAGE, AD74115_ADC_CH_CONV2),
1321 static struct iio_chan_spec ad74115_2_wire_resistance_input_channels[] = {
1322 _AD74115_ADC_CHANNEL(IIO_RESISTANCE, AD74115_ADC_CH_CONV1,
1323 BIT(IIO_CHAN_INFO_PROCESSED)),
1324 AD74115_ADC_CHANNEL(IIO_VOLTAGE, AD74115_ADC_CH_CONV2),
1327 static struct iio_chan_spec ad74115_3_4_wire_resistance_input_channels[] = {
1328 AD74115_ADC_CHANNEL(IIO_RESISTANCE, AD74115_ADC_CH_CONV1),
1329 AD74115_ADC_CHANNEL(IIO_VOLTAGE, AD74115_ADC_CH_CONV2),
1332 static struct iio_chan_spec ad74115_digital_input_logic_channels[] = {
1333 AD74115_DAC_CHANNEL(IIO_VOLTAGE, AD74115_DAC_CH_COMPARATOR),
1334 AD74115_ADC_CHANNEL(IIO_VOLTAGE, AD74115_ADC_CH_CONV1),
1335 AD74115_ADC_CHANNEL(IIO_VOLTAGE, AD74115_ADC_CH_CONV2),
1338 static struct iio_chan_spec ad74115_digital_input_loop_channels[] = {
1339 AD74115_DAC_CHANNEL(IIO_CURRENT, AD74115_DAC_CH_MAIN),
1340 AD74115_DAC_CHANNEL(IIO_VOLTAGE, AD74115_DAC_CH_COMPARATOR),
1341 AD74115_ADC_CHANNEL(IIO_VOLTAGE, AD74115_ADC_CH_CONV1),
1342 AD74115_ADC_CHANNEL(IIO_VOLTAGE, AD74115_ADC_CH_CONV2),
1345 #define _AD74115_CHANNELS(_channels) \
1347 .channels = _channels, \
1348 .num_channels = ARRAY_SIZE(_channels), \
1351 #define AD74115_CHANNELS(name) \
1352 _AD74115_CHANNELS(ad74115_ ## name ## _channels)
1354 static const struct ad74115_channels ad74115_channels_map[AD74115_CH_FUNC_NUM] = {
1355 [AD74115_CH_FUNC_HIGH_IMPEDANCE] = AD74115_CHANNELS(voltage_input),
1356 [AD74115_CH_FUNC_VOLTAGE_INPUT] = AD74115_CHANNELS(voltage_input),
1358 [AD74115_CH_FUNC_VOLTAGE_OUTPUT] = AD74115_CHANNELS(voltage_output),
1360 [AD74115_CH_FUNC_CURRENT_INPUT_EXT_POWER] = AD74115_CHANNELS(current_input),
1361 [AD74115_CH_FUNC_CURRENT_INPUT_LOOP_POWER] = AD74115_CHANNELS(current_input),
1362 [AD74115_CH_FUNC_CURRENT_INPUT_EXT_POWER_HART] = AD74115_CHANNELS(current_input),
1363 [AD74115_CH_FUNC_CURRENT_INPUT_LOOP_POWER_HART] = AD74115_CHANNELS(current_input),
1365 [AD74115_CH_FUNC_CURRENT_OUTPUT] = AD74115_CHANNELS(current_output),
1366 [AD74115_CH_FUNC_CURRENT_OUTPUT_HART] = AD74115_CHANNELS(current_output),
1368 [AD74115_CH_FUNC_2_WIRE_RESISTANCE_INPUT] = AD74115_CHANNELS(2_wire_resistance_input),
1369 [AD74115_CH_FUNC_3_4_WIRE_RESISTANCE_INPUT] = AD74115_CHANNELS(3_4_wire_resistance_input),
1371 [AD74115_CH_FUNC_DIGITAL_INPUT_LOGIC] = AD74115_CHANNELS(digital_input_logic),
1373 [AD74115_CH_FUNC_DIGITAL_INPUT_LOOP_POWER] = AD74115_CHANNELS(digital_input_loop),
1376 #define AD74115_GPIO_MODE_FW_PROP(i) \
1378 .name = "adi,gpio" __stringify(i) "-mode", \
1379 .reg = AD74115_GPIO_CONFIG_X_REG(i), \
1380 .mask = AD74115_GPIO_CONFIG_SELECT_MASK, \
1381 .lookup_tbl = ad74115_gpio_mode_tbl, \
1382 .lookup_tbl_len = ARRAY_SIZE(ad74115_gpio_mode_tbl), \
1385 static const struct ad74115_fw_prop ad74115_gpio_mode_fw_props[] = {
1386 AD74115_GPIO_MODE_FW_PROP(0),
1387 AD74115_GPIO_MODE_FW_PROP(1),
1388 AD74115_GPIO_MODE_FW_PROP(2),
1389 AD74115_GPIO_MODE_FW_PROP(3),
1392 static const struct ad74115_fw_prop ad74115_din_threshold_mode_fw_prop =
1393 AD74115_FW_PROP_BOOL("adi,digital-input-threshold-mode-fixed",
1394 AD74115_DIN_CONFIG2_REG, BIT(7));
1396 static const struct ad74115_fw_prop ad74115_dac_bipolar_fw_prop =
1397 AD74115_FW_PROP_BOOL("adi,dac-bipolar", AD74115_OUTPUT_CONFIG_REG, BIT(7));
1399 static const struct ad74115_fw_prop ad74115_ch_func_fw_prop =
1400 AD74115_FW_PROP("adi,ch-func", AD74115_CH_FUNC_MAX,
1401 AD74115_CH_FUNC_SETUP_REG, GENMASK(3, 0));
1403 static const struct ad74115_fw_prop ad74115_rtd_mode_fw_prop =
1404 AD74115_FW_PROP_BOOL("adi,4-wire-rtd", AD74115_RTD3W4W_CONFIG_REG, BIT(3));
1406 static const struct ad74115_fw_prop ad74115_din_range_fw_prop =
1407 AD74115_FW_PROP_BOOL("adi,digital-input-sink-range-high",
1408 AD74115_DIN_CONFIG1_REG, BIT(12));
1410 static const struct ad74115_fw_prop ad74115_ext2_burnout_current_fw_prop =
1411 AD74115_FW_PROP_TBL("adi,ext2-burnout-current-nanoamp",
1412 ad74115_burnout_current_na_tbl,
1413 AD74115_BURNOUT_CONFIG_REG, GENMASK(14, 12));
1415 static const struct ad74115_fw_prop ad74115_ext1_burnout_current_fw_prop =
1416 AD74115_FW_PROP_TBL("adi,ext1-burnout-current-nanoamp",
1417 ad74115_burnout_current_na_tbl,
1418 AD74115_BURNOUT_CONFIG_REG, GENMASK(9, 7));
1420 static const struct ad74115_fw_prop ad74115_viout_burnout_current_fw_prop =
1421 AD74115_FW_PROP_TBL("adi,viout-burnout-current-nanoamp",
1422 ad74115_viout_burnout_current_na_tbl,
1423 AD74115_BURNOUT_CONFIG_REG, GENMASK(4, 2));
1425 static const struct ad74115_fw_prop ad74115_fw_props[] = {
1426 AD74115_FW_PROP("adi,conv2-mux", 3,
1427 AD74115_ADC_CONFIG_REG, GENMASK(3, 2)),
1429 AD74115_FW_PROP_BOOL_NEG("adi,sense-agnd-buffer-low-power",
1430 AD74115_PWR_OPTIM_CONFIG_REG, BIT(4)),
1431 AD74115_FW_PROP_BOOL_NEG("adi,lf-buffer-low-power",
1432 AD74115_PWR_OPTIM_CONFIG_REG, BIT(3)),
1433 AD74115_FW_PROP_BOOL_NEG("adi,hf-buffer-low-power",
1434 AD74115_PWR_OPTIM_CONFIG_REG, BIT(2)),
1435 AD74115_FW_PROP_BOOL_NEG("adi,ext2-buffer-low-power",
1436 AD74115_PWR_OPTIM_CONFIG_REG, BIT(1)),
1437 AD74115_FW_PROP_BOOL_NEG("adi,ext1-buffer-low-power",
1438 AD74115_PWR_OPTIM_CONFIG_REG, BIT(0)),
1440 AD74115_FW_PROP_BOOL("adi,comparator-invert",
1441 AD74115_DIN_CONFIG1_REG, BIT(14)),
1442 AD74115_FW_PROP_BOOL("adi,digital-input-debounce-mode-counter-reset",
1443 AD74115_DIN_CONFIG1_REG, BIT(6)),
1445 AD74115_FW_PROP_BOOL("adi,digital-input-unbuffered",
1446 AD74115_DIN_CONFIG2_REG, BIT(10)),
1447 AD74115_FW_PROP_BOOL("adi,digital-input-short-circuit-detection",
1448 AD74115_DIN_CONFIG2_REG, BIT(9)),
1449 AD74115_FW_PROP_BOOL("adi,digital-input-open-circuit-detection",
1450 AD74115_DIN_CONFIG2_REG, BIT(8)),
1452 AD74115_FW_PROP_BOOL("adi,dac-current-limit-low",
1453 AD74115_OUTPUT_CONFIG_REG, BIT(0)),
1455 AD74115_FW_PROP_BOOL("adi,3-wire-rtd-excitation-swap",
1456 AD74115_RTD3W4W_CONFIG_REG, BIT(2)),
1457 AD74115_FW_PROP_TBL("adi,rtd-excitation-current-microamp",
1458 ad74115_rtd_excitation_current_ua_tbl,
1459 AD74115_RTD3W4W_CONFIG_REG, GENMASK(1, 0)),
1461 AD74115_FW_PROP_BOOL("adi,ext2-burnout-current-polarity-sourcing",
1462 AD74115_BURNOUT_CONFIG_REG, BIT(11)),
1463 AD74115_FW_PROP_BOOL("adi,ext1-burnout-current-polarity-sourcing",
1464 AD74115_BURNOUT_CONFIG_REG, BIT(6)),
1465 AD74115_FW_PROP_BOOL("adi,viout-burnout-current-polarity-sourcing",
1466 AD74115_BURNOUT_CONFIG_REG, BIT(1)),
1468 AD74115_FW_PROP_BOOL("adi,charge-pump",
1469 AD74115_CHARGE_PUMP_REG, BIT(0)),
1472 static int ad74115_apply_fw_prop(struct ad74115_state *st,
1473 const struct ad74115_fw_prop *prop, u32 *retval)
1475 struct device *dev = &st->spi->dev;
1479 if (prop->is_boolean) {
1480 val = device_property_read_bool(dev, prop->name);
1482 ret = device_property_read_u32(dev, prop->name, &val);
1483 if (ret && prop->lookup_tbl)
1484 val = prop->lookup_tbl[0];
1492 if (prop->lookup_tbl)
1493 ret = _ad74115_find_tbl_index(prop->lookup_tbl,
1494 prop->lookup_tbl_len, val, &val);
1495 else if (prop->max && val > prop->max)
1501 return dev_err_probe(dev, -EINVAL,
1502 "Invalid value %u for prop %s\n",
1505 WARN(!prop->mask, "Prop %s mask is empty\n", prop->name);
1507 val = (val << __ffs(prop->mask)) & prop->mask;
1509 return regmap_update_bits(st->regmap, prop->reg, prop->mask, val);
1512 static int ad74115_setup_adc_conv2_range(struct ad74115_state *st)
1514 unsigned int tbl_len = ARRAY_SIZE(ad74115_adc_range_tbl);
1515 const char *prop_name = "adi,conv2-range-microvolt";
1517 ad74115_adc_range_tbl[0][0],
1518 ad74115_adc_range_tbl[0][1],
1520 struct device *dev = &st->spi->dev;
1523 device_property_read_u32_array(dev, prop_name, vals, 2);
1525 for (i = 0; i < tbl_len; i++)
1526 if (vals[0] == ad74115_adc_range_tbl[i][0] &&
1527 vals[1] == ad74115_adc_range_tbl[i][1])
1531 return dev_err_probe(dev, -EINVAL,
1532 "Invalid value %d, %d for prop %s\n",
1533 vals[0], vals[1], prop_name);
1535 return regmap_update_bits(st->regmap, AD74115_ADC_CONFIG_REG,
1536 AD74115_ADC_CONFIG_CONV2_RANGE_MASK,
1537 FIELD_PREP(AD74115_ADC_CONFIG_CONV2_RANGE_MASK, i));
1540 static int ad74115_setup_iio_channels(struct iio_dev *indio_dev)
1542 struct ad74115_state *st = iio_priv(indio_dev);
1543 struct device *dev = &st->spi->dev;
1544 struct iio_chan_spec *channels;
1546 channels = devm_kcalloc(dev, sizeof(*channels),
1547 indio_dev->num_channels, GFP_KERNEL);
1551 indio_dev->channels = channels;
1553 memcpy(channels, ad74115_channels_map[st->ch_func].channels,
1554 sizeof(*channels) * ad74115_channels_map[st->ch_func].num_channels);
1556 if (channels[0].output && channels[0].channel == AD74115_DAC_CH_MAIN &&
1557 channels[0].type == IIO_VOLTAGE && !st->dac_hart_slew) {
1558 channels[0].info_mask_separate |= BIT(IIO_CHAN_INFO_SAMP_FREQ);
1559 channels[0].info_mask_separate_available |= BIT(IIO_CHAN_INFO_SAMP_FREQ);
1565 static int ad74115_setup_gpio_chip(struct ad74115_state *st)
1567 struct device *dev = &st->spi->dev;
1569 if (!st->gpio_valid_mask)
1572 st->gc = (struct gpio_chip) {
1573 .owner = THIS_MODULE,
1574 .label = AD74115_NAME,
1576 .ngpio = AD74115_GPIO_NUM,
1579 .init_valid_mask = ad74115_gpio_init_valid_mask,
1580 .get_direction = ad74115_gpio_get_direction,
1581 .direction_input = ad74115_gpio_direction_input,
1582 .direction_output = ad74115_gpio_direction_output,
1583 .get = ad74115_gpio_get,
1584 .set = ad74115_gpio_set,
1587 return devm_gpiochip_add_data(dev, &st->gc, st);
1590 static int ad74115_setup_comp_gpio_chip(struct ad74115_state *st)
1592 struct device *dev = &st->spi->dev;
1596 ret = regmap_read(st->regmap, AD74115_DIN_CONFIG1_REG, &val);
1600 if (!(val & AD74115_DIN_COMPARATOR_EN_MASK))
1603 st->comp_gc = (struct gpio_chip) {
1604 .owner = THIS_MODULE,
1605 .label = AD74115_NAME,
1610 .get_direction = ad74115_comp_gpio_get_direction,
1611 .get = ad74115_comp_gpio_get,
1612 .set_config = ad74115_comp_gpio_set_config,
1615 return devm_gpiochip_add_data(dev, &st->comp_gc, st);
1618 static int ad74115_setup(struct iio_dev *indio_dev)
1620 struct ad74115_state *st = iio_priv(indio_dev);
1621 struct device *dev = &st->spi->dev;
1622 u32 val, din_range_high;
1626 ret = ad74115_apply_fw_prop(st, &ad74115_ch_func_fw_prop, &val);
1630 indio_dev->num_channels += ad74115_channels_map[val].num_channels;
1633 ret = ad74115_setup_adc_conv2_range(st);
1637 val = device_property_read_bool(dev, "adi,dac-hart-slew");
1639 st->dac_hart_slew = val;
1641 ret = regmap_update_bits(st->regmap, AD74115_OUTPUT_CONFIG_REG,
1642 AD74115_OUTPUT_SLEW_EN_MASK,
1643 FIELD_PREP(AD74115_OUTPUT_SLEW_EN_MASK,
1644 AD74115_SLEW_MODE_HART));
1649 ret = ad74115_apply_fw_prop(st, &ad74115_din_range_fw_prop,
1654 ret = device_property_read_u32(dev, "adi,digital-input-sink-microamp", &val);
1657 val = DIV_ROUND_CLOSEST(val, AD74115_DIN_SINK_LOW_STEP);
1659 val = DIV_ROUND_CLOSEST(val, AD74115_DIN_SINK_HIGH_STEP);
1661 if (val > AD74115_DIN_SINK_MAX)
1662 val = AD74115_DIN_SINK_MAX;
1664 ret = regmap_update_bits(st->regmap, AD74115_DIN_CONFIG1_REG,
1665 AD74115_DIN_SINK_MASK,
1666 FIELD_PREP(AD74115_DIN_SINK_MASK, val));
1671 ret = ad74115_apply_fw_prop(st, &ad74115_din_threshold_mode_fw_prop, &val);
1675 if (val == AD74115_DIN_THRESHOLD_MODE_AVDD) {
1676 ret = regulator_get_voltage(st->avdd);
1680 st->avdd_mv = ret / 1000;
1683 st->din_threshold_mode = val;
1685 ret = ad74115_apply_fw_prop(st, &ad74115_dac_bipolar_fw_prop, &val);
1689 st->dac_bipolar = val;
1691 ret = ad74115_apply_fw_prop(st, &ad74115_rtd_mode_fw_prop, &val);
1695 st->rtd_mode_4_wire = val;
1697 ret = ad74115_apply_fw_prop(st, &ad74115_ext2_burnout_current_fw_prop, &val);
1702 ret = regmap_update_bits(st->regmap, AD74115_BURNOUT_CONFIG_REG,
1703 AD74115_BURNOUT_EXT2_EN_MASK,
1704 FIELD_PREP(AD74115_BURNOUT_EXT2_EN_MASK, 1));
1709 ret = ad74115_apply_fw_prop(st, &ad74115_ext1_burnout_current_fw_prop, &val);
1714 ret = regmap_update_bits(st->regmap, AD74115_BURNOUT_CONFIG_REG,
1715 AD74115_BURNOUT_EXT1_EN_MASK,
1716 FIELD_PREP(AD74115_BURNOUT_EXT1_EN_MASK, 1));
1721 ret = ad74115_apply_fw_prop(st, &ad74115_viout_burnout_current_fw_prop, &val);
1726 ret = regmap_update_bits(st->regmap, AD74115_BURNOUT_CONFIG_REG,
1727 AD74115_BURNOUT_VIOUT_EN_MASK,
1728 FIELD_PREP(AD74115_BURNOUT_VIOUT_EN_MASK, 1));
1733 for (i = 0; i < AD74115_GPIO_NUM; i++) {
1734 ret = ad74115_apply_fw_prop(st, &ad74115_gpio_mode_fw_props[i], &val);
1738 if (val == AD74115_GPIO_MODE_LOGIC)
1739 st->gpio_valid_mask |= BIT(i);
1742 for (i = 0; i < ARRAY_SIZE(ad74115_fw_props); i++) {
1743 ret = ad74115_apply_fw_prop(st, &ad74115_fw_props[i], &val);
1748 ret = ad74115_setup_gpio_chip(st);
1752 ret = ad74115_setup_comp_gpio_chip(st);
1756 return ad74115_setup_iio_channels(indio_dev);
1759 static int ad74115_reset(struct ad74115_state *st)
1761 struct device *dev = &st->spi->dev;
1762 struct gpio_desc *reset_gpio;
1765 reset_gpio = devm_gpiod_get_optional(dev, "reset", GPIOD_OUT_HIGH);
1766 if (IS_ERR(reset_gpio))
1767 return dev_err_probe(dev, PTR_ERR(reset_gpio),
1768 "Failed to find reset GPIO\n");
1773 gpiod_set_value_cansleep(reset_gpio, 0);
1775 ret = regmap_write(st->regmap, AD74115_CMD_KEY_REG,
1776 AD74115_CMD_KEY_RESET1);
1780 ret = regmap_write(st->regmap, AD74115_CMD_KEY_REG,
1781 AD74115_CMD_KEY_RESET2);
1791 static void ad74115_regulator_disable(void *data)
1793 regulator_disable(data);
1796 static int ad74115_setup_trigger(struct iio_dev *indio_dev)
1798 struct ad74115_state *st = iio_priv(indio_dev);
1799 struct device *dev = &st->spi->dev;
1802 st->irq = fwnode_irq_get_byname(dev_fwnode(dev), "adc_rdy");
1804 if (st->irq == -EPROBE_DEFER)
1805 return -EPROBE_DEFER;
1812 ret = devm_request_irq(dev, st->irq, ad74115_adc_data_interrupt,
1813 0, AD74115_NAME, indio_dev);
1817 st->trig = devm_iio_trigger_alloc(dev, "%s-dev%d", AD74115_NAME,
1818 iio_device_id(indio_dev));
1822 st->trig->ops = &ad74115_trigger_ops;
1823 iio_trigger_set_drvdata(st->trig, st);
1825 ret = devm_iio_trigger_register(dev, st->trig);
1829 indio_dev->trig = iio_trigger_get(st->trig);
1834 static int ad74115_probe(struct spi_device *spi)
1836 static const char * const regulator_names[] = {
1837 "avcc", "dvcc", "dovdd", "refin",
1839 struct device *dev = &spi->dev;
1840 struct ad74115_state *st;
1841 struct iio_dev *indio_dev;
1844 indio_dev = devm_iio_device_alloc(dev, sizeof(*st));
1848 st = iio_priv(indio_dev);
1851 mutex_init(&st->lock);
1852 init_completion(&st->adc_data_completion);
1854 indio_dev->name = AD74115_NAME;
1855 indio_dev->modes = INDIO_DIRECT_MODE;
1856 indio_dev->info = &ad74115_info;
1858 st->avdd = devm_regulator_get(dev, "avdd");
1859 if (IS_ERR(st->avdd))
1860 return PTR_ERR(st->avdd);
1862 ret = regulator_enable(st->avdd);
1864 dev_err(dev, "Failed to enable avdd regulator\n");
1868 ret = devm_add_action_or_reset(dev, ad74115_regulator_disable, st->avdd);
1872 ret = devm_regulator_bulk_get_enable(dev, ARRAY_SIZE(regulator_names),
1877 st->regmap = devm_regmap_init(dev, NULL, st, &ad74115_regmap_config);
1878 if (IS_ERR(st->regmap))
1879 return PTR_ERR(st->regmap);
1881 ret = ad74115_reset(st);
1885 ret = ad74115_setup(indio_dev);
1889 ret = ad74115_setup_trigger(indio_dev);
1893 ret = devm_iio_triggered_buffer_setup(dev, indio_dev, NULL,
1894 ad74115_trigger_handler,
1895 &ad74115_buffer_ops);
1899 return devm_iio_device_register(dev, indio_dev);
1902 static int ad74115_unregister_driver(struct spi_driver *spi)
1904 spi_unregister_driver(spi);
1909 static int __init ad74115_register_driver(struct spi_driver *spi)
1911 crc8_populate_msb(ad74115_crc8_table, AD74115_CRC_POLYNOMIAL);
1913 return spi_register_driver(spi);
1916 static const struct spi_device_id ad74115_spi_id[] = {
1921 MODULE_DEVICE_TABLE(spi, ad74115_spi_id);
1923 static const struct of_device_id ad74115_dt_id[] = {
1924 { .compatible = "adi,ad74115h" },
1927 MODULE_DEVICE_TABLE(of, ad74115_dt_id);
1929 static struct spi_driver ad74115_driver = {
1932 .of_match_table = ad74115_dt_id,
1934 .probe = ad74115_probe,
1935 .id_table = ad74115_spi_id,
1938 module_driver(ad74115_driver,
1939 ad74115_register_driver, ad74115_unregister_driver);
1942 MODULE_DESCRIPTION("Analog Devices AD74115 ADDAC");
1943 MODULE_LICENSE("GPL");