brintos

brintos / linux-shallow public Read only

0
0
Text · 50.5 KiB · 3ee0dd5 Raw
1934 lines · c
1// SPDX-License-Identifier: GPL-2.02/*3 * Copyright (C) 2022 Analog Devices, Inc.4 * Author: Cosmin Tanislav <cosmin.tanislav@analog.com>5 */6 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>18 19#include <linux/unaligned.h>20 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>26 27#define AD74115_NAME				"ad74115"28 29#define AD74115_CH_FUNC_SETUP_REG		0x0130 31#define AD74115_ADC_CONFIG_REG			0x0232#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)36 37#define AD74115_PWR_OPTIM_CONFIG_REG		0x0338 39#define AD74115_DIN_CONFIG1_REG			0x0440#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)43 44#define AD74115_DIN_CONFIG2_REG			0x0545#define AD74115_COMP_THRESH_MASK		GENMASK(6, 0)46 47#define AD74115_OUTPUT_CONFIG_REG		0x0648#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)51 52#define AD74115_RTD3W4W_CONFIG_REG		0x0753 54#define AD74115_BURNOUT_CONFIG_REG		0x0a55#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)58 59#define AD74115_DAC_CODE_REG			0x0b60 61#define AD74115_DAC_ACTIVE_REG			0x0d62 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)67 68#define AD74115_CHARGE_PUMP_REG			0x3a69 70#define AD74115_ADC_CONV_CTRL_REG		0x3b71#define AD74115_ADC_CONV_SEQ_MASK		GENMASK(13, 12)72 73#define AD74115_DIN_COMP_OUT_REG		0x4074 75#define AD74115_LIVE_STATUS_REG			0x4276#define AD74115_ADC_DATA_RDY_MASK		BIT(3)77 78#define AD74115_READ_SELECT_REG			0x6479 80#define AD74115_CMD_KEY_REG			0x7881#define AD74115_CMD_KEY_RESET1			0x15fa82#define AD74115_CMD_KEY_RESET2			0xaf5183 84#define AD74115_CRC_POLYNOMIAL			0x785DECLARE_CRC8_TABLE(ad74115_crc8_table);86 87#define AD74115_ADC_CODE_MAX			((int)GENMASK(15, 0))88#define AD74115_ADC_CODE_HALF			(AD74115_ADC_CODE_MAX / 2)89 90#define AD74115_DAC_VOLTAGE_MAX			1200091#define AD74115_DAC_CURRENT_MAX			2592#define AD74115_DAC_CODE_MAX			((int)GENMASK(13, 0))93#define AD74115_DAC_CODE_HALF			(AD74115_DAC_CODE_MAX / 2)94 95#define AD74115_COMP_THRESH_MAX			9896 97#define AD74115_SENSE_RESISTOR_OHMS		10098#define AD74115_REF_RESISTOR_OHMS		210099 100#define AD74115_DIN_SINK_LOW_STEP		120101#define AD74115_DIN_SINK_HIGH_STEP		240102#define AD74115_DIN_SINK_MAX			31103 104#define AD74115_FRAME_SIZE			4105#define AD74115_GPIO_NUM			4106 107#define AD74115_CONV_TIME_US			1000000108 109enum ad74115_dac_ch {110	AD74115_DAC_CH_MAIN,111	AD74115_DAC_CH_COMPARATOR,112};113 114enum ad74115_adc_ch {115	AD74115_ADC_CH_CONV1,116	AD74115_ADC_CH_CONV2,117	AD74115_ADC_CH_NUM118};119 120enum 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,135	AD74115_CH_FUNC_NUM136};137 138enum 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_NUM149};150 151enum 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,155};156 157enum 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,161};162 163enum ad74115_slew_mode {164	AD74115_SLEW_MODE_DISABLED,165	AD74115_SLEW_MODE_LINEAR,166	AD74115_SLEW_MODE_HART,167};168 169enum 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,174};175 176enum ad74115_slew_rate {177	AD74115_SLEW_RATE_4KHZ,178	AD74115_SLEW_RATE_64KHZ,179	AD74115_SLEW_RATE_150KHZ,180	AD74115_SLEW_RATE_240KHZ,181};182 183enum ad74115_gpio_config {184	AD74115_GPIO_CONFIG_OUTPUT_BUFFERED = 0b010,185	AD74115_GPIO_CONFIG_INPUT = 0b011,186};187 188enum ad74115_gpio_mode {189	AD74115_GPIO_MODE_LOGIC = 1,190	AD74115_GPIO_MODE_SPECIAL = 2,191};192 193struct ad74115_channels {194	struct iio_chan_spec		*channels;195	unsigned int			num_channels;196};197 198struct ad74115_state {199	struct spi_device		*spi;200	struct regmap			*regmap;201	struct iio_trigger		*trig;202 203	/*204	 * Synchronize consecutive operations when doing a one-shot205	 * conversion and when updating the ADC samples SPI message.206	 */207	struct mutex			lock;208	struct gpio_chip		gc;209	struct gpio_chip		comp_gc;210	int				irq;211 212	unsigned int			avdd_mv;213	unsigned long			gpio_valid_mask;214	bool				dac_bipolar;215	bool				dac_hart_slew;216	bool				rtd_mode_4_wire;217	enum ad74115_ch_func		ch_func;218	enum ad74115_din_threshold_mode	din_threshold_mode;219 220	struct completion		adc_data_completion;221	struct spi_message		adc_samples_msg;222	struct spi_transfer		adc_samples_xfer[AD74115_ADC_CH_NUM + 1];223 224	/*225	 * DMA (thus cache coherency maintenance) requires the226	 * transfer buffers to live in their own cache lines.227	 */228	u8				reg_tx_buf[AD74115_FRAME_SIZE] __aligned(IIO_DMA_MINALIGN);229	u8				reg_rx_buf[AD74115_FRAME_SIZE];230	u8				adc_samples_tx_buf[AD74115_FRAME_SIZE * AD74115_ADC_CH_NUM];231	u8				adc_samples_rx_buf[AD74115_FRAME_SIZE * AD74115_ADC_CH_NUM];232};233 234struct ad74115_fw_prop {235	const char			*name;236	bool				is_boolean;237	bool				negate;238	unsigned int			max;239	unsigned int			reg;240	unsigned int			mask;241	const unsigned int		*lookup_tbl;242	unsigned int			lookup_tbl_len;243};244 245#define AD74115_FW_PROP(_name, _max, _reg, _mask)		\246{								\247	.name = (_name),					\248	.max = (_max),						\249	.reg = (_reg),						\250	.mask = (_mask),					\251}252 253#define AD74115_FW_PROP_TBL(_name, _tbl, _reg, _mask)		\254{								\255	.name = (_name),					\256	.reg = (_reg),						\257	.mask = (_mask),					\258	.lookup_tbl = (_tbl),					\259	.lookup_tbl_len = ARRAY_SIZE(_tbl),			\260}261 262#define AD74115_FW_PROP_BOOL(_name, _reg, _mask)		\263{								\264	.name = (_name),					\265	.is_boolean = true,					\266	.reg = (_reg),						\267	.mask = (_mask),					\268}269 270#define AD74115_FW_PROP_BOOL_NEG(_name, _reg, _mask)		\271{								\272	.name = (_name),					\273	.is_boolean = true,					\274	.negate = true,						\275	.reg = (_reg),						\276	.mask = (_mask),					\277}278 279static const int ad74115_dac_rate_tbl[] = {280	0,281	4 * 8,282	4 * 15,283	4 * 61,284	4 * 222,285	64 * 8,286	64 * 15,287	64 * 61,288	64 * 222,289	150 * 8,290	150 * 15,291	150 * 61,292	150 * 222,293	240 * 8,294	240 * 15,295	240 * 61,296	240 * 222,297};298 299static const unsigned int ad74115_dac_rate_step_tbl[][3] = {300	{ AD74115_SLEW_MODE_DISABLED },301	{ AD74115_SLEW_MODE_LINEAR, AD74115_SLEW_STEP_0_8_PERCENT, AD74115_SLEW_RATE_4KHZ },302	{ AD74115_SLEW_MODE_LINEAR, AD74115_SLEW_STEP_1_5_PERCENT, AD74115_SLEW_RATE_4KHZ },303	{ AD74115_SLEW_MODE_LINEAR, AD74115_SLEW_STEP_6_1_PERCENT, AD74115_SLEW_RATE_4KHZ },304	{ AD74115_SLEW_MODE_LINEAR, AD74115_SLEW_STEP_22_2_PERCENT, AD74115_SLEW_RATE_4KHZ },305	{ AD74115_SLEW_MODE_LINEAR, AD74115_SLEW_STEP_0_8_PERCENT, AD74115_SLEW_RATE_64KHZ },306	{ AD74115_SLEW_MODE_LINEAR, AD74115_SLEW_STEP_1_5_PERCENT, AD74115_SLEW_RATE_64KHZ },307	{ AD74115_SLEW_MODE_LINEAR, AD74115_SLEW_STEP_6_1_PERCENT, AD74115_SLEW_RATE_64KHZ },308	{ AD74115_SLEW_MODE_LINEAR, AD74115_SLEW_STEP_22_2_PERCENT, AD74115_SLEW_RATE_64KHZ },309	{ AD74115_SLEW_MODE_LINEAR, AD74115_SLEW_STEP_0_8_PERCENT, AD74115_SLEW_RATE_150KHZ },310	{ AD74115_SLEW_MODE_LINEAR, AD74115_SLEW_STEP_1_5_PERCENT, AD74115_SLEW_RATE_150KHZ },311	{ AD74115_SLEW_MODE_LINEAR, AD74115_SLEW_STEP_6_1_PERCENT, AD74115_SLEW_RATE_150KHZ },312	{ AD74115_SLEW_MODE_LINEAR, AD74115_SLEW_STEP_22_2_PERCENT, AD74115_SLEW_RATE_150KHZ },313	{ AD74115_SLEW_MODE_LINEAR, AD74115_SLEW_STEP_0_8_PERCENT, AD74115_SLEW_RATE_240KHZ },314	{ AD74115_SLEW_MODE_LINEAR, AD74115_SLEW_STEP_1_5_PERCENT, AD74115_SLEW_RATE_240KHZ },315	{ AD74115_SLEW_MODE_LINEAR, AD74115_SLEW_STEP_6_1_PERCENT, AD74115_SLEW_RATE_240KHZ },316	{ AD74115_SLEW_MODE_LINEAR, AD74115_SLEW_STEP_22_2_PERCENT, AD74115_SLEW_RATE_240KHZ },317};318 319static const unsigned int ad74115_rtd_excitation_current_ua_tbl[] = {320	250, 500, 750, 1000321};322 323static const unsigned int ad74115_burnout_current_na_tbl[] = {324	0, 50, 0, 500, 1000, 0, 10000, 0325};326 327static const unsigned int ad74115_viout_burnout_current_na_tbl[] = {328	0, 0, 0, 0, 1000, 0, 10000, 0329};330 331static const unsigned int ad74115_gpio_mode_tbl[] = {332	0, 0, 0, 1, 2, 3, 4, 5333};334 335static const unsigned int ad74115_adc_conv_rate_tbl[] = {336	10, 20, 1200, 4800, 9600337};338 339static const unsigned int ad74115_debounce_tbl[] = {340	0,     13,    18,    24,    32,    42,    56,    75,341	100,   130,   180,   240,   320,   420,   560,   750,342	1000,  1300,  1800,  2400,  3200,  4200,  5600,  7500,343	10000, 13000, 18000, 24000, 32000, 42000, 56000, 75000,344};345 346static const unsigned int ad74115_adc_ch_data_regs_tbl[] = {347	[AD74115_ADC_CH_CONV1] = 0x44,348	[AD74115_ADC_CH_CONV2] = 0x46,349};350 351static const unsigned int ad74115_adc_ch_en_bit_tbl[] = {352	[AD74115_ADC_CH_CONV1] = BIT(0),353	[AD74115_ADC_CH_CONV2] = BIT(1),354};355 356static const bool ad74115_adc_bipolar_tbl[AD74115_ADC_RANGE_NUM] = {357	[AD74115_ADC_RANGE_12V_BIPOLAR]		= true,358	[AD74115_ADC_RANGE_2_5V_BIPOLAR]	= true,359	[AD74115_ADC_RANGE_104MV_BIPOLAR]	= true,360};361 362static const unsigned int ad74115_adc_conv_mul_tbl[AD74115_ADC_RANGE_NUM] = {363	[AD74115_ADC_RANGE_12V]			= 12000,364	[AD74115_ADC_RANGE_12V_BIPOLAR]		= 24000,365	[AD74115_ADC_RANGE_2_5V_BIPOLAR]	= 5000,366	[AD74115_ADC_RANGE_2_5V_NEG]		= 2500,367	[AD74115_ADC_RANGE_2_5V]		= 2500,368	[AD74115_ADC_RANGE_0_625V]		= 625,369	[AD74115_ADC_RANGE_104MV_BIPOLAR]	= 208,370	[AD74115_ADC_RANGE_12V_OTHER]		= 12000,371};372 373static const unsigned int ad74115_adc_gain_tbl[AD74115_ADC_RANGE_NUM][2] = {374	[AD74115_ADC_RANGE_12V]			= { 5, 24 },375	[AD74115_ADC_RANGE_12V_BIPOLAR]		= { 5, 24 },376	[AD74115_ADC_RANGE_2_5V_BIPOLAR]	= { 1, 1 },377	[AD74115_ADC_RANGE_2_5V_NEG]		= { 1, 1 },378	[AD74115_ADC_RANGE_2_5V]		= { 1, 1 },379	[AD74115_ADC_RANGE_0_625V]		= { 4, 1 },380	[AD74115_ADC_RANGE_104MV_BIPOLAR]	= { 24, 1 },381	[AD74115_ADC_RANGE_12V_OTHER]		= { 5, 24 },382};383 384static const int ad74115_adc_range_tbl[AD74115_ADC_RANGE_NUM][2] = {385	[AD74115_ADC_RANGE_12V]			= { 0,         12000000 },386	[AD74115_ADC_RANGE_12V_BIPOLAR]		= { -12000000, 12000000 },387	[AD74115_ADC_RANGE_2_5V_BIPOLAR]	= { -2500000,  2500000 },388	[AD74115_ADC_RANGE_2_5V_NEG]		= { -2500000,  0 },389	[AD74115_ADC_RANGE_2_5V]		= { 0,         2500000 },390	[AD74115_ADC_RANGE_0_625V]		= { 0,         625000 },391	[AD74115_ADC_RANGE_104MV_BIPOLAR]	= { -104000,   104000 },392	[AD74115_ADC_RANGE_12V_OTHER]		= { 0,         12000000 },393};394 395static int _ad74115_find_tbl_index(const unsigned int *tbl, unsigned int tbl_len,396				   unsigned int val, unsigned int *index)397{398	unsigned int i;399 400	for (i = 0; i < tbl_len; i++)401		if (val == tbl[i]) {402			*index = i;403			return 0;404		}405 406	return -EINVAL;407}408 409#define ad74115_find_tbl_index(tbl, val, index)	\410	_ad74115_find_tbl_index(tbl, ARRAY_SIZE(tbl), val, index)411 412static int ad74115_crc(u8 *buf)413{414	return crc8(ad74115_crc8_table, buf, 3, 0);415}416 417static void ad74115_format_reg_write(u8 reg, u16 val, u8 *buf)418{419	buf[0] = reg;420	put_unaligned_be16(val, &buf[1]);421	buf[3] = ad74115_crc(buf);422}423 424static int ad74115_reg_write(void *context, unsigned int reg, unsigned int val)425{426	struct ad74115_state *st = context;427 428	ad74115_format_reg_write(reg, val, st->reg_tx_buf);429 430	return spi_write(st->spi, st->reg_tx_buf, AD74115_FRAME_SIZE);431}432 433static int ad74115_crc_check(struct ad74115_state *st, u8 *buf)434{435	struct device *dev = &st->spi->dev;436	u8 expected_crc = ad74115_crc(buf);437 438	if (buf[3] != expected_crc) {439		dev_err(dev, "Bad CRC %02x for %02x%02x%02x, expected %02x\n",440			buf[3], buf[0], buf[1], buf[2], expected_crc);441		return -EINVAL;442	}443 444	return 0;445}446 447static int ad74115_reg_read(void *context, unsigned int reg, unsigned int *val)448{449	struct ad74115_state *st = context;450	struct spi_transfer reg_read_xfer[] = {451		{452			.tx_buf = st->reg_tx_buf,453			.len = sizeof(st->reg_tx_buf),454			.cs_change = 1,455		},456		{457			.rx_buf = st->reg_rx_buf,458			.len = sizeof(st->reg_rx_buf),459		},460	};461	int ret;462 463	ad74115_format_reg_write(AD74115_READ_SELECT_REG, reg, st->reg_tx_buf);464 465	ret = spi_sync_transfer(st->spi, reg_read_xfer, ARRAY_SIZE(reg_read_xfer));466	if (ret)467		return ret;468 469	ret = ad74115_crc_check(st, st->reg_rx_buf);470	if (ret)471		return ret;472 473	*val = get_unaligned_be16(&st->reg_rx_buf[1]);474 475	return 0;476}477 478static const struct regmap_config ad74115_regmap_config = {479	.reg_bits = 8,480	.val_bits = 16,481	.reg_read = ad74115_reg_read,482	.reg_write = ad74115_reg_write,483};484 485static int ad74115_gpio_config_set(struct ad74115_state *st, unsigned int offset,486				   enum ad74115_gpio_config cfg)487{488	return regmap_update_bits(st->regmap, AD74115_GPIO_CONFIG_X_REG(offset),489				  AD74115_GPIO_CONFIG_SELECT_MASK,490				  FIELD_PREP(AD74115_GPIO_CONFIG_SELECT_MASK, cfg));491}492 493static int ad74115_gpio_init_valid_mask(struct gpio_chip *gc,494					unsigned long *valid_mask,495					unsigned int ngpios)496{497	struct ad74115_state *st = gpiochip_get_data(gc);498 499	*valid_mask = st->gpio_valid_mask;500 501	return 0;502}503 504static int ad74115_gpio_get_direction(struct gpio_chip *gc, unsigned int offset)505{506	struct ad74115_state *st = gpiochip_get_data(gc);507	unsigned int val;508	int ret;509 510	ret = regmap_read(st->regmap, AD74115_GPIO_CONFIG_X_REG(offset), &val);511	if (ret)512		return ret;513 514	return FIELD_GET(AD74115_GPIO_CONFIG_SELECT_MASK, val) == AD74115_GPIO_CONFIG_INPUT;515}516 517static int ad74115_gpio_direction_input(struct gpio_chip *gc, unsigned int offset)518{519	struct ad74115_state *st = gpiochip_get_data(gc);520 521	return ad74115_gpio_config_set(st, offset, AD74115_GPIO_CONFIG_INPUT);522}523 524static int ad74115_gpio_direction_output(struct gpio_chip *gc, unsigned int offset,525					 int value)526{527	struct ad74115_state *st = gpiochip_get_data(gc);528 529	return ad74115_gpio_config_set(st, offset, AD74115_GPIO_CONFIG_OUTPUT_BUFFERED);530}531 532static int ad74115_gpio_get(struct gpio_chip *gc, unsigned int offset)533{534	struct ad74115_state *st = gpiochip_get_data(gc);535	unsigned int val;536	int ret;537 538	ret = regmap_read(st->regmap, AD74115_GPIO_CONFIG_X_REG(offset), &val);539	if (ret)540		return ret;541 542	return FIELD_GET(AD74115_GPIO_CONFIG_GPI_DATA, val);543}544 545static void ad74115_gpio_set(struct gpio_chip *gc, unsigned int offset, int value)546{547	struct ad74115_state *st = gpiochip_get_data(gc);548	struct device *dev = &st->spi->dev;549	int ret;550 551	ret = regmap_update_bits(st->regmap, AD74115_GPIO_CONFIG_X_REG(offset),552				 AD74115_GPIO_CONFIG_GPO_DATA,553				 FIELD_PREP(AD74115_GPIO_CONFIG_GPO_DATA, value));554	if (ret)555		dev_err(dev, "Failed to set GPIO %u output value, err: %d\n",556			offset, ret);557}558 559static int ad74115_set_comp_debounce(struct ad74115_state *st, unsigned int val)560{561	unsigned int len = ARRAY_SIZE(ad74115_debounce_tbl);562	unsigned int i;563 564	for (i = 0; i < len; i++)565		if (val <= ad74115_debounce_tbl[i])566			break;567 568	if (i == len)569		i = len - 1;570 571	return regmap_update_bits(st->regmap, AD74115_DIN_CONFIG1_REG,572				  AD74115_DIN_DEBOUNCE_MASK,573				  FIELD_PREP(AD74115_DIN_DEBOUNCE_MASK, val));574}575 576static int ad74115_comp_gpio_get_direction(struct gpio_chip *chip,577					   unsigned int offset)578{579	return GPIO_LINE_DIRECTION_IN;580}581 582static int ad74115_comp_gpio_set_config(struct gpio_chip *chip,583					unsigned int offset,584					unsigned long config)585{586	struct ad74115_state *st = gpiochip_get_data(chip);587	u32 param = pinconf_to_config_param(config);588	u32 arg = pinconf_to_config_argument(config);589 590	switch (param) {591	case PIN_CONFIG_INPUT_DEBOUNCE:592		return ad74115_set_comp_debounce(st, arg);593	default:594		return -ENOTSUPP;595	}596}597 598static int ad74115_comp_gpio_get(struct gpio_chip *chip, unsigned int offset)599{600	struct ad74115_state *st = gpiochip_get_data(chip);601	unsigned int val;602	int ret;603 604	ret = regmap_read(st->regmap, AD74115_DIN_COMP_OUT_REG, &val);605	if (ret)606		return ret;607 608	return !!val;609}610 611static irqreturn_t ad74115_trigger_handler(int irq, void *p)612{613	struct iio_poll_func *pf = p;614	struct iio_dev *indio_dev = pf->indio_dev;615	struct ad74115_state *st = iio_priv(indio_dev);616	int ret;617 618	ret = spi_sync(st->spi, &st->adc_samples_msg);619	if (ret)620		goto out;621 622	iio_push_to_buffers(indio_dev, st->adc_samples_rx_buf);623 624out:625	iio_trigger_notify_done(indio_dev->trig);626 627	return IRQ_HANDLED;628}629 630static irqreturn_t ad74115_adc_data_interrupt(int irq, void *data)631{632	struct iio_dev *indio_dev = data;633	struct ad74115_state *st = iio_priv(indio_dev);634 635	if (iio_buffer_enabled(indio_dev))636		iio_trigger_poll(st->trig);637	else638		complete(&st->adc_data_completion);639 640	return IRQ_HANDLED;641}642 643static int ad74115_set_adc_ch_en(struct ad74115_state *st,644				 enum ad74115_adc_ch channel, bool status)645{646	unsigned int mask = ad74115_adc_ch_en_bit_tbl[channel];647 648	return regmap_update_bits(st->regmap, AD74115_ADC_CONV_CTRL_REG, mask,649				  status ? mask : 0);650}651 652static int ad74115_set_adc_conv_seq(struct ad74115_state *st,653				    enum ad74115_adc_conv_seq conv_seq)654{655	return regmap_update_bits(st->regmap, AD74115_ADC_CONV_CTRL_REG,656				  AD74115_ADC_CONV_SEQ_MASK,657				  FIELD_PREP(AD74115_ADC_CONV_SEQ_MASK, conv_seq));658}659 660static int ad74115_update_scan_mode(struct iio_dev *indio_dev,661				    const unsigned long *active_scan_mask)662{663	struct ad74115_state *st = iio_priv(indio_dev);664	struct spi_transfer *xfer = st->adc_samples_xfer;665	u8 *rx_buf = st->adc_samples_rx_buf;666	u8 *tx_buf = st->adc_samples_tx_buf;667	unsigned int i;668	int ret = 0;669 670	mutex_lock(&st->lock);671 672	spi_message_init(&st->adc_samples_msg);673 674	for_each_clear_bit(i, active_scan_mask, AD74115_ADC_CH_NUM) {675		ret = ad74115_set_adc_ch_en(st, i, false);676		if (ret)677			goto out;678	}679 680	/*681	 * The read select register is used to select which register's value682	 * will be sent by the slave on the next SPI frame.683	 *684	 * Create an SPI message that, on each step, writes to the read select685	 * register to select the ADC result of the next enabled channel, and686	 * reads the ADC result of the previous enabled channel.687	 *688	 * Example:689	 * W: [WCH1] [WCH2] [WCH2] [WCH3] [    ]690	 * R: [    ] [RCH1] [RCH2] [RCH3] [RCH4]691	 */692	for_each_set_bit(i, active_scan_mask, AD74115_ADC_CH_NUM) {693		ret = ad74115_set_adc_ch_en(st, i, true);694		if (ret)695			goto out;696 697		if (xfer == st->adc_samples_xfer)698			xfer->rx_buf = NULL;699		else700			xfer->rx_buf = rx_buf;701 702		xfer->tx_buf = tx_buf;703		xfer->len = AD74115_FRAME_SIZE;704		xfer->cs_change = 1;705 706		ad74115_format_reg_write(AD74115_READ_SELECT_REG,707					 ad74115_adc_ch_data_regs_tbl[i], tx_buf);708 709		spi_message_add_tail(xfer, &st->adc_samples_msg);710 711		tx_buf += AD74115_FRAME_SIZE;712		if (xfer != st->adc_samples_xfer)713			rx_buf += AD74115_FRAME_SIZE;714		xfer++;715	}716 717	xfer->rx_buf = rx_buf;718	xfer->tx_buf = NULL;719	xfer->len = AD74115_FRAME_SIZE;720	xfer->cs_change = 0;721 722	spi_message_add_tail(xfer, &st->adc_samples_msg);723 724out:725	mutex_unlock(&st->lock);726 727	return ret;728}729 730static int ad74115_buffer_postenable(struct iio_dev *indio_dev)731{732	struct ad74115_state *st = iio_priv(indio_dev);733 734	return ad74115_set_adc_conv_seq(st, AD74115_ADC_CONV_SEQ_CONTINUOUS);735}736 737static int ad74115_buffer_predisable(struct iio_dev *indio_dev)738{739	struct ad74115_state *st = iio_priv(indio_dev);740	unsigned int i;741	int ret;742 743	mutex_lock(&st->lock);744 745	ret = ad74115_set_adc_conv_seq(st, AD74115_ADC_CONV_SEQ_STANDBY);746	if (ret)747		goto out;748 749	/*750	 * update_scan_mode() is not called in the disable path, disable all751	 * channels here.752	 */753	for (i = 0; i < AD74115_ADC_CH_NUM; i++) {754		ret = ad74115_set_adc_ch_en(st, i, false);755		if (ret)756			goto out;757	}758 759out:760	mutex_unlock(&st->lock);761 762	return ret;763}764 765static const struct iio_buffer_setup_ops ad74115_buffer_ops = {766	.postenable = &ad74115_buffer_postenable,767	.predisable = &ad74115_buffer_predisable,768};769 770static const struct iio_trigger_ops ad74115_trigger_ops = {771	.validate_device = iio_trigger_validate_own_device,772};773 774static int ad74115_get_adc_rate(struct ad74115_state *st,775				enum ad74115_adc_ch channel, int *val)776{777	unsigned int i;778	int ret;779 780	ret = regmap_read(st->regmap, AD74115_ADC_CONFIG_REG, &i);781	if (ret)782		return ret;783 784	if (channel == AD74115_ADC_CH_CONV1)785		i = FIELD_GET(AD74115_ADC_CONFIG_CONV1_RATE_MASK, i);786	else787		i = FIELD_GET(AD74115_ADC_CONFIG_CONV2_RATE_MASK, i);788 789	*val = ad74115_adc_conv_rate_tbl[i];790 791	return IIO_VAL_INT;792}793 794static int _ad74115_get_adc_code(struct ad74115_state *st,795				 enum ad74115_adc_ch channel, int *val)796{797	unsigned int uval;798	int ret;799 800	reinit_completion(&st->adc_data_completion);801 802	ret = ad74115_set_adc_ch_en(st, channel, true);803	if (ret)804		return ret;805 806	ret = ad74115_set_adc_conv_seq(st, AD74115_ADC_CONV_SEQ_SINGLE);807	if (ret)808		return ret;809 810	if (st->irq) {811		ret = wait_for_completion_timeout(&st->adc_data_completion,812						  msecs_to_jiffies(1000));813		if (!ret)814			return -ETIMEDOUT;815	} else {816		unsigned int regval, wait_time;817		int rate;818 819		ret = ad74115_get_adc_rate(st, channel, &rate);820		if (ret < 0)821			return ret;822 823		wait_time = DIV_ROUND_CLOSEST(AD74115_CONV_TIME_US, rate);824 825		ret = regmap_read_poll_timeout(st->regmap, AD74115_LIVE_STATUS_REG,826					       regval, regval & AD74115_ADC_DATA_RDY_MASK,827					       wait_time, 5 * wait_time);828		if (ret)829			return ret;830 831		/*832		 * The ADC_DATA_RDY bit is W1C.833		 * See datasheet page 98, Table 62. Bit Descriptions for834		 * LIVE_STATUS.835		 * Although the datasheet mentions that the bit will auto-clear836		 * when writing to the ADC_CONV_CTRL register, this does not837		 * seem to happen.838		 */839		ret = regmap_write_bits(st->regmap, AD74115_LIVE_STATUS_REG,840					AD74115_ADC_DATA_RDY_MASK,841					FIELD_PREP(AD74115_ADC_DATA_RDY_MASK, 1));842		if (ret)843			return ret;844	}845 846	ret = regmap_read(st->regmap, ad74115_adc_ch_data_regs_tbl[channel], &uval);847	if (ret)848		return ret;849 850	ret = ad74115_set_adc_conv_seq(st, AD74115_ADC_CONV_SEQ_STANDBY);851	if (ret)852		return ret;853 854	ret = ad74115_set_adc_ch_en(st, channel, false);855	if (ret)856		return ret;857 858	*val = uval;859 860	return IIO_VAL_INT;861}862 863static int ad74115_get_adc_code(struct iio_dev *indio_dev,864				enum ad74115_adc_ch channel, int *val)865{866	struct ad74115_state *st = iio_priv(indio_dev);867	int ret;868 869	ret = iio_device_claim_direct_mode(indio_dev);870	if (ret)871		return ret;872 873	mutex_lock(&st->lock);874	ret = _ad74115_get_adc_code(st, channel, val);875	mutex_unlock(&st->lock);876 877	iio_device_release_direct_mode(indio_dev);878 879	return ret;880}881 882static int ad74115_adc_code_to_resistance(int code, int *val, int *val2)883{884	if (code == AD74115_ADC_CODE_MAX)885		code--;886 887	*val = code * AD74115_REF_RESISTOR_OHMS;888	*val2 = AD74115_ADC_CODE_MAX - code;889 890	return IIO_VAL_FRACTIONAL;891}892 893static int ad74115_set_dac_code(struct ad74115_state *st,894				enum ad74115_dac_ch channel, int val)895{896	if (val < 0)897		return -EINVAL;898 899	if (channel == AD74115_DAC_CH_COMPARATOR) {900		if (val > AD74115_COMP_THRESH_MAX)901			return -EINVAL;902 903		return regmap_update_bits(st->regmap, AD74115_DIN_CONFIG2_REG,904					  AD74115_COMP_THRESH_MASK,905					  FIELD_PREP(AD74115_COMP_THRESH_MASK, val));906	}907 908	if (val > AD74115_DAC_CODE_MAX)909		return -EINVAL;910 911	return regmap_write(st->regmap, AD74115_DAC_CODE_REG, val);912}913 914static int ad74115_get_dac_code(struct ad74115_state *st,915				enum ad74115_dac_ch channel, int *val)916{917	unsigned int uval;918	int ret;919 920	if (channel == AD74115_DAC_CH_COMPARATOR)921		return -EINVAL;922 923	ret = regmap_read(st->regmap, AD74115_DAC_ACTIVE_REG, &uval);924	if (ret)925		return ret;926 927	*val = uval;928 929	return IIO_VAL_INT;930}931 932static int ad74115_set_adc_rate(struct ad74115_state *st,933				enum ad74115_adc_ch channel, int val)934{935	unsigned int i;936	int ret;937 938	ret = ad74115_find_tbl_index(ad74115_adc_conv_rate_tbl, val, &i);939	if (ret)940		return ret;941 942	if (channel == AD74115_ADC_CH_CONV1)943		return regmap_update_bits(st->regmap, AD74115_ADC_CONFIG_REG,944					  AD74115_ADC_CONFIG_CONV1_RATE_MASK,945					  FIELD_PREP(AD74115_ADC_CONFIG_CONV1_RATE_MASK, i));946 947	return regmap_update_bits(st->regmap, AD74115_ADC_CONFIG_REG,948				  AD74115_ADC_CONFIG_CONV2_RATE_MASK,949				  FIELD_PREP(AD74115_ADC_CONFIG_CONV2_RATE_MASK, i));950}951 952static int ad74115_get_dac_rate(struct ad74115_state *st, int *val)953{954	unsigned int i, en_val, step_val, rate_val, tmp;955	int ret;956 957	ret = regmap_read(st->regmap, AD74115_OUTPUT_CONFIG_REG, &tmp);958	if (ret)959		return ret;960 961	en_val = FIELD_GET(AD74115_OUTPUT_SLEW_EN_MASK, tmp);962	step_val = FIELD_GET(AD74115_OUTPUT_SLEW_LIN_STEP_MASK, tmp);963	rate_val = FIELD_GET(AD74115_OUTPUT_SLEW_LIN_RATE_MASK, tmp);964 965	for (i = 0; i < ARRAY_SIZE(ad74115_dac_rate_step_tbl); i++)966		if (en_val == ad74115_dac_rate_step_tbl[i][0] &&967		    step_val == ad74115_dac_rate_step_tbl[i][1] &&968		    rate_val == ad74115_dac_rate_step_tbl[i][2])969			break;970 971	if (i == ARRAY_SIZE(ad74115_dac_rate_step_tbl))972		return -EINVAL;973 974	*val = ad74115_dac_rate_tbl[i];975 976	return IIO_VAL_INT;977}978 979static int ad74115_set_dac_rate(struct ad74115_state *st, int val)980{981	unsigned int i, en_val, step_val, rate_val, mask, tmp;982	int ret;983 984	ret = ad74115_find_tbl_index(ad74115_dac_rate_tbl, val, &i);985	if (ret)986		return ret;987 988	en_val = ad74115_dac_rate_step_tbl[i][0];989	step_val = ad74115_dac_rate_step_tbl[i][1];990	rate_val = ad74115_dac_rate_step_tbl[i][2];991 992	mask = AD74115_OUTPUT_SLEW_EN_MASK;993	mask |= AD74115_OUTPUT_SLEW_LIN_STEP_MASK;994	mask |= AD74115_OUTPUT_SLEW_LIN_RATE_MASK;995 996	tmp = FIELD_PREP(AD74115_OUTPUT_SLEW_EN_MASK, en_val);997	tmp |= FIELD_PREP(AD74115_OUTPUT_SLEW_LIN_STEP_MASK, step_val);998	tmp |= FIELD_PREP(AD74115_OUTPUT_SLEW_LIN_RATE_MASK, rate_val);999 1000	return regmap_update_bits(st->regmap, AD74115_OUTPUT_CONFIG_REG, mask, tmp);1001}1002 1003static int ad74115_get_dac_scale(struct ad74115_state *st,1004				 struct iio_chan_spec const *chan,1005				 int *val, int *val2)1006{1007	if (chan->channel == AD74115_DAC_CH_MAIN) {1008		if (chan->type == IIO_VOLTAGE) {1009			*val = AD74115_DAC_VOLTAGE_MAX;1010 1011			if (st->dac_bipolar)1012				*val *= 2;1013 1014		} else {1015			*val = AD74115_DAC_CURRENT_MAX;1016		}1017 1018		*val2 = AD74115_DAC_CODE_MAX;1019	} else {1020		if (st->din_threshold_mode == AD74115_DIN_THRESHOLD_MODE_AVDD) {1021			*val = 196 * st->avdd_mv;1022			*val2 = 10 * AD74115_COMP_THRESH_MAX;1023		} else {1024			*val = 49000;1025			*val2 = AD74115_COMP_THRESH_MAX;1026		}1027	}1028 1029	return IIO_VAL_FRACTIONAL;1030}1031 1032static int ad74115_get_dac_offset(struct ad74115_state *st,1033				  struct iio_chan_spec const *chan, int *val)1034{1035	if (chan->channel == AD74115_DAC_CH_MAIN) {1036		if (chan->type == IIO_VOLTAGE && st->dac_bipolar)1037			*val = -AD74115_DAC_CODE_HALF;1038		else1039			*val = 0;1040	} else {1041		if (st->din_threshold_mode == AD74115_DIN_THRESHOLD_MODE_AVDD)1042			*val = -48;1043		else1044			*val = -38;1045	}1046 1047	return IIO_VAL_INT;1048}1049 1050static int ad74115_get_adc_range(struct ad74115_state *st,1051				 enum ad74115_adc_ch channel, unsigned int *val)1052{1053	int ret;1054 1055	ret = regmap_read(st->regmap, AD74115_ADC_CONFIG_REG, val);1056	if (ret)1057		return ret;1058 1059	if (channel == AD74115_ADC_CH_CONV1)1060		*val = FIELD_GET(AD74115_ADC_CONFIG_CONV1_RANGE_MASK, *val);1061	else1062		*val = FIELD_GET(AD74115_ADC_CONFIG_CONV2_RANGE_MASK, *val);1063 1064	return 0;1065}1066 1067static int ad74115_get_adc_resistance_scale(struct ad74115_state *st,1068					    unsigned int range,1069					    int *val, int *val2)1070{1071	*val = ad74115_adc_gain_tbl[range][1] * AD74115_REF_RESISTOR_OHMS;1072	*val2 = ad74115_adc_gain_tbl[range][0];1073 1074	if (ad74115_adc_bipolar_tbl[range])1075		*val2 *= AD74115_ADC_CODE_HALF;1076	else1077		*val2 *= AD74115_ADC_CODE_MAX;1078 1079	return IIO_VAL_FRACTIONAL;1080}1081 1082static int ad74115_get_adc_scale(struct ad74115_state *st,1083				 struct iio_chan_spec const *chan,1084				 int *val, int *val2)1085{1086	unsigned int range;1087	int ret;1088 1089	ret = ad74115_get_adc_range(st, chan->channel, &range);1090	if (ret)1091		return ret;1092 1093	if (chan->type == IIO_RESISTANCE)1094		return ad74115_get_adc_resistance_scale(st, range, val, val2);1095 1096	*val = ad74115_adc_conv_mul_tbl[range];1097	*val2 = AD74115_ADC_CODE_MAX;1098 1099	if (chan->type == IIO_CURRENT)1100		*val2 *= AD74115_SENSE_RESISTOR_OHMS;1101 1102	return IIO_VAL_FRACTIONAL;1103}1104 1105static int ad74115_get_adc_resistance_offset(struct ad74115_state *st,1106					     unsigned int range,1107					     int *val, int *val2)1108{1109	unsigned int d = 10 * AD74115_REF_RESISTOR_OHMS1110			 * ad74115_adc_gain_tbl[range][1];1111 1112	*val = 5;1113 1114	if (ad74115_adc_bipolar_tbl[range])1115		*val -= AD74115_ADC_CODE_HALF;1116 1117	*val *= d;1118 1119	if (!st->rtd_mode_4_wire) {1120		/* Add 0.2 Ohm to the final result for 3-wire RTD. */1121		unsigned int v = 2 * ad74115_adc_gain_tbl[range][0];1122 1123		if (ad74115_adc_bipolar_tbl[range])1124			v *= AD74115_ADC_CODE_HALF;1125		else1126			v *= AD74115_ADC_CODE_MAX;1127 1128		*val += v;1129	}1130 1131	*val2 = d;1132 1133	return IIO_VAL_FRACTIONAL;1134}1135 1136static int ad74115_get_adc_offset(struct ad74115_state *st,1137				  struct iio_chan_spec const *chan,1138				  int *val, int *val2)1139{1140	unsigned int range;1141	int ret;1142 1143	ret = ad74115_get_adc_range(st, chan->channel, &range);1144	if (ret)1145		return ret;1146 1147	if (chan->type == IIO_RESISTANCE)1148		return ad74115_get_adc_resistance_offset(st, range, val, val2);1149 1150	if (ad74115_adc_bipolar_tbl[range])1151		*val = -AD74115_ADC_CODE_HALF;1152	else if (range == AD74115_ADC_RANGE_2_5V_NEG)1153		*val = -AD74115_ADC_CODE_MAX;1154	else1155		*val = 0;1156 1157	return IIO_VAL_INT;1158}1159 1160static int ad74115_read_raw(struct iio_dev *indio_dev,1161			    struct iio_chan_spec const *chan,1162			    int *val, int *val2, long info)1163{1164	struct ad74115_state *st = iio_priv(indio_dev);1165	int ret;1166 1167	switch (info) {1168	case IIO_CHAN_INFO_RAW:1169		if (chan->output)1170			return ad74115_get_dac_code(st, chan->channel, val);1171 1172		return ad74115_get_adc_code(indio_dev, chan->channel, val);1173	case IIO_CHAN_INFO_PROCESSED:1174		ret = ad74115_get_adc_code(indio_dev, chan->channel, val);1175		if (ret)1176			return ret;1177 1178		return ad74115_adc_code_to_resistance(*val, val, val2);1179	case IIO_CHAN_INFO_SCALE:1180		if (chan->output)1181			return ad74115_get_dac_scale(st, chan, val, val2);1182 1183		return ad74115_get_adc_scale(st, chan, val, val2);1184	case IIO_CHAN_INFO_OFFSET:1185		if (chan->output)1186			return ad74115_get_dac_offset(st, chan, val);1187 1188		return ad74115_get_adc_offset(st, chan, val, val2);1189	case IIO_CHAN_INFO_SAMP_FREQ:1190		if (chan->output)1191			return ad74115_get_dac_rate(st, val);1192 1193		return ad74115_get_adc_rate(st, chan->channel, val);1194	default:1195		return -EINVAL;1196	}1197}1198 1199static int ad74115_write_raw(struct iio_dev *indio_dev,1200			     struct iio_chan_spec const *chan, int val, int val2,1201			     long info)1202{1203	struct ad74115_state *st = iio_priv(indio_dev);1204 1205	switch (info) {1206	case IIO_CHAN_INFO_RAW:1207		if (!chan->output)1208			return -EINVAL;1209 1210		return ad74115_set_dac_code(st, chan->channel, val);1211	case IIO_CHAN_INFO_SAMP_FREQ:1212		if (chan->output)1213			return ad74115_set_dac_rate(st, val);1214 1215		return ad74115_set_adc_rate(st, chan->channel, val);1216	default:1217		return -EINVAL;1218	}1219}1220 1221static int ad74115_read_avail(struct iio_dev *indio_dev,1222			      struct iio_chan_spec const *chan,1223			      const int **vals, int *type, int *length, long info)1224{1225	switch (info) {1226	case IIO_CHAN_INFO_SAMP_FREQ:1227		if (chan->output) {1228			*vals = ad74115_dac_rate_tbl;1229			*length = ARRAY_SIZE(ad74115_dac_rate_tbl);1230		} else {1231			*vals = ad74115_adc_conv_rate_tbl;1232			*length = ARRAY_SIZE(ad74115_adc_conv_rate_tbl);1233		}1234 1235		*type = IIO_VAL_INT;1236 1237		return IIO_AVAIL_LIST;1238	default:1239		return -EINVAL;1240	}1241}1242 1243static int ad74115_reg_access(struct iio_dev *indio_dev, unsigned int reg,1244			      unsigned int writeval, unsigned int *readval)1245{1246	struct ad74115_state *st = iio_priv(indio_dev);1247 1248	if (readval)1249		return regmap_read(st->regmap, reg, readval);1250 1251	return regmap_write(st->regmap, reg, writeval);1252}1253 1254static const struct iio_info ad74115_info = {1255	.read_raw = ad74115_read_raw,1256	.write_raw = ad74115_write_raw,1257	.read_avail = ad74115_read_avail,1258	.update_scan_mode = ad74115_update_scan_mode,1259	.debugfs_reg_access = ad74115_reg_access,1260};1261 1262#define AD74115_DAC_CHANNEL(_type, index)				\1263	{								\1264		.type = (_type),					\1265		.channel = (index),					\1266		.indexed = 1,						\1267		.output = 1,						\1268		.scan_index = -1,					\1269		.info_mask_separate = BIT(IIO_CHAN_INFO_RAW)		\1270				      | BIT(IIO_CHAN_INFO_SCALE)	\1271				      | BIT(IIO_CHAN_INFO_OFFSET),	\1272	}1273 1274#define _AD74115_ADC_CHANNEL(_type, index, extra_mask_separate)		\1275	{								\1276		.type = (_type),					\1277		.channel = (index),					\1278		.indexed = 1,						\1279		.info_mask_separate = BIT(IIO_CHAN_INFO_RAW)		\1280				      | BIT(IIO_CHAN_INFO_SAMP_FREQ)	\1281				      | (extra_mask_separate),		\1282		.info_mask_separate_available =				\1283					BIT(IIO_CHAN_INFO_SAMP_FREQ),	\1284		.scan_index = index,					\1285		.scan_type = {						\1286			.sign = 'u',					\1287			.realbits = 16,					\1288			.storagebits = 32,				\1289			.shift = 8,					\1290			.endianness = IIO_BE,				\1291		},							\1292	}1293 1294#define AD74115_ADC_CHANNEL(_type, index)				\1295	_AD74115_ADC_CHANNEL(_type, index, BIT(IIO_CHAN_INFO_SCALE)	\1296					   | BIT(IIO_CHAN_INFO_OFFSET))1297 1298static struct iio_chan_spec ad74115_voltage_input_channels[] = {1299	AD74115_ADC_CHANNEL(IIO_VOLTAGE, AD74115_ADC_CH_CONV1),1300	AD74115_ADC_CHANNEL(IIO_VOLTAGE, AD74115_ADC_CH_CONV2),1301};1302 1303static struct iio_chan_spec ad74115_voltage_output_channels[] = {1304	AD74115_DAC_CHANNEL(IIO_VOLTAGE, AD74115_DAC_CH_MAIN),1305	AD74115_ADC_CHANNEL(IIO_CURRENT, AD74115_ADC_CH_CONV1),1306	AD74115_ADC_CHANNEL(IIO_VOLTAGE, AD74115_ADC_CH_CONV2),1307};1308 1309static struct iio_chan_spec ad74115_current_input_channels[] = {1310	AD74115_ADC_CHANNEL(IIO_CURRENT, AD74115_ADC_CH_CONV1),1311	AD74115_ADC_CHANNEL(IIO_VOLTAGE, AD74115_ADC_CH_CONV2),1312};1313 1314static struct iio_chan_spec ad74115_current_output_channels[] = {1315	AD74115_DAC_CHANNEL(IIO_CURRENT, AD74115_DAC_CH_MAIN),1316	AD74115_ADC_CHANNEL(IIO_VOLTAGE, AD74115_ADC_CH_CONV1),1317	AD74115_ADC_CHANNEL(IIO_VOLTAGE, AD74115_ADC_CH_CONV2),1318};1319 1320static struct iio_chan_spec ad74115_2_wire_resistance_input_channels[] = {1321	_AD74115_ADC_CHANNEL(IIO_RESISTANCE, AD74115_ADC_CH_CONV1,1322			     BIT(IIO_CHAN_INFO_PROCESSED)),1323	AD74115_ADC_CHANNEL(IIO_VOLTAGE, AD74115_ADC_CH_CONV2),1324};1325 1326static struct iio_chan_spec ad74115_3_4_wire_resistance_input_channels[] = {1327	AD74115_ADC_CHANNEL(IIO_RESISTANCE, AD74115_ADC_CH_CONV1),1328	AD74115_ADC_CHANNEL(IIO_VOLTAGE, AD74115_ADC_CH_CONV2),1329};1330 1331static struct iio_chan_spec ad74115_digital_input_logic_channels[] = {1332	AD74115_DAC_CHANNEL(IIO_VOLTAGE, AD74115_DAC_CH_COMPARATOR),1333	AD74115_ADC_CHANNEL(IIO_VOLTAGE, AD74115_ADC_CH_CONV1),1334	AD74115_ADC_CHANNEL(IIO_VOLTAGE, AD74115_ADC_CH_CONV2),1335};1336 1337static struct iio_chan_spec ad74115_digital_input_loop_channels[] = {1338	AD74115_DAC_CHANNEL(IIO_CURRENT, AD74115_DAC_CH_MAIN),1339	AD74115_DAC_CHANNEL(IIO_VOLTAGE, AD74115_DAC_CH_COMPARATOR),1340	AD74115_ADC_CHANNEL(IIO_VOLTAGE, AD74115_ADC_CH_CONV1),1341	AD74115_ADC_CHANNEL(IIO_VOLTAGE, AD74115_ADC_CH_CONV2),1342};1343 1344#define _AD74115_CHANNELS(_channels)			\1345	{						\1346		.channels = _channels,			\1347		.num_channels = ARRAY_SIZE(_channels),	\1348	}1349 1350#define AD74115_CHANNELS(name) \1351	_AD74115_CHANNELS(ad74115_ ## name ## _channels)1352 1353static const struct ad74115_channels ad74115_channels_map[AD74115_CH_FUNC_NUM] = {1354	[AD74115_CH_FUNC_HIGH_IMPEDANCE] = AD74115_CHANNELS(voltage_input),1355	[AD74115_CH_FUNC_VOLTAGE_INPUT] = AD74115_CHANNELS(voltage_input),1356 1357	[AD74115_CH_FUNC_VOLTAGE_OUTPUT] = AD74115_CHANNELS(voltage_output),1358 1359	[AD74115_CH_FUNC_CURRENT_INPUT_EXT_POWER] = AD74115_CHANNELS(current_input),1360	[AD74115_CH_FUNC_CURRENT_INPUT_LOOP_POWER] = AD74115_CHANNELS(current_input),1361	[AD74115_CH_FUNC_CURRENT_INPUT_EXT_POWER_HART] = AD74115_CHANNELS(current_input),1362	[AD74115_CH_FUNC_CURRENT_INPUT_LOOP_POWER_HART] = AD74115_CHANNELS(current_input),1363 1364	[AD74115_CH_FUNC_CURRENT_OUTPUT] = AD74115_CHANNELS(current_output),1365	[AD74115_CH_FUNC_CURRENT_OUTPUT_HART] = AD74115_CHANNELS(current_output),1366 1367	[AD74115_CH_FUNC_2_WIRE_RESISTANCE_INPUT] = AD74115_CHANNELS(2_wire_resistance_input),1368	[AD74115_CH_FUNC_3_4_WIRE_RESISTANCE_INPUT] = AD74115_CHANNELS(3_4_wire_resistance_input),1369 1370	[AD74115_CH_FUNC_DIGITAL_INPUT_LOGIC] = AD74115_CHANNELS(digital_input_logic),1371 1372	[AD74115_CH_FUNC_DIGITAL_INPUT_LOOP_POWER] = AD74115_CHANNELS(digital_input_loop),1373};1374 1375#define AD74115_GPIO_MODE_FW_PROP(i)					\1376{									\1377	.name = "adi,gpio" __stringify(i) "-mode",			\1378	.reg = AD74115_GPIO_CONFIG_X_REG(i),				\1379	.mask = AD74115_GPIO_CONFIG_SELECT_MASK,			\1380	.lookup_tbl = ad74115_gpio_mode_tbl,				\1381	.lookup_tbl_len = ARRAY_SIZE(ad74115_gpio_mode_tbl),		\1382}1383 1384static const struct ad74115_fw_prop ad74115_gpio_mode_fw_props[] = {1385	AD74115_GPIO_MODE_FW_PROP(0),1386	AD74115_GPIO_MODE_FW_PROP(1),1387	AD74115_GPIO_MODE_FW_PROP(2),1388	AD74115_GPIO_MODE_FW_PROP(3),1389};1390 1391static const struct ad74115_fw_prop ad74115_din_threshold_mode_fw_prop =1392	AD74115_FW_PROP_BOOL("adi,digital-input-threshold-mode-fixed",1393			     AD74115_DIN_CONFIG2_REG, BIT(7));1394 1395static const struct ad74115_fw_prop ad74115_dac_bipolar_fw_prop =1396	AD74115_FW_PROP_BOOL("adi,dac-bipolar", AD74115_OUTPUT_CONFIG_REG, BIT(7));1397 1398static const struct ad74115_fw_prop ad74115_ch_func_fw_prop =1399	AD74115_FW_PROP("adi,ch-func", AD74115_CH_FUNC_MAX,1400			AD74115_CH_FUNC_SETUP_REG, GENMASK(3, 0));1401 1402static const struct ad74115_fw_prop ad74115_rtd_mode_fw_prop =1403	AD74115_FW_PROP_BOOL("adi,4-wire-rtd", AD74115_RTD3W4W_CONFIG_REG, BIT(3));1404 1405static const struct ad74115_fw_prop ad74115_din_range_fw_prop =1406	AD74115_FW_PROP_BOOL("adi,digital-input-sink-range-high",1407			     AD74115_DIN_CONFIG1_REG, BIT(12));1408 1409static const struct ad74115_fw_prop ad74115_ext2_burnout_current_fw_prop =1410	AD74115_FW_PROP_TBL("adi,ext2-burnout-current-nanoamp",1411			    ad74115_burnout_current_na_tbl,1412			    AD74115_BURNOUT_CONFIG_REG, GENMASK(14, 12));1413 1414static const struct ad74115_fw_prop ad74115_ext1_burnout_current_fw_prop =1415	AD74115_FW_PROP_TBL("adi,ext1-burnout-current-nanoamp",1416			    ad74115_burnout_current_na_tbl,1417			    AD74115_BURNOUT_CONFIG_REG, GENMASK(9, 7));1418 1419static const struct ad74115_fw_prop ad74115_viout_burnout_current_fw_prop =1420	AD74115_FW_PROP_TBL("adi,viout-burnout-current-nanoamp",1421			    ad74115_viout_burnout_current_na_tbl,1422			    AD74115_BURNOUT_CONFIG_REG, GENMASK(4, 2));1423 1424static const struct ad74115_fw_prop ad74115_fw_props[] = {1425	AD74115_FW_PROP("adi,conv2-mux", 3,1426			AD74115_ADC_CONFIG_REG, GENMASK(3, 2)),1427 1428	AD74115_FW_PROP_BOOL_NEG("adi,sense-agnd-buffer-low-power",1429				 AD74115_PWR_OPTIM_CONFIG_REG, BIT(4)),1430	AD74115_FW_PROP_BOOL_NEG("adi,lf-buffer-low-power",1431				 AD74115_PWR_OPTIM_CONFIG_REG, BIT(3)),1432	AD74115_FW_PROP_BOOL_NEG("adi,hf-buffer-low-power",1433				 AD74115_PWR_OPTIM_CONFIG_REG, BIT(2)),1434	AD74115_FW_PROP_BOOL_NEG("adi,ext2-buffer-low-power",1435				 AD74115_PWR_OPTIM_CONFIG_REG, BIT(1)),1436	AD74115_FW_PROP_BOOL_NEG("adi,ext1-buffer-low-power",1437				 AD74115_PWR_OPTIM_CONFIG_REG, BIT(0)),1438 1439	AD74115_FW_PROP_BOOL("adi,comparator-invert",1440			     AD74115_DIN_CONFIG1_REG, BIT(14)),1441	AD74115_FW_PROP_BOOL("adi,digital-input-debounce-mode-counter-reset",1442			     AD74115_DIN_CONFIG1_REG, BIT(6)),1443 1444	AD74115_FW_PROP_BOOL("adi,digital-input-unbuffered",1445			     AD74115_DIN_CONFIG2_REG, BIT(10)),1446	AD74115_FW_PROP_BOOL("adi,digital-input-short-circuit-detection",1447			     AD74115_DIN_CONFIG2_REG, BIT(9)),1448	AD74115_FW_PROP_BOOL("adi,digital-input-open-circuit-detection",1449			     AD74115_DIN_CONFIG2_REG, BIT(8)),1450 1451	AD74115_FW_PROP_BOOL("adi,dac-current-limit-low",1452			     AD74115_OUTPUT_CONFIG_REG, BIT(0)),1453 1454	AD74115_FW_PROP_BOOL("adi,3-wire-rtd-excitation-swap",1455			     AD74115_RTD3W4W_CONFIG_REG, BIT(2)),1456	AD74115_FW_PROP_TBL("adi,rtd-excitation-current-microamp",1457			    ad74115_rtd_excitation_current_ua_tbl,1458			    AD74115_RTD3W4W_CONFIG_REG, GENMASK(1, 0)),1459 1460	AD74115_FW_PROP_BOOL("adi,ext2-burnout-current-polarity-sourcing",1461			     AD74115_BURNOUT_CONFIG_REG, BIT(11)),1462	AD74115_FW_PROP_BOOL("adi,ext1-burnout-current-polarity-sourcing",1463			     AD74115_BURNOUT_CONFIG_REG, BIT(6)),1464	AD74115_FW_PROP_BOOL("adi,viout-burnout-current-polarity-sourcing",1465			     AD74115_BURNOUT_CONFIG_REG, BIT(1)),1466 1467	AD74115_FW_PROP_BOOL("adi,charge-pump",1468			     AD74115_CHARGE_PUMP_REG, BIT(0)),1469};1470 1471static int ad74115_apply_fw_prop(struct ad74115_state *st,1472				 const struct ad74115_fw_prop *prop, u32 *retval)1473{1474	struct device *dev = &st->spi->dev;1475	u32 val = 0;1476	int ret;1477 1478	if (prop->is_boolean) {1479		val = device_property_read_bool(dev, prop->name);1480	} else {1481		ret = device_property_read_u32(dev, prop->name, &val);1482		if (ret && prop->lookup_tbl)1483			val = prop->lookup_tbl[0];1484	}1485 1486	*retval = val;1487 1488	if (prop->negate)1489		val = !val;1490 1491	if (prop->lookup_tbl)1492		ret = _ad74115_find_tbl_index(prop->lookup_tbl,1493					      prop->lookup_tbl_len, val, &val);1494	else if (prop->max && val > prop->max)1495		ret = -EINVAL;1496	else1497		ret = 0;1498 1499	if (ret)1500		return dev_err_probe(dev, -EINVAL,1501				     "Invalid value %u for prop %s\n",1502				     val, prop->name);1503 1504	WARN(!prop->mask, "Prop %s mask is empty\n", prop->name);1505 1506	val = (val << __ffs(prop->mask)) & prop->mask;1507 1508	return regmap_update_bits(st->regmap, prop->reg, prop->mask, val);1509}1510 1511static int ad74115_setup_adc_conv2_range(struct ad74115_state *st)1512{1513	unsigned int tbl_len = ARRAY_SIZE(ad74115_adc_range_tbl);1514	const char *prop_name = "adi,conv2-range-microvolt";1515	s32 vals[2] = {1516		ad74115_adc_range_tbl[0][0],1517		ad74115_adc_range_tbl[0][1],1518	};1519	struct device *dev = &st->spi->dev;1520	unsigned int i;1521 1522	device_property_read_u32_array(dev, prop_name, vals, 2);1523 1524	for (i = 0; i < tbl_len; i++)1525		if (vals[0] == ad74115_adc_range_tbl[i][0] &&1526		    vals[1] == ad74115_adc_range_tbl[i][1])1527			break;1528 1529	if (i == tbl_len)1530		return dev_err_probe(dev, -EINVAL,1531				     "Invalid value %d, %d for prop %s\n",1532				     vals[0], vals[1], prop_name);1533 1534	return regmap_update_bits(st->regmap, AD74115_ADC_CONFIG_REG,1535				  AD74115_ADC_CONFIG_CONV2_RANGE_MASK,1536				  FIELD_PREP(AD74115_ADC_CONFIG_CONV2_RANGE_MASK, i));1537}1538 1539static int ad74115_setup_iio_channels(struct iio_dev *indio_dev)1540{1541	struct ad74115_state *st = iio_priv(indio_dev);1542	struct device *dev = &st->spi->dev;1543	struct iio_chan_spec *channels;1544 1545	channels = devm_kcalloc(dev, sizeof(*channels),1546				indio_dev->num_channels, GFP_KERNEL);1547	if (!channels)1548		return -ENOMEM;1549 1550	indio_dev->channels = channels;1551 1552	memcpy(channels, ad74115_channels_map[st->ch_func].channels,1553	       sizeof(*channels) * ad74115_channels_map[st->ch_func].num_channels);1554 1555	if (channels[0].output && channels[0].channel == AD74115_DAC_CH_MAIN &&1556	    channels[0].type == IIO_VOLTAGE && !st->dac_hart_slew) {1557		channels[0].info_mask_separate |= BIT(IIO_CHAN_INFO_SAMP_FREQ);1558		channels[0].info_mask_separate_available |= BIT(IIO_CHAN_INFO_SAMP_FREQ);1559	}1560 1561	return 0;1562}1563 1564static int ad74115_setup_gpio_chip(struct ad74115_state *st)1565{1566	struct device *dev = &st->spi->dev;1567 1568	if (!st->gpio_valid_mask)1569		return 0;1570 1571	st->gc = (struct gpio_chip) {1572		.owner = THIS_MODULE,1573		.label = AD74115_NAME,1574		.base = -1,1575		.ngpio = AD74115_GPIO_NUM,1576		.parent = dev,1577		.can_sleep = true,1578		.init_valid_mask = ad74115_gpio_init_valid_mask,1579		.get_direction = ad74115_gpio_get_direction,1580		.direction_input = ad74115_gpio_direction_input,1581		.direction_output = ad74115_gpio_direction_output,1582		.get = ad74115_gpio_get,1583		.set = ad74115_gpio_set,1584	};1585 1586	return devm_gpiochip_add_data(dev, &st->gc, st);1587}1588 1589static int ad74115_setup_comp_gpio_chip(struct ad74115_state *st)1590{1591	struct device *dev = &st->spi->dev;1592	u32 val;1593	int ret;1594 1595	ret = regmap_read(st->regmap, AD74115_DIN_CONFIG1_REG, &val);1596	if (ret)1597		return ret;1598 1599	if (!(val & AD74115_DIN_COMPARATOR_EN_MASK))1600		return 0;1601 1602	st->comp_gc = (struct gpio_chip) {1603		.owner = THIS_MODULE,1604		.label = AD74115_NAME,1605		.base = -1,1606		.ngpio = 1,1607		.parent = dev,1608		.can_sleep = true,1609		.get_direction = ad74115_comp_gpio_get_direction,1610		.get = ad74115_comp_gpio_get,1611		.set_config = ad74115_comp_gpio_set_config,1612	};1613 1614	return devm_gpiochip_add_data(dev, &st->comp_gc, st);1615}1616 1617static int ad74115_setup(struct iio_dev *indio_dev)1618{1619	struct ad74115_state *st = iio_priv(indio_dev);1620	struct device *dev = &st->spi->dev;1621	u32 val, din_range_high;1622	unsigned int i;1623	int ret;1624 1625	ret = ad74115_apply_fw_prop(st, &ad74115_ch_func_fw_prop, &val);1626	if (ret)1627		return ret;1628 1629	indio_dev->num_channels += ad74115_channels_map[val].num_channels;1630	st->ch_func = val;1631 1632	ret = ad74115_setup_adc_conv2_range(st);1633	if (ret)1634		return ret;1635 1636	val = device_property_read_bool(dev, "adi,dac-hart-slew");1637	if (val) {1638		st->dac_hart_slew = val;1639 1640		ret = regmap_update_bits(st->regmap, AD74115_OUTPUT_CONFIG_REG,1641					 AD74115_OUTPUT_SLEW_EN_MASK,1642					 FIELD_PREP(AD74115_OUTPUT_SLEW_EN_MASK,1643						    AD74115_SLEW_MODE_HART));1644		if (ret)1645			return ret;1646	}1647 1648	ret = ad74115_apply_fw_prop(st, &ad74115_din_range_fw_prop,1649				    &din_range_high);1650	if (ret)1651		return ret;1652 1653	ret = device_property_read_u32(dev, "adi,digital-input-sink-microamp", &val);1654	if (!ret) {1655		if (din_range_high)1656			val = DIV_ROUND_CLOSEST(val, AD74115_DIN_SINK_LOW_STEP);1657		else1658			val = DIV_ROUND_CLOSEST(val, AD74115_DIN_SINK_HIGH_STEP);1659 1660		if (val > AD74115_DIN_SINK_MAX)1661			val = AD74115_DIN_SINK_MAX;1662 1663		ret = regmap_update_bits(st->regmap, AD74115_DIN_CONFIG1_REG,1664					 AD74115_DIN_SINK_MASK,1665					 FIELD_PREP(AD74115_DIN_SINK_MASK, val));1666		if (ret)1667			return ret;1668	}1669 1670	ret = ad74115_apply_fw_prop(st, &ad74115_din_threshold_mode_fw_prop, &val);1671	if (ret)1672		return ret;1673 1674	if (val == AD74115_DIN_THRESHOLD_MODE_AVDD && !st->avdd_mv)1675		return dev_err_probe(dev, -EINVAL,1676				     "AVDD voltage is required for digital input threshold mode AVDD\n");1677 1678	st->din_threshold_mode = val;1679 1680	ret = ad74115_apply_fw_prop(st, &ad74115_dac_bipolar_fw_prop, &val);1681	if (ret)1682		return ret;1683 1684	st->dac_bipolar = val;1685 1686	ret = ad74115_apply_fw_prop(st, &ad74115_rtd_mode_fw_prop, &val);1687	if (ret)1688		return ret;1689 1690	st->rtd_mode_4_wire = val;1691 1692	ret = ad74115_apply_fw_prop(st, &ad74115_ext2_burnout_current_fw_prop, &val);1693	if (ret)1694		return ret;1695 1696	if (val) {1697		ret = regmap_update_bits(st->regmap, AD74115_BURNOUT_CONFIG_REG,1698					 AD74115_BURNOUT_EXT2_EN_MASK,1699					 FIELD_PREP(AD74115_BURNOUT_EXT2_EN_MASK, 1));1700		if (ret)1701			return ret;1702	}1703 1704	ret = ad74115_apply_fw_prop(st, &ad74115_ext1_burnout_current_fw_prop, &val);1705	if (ret)1706		return ret;1707 1708	if (val) {1709		ret = regmap_update_bits(st->regmap, AD74115_BURNOUT_CONFIG_REG,1710					 AD74115_BURNOUT_EXT1_EN_MASK,1711					 FIELD_PREP(AD74115_BURNOUT_EXT1_EN_MASK, 1));1712		if (ret)1713			return ret;1714	}1715 1716	ret = ad74115_apply_fw_prop(st, &ad74115_viout_burnout_current_fw_prop, &val);1717	if (ret)1718		return ret;1719 1720	if (val) {1721		ret = regmap_update_bits(st->regmap, AD74115_BURNOUT_CONFIG_REG,1722					 AD74115_BURNOUT_VIOUT_EN_MASK,1723					 FIELD_PREP(AD74115_BURNOUT_VIOUT_EN_MASK, 1));1724		if (ret)1725			return ret;1726	}1727 1728	for (i = 0; i < AD74115_GPIO_NUM; i++) {1729		ret = ad74115_apply_fw_prop(st, &ad74115_gpio_mode_fw_props[i], &val);1730		if (ret)1731			return ret;1732 1733		if (val == AD74115_GPIO_MODE_LOGIC)1734			st->gpio_valid_mask |= BIT(i);1735	}1736 1737	for (i = 0; i < ARRAY_SIZE(ad74115_fw_props); i++) {1738		ret = ad74115_apply_fw_prop(st, &ad74115_fw_props[i], &val);1739		if (ret)1740			return ret;1741	}1742 1743	ret = ad74115_setup_gpio_chip(st);1744	if (ret)1745		return ret;1746 1747	ret = ad74115_setup_comp_gpio_chip(st);1748	if (ret)1749		return ret;1750 1751	return ad74115_setup_iio_channels(indio_dev);1752}1753 1754static int ad74115_reset(struct ad74115_state *st)1755{1756	struct device *dev = &st->spi->dev;1757	struct gpio_desc *reset_gpio;1758	int ret;1759 1760	reset_gpio = devm_gpiod_get_optional(dev, "reset", GPIOD_OUT_HIGH);1761	if (IS_ERR(reset_gpio))1762		return dev_err_probe(dev, PTR_ERR(reset_gpio),1763				     "Failed to find reset GPIO\n");1764 1765	if (reset_gpio) {1766		fsleep(100);1767 1768		gpiod_set_value_cansleep(reset_gpio, 0);1769	} else {1770		ret = regmap_write(st->regmap, AD74115_CMD_KEY_REG,1771				   AD74115_CMD_KEY_RESET1);1772		if (ret)1773			return ret;1774 1775		ret = regmap_write(st->regmap, AD74115_CMD_KEY_REG,1776				   AD74115_CMD_KEY_RESET2);1777		if (ret)1778			return ret;1779	}1780 1781	fsleep(1000);1782 1783	return 0;1784}1785 1786static int ad74115_setup_trigger(struct iio_dev *indio_dev)1787{1788	struct ad74115_state *st = iio_priv(indio_dev);1789	struct device *dev = &st->spi->dev;1790	int ret;1791 1792	st->irq = fwnode_irq_get_byname(dev_fwnode(dev), "adc_rdy");1793 1794	if (st->irq == -EPROBE_DEFER)1795		return -EPROBE_DEFER;1796 1797	if (st->irq < 0) {1798		st->irq = 0;1799		return 0;1800	}1801 1802	ret = devm_request_irq(dev, st->irq, ad74115_adc_data_interrupt,1803			       0, AD74115_NAME, indio_dev);1804	if (ret)1805		return ret;1806 1807	st->trig = devm_iio_trigger_alloc(dev, "%s-dev%d", AD74115_NAME,1808					  iio_device_id(indio_dev));1809	if (!st->trig)1810		return -ENOMEM;1811 1812	st->trig->ops = &ad74115_trigger_ops;1813	iio_trigger_set_drvdata(st->trig, st);1814 1815	ret = devm_iio_trigger_register(dev, st->trig);1816	if (ret)1817		return ret;1818 1819	indio_dev->trig = iio_trigger_get(st->trig);1820 1821	return 0;1822}1823 1824static int ad74115_probe(struct spi_device *spi)1825{1826	static const char * const regulator_names[] = {1827		"avcc", "dvcc", "dovdd", "refin",1828	};1829	struct device *dev = &spi->dev;1830	struct ad74115_state *st;1831	struct iio_dev *indio_dev;1832	int ret;1833 1834	indio_dev = devm_iio_device_alloc(dev, sizeof(*st));1835	if (!indio_dev)1836		return -ENOMEM;1837 1838	st = iio_priv(indio_dev);1839 1840	st->spi = spi;1841	mutex_init(&st->lock);1842	init_completion(&st->adc_data_completion);1843 1844	indio_dev->name = AD74115_NAME;1845	indio_dev->modes = INDIO_DIRECT_MODE;1846	indio_dev->info = &ad74115_info;1847 1848	ret = devm_regulator_get_enable_read_voltage(dev, "avdd");1849	if (ret < 0) {1850		/*1851		 * Since this is both a power supply and only optionally a1852		 * reference voltage, make sure to enable it even when the1853		 * voltage is not available.1854		 */1855		ret = devm_regulator_get_enable(dev, "avdd");1856		if (ret)1857			return dev_err_probe(dev, ret, "failed to enable avdd\n");1858	} else {1859		st->avdd_mv = ret / 1000;1860	}1861 1862	ret = devm_regulator_bulk_get_enable(dev, ARRAY_SIZE(regulator_names),1863					     regulator_names);1864	if (ret)1865		return ret;1866 1867	st->regmap = devm_regmap_init(dev, NULL, st, &ad74115_regmap_config);1868	if (IS_ERR(st->regmap))1869		return PTR_ERR(st->regmap);1870 1871	ret = ad74115_reset(st);1872	if (ret)1873		return ret;1874 1875	ret = ad74115_setup(indio_dev);1876	if (ret)1877		return ret;1878 1879	ret = ad74115_setup_trigger(indio_dev);1880	if (ret)1881		return ret;1882 1883	ret = devm_iio_triggered_buffer_setup(dev, indio_dev, NULL,1884					      ad74115_trigger_handler,1885					      &ad74115_buffer_ops);1886	if (ret)1887		return ret;1888 1889	return devm_iio_device_register(dev, indio_dev);1890}1891 1892static int ad74115_unregister_driver(struct spi_driver *spi)1893{1894	spi_unregister_driver(spi);1895 1896	return 0;1897}1898 1899static int __init ad74115_register_driver(struct spi_driver *spi)1900{1901	crc8_populate_msb(ad74115_crc8_table, AD74115_CRC_POLYNOMIAL);1902 1903	return spi_register_driver(spi);1904}1905 1906static const struct spi_device_id ad74115_spi_id[] = {1907	{ "ad74115h" },1908	{ }1909};1910 1911MODULE_DEVICE_TABLE(spi, ad74115_spi_id);1912 1913static const struct of_device_id ad74115_dt_id[] = {1914	{ .compatible = "adi,ad74115h" },1915	{ }1916};1917MODULE_DEVICE_TABLE(of, ad74115_dt_id);1918 1919static struct spi_driver ad74115_driver = {1920	.driver = {1921		   .name = "ad74115",1922		   .of_match_table = ad74115_dt_id,1923	},1924	.probe = ad74115_probe,1925	.id_table = ad74115_spi_id,1926};1927 1928module_driver(ad74115_driver,1929	      ad74115_register_driver, ad74115_unregister_driver);1930 1931MODULE_AUTHOR("Cosmin Tanislav <cosmin.tanislav@analog.com>");1932MODULE_DESCRIPTION("Analog Devices AD74115 ADDAC");1933MODULE_LICENSE("GPL");1934