Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

iio: addac: add AD74413R driver

The AD74412R and AD74413R are quad-channel, software configurable,
input/output solutions for building and process control applications.

They contain functionality for analog output, analog input, digital input,
resistance temperature detector, and thermocouple measurements integrated
into a single chip solution with an SPI interface.

The devices feature a 16-bit ADC and four configurable 13-bit DACs to
provide four configurable input/output channels and a suite of diagnostic
functions.

The AD74413R differentiates itself from the AD74412R by being
HART-compatible.

When configured with channel 0 as voltage output, channel 1 as current
output, channel 2 as voltage input and channel 3 as current input, the
following structure is created under the corresponding IIO device.

.
├── in_current0_offset
├── in_current0_raw
├── in_current0_sampling_frequency
├── in_current0_sampling_frequency_available
├── in_current0_scale
├── in_voltage1_offset
├── in_voltage1_raw
├── in_voltage1_sampling_frequency
├── in_voltage1_sampling_frequency_available
├── in_voltage1_scale
├── in_voltage2_offset
├── in_voltage2_raw
├── in_voltage2_sampling_frequency
├── in_voltage2_sampling_frequency_available
├── in_voltage2_scale
├── in_current3_offset
├── in_current3_raw
├── in_current3_sampling_frequency
├── in_current3_sampling_frequency_available
├── in_current3_scale
├── out_voltage0_raw
├── out_voltage0_scale
├── out_current1_raw
├── out_current1_scale
├── name
├── buffer
│   ├── data_available
│   ├── enable
│   ├── length
│   └── watermark
└── scan_elements
   ├── in_current0_en
   ├── in_current0_index
   ├── in_current0_type
   ├── in_voltage1_en
   ├── in_voltage1_index
   ├── in_voltage1_type
   ├── in_voltage2_en
   ├── in_voltage2_index
   ├── in_voltage2_type
   ├── in_current3_en
   ├── in_current3_index
   └── in_current3_type

Signed-off-by: Cosmin Tanislav <cosmin.tanislav@analog.com>
Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
Link: https://lore.kernel.org/r/20211205114045.173612-4-cosmin.tanislav@analog.com
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>

authored by

Cosmin Tanislav and committed by
Jonathan Cameron
fea251b6 3cf3cdea

+1497
+9
MAINTAINERS
··· 1069 1069 F: Documentation/devicetree/bindings/iio/adc/adi,ad7780.yaml 1070 1070 F: drivers/iio/adc/ad7780.c 1071 1071 1072 + ANALOG DEVICES INC AD74413R DRIVER 1073 + M: Cosmin Tanislav <cosmin.tanislav@analog.com> 1074 + L: linux-iio@vger.kernel.org 1075 + S: Supported 1076 + W: http://ez.analog.com/community/linux-device-drivers 1077 + F: Documentation/devicetree/bindings/iio/addac/adi,ad74413r.yaml 1078 + F: drivers/iio/addac/ad74413r.c 1079 + F: include/dt-bindings/iio/addac/adi,ad74413r.h 1080 + 1072 1081 ANALOG DEVICES INC AD9389B DRIVER 1073 1082 M: Hans Verkuil <hverkuil-cisco@xs4all.nl> 1074 1083 L: linux-media@vger.kernel.org
+12
drivers/iio/addac/Kconfig
··· 5 5 6 6 menu "Analog to digital and digital to analog converters" 7 7 8 + config AD74413R 9 + tristate "Analog Devices AD74412R/AD74413R driver" 10 + depends on GPIOLIB && SPI 11 + select REGMAP_SPI 12 + select CRC8 13 + help 14 + Say yes here to build support for Analog Devices AD74412R/AD74413R 15 + quad-channel software configurable input/output solution. 16 + 17 + To compile this driver as a module, choose M here: the 18 + module will be called ad74413r. 19 + 8 20 endmenu
+1
drivers/iio/addac/Makefile
··· 4 4 # 5 5 6 6 # When adding new entries keep the list in alphabetical order 7 + obj-$(CONFIG_AD74413R) += ad74413r.o
+1475
drivers/iio/addac/ad74413r.c
··· 1 + // SPDX-License-Identifier: GPL-2.0 2 + /* 3 + * Copyright (C) 2021 Analog Devices, Inc. 4 + * Author: Cosmin Tanislav <cosmin.tanislav@analog.com> 5 + */ 6 + 7 + #include <asm/unaligned.h> 8 + #include <linux/bitfield.h> 9 + #include <linux/crc8.h> 10 + #include <linux/device.h> 11 + #include <linux/err.h> 12 + #include <linux/gpio/driver.h> 13 + #include <linux/iio/buffer.h> 14 + #include <linux/iio/iio.h> 15 + #include <linux/iio/sysfs.h> 16 + #include <linux/iio/trigger.h> 17 + #include <linux/iio/trigger_consumer.h> 18 + #include <linux/iio/triggered_buffer.h> 19 + #include <linux/interrupt.h> 20 + #include <linux/mod_devicetable.h> 21 + #include <linux/property.h> 22 + #include <linux/regmap.h> 23 + #include <linux/regulator/consumer.h> 24 + #include <linux/spi/spi.h> 25 + 26 + #include <dt-bindings/iio/addac/adi,ad74413r.h> 27 + 28 + #define AD74413R_CRC_POLYNOMIAL 0x7 29 + DECLARE_CRC8_TABLE(ad74413r_crc8_table); 30 + 31 + #define AD74413R_CHANNEL_MAX 4 32 + 33 + #define AD74413R_FRAME_SIZE 4 34 + 35 + struct ad74413r_chip_info { 36 + const char *name; 37 + bool hart_support; 38 + }; 39 + 40 + struct ad74413r_channel_config { 41 + u32 func; 42 + bool gpo_comparator; 43 + bool initialized; 44 + }; 45 + 46 + struct ad74413r_channels { 47 + struct iio_chan_spec *channels; 48 + unsigned int num_channels; 49 + }; 50 + 51 + struct ad74413r_state { 52 + struct ad74413r_channel_config channel_configs[AD74413R_CHANNEL_MAX]; 53 + unsigned int gpo_gpio_offsets[AD74413R_CHANNEL_MAX]; 54 + unsigned int comp_gpio_offsets[AD74413R_CHANNEL_MAX]; 55 + struct gpio_chip gpo_gpiochip; 56 + struct gpio_chip comp_gpiochip; 57 + struct completion adc_data_completion; 58 + unsigned int num_gpo_gpios; 59 + unsigned int num_comparator_gpios; 60 + u32 sense_resistor_ohms; 61 + 62 + /* 63 + * Synchronize consecutive operations when doing a one-shot 64 + * conversion and when updating the ADC samples SPI message. 65 + */ 66 + struct mutex lock; 67 + 68 + const struct ad74413r_chip_info *chip_info; 69 + struct spi_device *spi; 70 + struct regulator *refin_reg; 71 + struct regmap *regmap; 72 + struct device *dev; 73 + struct iio_trigger *trig; 74 + 75 + size_t adc_active_channels; 76 + struct spi_message adc_samples_msg; 77 + struct spi_transfer adc_samples_xfer[AD74413R_CHANNEL_MAX + 1]; 78 + 79 + /* 80 + * DMA (thus cache coherency maintenance) requires the 81 + * transfer buffers to live in their own cache lines. 82 + */ 83 + struct { 84 + u8 rx_buf[AD74413R_FRAME_SIZE * AD74413R_CHANNEL_MAX]; 85 + s64 timestamp; 86 + } adc_samples_buf ____cacheline_aligned; 87 + 88 + u8 adc_samples_tx_buf[AD74413R_FRAME_SIZE * AD74413R_CHANNEL_MAX]; 89 + u8 reg_tx_buf[AD74413R_FRAME_SIZE]; 90 + u8 reg_rx_buf[AD74413R_FRAME_SIZE]; 91 + }; 92 + 93 + #define AD74413R_REG_NOP 0x00 94 + 95 + #define AD74413R_REG_CH_FUNC_SETUP_X(x) (0x01 + (x)) 96 + #define AD74413R_CH_FUNC_SETUP_MASK GENMASK(3, 0) 97 + 98 + #define AD74413R_REG_ADC_CONFIG_X(x) (0x05 + (x)) 99 + #define AD74413R_ADC_CONFIG_RANGE_MASK GENMASK(7, 5) 100 + #define AD74413R_ADC_CONFIG_REJECTION_MASK GENMASK(4, 3) 101 + #define AD74413R_ADC_RANGE_10V 0b000 102 + #define AD74413R_ADC_RANGE_2P5V_EXT_POW 0b001 103 + #define AD74413R_ADC_RANGE_2P5V_INT_POW 0b010 104 + #define AD74413R_ADC_RANGE_5V_BI_DIR 0b011 105 + #define AD74413R_ADC_REJECTION_50_60 0b00 106 + #define AD74413R_ADC_REJECTION_NONE 0b01 107 + #define AD74413R_ADC_REJECTION_50_60_HART 0b10 108 + #define AD74413R_ADC_REJECTION_HART 0b11 109 + 110 + #define AD74413R_REG_DIN_CONFIG_X(x) (0x09 + (x)) 111 + #define AD74413R_DIN_DEBOUNCE_MASK GENMASK(4, 0) 112 + #define AD74413R_DIN_DEBOUNCE_LEN BIT(5) 113 + 114 + #define AD74413R_REG_DAC_CODE_X(x) (0x16 + (x)) 115 + #define AD74413R_DAC_CODE_MAX GENMASK(12, 0) 116 + #define AD74413R_DAC_VOLTAGE_MAX 11000 117 + 118 + #define AD74413R_REG_GPO_PAR_DATA 0x0d 119 + #define AD74413R_REG_GPO_CONFIG_X(x) (0x0e + (x)) 120 + #define AD74413R_GPO_CONFIG_DATA_MASK BIT(3) 121 + #define AD74413R_GPO_CONFIG_SELECT_MASK GENMASK(2, 0) 122 + #define AD74413R_GPO_CONFIG_100K_PULL_DOWN 0b000 123 + #define AD74413R_GPO_CONFIG_LOGIC 0b001 124 + #define AD74413R_GPO_CONFIG_LOGIC_PARALLEL 0b010 125 + #define AD74413R_GPO_CONFIG_COMPARATOR 0b011 126 + #define AD74413R_GPO_CONFIG_HIGH_IMPEDANCE 0b100 127 + 128 + #define AD74413R_REG_ADC_CONV_CTRL 0x23 129 + #define AD74413R_CONV_SEQ_MASK GENMASK(9, 8) 130 + #define AD74413R_CONV_SEQ_ON 0b00 131 + #define AD74413R_CONV_SEQ_SINGLE 0b01 132 + #define AD74413R_CONV_SEQ_CONTINUOUS 0b10 133 + #define AD74413R_CONV_SEQ_OFF 0b11 134 + #define AD74413R_CH_EN_MASK(x) BIT(x) 135 + 136 + #define AD74413R_REG_DIN_COMP_OUT 0x25 137 + #define AD74413R_DIN_COMP_OUT_SHIFT_X(x) x 138 + 139 + #define AD74413R_REG_ADC_RESULT_X(x) (0x26 + (x)) 140 + #define AD74413R_ADC_RESULT_MAX GENMASK(15, 0) 141 + 142 + #define AD74413R_REG_READ_SELECT 0x41 143 + 144 + #define AD74413R_REG_CMD_KEY 0x44 145 + #define AD74413R_CMD_KEY_LDAC 0x953a 146 + #define AD74413R_CMD_KEY_RESET1 0x15fa 147 + #define AD74413R_CMD_KEY_RESET2 0xaf51 148 + 149 + static const int ad74413r_adc_sampling_rates[] = { 150 + 20, 4800, 151 + }; 152 + 153 + static const int ad74413r_adc_sampling_rates_hart[] = { 154 + 10, 20, 1200, 4800, 155 + }; 156 + 157 + static int ad74413r_crc(u8 *buf) 158 + { 159 + return crc8(ad74413r_crc8_table, buf, 3, 0); 160 + } 161 + 162 + static void ad74413r_format_reg_write(u8 reg, u16 val, u8 *buf) 163 + { 164 + buf[0] = reg; 165 + put_unaligned_be16(val, &buf[1]); 166 + buf[3] = ad74413r_crc(buf); 167 + } 168 + 169 + static int ad74413r_reg_write(void *context, unsigned int reg, unsigned int val) 170 + { 171 + struct ad74413r_state *st = context; 172 + 173 + ad74413r_format_reg_write(reg, val, st->reg_tx_buf); 174 + 175 + return spi_write(st->spi, st->reg_tx_buf, AD74413R_FRAME_SIZE); 176 + } 177 + 178 + static int ad74413r_crc_check(struct ad74413r_state *st, u8 *buf) 179 + { 180 + u8 expected_crc = ad74413r_crc(buf); 181 + 182 + if (buf[3] != expected_crc) { 183 + dev_err(st->dev, "Bad CRC %02x for %02x%02x%02x\n", 184 + buf[3], buf[0], buf[1], buf[2]); 185 + return -EINVAL; 186 + } 187 + 188 + return 0; 189 + } 190 + 191 + static int ad74413r_reg_read(void *context, unsigned int reg, unsigned int *val) 192 + { 193 + struct ad74413r_state *st = context; 194 + struct spi_transfer reg_read_xfer[] = { 195 + { 196 + .tx_buf = st->reg_tx_buf, 197 + .len = AD74413R_FRAME_SIZE, 198 + .cs_change = 1, 199 + }, 200 + { 201 + .rx_buf = st->reg_rx_buf, 202 + .len = AD74413R_FRAME_SIZE, 203 + }, 204 + }; 205 + int ret; 206 + 207 + ad74413r_format_reg_write(AD74413R_REG_READ_SELECT, reg, 208 + st->reg_tx_buf); 209 + 210 + ret = spi_sync_transfer(st->spi, reg_read_xfer, 211 + ARRAY_SIZE(reg_read_xfer)); 212 + if (ret) 213 + return ret; 214 + 215 + ret = ad74413r_crc_check(st, st->reg_rx_buf); 216 + if (ret) 217 + return ret; 218 + 219 + *val = get_unaligned_be16(&st->reg_rx_buf[1]); 220 + 221 + return 0; 222 + } 223 + 224 + static const struct regmap_config ad74413r_regmap_config = { 225 + .reg_bits = 8, 226 + .val_bits = 16, 227 + .reg_read = ad74413r_reg_read, 228 + .reg_write = ad74413r_reg_write, 229 + }; 230 + 231 + static int ad74413r_set_gpo_config(struct ad74413r_state *st, 232 + unsigned int offset, u8 mode) 233 + { 234 + return regmap_update_bits(st->regmap, AD74413R_REG_GPO_CONFIG_X(offset), 235 + AD74413R_GPO_CONFIG_SELECT_MASK, mode); 236 + } 237 + 238 + static const unsigned int ad74413r_debounce_map[AD74413R_DIN_DEBOUNCE_LEN] = { 239 + 0, 13, 18, 24, 32, 42, 56, 75, 240 + 100, 130, 180, 240, 320, 420, 560, 750, 241 + 1000, 1300, 1800, 2400, 3200, 4200, 5600, 7500, 242 + 10000, 13000, 18000, 24000, 32000, 42000, 56000, 75000, 243 + }; 244 + 245 + static int ad74413r_set_comp_debounce(struct ad74413r_state *st, 246 + unsigned int offset, 247 + unsigned int debounce) 248 + { 249 + unsigned int val = AD74413R_DIN_DEBOUNCE_LEN - 1; 250 + unsigned int i; 251 + 252 + for (i = 0; i < AD74413R_DIN_DEBOUNCE_LEN; i++) 253 + if (debounce <= ad74413r_debounce_map[i]) { 254 + val = i; 255 + break; 256 + } 257 + 258 + return regmap_update_bits(st->regmap, 259 + AD74413R_REG_DIN_CONFIG_X(offset), 260 + AD74413R_DIN_DEBOUNCE_MASK, 261 + val); 262 + } 263 + 264 + static void ad74413r_gpio_set(struct gpio_chip *chip, 265 + unsigned int offset, int val) 266 + { 267 + struct ad74413r_state *st = gpiochip_get_data(chip); 268 + unsigned int real_offset = st->gpo_gpio_offsets[offset]; 269 + int ret; 270 + 271 + ret = ad74413r_set_gpo_config(st, real_offset, 272 + AD74413R_GPO_CONFIG_LOGIC); 273 + if (ret) 274 + return; 275 + 276 + regmap_update_bits(st->regmap, AD74413R_REG_GPO_CONFIG_X(real_offset), 277 + AD74413R_GPO_CONFIG_DATA_MASK, 278 + val ? AD74413R_GPO_CONFIG_DATA_MASK : 0); 279 + } 280 + 281 + static void ad74413r_gpio_set_multiple(struct gpio_chip *chip, 282 + unsigned long *mask, 283 + unsigned long *bits) 284 + { 285 + struct ad74413r_state *st = gpiochip_get_data(chip); 286 + unsigned long real_mask = 0; 287 + unsigned long real_bits = 0; 288 + unsigned int offset = 0; 289 + int ret; 290 + 291 + for_each_set_bit_from(offset, mask, AD74413R_CHANNEL_MAX) { 292 + unsigned int real_offset = st->gpo_gpio_offsets[offset]; 293 + 294 + ret = ad74413r_set_gpo_config(st, real_offset, 295 + AD74413R_GPO_CONFIG_LOGIC_PARALLEL); 296 + if (ret) 297 + return; 298 + 299 + real_mask |= BIT(real_offset); 300 + if (*bits & offset) 301 + real_bits |= BIT(real_offset); 302 + } 303 + 304 + regmap_update_bits(st->regmap, AD74413R_REG_GPO_PAR_DATA, 305 + real_mask, real_bits); 306 + } 307 + 308 + static int ad74413r_gpio_get(struct gpio_chip *chip, unsigned int offset) 309 + { 310 + struct ad74413r_state *st = gpiochip_get_data(chip); 311 + unsigned int real_offset = st->comp_gpio_offsets[offset]; 312 + unsigned int status; 313 + int ret; 314 + 315 + ret = regmap_read(st->regmap, AD74413R_REG_DIN_COMP_OUT, &status); 316 + if (ret) 317 + return ret; 318 + 319 + status &= AD74413R_DIN_COMP_OUT_SHIFT_X(real_offset); 320 + 321 + return status ? 1 : 0; 322 + } 323 + 324 + static int ad74413r_gpio_get_multiple(struct gpio_chip *chip, 325 + unsigned long *mask, 326 + unsigned long *bits) 327 + { 328 + struct ad74413r_state *st = gpiochip_get_data(chip); 329 + unsigned int offset = 0; 330 + unsigned int val; 331 + int ret; 332 + 333 + ret = regmap_read(st->regmap, AD74413R_REG_DIN_COMP_OUT, &val); 334 + if (ret) 335 + return ret; 336 + 337 + for_each_set_bit_from(offset, mask, AD74413R_CHANNEL_MAX) { 338 + unsigned int real_offset = st->comp_gpio_offsets[offset]; 339 + 340 + if (val & BIT(real_offset)) 341 + *bits |= offset; 342 + } 343 + 344 + return ret; 345 + } 346 + 347 + static int ad74413r_gpio_get_gpo_direction(struct gpio_chip *chip, 348 + unsigned int offset) 349 + { 350 + return GPIO_LINE_DIRECTION_OUT; 351 + } 352 + 353 + static int ad74413r_gpio_get_comp_direction(struct gpio_chip *chip, 354 + unsigned int offset) 355 + { 356 + return GPIO_LINE_DIRECTION_IN; 357 + } 358 + 359 + static int ad74413r_gpio_set_gpo_config(struct gpio_chip *chip, 360 + unsigned int offset, 361 + unsigned long config) 362 + { 363 + struct ad74413r_state *st = gpiochip_get_data(chip); 364 + unsigned int real_offset = st->gpo_gpio_offsets[offset]; 365 + 366 + switch (pinconf_to_config_param(config)) { 367 + case PIN_CONFIG_BIAS_PULL_DOWN: 368 + return ad74413r_set_gpo_config(st, real_offset, 369 + AD74413R_GPO_CONFIG_100K_PULL_DOWN); 370 + case PIN_CONFIG_BIAS_HIGH_IMPEDANCE: 371 + return ad74413r_set_gpo_config(st, real_offset, 372 + AD74413R_GPO_CONFIG_HIGH_IMPEDANCE); 373 + default: 374 + return -ENOTSUPP; 375 + } 376 + } 377 + 378 + static int ad74413r_gpio_set_comp_config(struct gpio_chip *chip, 379 + unsigned int offset, 380 + unsigned long config) 381 + { 382 + struct ad74413r_state *st = gpiochip_get_data(chip); 383 + unsigned int real_offset = st->comp_gpio_offsets[offset]; 384 + 385 + switch (pinconf_to_config_param(config)) { 386 + case PIN_CONFIG_INPUT_DEBOUNCE: 387 + return ad74413r_set_comp_debounce(st, real_offset, 388 + pinconf_to_config_argument(config)); 389 + default: 390 + return -ENOTSUPP; 391 + } 392 + } 393 + 394 + static int ad74413r_reset(struct ad74413r_state *st) 395 + { 396 + int ret; 397 + 398 + ret = regmap_write(st->regmap, AD74413R_REG_CMD_KEY, 399 + AD74413R_CMD_KEY_RESET1); 400 + if (ret) 401 + return ret; 402 + 403 + return regmap_write(st->regmap, AD74413R_REG_CMD_KEY, 404 + AD74413R_CMD_KEY_RESET2); 405 + } 406 + 407 + static int ad74413r_set_channel_dac_code(struct ad74413r_state *st, 408 + unsigned int channel, int dac_code) 409 + { 410 + struct reg_sequence reg_seq[2] = { 411 + { AD74413R_REG_DAC_CODE_X(channel), dac_code }, 412 + { AD74413R_REG_CMD_KEY, AD74413R_CMD_KEY_LDAC }, 413 + }; 414 + 415 + return regmap_multi_reg_write(st->regmap, reg_seq, 2); 416 + } 417 + 418 + static int ad74413r_set_channel_function(struct ad74413r_state *st, 419 + unsigned int channel, u8 func) 420 + { 421 + return regmap_update_bits(st->regmap, 422 + AD74413R_REG_CH_FUNC_SETUP_X(channel), 423 + AD74413R_CH_FUNC_SETUP_MASK, func); 424 + } 425 + 426 + static int ad74413r_set_adc_conv_seq(struct ad74413r_state *st, 427 + unsigned int status) 428 + { 429 + int ret; 430 + 431 + /* 432 + * These bits do not clear when a conversion completes. 433 + * To enable a subsequent conversion, repeat the write. 434 + */ 435 + ret = regmap_write_bits(st->regmap, AD74413R_REG_ADC_CONV_CTRL, 436 + AD74413R_CONV_SEQ_MASK, 437 + FIELD_PREP(AD74413R_CONV_SEQ_MASK, status)); 438 + if (ret) 439 + return ret; 440 + 441 + /* 442 + * Wait 100us before starting conversions. 443 + */ 444 + usleep_range(100, 120); 445 + 446 + return 0; 447 + } 448 + 449 + static int ad74413r_set_adc_channel_enable(struct ad74413r_state *st, 450 + unsigned int channel, 451 + bool status) 452 + { 453 + return regmap_update_bits(st->regmap, AD74413R_REG_ADC_CONV_CTRL, 454 + AD74413R_CH_EN_MASK(channel), 455 + status ? AD74413R_CH_EN_MASK(channel) : 0); 456 + } 457 + 458 + static int ad74413r_get_adc_range(struct ad74413r_state *st, 459 + unsigned int channel, 460 + unsigned int *val) 461 + { 462 + int ret; 463 + 464 + ret = regmap_read(st->regmap, AD74413R_REG_ADC_CONFIG_X(channel), val); 465 + if (ret) 466 + return ret; 467 + 468 + *val = FIELD_GET(AD74413R_ADC_CONFIG_RANGE_MASK, *val); 469 + 470 + return 0; 471 + } 472 + 473 + static int ad74413r_get_adc_rejection(struct ad74413r_state *st, 474 + unsigned int channel, 475 + unsigned int *val) 476 + { 477 + int ret; 478 + 479 + ret = regmap_read(st->regmap, AD74413R_REG_ADC_CONFIG_X(channel), val); 480 + if (ret) 481 + return ret; 482 + 483 + *val = FIELD_GET(AD74413R_ADC_CONFIG_REJECTION_MASK, *val); 484 + 485 + return 0; 486 + } 487 + 488 + static int ad74413r_set_adc_rejection(struct ad74413r_state *st, 489 + unsigned int channel, 490 + unsigned int val) 491 + { 492 + return regmap_update_bits(st->regmap, 493 + AD74413R_REG_ADC_CONFIG_X(channel), 494 + AD74413R_ADC_CONFIG_REJECTION_MASK, 495 + FIELD_PREP(AD74413R_ADC_CONFIG_REJECTION_MASK, 496 + val)); 497 + } 498 + 499 + static int ad74413r_rejection_to_rate(struct ad74413r_state *st, 500 + unsigned int rej, int *val) 501 + { 502 + switch (rej) { 503 + case AD74413R_ADC_REJECTION_50_60: 504 + *val = 20; 505 + return 0; 506 + case AD74413R_ADC_REJECTION_NONE: 507 + *val = 4800; 508 + return 0; 509 + case AD74413R_ADC_REJECTION_50_60_HART: 510 + *val = 10; 511 + return 0; 512 + case AD74413R_ADC_REJECTION_HART: 513 + *val = 1200; 514 + return 0; 515 + default: 516 + dev_err(st->dev, "ADC rejection invalid\n"); 517 + return -EINVAL; 518 + } 519 + } 520 + 521 + static int ad74413r_rate_to_rejection(struct ad74413r_state *st, 522 + int rate, unsigned int *val) 523 + { 524 + switch (rate) { 525 + case 20: 526 + *val = AD74413R_ADC_REJECTION_50_60; 527 + return 0; 528 + case 4800: 529 + *val = AD74413R_ADC_REJECTION_NONE; 530 + return 0; 531 + case 10: 532 + *val = AD74413R_ADC_REJECTION_50_60_HART; 533 + return 0; 534 + case 1200: 535 + *val = AD74413R_ADC_REJECTION_HART; 536 + return 0; 537 + default: 538 + dev_err(st->dev, "ADC rate invalid\n"); 539 + return -EINVAL; 540 + } 541 + } 542 + 543 + static int ad74413r_range_to_voltage_range(struct ad74413r_state *st, 544 + unsigned int range, int *val) 545 + { 546 + switch (range) { 547 + case AD74413R_ADC_RANGE_10V: 548 + *val = 10000; 549 + return 0; 550 + case AD74413R_ADC_RANGE_2P5V_EXT_POW: 551 + case AD74413R_ADC_RANGE_2P5V_INT_POW: 552 + *val = 2500; 553 + return 0; 554 + case AD74413R_ADC_RANGE_5V_BI_DIR: 555 + *val = 5000; 556 + return 0; 557 + default: 558 + dev_err(st->dev, "ADC range invalid\n"); 559 + return -EINVAL; 560 + } 561 + } 562 + 563 + static int ad74413r_range_to_voltage_offset(struct ad74413r_state *st, 564 + unsigned int range, int *val) 565 + { 566 + switch (range) { 567 + case AD74413R_ADC_RANGE_10V: 568 + case AD74413R_ADC_RANGE_2P5V_EXT_POW: 569 + *val = 0; 570 + return 0; 571 + case AD74413R_ADC_RANGE_2P5V_INT_POW: 572 + case AD74413R_ADC_RANGE_5V_BI_DIR: 573 + *val = -2500; 574 + return 0; 575 + default: 576 + dev_err(st->dev, "ADC range invalid\n"); 577 + return -EINVAL; 578 + } 579 + } 580 + 581 + static int ad74413r_range_to_voltage_offset_raw(struct ad74413r_state *st, 582 + unsigned int range, int *val) 583 + { 584 + switch (range) { 585 + case AD74413R_ADC_RANGE_10V: 586 + case AD74413R_ADC_RANGE_2P5V_EXT_POW: 587 + *val = 0; 588 + return 0; 589 + case AD74413R_ADC_RANGE_2P5V_INT_POW: 590 + *val = -((int)AD74413R_ADC_RESULT_MAX); 591 + return 0; 592 + case AD74413R_ADC_RANGE_5V_BI_DIR: 593 + *val = -((int)AD74413R_ADC_RESULT_MAX / 2); 594 + return 0; 595 + default: 596 + dev_err(st->dev, "ADC range invalid\n"); 597 + return -EINVAL; 598 + } 599 + } 600 + 601 + static int ad74413r_get_output_voltage_scale(struct ad74413r_state *st, 602 + int *val, int *val2) 603 + { 604 + *val = AD74413R_DAC_VOLTAGE_MAX; 605 + *val2 = AD74413R_DAC_CODE_MAX; 606 + 607 + return IIO_VAL_FRACTIONAL; 608 + } 609 + 610 + static int ad74413r_get_output_current_scale(struct ad74413r_state *st, 611 + int *val, int *val2) 612 + { 613 + *val = regulator_get_voltage(st->refin_reg); 614 + *val2 = st->sense_resistor_ohms * AD74413R_DAC_CODE_MAX * 1000; 615 + 616 + return IIO_VAL_FRACTIONAL; 617 + } 618 + 619 + static int ad74413r_get_input_voltage_scale(struct ad74413r_state *st, 620 + unsigned int channel, 621 + int *val, int *val2) 622 + { 623 + unsigned int range; 624 + int ret; 625 + 626 + ret = ad74413r_get_adc_range(st, channel, &range); 627 + if (ret) 628 + return ret; 629 + 630 + ret = ad74413r_range_to_voltage_range(st, range, val); 631 + if (ret) 632 + return ret; 633 + 634 + *val2 = AD74413R_ADC_RESULT_MAX; 635 + 636 + return IIO_VAL_FRACTIONAL; 637 + } 638 + 639 + static int ad74413r_get_input_voltage_offset(struct ad74413r_state *st, 640 + unsigned int channel, int *val) 641 + { 642 + unsigned int range; 643 + int ret; 644 + 645 + ret = ad74413r_get_adc_range(st, channel, &range); 646 + if (ret) 647 + return ret; 648 + 649 + ret = ad74413r_range_to_voltage_offset_raw(st, range, val); 650 + if (ret) 651 + return ret; 652 + 653 + return IIO_VAL_INT; 654 + } 655 + 656 + static int ad74413r_get_input_current_scale(struct ad74413r_state *st, 657 + unsigned int channel, int *val, 658 + int *val2) 659 + { 660 + unsigned int range; 661 + int ret; 662 + 663 + ret = ad74413r_get_adc_range(st, channel, &range); 664 + if (ret) 665 + return ret; 666 + 667 + ret = ad74413r_range_to_voltage_range(st, range, val); 668 + if (ret) 669 + return ret; 670 + 671 + *val2 = AD74413R_ADC_RESULT_MAX * st->sense_resistor_ohms; 672 + 673 + return IIO_VAL_FRACTIONAL; 674 + } 675 + 676 + static int ad74413_get_input_current_offset(struct ad74413r_state *st, 677 + unsigned int channel, int *val) 678 + { 679 + unsigned int range; 680 + int voltage_range; 681 + int voltage_offset; 682 + int ret; 683 + 684 + ret = ad74413r_get_adc_range(st, channel, &range); 685 + if (ret) 686 + return ret; 687 + 688 + ret = ad74413r_range_to_voltage_range(st, range, &voltage_range); 689 + if (ret) 690 + return ret; 691 + 692 + ret = ad74413r_range_to_voltage_offset(st, range, &voltage_offset); 693 + if (ret) 694 + return ret; 695 + 696 + *val = voltage_offset * AD74413R_ADC_RESULT_MAX / voltage_range; 697 + 698 + return IIO_VAL_INT; 699 + } 700 + 701 + static int ad74413r_get_adc_rate(struct ad74413r_state *st, 702 + unsigned int channel, int *val) 703 + { 704 + unsigned int rejection; 705 + int ret; 706 + 707 + ret = ad74413r_get_adc_rejection(st, channel, &rejection); 708 + if (ret) 709 + return ret; 710 + 711 + ret = ad74413r_rejection_to_rate(st, rejection, val); 712 + if (ret) 713 + return ret; 714 + 715 + return IIO_VAL_INT; 716 + } 717 + 718 + static int ad74413r_set_adc_rate(struct ad74413r_state *st, 719 + unsigned int channel, int val) 720 + { 721 + unsigned int rejection; 722 + int ret; 723 + 724 + ret = ad74413r_rate_to_rejection(st, val, &rejection); 725 + if (ret) 726 + return ret; 727 + 728 + return ad74413r_set_adc_rejection(st, channel, rejection); 729 + } 730 + 731 + static irqreturn_t ad74413r_trigger_handler(int irq, void *p) 732 + { 733 + struct iio_poll_func *pf = p; 734 + struct iio_dev *indio_dev = pf->indio_dev; 735 + struct ad74413r_state *st = iio_priv(indio_dev); 736 + u8 *rx_buf = st->adc_samples_buf.rx_buf; 737 + unsigned int i; 738 + int ret; 739 + 740 + ret = spi_sync(st->spi, &st->adc_samples_msg); 741 + if (ret) 742 + goto out; 743 + 744 + for (i = 0; i < st->adc_active_channels; i++) 745 + ad74413r_crc_check(st, &rx_buf[i * AD74413R_FRAME_SIZE]); 746 + 747 + iio_push_to_buffers_with_timestamp(indio_dev, &st->adc_samples_buf, 748 + iio_get_time_ns(indio_dev)); 749 + 750 + out: 751 + iio_trigger_notify_done(indio_dev->trig); 752 + 753 + return IRQ_HANDLED; 754 + } 755 + 756 + static irqreturn_t ad74413r_adc_data_interrupt(int irq, void *data) 757 + { 758 + struct iio_dev *indio_dev = data; 759 + struct ad74413r_state *st = iio_priv(indio_dev); 760 + 761 + if (iio_buffer_enabled(indio_dev)) 762 + iio_trigger_poll(st->trig); 763 + else 764 + complete(&st->adc_data_completion); 765 + 766 + return IRQ_HANDLED; 767 + } 768 + 769 + static int _ad74413r_get_single_adc_result(struct ad74413r_state *st, 770 + unsigned int channel, int *val) 771 + { 772 + unsigned int uval; 773 + int ret; 774 + 775 + reinit_completion(&st->adc_data_completion); 776 + 777 + ret = ad74413r_set_adc_channel_enable(st, channel, true); 778 + if (ret) 779 + return ret; 780 + 781 + ret = ad74413r_set_adc_conv_seq(st, AD74413R_CONV_SEQ_SINGLE); 782 + if (ret) 783 + return ret; 784 + 785 + ret = wait_for_completion_timeout(&st->adc_data_completion, 786 + msecs_to_jiffies(1000)); 787 + if (!ret) { 788 + ret = -ETIMEDOUT; 789 + return ret; 790 + } 791 + 792 + ret = regmap_read(st->regmap, AD74413R_REG_ADC_RESULT_X(channel), 793 + &uval); 794 + if (ret) 795 + return ret; 796 + 797 + ret = ad74413r_set_adc_conv_seq(st, AD74413R_CONV_SEQ_OFF); 798 + if (ret) 799 + return ret; 800 + 801 + ret = ad74413r_set_adc_channel_enable(st, channel, false); 802 + if (ret) 803 + return ret; 804 + 805 + *val = uval; 806 + 807 + return IIO_VAL_INT; 808 + } 809 + 810 + static int ad74413r_get_single_adc_result(struct iio_dev *indio_dev, 811 + unsigned int channel, int *val) 812 + { 813 + struct ad74413r_state *st = iio_priv(indio_dev); 814 + int ret; 815 + 816 + ret = iio_device_claim_direct_mode(indio_dev); 817 + if (ret) 818 + return ret; 819 + 820 + mutex_lock(&st->lock); 821 + ret = _ad74413r_get_single_adc_result(st, channel, val); 822 + mutex_unlock(&st->lock); 823 + 824 + iio_device_release_direct_mode(indio_dev); 825 + 826 + return ret; 827 + } 828 + 829 + static void ad74413r_adc_to_resistance_result(int adc_result, int *val) 830 + { 831 + if (adc_result == AD74413R_ADC_RESULT_MAX) 832 + adc_result = AD74413R_ADC_RESULT_MAX - 1; 833 + 834 + *val = DIV_ROUND_CLOSEST(adc_result * 2100, 835 + AD74413R_ADC_RESULT_MAX - adc_result); 836 + } 837 + 838 + static int ad74413r_update_scan_mode(struct iio_dev *indio_dev, 839 + const unsigned long *active_scan_mask) 840 + { 841 + struct ad74413r_state *st = iio_priv(indio_dev); 842 + struct spi_transfer *xfer = st->adc_samples_xfer; 843 + u8 *rx_buf = &st->adc_samples_buf.rx_buf[-1 * AD74413R_FRAME_SIZE]; 844 + u8 *tx_buf = st->adc_samples_tx_buf; 845 + unsigned int channel; 846 + int ret; 847 + 848 + mutex_lock(&st->lock); 849 + 850 + spi_message_init(&st->adc_samples_msg); 851 + st->adc_active_channels = 0; 852 + 853 + for_each_clear_bit(channel, active_scan_mask, AD74413R_CHANNEL_MAX) { 854 + ret = ad74413r_set_adc_channel_enable(st, channel, false); 855 + if (ret) 856 + goto out; 857 + } 858 + 859 + if (*active_scan_mask == 0) 860 + goto out; 861 + 862 + /* 863 + * The read select register is used to select which register's value 864 + * will be sent by the slave on the next SPI frame. 865 + * 866 + * Create an SPI message that, on each step, writes to the read select 867 + * register to select the ADC result of the next enabled channel, and 868 + * reads the ADC result of the previous enabled channel. 869 + * 870 + * Example: 871 + * W: [WCH1] [WCH2] [WCH2] [WCH3] [ ] 872 + * R: [ ] [RCH1] [RCH2] [RCH3] [RCH4] 873 + */ 874 + 875 + for_each_set_bit(channel, active_scan_mask, AD74413R_CHANNEL_MAX) { 876 + ret = ad74413r_set_adc_channel_enable(st, channel, true); 877 + if (ret) 878 + goto out; 879 + 880 + st->adc_active_channels++; 881 + 882 + if (xfer == st->adc_samples_xfer) 883 + xfer->rx_buf = NULL; 884 + else 885 + xfer->rx_buf = rx_buf; 886 + 887 + xfer->tx_buf = tx_buf; 888 + xfer->len = AD74413R_FRAME_SIZE; 889 + xfer->cs_change = 1; 890 + 891 + ad74413r_format_reg_write(AD74413R_REG_READ_SELECT, 892 + AD74413R_REG_ADC_RESULT_X(channel), 893 + tx_buf); 894 + 895 + spi_message_add_tail(xfer, &st->adc_samples_msg); 896 + 897 + xfer++; 898 + tx_buf += AD74413R_FRAME_SIZE; 899 + rx_buf += AD74413R_FRAME_SIZE; 900 + } 901 + 902 + xfer->rx_buf = rx_buf; 903 + xfer->tx_buf = NULL; 904 + xfer->len = AD74413R_FRAME_SIZE; 905 + xfer->cs_change = 0; 906 + 907 + spi_message_add_tail(xfer, &st->adc_samples_msg); 908 + 909 + out: 910 + mutex_unlock(&st->lock); 911 + 912 + return ret; 913 + } 914 + 915 + static int ad74413r_buffer_postenable(struct iio_dev *indio_dev) 916 + { 917 + struct ad74413r_state *st = iio_priv(indio_dev); 918 + 919 + return ad74413r_set_adc_conv_seq(st, AD74413R_CONV_SEQ_CONTINUOUS); 920 + } 921 + 922 + static int ad74413r_buffer_predisable(struct iio_dev *indio_dev) 923 + { 924 + struct ad74413r_state *st = iio_priv(indio_dev); 925 + 926 + return ad74413r_set_adc_conv_seq(st, AD74413R_CONV_SEQ_OFF); 927 + } 928 + 929 + static int ad74413r_read_raw(struct iio_dev *indio_dev, 930 + struct iio_chan_spec const *chan, 931 + int *val, int *val2, long info) 932 + { 933 + struct ad74413r_state *st = iio_priv(indio_dev); 934 + 935 + switch (info) { 936 + case IIO_CHAN_INFO_SCALE: 937 + switch (chan->type) { 938 + case IIO_VOLTAGE: 939 + if (chan->output) 940 + return ad74413r_get_output_voltage_scale(st, 941 + val, val2); 942 + else 943 + return ad74413r_get_input_voltage_scale(st, 944 + chan->channel, val, val2); 945 + case IIO_CURRENT: 946 + if (chan->output) 947 + return ad74413r_get_output_current_scale(st, 948 + val, val2); 949 + else 950 + return ad74413r_get_input_current_scale(st, 951 + chan->channel, val, val2); 952 + default: 953 + return -EINVAL; 954 + } 955 + case IIO_CHAN_INFO_OFFSET: 956 + switch (chan->type) { 957 + case IIO_VOLTAGE: 958 + return ad74413r_get_input_voltage_offset(st, 959 + chan->channel, val); 960 + case IIO_CURRENT: 961 + return ad74413_get_input_current_offset(st, 962 + chan->channel, val); 963 + default: 964 + return -EINVAL; 965 + } 966 + case IIO_CHAN_INFO_RAW: 967 + if (chan->output) 968 + return -EINVAL; 969 + 970 + return ad74413r_get_single_adc_result(indio_dev, chan->channel, 971 + val); 972 + case IIO_CHAN_INFO_PROCESSED: { 973 + int ret; 974 + 975 + ret = ad74413r_get_single_adc_result(indio_dev, chan->channel, 976 + val); 977 + if (ret) 978 + return ret; 979 + 980 + ad74413r_adc_to_resistance_result(*val, val); 981 + 982 + return ret; 983 + } 984 + case IIO_CHAN_INFO_SAMP_FREQ: 985 + return ad74413r_get_adc_rate(st, chan->channel, val); 986 + default: 987 + return -EINVAL; 988 + } 989 + } 990 + 991 + static int ad74413r_write_raw(struct iio_dev *indio_dev, 992 + struct iio_chan_spec const *chan, 993 + int val, int val2, long info) 994 + { 995 + struct ad74413r_state *st = iio_priv(indio_dev); 996 + 997 + switch (info) { 998 + case IIO_CHAN_INFO_RAW: 999 + if (!chan->output) 1000 + return -EINVAL; 1001 + 1002 + if (val < 0 || val > AD74413R_DAC_CODE_MAX) { 1003 + dev_err(st->dev, "Invalid DAC code\n"); 1004 + return -EINVAL; 1005 + } 1006 + 1007 + return ad74413r_set_channel_dac_code(st, chan->channel, val); 1008 + case IIO_CHAN_INFO_SAMP_FREQ: 1009 + return ad74413r_set_adc_rate(st, chan->channel, val); 1010 + default: 1011 + return -EINVAL; 1012 + } 1013 + } 1014 + 1015 + static int ad74413r_read_avail(struct iio_dev *indio_dev, 1016 + struct iio_chan_spec const *chan, 1017 + const int **vals, int *type, int *length, 1018 + long info) 1019 + { 1020 + struct ad74413r_state *st = iio_priv(indio_dev); 1021 + 1022 + switch (info) { 1023 + case IIO_CHAN_INFO_SAMP_FREQ: 1024 + if (st->chip_info->hart_support) { 1025 + *vals = ad74413r_adc_sampling_rates_hart; 1026 + *length = ARRAY_SIZE(ad74413r_adc_sampling_rates_hart); 1027 + } else { 1028 + *vals = ad74413r_adc_sampling_rates; 1029 + *length = ARRAY_SIZE(ad74413r_adc_sampling_rates); 1030 + } 1031 + *type = IIO_VAL_INT; 1032 + return IIO_AVAIL_LIST; 1033 + default: 1034 + return -EINVAL; 1035 + } 1036 + } 1037 + 1038 + static const struct iio_buffer_setup_ops ad74413r_buffer_ops = { 1039 + .postenable = &ad74413r_buffer_postenable, 1040 + .predisable = &ad74413r_buffer_predisable, 1041 + }; 1042 + 1043 + static const struct iio_trigger_ops ad74413r_trigger_ops = { 1044 + .validate_device = iio_trigger_validate_own_device, 1045 + }; 1046 + 1047 + static const struct iio_info ad74413r_info = { 1048 + .read_raw = &ad74413r_read_raw, 1049 + .write_raw = &ad74413r_write_raw, 1050 + .read_avail = &ad74413r_read_avail, 1051 + .update_scan_mode = &ad74413r_update_scan_mode, 1052 + }; 1053 + 1054 + #define AD74413R_DAC_CHANNEL(_type, extra_mask_separate) \ 1055 + { \ 1056 + .type = (_type), \ 1057 + .indexed = 1, \ 1058 + .output = 1, \ 1059 + .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) \ 1060 + | (extra_mask_separate), \ 1061 + } 1062 + 1063 + #define AD74413R_ADC_CHANNEL(_type, extra_mask_separate) \ 1064 + { \ 1065 + .type = (_type), \ 1066 + .indexed = 1, \ 1067 + .output = 0, \ 1068 + .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) \ 1069 + | BIT(IIO_CHAN_INFO_SAMP_FREQ) \ 1070 + | (extra_mask_separate), \ 1071 + .info_mask_separate_available = \ 1072 + BIT(IIO_CHAN_INFO_SAMP_FREQ), \ 1073 + .scan_type = { \ 1074 + .sign = 'u', \ 1075 + .realbits = 16, \ 1076 + .storagebits = 32, \ 1077 + .shift = 8, \ 1078 + .endianness = IIO_BE, \ 1079 + }, \ 1080 + } 1081 + 1082 + #define AD74413R_ADC_VOLTAGE_CHANNEL \ 1083 + AD74413R_ADC_CHANNEL(IIO_VOLTAGE, BIT(IIO_CHAN_INFO_SCALE) \ 1084 + | BIT(IIO_CHAN_INFO_OFFSET)) 1085 + 1086 + #define AD74413R_ADC_CURRENT_CHANNEL \ 1087 + AD74413R_ADC_CHANNEL(IIO_CURRENT, BIT(IIO_CHAN_INFO_SCALE) \ 1088 + | BIT(IIO_CHAN_INFO_OFFSET)) 1089 + 1090 + static struct iio_chan_spec ad74413r_voltage_output_channels[] = { 1091 + AD74413R_DAC_CHANNEL(IIO_VOLTAGE, BIT(IIO_CHAN_INFO_SCALE)), 1092 + AD74413R_ADC_CURRENT_CHANNEL, 1093 + }; 1094 + 1095 + static struct iio_chan_spec ad74413r_current_output_channels[] = { 1096 + AD74413R_DAC_CHANNEL(IIO_CURRENT, BIT(IIO_CHAN_INFO_SCALE)), 1097 + AD74413R_ADC_VOLTAGE_CHANNEL, 1098 + }; 1099 + 1100 + static struct iio_chan_spec ad74413r_voltage_input_channels[] = { 1101 + AD74413R_ADC_VOLTAGE_CHANNEL, 1102 + }; 1103 + 1104 + static struct iio_chan_spec ad74413r_current_input_channels[] = { 1105 + AD74413R_ADC_CURRENT_CHANNEL, 1106 + }; 1107 + 1108 + static struct iio_chan_spec ad74413r_resistance_input_channels[] = { 1109 + AD74413R_ADC_CHANNEL(IIO_RESISTANCE, BIT(IIO_CHAN_INFO_PROCESSED)), 1110 + }; 1111 + 1112 + static struct iio_chan_spec ad74413r_digital_input_channels[] = { 1113 + AD74413R_ADC_VOLTAGE_CHANNEL, 1114 + }; 1115 + 1116 + #define _AD74413R_CHANNELS(_channels) \ 1117 + { \ 1118 + .channels = _channels, \ 1119 + .num_channels = ARRAY_SIZE(_channels), \ 1120 + } 1121 + 1122 + #define AD74413R_CHANNELS(name) \ 1123 + _AD74413R_CHANNELS(ad74413r_ ## name ## _channels) 1124 + 1125 + static const struct ad74413r_channels ad74413r_channels_map[] = { 1126 + [CH_FUNC_HIGH_IMPEDANCE] = AD74413R_CHANNELS(voltage_input), 1127 + [CH_FUNC_VOLTAGE_OUTPUT] = AD74413R_CHANNELS(voltage_output), 1128 + [CH_FUNC_CURRENT_OUTPUT] = AD74413R_CHANNELS(current_output), 1129 + [CH_FUNC_VOLTAGE_INPUT] = AD74413R_CHANNELS(voltage_input), 1130 + [CH_FUNC_CURRENT_INPUT_EXT_POWER] = AD74413R_CHANNELS(current_input), 1131 + [CH_FUNC_CURRENT_INPUT_LOOP_POWER] = AD74413R_CHANNELS(current_input), 1132 + [CH_FUNC_RESISTANCE_INPUT] = AD74413R_CHANNELS(resistance_input), 1133 + [CH_FUNC_DIGITAL_INPUT_LOGIC] = AD74413R_CHANNELS(digital_input), 1134 + [CH_FUNC_DIGITAL_INPUT_LOOP_POWER] = AD74413R_CHANNELS(digital_input), 1135 + [CH_FUNC_CURRENT_INPUT_EXT_POWER_HART] = AD74413R_CHANNELS(current_input), 1136 + [CH_FUNC_CURRENT_INPUT_LOOP_POWER_HART] = AD74413R_CHANNELS(current_input), 1137 + }; 1138 + 1139 + static int ad74413r_parse_channel_config(struct iio_dev *indio_dev, 1140 + struct fwnode_handle *channel_node) 1141 + { 1142 + struct ad74413r_state *st = iio_priv(indio_dev); 1143 + struct ad74413r_channel_config *config; 1144 + u32 index; 1145 + int ret; 1146 + 1147 + ret = fwnode_property_read_u32(channel_node, "reg", &index); 1148 + if (ret) { 1149 + dev_err(st->dev, "Failed to read channel reg: %d\n", ret); 1150 + return ret; 1151 + } 1152 + 1153 + if (index > AD74413R_CHANNEL_MAX) { 1154 + dev_err(st->dev, "Channel index %u is too large\n", index); 1155 + return -EINVAL; 1156 + } 1157 + 1158 + config = &st->channel_configs[index]; 1159 + if (config->initialized) { 1160 + dev_err(st->dev, "Channel %u already initialized\n", index); 1161 + return -EINVAL; 1162 + } 1163 + 1164 + config->func = CH_FUNC_HIGH_IMPEDANCE; 1165 + fwnode_property_read_u32(channel_node, "adi,ch-func", &config->func); 1166 + 1167 + if (config->func < CH_FUNC_MIN || config->func > CH_FUNC_MAX) { 1168 + dev_err(st->dev, "Invalid channel function %u\n", config->func); 1169 + return -EINVAL; 1170 + } 1171 + 1172 + if (!st->chip_info->hart_support && 1173 + (config->func == CH_FUNC_CURRENT_INPUT_EXT_POWER_HART || 1174 + config->func == CH_FUNC_CURRENT_INPUT_LOOP_POWER_HART)) { 1175 + dev_err(st->dev, "Unsupported HART function %u\n", config->func); 1176 + return -EINVAL; 1177 + } 1178 + 1179 + if (config->func == CH_FUNC_DIGITAL_INPUT_LOGIC || 1180 + config->func == CH_FUNC_DIGITAL_INPUT_LOOP_POWER) 1181 + st->num_comparator_gpios++; 1182 + 1183 + config->gpo_comparator = fwnode_property_read_bool(channel_node, 1184 + "adi,gpo-comparator"); 1185 + 1186 + if (!config->gpo_comparator) 1187 + st->num_gpo_gpios++; 1188 + 1189 + indio_dev->num_channels += ad74413r_channels_map[config->func].num_channels; 1190 + 1191 + config->initialized = true; 1192 + 1193 + return 0; 1194 + } 1195 + 1196 + static int ad74413r_parse_channel_configs(struct iio_dev *indio_dev) 1197 + { 1198 + struct ad74413r_state *st = iio_priv(indio_dev); 1199 + struct fwnode_handle *channel_node = NULL; 1200 + int ret; 1201 + 1202 + fwnode_for_each_available_child_node(dev_fwnode(st->dev), channel_node) { 1203 + ret = ad74413r_parse_channel_config(indio_dev, channel_node); 1204 + if (ret) 1205 + goto put_channel_node; 1206 + } 1207 + 1208 + return 0; 1209 + 1210 + put_channel_node: 1211 + fwnode_handle_put(channel_node); 1212 + 1213 + return ret; 1214 + } 1215 + 1216 + static int ad74413r_setup_channels(struct iio_dev *indio_dev) 1217 + { 1218 + struct ad74413r_state *st = iio_priv(indio_dev); 1219 + struct ad74413r_channel_config *config; 1220 + struct iio_chan_spec *channels, *chans; 1221 + unsigned int i, num_chans, chan_i; 1222 + int ret; 1223 + 1224 + channels = devm_kcalloc(st->dev, sizeof(*channels), 1225 + indio_dev->num_channels, GFP_KERNEL); 1226 + if (!channels) 1227 + return -ENOMEM; 1228 + 1229 + indio_dev->channels = channels; 1230 + 1231 + for (i = 0; i < AD74413R_CHANNEL_MAX; i++) { 1232 + config = &st->channel_configs[i]; 1233 + chans = ad74413r_channels_map[config->func].channels; 1234 + num_chans = ad74413r_channels_map[config->func].num_channels; 1235 + 1236 + memcpy(channels, chans, num_chans * sizeof(*chans)); 1237 + 1238 + for (chan_i = 0; chan_i < num_chans; chan_i++) { 1239 + struct iio_chan_spec *chan = &channels[chan_i]; 1240 + 1241 + chan->channel = i; 1242 + if (chan->output) 1243 + chan->scan_index = -1; 1244 + else 1245 + chan->scan_index = i; 1246 + } 1247 + 1248 + ret = ad74413r_set_channel_function(st, i, config->func); 1249 + if (ret) 1250 + return ret; 1251 + 1252 + channels += num_chans; 1253 + } 1254 + 1255 + return 0; 1256 + } 1257 + 1258 + static int ad74413r_setup_gpios(struct ad74413r_state *st) 1259 + { 1260 + struct ad74413r_channel_config *config; 1261 + unsigned int comp_gpio_i = 0; 1262 + unsigned int gpo_gpio_i = 0; 1263 + unsigned int i; 1264 + u8 gpo_config; 1265 + int ret; 1266 + 1267 + for (i = 0; i < AD74413R_CHANNEL_MAX; i++) { 1268 + config = &st->channel_configs[i]; 1269 + 1270 + if (config->gpo_comparator) { 1271 + gpo_config = AD74413R_GPO_CONFIG_COMPARATOR; 1272 + } else { 1273 + gpo_config = AD74413R_GPO_CONFIG_LOGIC; 1274 + st->gpo_gpio_offsets[gpo_gpio_i++] = i; 1275 + } 1276 + 1277 + if (config->func == CH_FUNC_DIGITAL_INPUT_LOGIC || 1278 + config->func == CH_FUNC_DIGITAL_INPUT_LOOP_POWER) 1279 + st->comp_gpio_offsets[comp_gpio_i++] = i; 1280 + 1281 + ret = ad74413r_set_gpo_config(st, i, gpo_config); 1282 + if (ret) 1283 + return ret; 1284 + } 1285 + 1286 + return 0; 1287 + } 1288 + 1289 + static void ad74413r_regulator_disable(void *regulator) 1290 + { 1291 + regulator_disable(regulator); 1292 + } 1293 + 1294 + static int ad74413r_probe(struct spi_device *spi) 1295 + { 1296 + struct ad74413r_state *st; 1297 + struct iio_dev *indio_dev; 1298 + int ret; 1299 + 1300 + indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*st)); 1301 + if (!indio_dev) 1302 + return -ENOMEM; 1303 + 1304 + st = iio_priv(indio_dev); 1305 + 1306 + st->spi = spi; 1307 + st->dev = &spi->dev; 1308 + st->chip_info = device_get_match_data(&spi->dev); 1309 + mutex_init(&st->lock); 1310 + init_completion(&st->adc_data_completion); 1311 + 1312 + st->regmap = devm_regmap_init(st->dev, NULL, st, 1313 + &ad74413r_regmap_config); 1314 + if (IS_ERR(st->regmap)) 1315 + return PTR_ERR(st->regmap); 1316 + 1317 + st->refin_reg = devm_regulator_get(st->dev, "refin"); 1318 + if (IS_ERR(st->refin_reg)) 1319 + return dev_err_probe(st->dev, PTR_ERR(st->refin_reg), 1320 + "Failed to get refin regulator\n"); 1321 + 1322 + ret = regulator_enable(st->refin_reg); 1323 + if (ret) 1324 + return ret; 1325 + 1326 + ret = devm_add_action_or_reset(st->dev, ad74413r_regulator_disable, 1327 + st->refin_reg); 1328 + if (ret) 1329 + return ret; 1330 + 1331 + st->sense_resistor_ohms = 100000000; 1332 + device_property_read_u32(st->dev, "shunt-resistor-micro-ohms", 1333 + &st->sense_resistor_ohms); 1334 + st->sense_resistor_ohms /= 1000000; 1335 + 1336 + st->trig = devm_iio_trigger_alloc(st->dev, "%s-dev%d", 1337 + st->chip_info->name, iio_device_id(indio_dev)); 1338 + if (!st->trig) 1339 + return -ENOMEM; 1340 + 1341 + st->trig->ops = &ad74413r_trigger_ops; 1342 + iio_trigger_set_drvdata(st->trig, st); 1343 + 1344 + ret = devm_iio_trigger_register(st->dev, st->trig); 1345 + if (ret) 1346 + return ret; 1347 + 1348 + indio_dev->name = st->chip_info->name; 1349 + indio_dev->modes = INDIO_DIRECT_MODE; 1350 + indio_dev->info = &ad74413r_info; 1351 + indio_dev->trig = iio_trigger_get(st->trig); 1352 + 1353 + ret = ad74413r_reset(st); 1354 + if (ret) 1355 + return ret; 1356 + 1357 + ret = ad74413r_parse_channel_configs(indio_dev); 1358 + if (ret) 1359 + return ret; 1360 + 1361 + ret = ad74413r_setup_channels(indio_dev); 1362 + if (ret) 1363 + return ret; 1364 + 1365 + ret = ad74413r_setup_gpios(st); 1366 + if (ret) 1367 + return ret; 1368 + 1369 + if (st->num_gpo_gpios) { 1370 + st->gpo_gpiochip.owner = THIS_MODULE; 1371 + st->gpo_gpiochip.label = st->chip_info->name; 1372 + st->gpo_gpiochip.base = -1; 1373 + st->gpo_gpiochip.ngpio = st->num_gpo_gpios; 1374 + st->gpo_gpiochip.parent = st->dev; 1375 + st->gpo_gpiochip.can_sleep = true; 1376 + st->gpo_gpiochip.set = ad74413r_gpio_set; 1377 + st->gpo_gpiochip.set_multiple = ad74413r_gpio_set_multiple; 1378 + st->gpo_gpiochip.set_config = ad74413r_gpio_set_gpo_config; 1379 + st->gpo_gpiochip.get_direction = 1380 + ad74413r_gpio_get_gpo_direction; 1381 + 1382 + ret = devm_gpiochip_add_data(st->dev, &st->gpo_gpiochip, st); 1383 + if (ret) 1384 + return ret; 1385 + } 1386 + 1387 + if (st->num_comparator_gpios) { 1388 + st->comp_gpiochip.owner = THIS_MODULE; 1389 + st->comp_gpiochip.label = st->chip_info->name; 1390 + st->comp_gpiochip.base = -1; 1391 + st->comp_gpiochip.ngpio = st->num_comparator_gpios; 1392 + st->comp_gpiochip.parent = st->dev; 1393 + st->comp_gpiochip.can_sleep = true; 1394 + st->comp_gpiochip.get = ad74413r_gpio_get; 1395 + st->comp_gpiochip.get_multiple = ad74413r_gpio_get_multiple; 1396 + st->comp_gpiochip.set_config = ad74413r_gpio_set_comp_config; 1397 + st->comp_gpiochip.get_direction = 1398 + ad74413r_gpio_get_comp_direction; 1399 + 1400 + ret = devm_gpiochip_add_data(st->dev, &st->comp_gpiochip, st); 1401 + if (ret) 1402 + return ret; 1403 + } 1404 + 1405 + ret = ad74413r_set_adc_conv_seq(st, AD74413R_CONV_SEQ_OFF); 1406 + if (ret) 1407 + return ret; 1408 + 1409 + ret = devm_request_irq(st->dev, spi->irq, ad74413r_adc_data_interrupt, 1410 + 0, st->chip_info->name, indio_dev); 1411 + if (ret) 1412 + return dev_err_probe(st->dev, ret, "Failed to request irq\n"); 1413 + 1414 + ret = devm_iio_triggered_buffer_setup(st->dev, indio_dev, 1415 + &iio_pollfunc_store_time, 1416 + &ad74413r_trigger_handler, 1417 + &ad74413r_buffer_ops); 1418 + if (ret) 1419 + return ret; 1420 + 1421 + return devm_iio_device_register(st->dev, indio_dev); 1422 + } 1423 + 1424 + static int ad74413r_unregister_driver(struct spi_driver *spi) 1425 + { 1426 + spi_unregister_driver(spi); 1427 + 1428 + return 0; 1429 + } 1430 + 1431 + static int __init ad74413r_register_driver(struct spi_driver *spi) 1432 + { 1433 + crc8_populate_msb(ad74413r_crc8_table, AD74413R_CRC_POLYNOMIAL); 1434 + 1435 + return spi_register_driver(spi); 1436 + } 1437 + 1438 + static const struct ad74413r_chip_info ad74412r_chip_info_data = { 1439 + .hart_support = false, 1440 + .name = "ad74412r", 1441 + }; 1442 + 1443 + static const struct ad74413r_chip_info ad74413r_chip_info_data = { 1444 + .hart_support = true, 1445 + .name = "ad74413r", 1446 + }; 1447 + 1448 + static const struct of_device_id ad74413r_dt_id[] = { 1449 + { 1450 + .compatible = "adi,ad74412r", 1451 + .data = &ad74412r_chip_info_data, 1452 + }, 1453 + { 1454 + .compatible = "adi,ad74413r", 1455 + .data = &ad74413r_chip_info_data, 1456 + }, 1457 + {}, 1458 + }; 1459 + MODULE_DEVICE_TABLE(of, ad74413r_dt_id); 1460 + 1461 + static struct spi_driver ad74413r_driver = { 1462 + .driver = { 1463 + .name = "ad74413r", 1464 + .of_match_table = ad74413r_dt_id, 1465 + }, 1466 + .probe = ad74413r_probe, 1467 + }; 1468 + 1469 + module_driver(ad74413r_driver, 1470 + ad74413r_register_driver, 1471 + ad74413r_unregister_driver); 1472 + 1473 + MODULE_AUTHOR("Cosmin Tanislav <cosmin.tanislav@analog.com>"); 1474 + MODULE_DESCRIPTION("Analog Devices AD74413R ADDAC"); 1475 + MODULE_LICENSE("GPL v2");