xref: /openbmc/linux/drivers/iio/dac/ad7293.c (revision 4f2c0a4acffbec01079c28f839422e64ddeff004)
10bb12606SAntoniu Miclaus // SPDX-License-Identifier: GPL-2.0-only
20bb12606SAntoniu Miclaus /*
30bb12606SAntoniu Miclaus  * AD7293 driver
40bb12606SAntoniu Miclaus  *
50bb12606SAntoniu Miclaus  * Copyright 2021 Analog Devices Inc.
60bb12606SAntoniu Miclaus  */
70bb12606SAntoniu Miclaus 
80bb12606SAntoniu Miclaus #include <linux/bitfield.h>
90bb12606SAntoniu Miclaus #include <linux/bits.h>
100bb12606SAntoniu Miclaus #include <linux/delay.h>
110bb12606SAntoniu Miclaus #include <linux/device.h>
120bb12606SAntoniu Miclaus #include <linux/gpio/consumer.h>
130bb12606SAntoniu Miclaus #include <linux/iio/iio.h>
140bb12606SAntoniu Miclaus #include <linux/mod_devicetable.h>
150bb12606SAntoniu Miclaus #include <linux/module.h>
160bb12606SAntoniu Miclaus #include <linux/regulator/consumer.h>
170bb12606SAntoniu Miclaus #include <linux/spi/spi.h>
180bb12606SAntoniu Miclaus 
190bb12606SAntoniu Miclaus #include <asm/unaligned.h>
200bb12606SAntoniu Miclaus 
210bb12606SAntoniu Miclaus #define AD7293_R1B				BIT(16)
220bb12606SAntoniu Miclaus #define AD7293_R2B				BIT(17)
230bb12606SAntoniu Miclaus #define AD7293_PAGE_ADDR_MSK			GENMASK(15, 8)
240bb12606SAntoniu Miclaus #define AD7293_PAGE(x)				FIELD_PREP(AD7293_PAGE_ADDR_MSK, x)
250bb12606SAntoniu Miclaus 
260bb12606SAntoniu Miclaus /* AD7293 Register Map Common */
270bb12606SAntoniu Miclaus #define AD7293_REG_NO_OP			(AD7293_R1B | AD7293_PAGE(0x0) | 0x0)
280bb12606SAntoniu Miclaus #define AD7293_REG_PAGE_SELECT			(AD7293_R1B | AD7293_PAGE(0x0) | 0x1)
290bb12606SAntoniu Miclaus #define AD7293_REG_CONV_CMD			(AD7293_R2B | AD7293_PAGE(0x0) | 0x2)
300bb12606SAntoniu Miclaus #define AD7293_REG_RESULT			(AD7293_R1B | AD7293_PAGE(0x0) | 0x3)
310bb12606SAntoniu Miclaus #define AD7293_REG_DAC_EN			(AD7293_R1B | AD7293_PAGE(0x0) | 0x4)
320bb12606SAntoniu Miclaus #define AD7293_REG_DEVICE_ID			(AD7293_R2B | AD7293_PAGE(0x0) | 0xC)
330bb12606SAntoniu Miclaus #define AD7293_REG_SOFT_RESET			(AD7293_R2B | AD7293_PAGE(0x0) | 0xF)
340bb12606SAntoniu Miclaus 
350bb12606SAntoniu Miclaus /* AD7293 Register Map Page 0x0 */
360bb12606SAntoniu Miclaus #define AD7293_REG_VIN0				(AD7293_R2B | AD7293_PAGE(0x0) | 0x10)
370bb12606SAntoniu Miclaus #define AD7293_REG_VIN1				(AD7293_R2B | AD7293_PAGE(0x0) | 0x11)
380bb12606SAntoniu Miclaus #define AD7293_REG_VIN2				(AD7293_R2B | AD7293_PAGE(0x0) | 0x12)
390bb12606SAntoniu Miclaus #define AD7293_REG_VIN3				(AD7293_R2B | AD7293_PAGE(0x0) | 0x13)
400bb12606SAntoniu Miclaus #define AD7293_REG_TSENSE_INT			(AD7293_R2B | AD7293_PAGE(0x0) | 0x20)
410bb12606SAntoniu Miclaus #define AD7293_REG_TSENSE_D0			(AD7293_R2B | AD7293_PAGE(0x0) | 0x21)
420bb12606SAntoniu Miclaus #define AD7293_REG_TSENSE_D1			(AD7293_R2B | AD7293_PAGE(0x0) | 0x22)
430bb12606SAntoniu Miclaus #define AD7293_REG_ISENSE_0			(AD7293_R2B | AD7293_PAGE(0x0) | 0x28)
440bb12606SAntoniu Miclaus #define AD7293_REG_ISENSE_1			(AD7293_R2B | AD7293_PAGE(0x0) | 0x29)
450bb12606SAntoniu Miclaus #define AD7293_REG_ISENSE_2			(AD7293_R2B | AD7293_PAGE(0x0) | 0x2A)
460bb12606SAntoniu Miclaus #define AD7293_REG_ISENSE_3			(AD7293_R2B | AD7293_PAGE(0x0) | 0x2B)
470bb12606SAntoniu Miclaus #define AD7293_REG_UNI_VOUT0			(AD7293_R2B | AD7293_PAGE(0x0) | 0x30)
480bb12606SAntoniu Miclaus #define AD7293_REG_UNI_VOUT1			(AD7293_R2B | AD7293_PAGE(0x0) | 0x31)
490bb12606SAntoniu Miclaus #define AD7293_REG_UNI_VOUT2			(AD7293_R2B | AD7293_PAGE(0x0) | 0x32)
500bb12606SAntoniu Miclaus #define AD7293_REG_UNI_VOUT3			(AD7293_R2B | AD7293_PAGE(0x0) | 0x33)
510bb12606SAntoniu Miclaus #define AD7293_REG_BI_VOUT0			(AD7293_R2B | AD7293_PAGE(0x0) | 0x34)
520bb12606SAntoniu Miclaus #define AD7293_REG_BI_VOUT1			(AD7293_R2B | AD7293_PAGE(0x0) | 0x35)
530bb12606SAntoniu Miclaus #define AD7293_REG_BI_VOUT2			(AD7293_R2B | AD7293_PAGE(0x0) | 0x36)
540bb12606SAntoniu Miclaus #define AD7293_REG_BI_VOUT3			(AD7293_R2B | AD7293_PAGE(0x0) | 0x37)
550bb12606SAntoniu Miclaus 
560bb12606SAntoniu Miclaus /* AD7293 Register Map Page 0x2 */
570bb12606SAntoniu Miclaus #define AD7293_REG_DIGITAL_OUT_EN		(AD7293_R2B | AD7293_PAGE(0x2) | 0x11)
580bb12606SAntoniu Miclaus #define AD7293_REG_DIGITAL_INOUT_FUNC		(AD7293_R2B | AD7293_PAGE(0x2) | 0x12)
590bb12606SAntoniu Miclaus #define AD7293_REG_DIGITAL_FUNC_POL		(AD7293_R2B | AD7293_PAGE(0x2) | 0x13)
600bb12606SAntoniu Miclaus #define AD7293_REG_GENERAL			(AD7293_R2B | AD7293_PAGE(0x2) | 0x14)
610bb12606SAntoniu Miclaus #define AD7293_REG_VINX_RANGE0			(AD7293_R2B | AD7293_PAGE(0x2) | 0x15)
620bb12606SAntoniu Miclaus #define AD7293_REG_VINX_RANGE1			(AD7293_R2B | AD7293_PAGE(0x2) | 0x16)
630bb12606SAntoniu Miclaus #define AD7293_REG_VINX_DIFF_SE			(AD7293_R2B | AD7293_PAGE(0x2) | 0x17)
640bb12606SAntoniu Miclaus #define AD7293_REG_VINX_FILTER			(AD7293_R2B | AD7293_PAGE(0x2) | 0x18)
650bb12606SAntoniu Miclaus #define AD7293_REG_BG_EN			(AD7293_R2B | AD7293_PAGE(0x2) | 0x19)
660bb12606SAntoniu Miclaus #define AD7293_REG_CONV_DELAY			(AD7293_R2B | AD7293_PAGE(0x2) | 0x1A)
670bb12606SAntoniu Miclaus #define AD7293_REG_TSENSE_BG_EN			(AD7293_R2B | AD7293_PAGE(0x2) | 0x1B)
680bb12606SAntoniu Miclaus #define AD7293_REG_ISENSE_BG_EN			(AD7293_R2B | AD7293_PAGE(0x2) | 0x1C)
690bb12606SAntoniu Miclaus #define AD7293_REG_ISENSE_GAIN			(AD7293_R2B | AD7293_PAGE(0x2) | 0x1D)
700bb12606SAntoniu Miclaus #define AD7293_REG_DAC_SNOOZE_O			(AD7293_R2B | AD7293_PAGE(0x2) | 0x1F)
710bb12606SAntoniu Miclaus #define AD7293_REG_DAC_SNOOZE_1			(AD7293_R2B | AD7293_PAGE(0x2) | 0x20)
720bb12606SAntoniu Miclaus #define AD7293_REG_RSX_MON_BG_EN		(AD7293_R2B | AD7293_PAGE(0x2) | 0x23)
730bb12606SAntoniu Miclaus #define AD7293_REG_INTEGR_CL			(AD7293_R2B | AD7293_PAGE(0x2) | 0x28)
740bb12606SAntoniu Miclaus #define AD7293_REG_PA_ON_CTRL			(AD7293_R2B | AD7293_PAGE(0x2) | 0x29)
750bb12606SAntoniu Miclaus #define AD7293_REG_RAMP_TIME_0			(AD7293_R2B | AD7293_PAGE(0x2) | 0x2A)
760bb12606SAntoniu Miclaus #define AD7293_REG_RAMP_TIME_1			(AD7293_R2B | AD7293_PAGE(0x2) | 0x2B)
770bb12606SAntoniu Miclaus #define AD7293_REG_RAMP_TIME_2			(AD7293_R2B | AD7293_PAGE(0x2) | 0x2C)
780bb12606SAntoniu Miclaus #define AD7293_REG_RAMP_TIME_3			(AD7293_R2B | AD7293_PAGE(0x2) | 0x2D)
790bb12606SAntoniu Miclaus #define AD7293_REG_CL_FR_IT			(AD7293_R2B | AD7293_PAGE(0x2) | 0x2E)
800bb12606SAntoniu Miclaus #define AD7293_REG_INTX_AVSS_AVDD		(AD7293_R2B | AD7293_PAGE(0x2) | 0x2F)
810bb12606SAntoniu Miclaus 
820bb12606SAntoniu Miclaus /* AD7293 Register Map Page 0x3 */
830bb12606SAntoniu Miclaus #define AD7293_REG_VINX_SEQ			(AD7293_R2B | AD7293_PAGE(0x3) | 0x10)
840bb12606SAntoniu Miclaus #define AD7293_REG_ISENSEX_TSENSEX_SEQ		(AD7293_R2B | AD7293_PAGE(0x3) | 0x11)
850bb12606SAntoniu Miclaus #define AD7293_REG_RSX_MON_BI_VOUTX_SEQ		(AD7293_R2B | AD7293_PAGE(0x3) | 0x12)
860bb12606SAntoniu Miclaus 
870bb12606SAntoniu Miclaus /* AD7293 Register Map Page 0xE */
880bb12606SAntoniu Miclaus #define AD7293_REG_VIN0_OFFSET			(AD7293_R1B | AD7293_PAGE(0xE) | 0x10)
890bb12606SAntoniu Miclaus #define AD7293_REG_VIN1_OFFSET			(AD7293_R1B | AD7293_PAGE(0xE) | 0x11)
900bb12606SAntoniu Miclaus #define AD7293_REG_VIN2_OFFSET			(AD7293_R1B | AD7293_PAGE(0xE) | 0x12)
910bb12606SAntoniu Miclaus #define AD7293_REG_VIN3_OFFSET			(AD7293_R1B | AD7293_PAGE(0xE) | 0x13)
920bb12606SAntoniu Miclaus #define AD7293_REG_TSENSE_INT_OFFSET		(AD7293_R1B | AD7293_PAGE(0xE) | 0x20)
930bb12606SAntoniu Miclaus #define AD7293_REG_TSENSE_D0_OFFSET		(AD7293_R1B | AD7293_PAGE(0xE) | 0x21)
940bb12606SAntoniu Miclaus #define AD7293_REG_TSENSE_D1_OFFSET		(AD7293_R1B | AD7293_PAGE(0xE) | 0x22)
950bb12606SAntoniu Miclaus #define AD7293_REG_ISENSE0_OFFSET		(AD7293_R1B | AD7293_PAGE(0xE) | 0x28)
960bb12606SAntoniu Miclaus #define AD7293_REG_ISENSE1_OFFSET		(AD7293_R1B | AD7293_PAGE(0xE) | 0x29)
970bb12606SAntoniu Miclaus #define AD7293_REG_ISENSE2_OFFSET		(AD7293_R1B | AD7293_PAGE(0xE) | 0x2A)
980bb12606SAntoniu Miclaus #define AD7293_REG_ISENSE3_OFFSET		(AD7293_R1B | AD7293_PAGE(0xE) | 0x2B)
990bb12606SAntoniu Miclaus #define AD7293_REG_UNI_VOUT0_OFFSET		(AD7293_R1B | AD7293_PAGE(0xE) | 0x30)
1000bb12606SAntoniu Miclaus #define AD7293_REG_UNI_VOUT1_OFFSET		(AD7293_R1B | AD7293_PAGE(0xE) | 0x31)
1010bb12606SAntoniu Miclaus #define AD7293_REG_UNI_VOUT2_OFFSET		(AD7293_R1B | AD7293_PAGE(0xE) | 0x32)
1020bb12606SAntoniu Miclaus #define AD7293_REG_UNI_VOUT3_OFFSET		(AD7293_R1B | AD7293_PAGE(0xE) | 0x33)
1030bb12606SAntoniu Miclaus #define AD7293_REG_BI_VOUT0_OFFSET		(AD7293_R1B | AD7293_PAGE(0xE) | 0x34)
1040bb12606SAntoniu Miclaus #define AD7293_REG_BI_VOUT1_OFFSET		(AD7293_R1B | AD7293_PAGE(0xE) | 0x35)
1050bb12606SAntoniu Miclaus #define AD7293_REG_BI_VOUT2_OFFSET		(AD7293_R1B | AD7293_PAGE(0xE) | 0x36)
1060bb12606SAntoniu Miclaus #define AD7293_REG_BI_VOUT3_OFFSET		(AD7293_R1B | AD7293_PAGE(0xE) | 0x37)
1070bb12606SAntoniu Miclaus 
1080bb12606SAntoniu Miclaus /* AD7293 Miscellaneous Definitions */
1090bb12606SAntoniu Miclaus #define AD7293_READ				BIT(7)
1100bb12606SAntoniu Miclaus #define AD7293_TRANSF_LEN_MSK			GENMASK(17, 16)
1110bb12606SAntoniu Miclaus 
1120bb12606SAntoniu Miclaus #define AD7293_REG_ADDR_MSK			GENMASK(7, 0)
1130bb12606SAntoniu Miclaus #define AD7293_REG_VOUT_OFFSET_MSK		GENMASK(5, 4)
1140bb12606SAntoniu Miclaus #define AD7293_REG_DATA_RAW_MSK			GENMASK(15, 4)
1150bb12606SAntoniu Miclaus #define AD7293_REG_VINX_RANGE_GET_CH_MSK(x, ch)	(((x) >> (ch)) & 0x1)
1160bb12606SAntoniu Miclaus #define AD7293_REG_VINX_RANGE_SET_CH_MSK(x, ch)	(((x) & 0x1) << (ch))
1170bb12606SAntoniu Miclaus #define AD7293_CHIP_ID				0x18
1180bb12606SAntoniu Miclaus 
1190bb12606SAntoniu Miclaus enum ad7293_ch_type {
1200bb12606SAntoniu Miclaus 	AD7293_ADC_VINX,
1210bb12606SAntoniu Miclaus 	AD7293_ADC_TSENSE,
1220bb12606SAntoniu Miclaus 	AD7293_ADC_ISENSE,
1230bb12606SAntoniu Miclaus 	AD7293_DAC,
1240bb12606SAntoniu Miclaus };
1250bb12606SAntoniu Miclaus 
1260bb12606SAntoniu Miclaus enum ad7293_max_offset {
1270bb12606SAntoniu Miclaus 	AD7293_TSENSE_MIN_OFFSET_CH = 4,
1280bb12606SAntoniu Miclaus 	AD7293_ISENSE_MIN_OFFSET_CH = 7,
1290bb12606SAntoniu Miclaus 	AD7293_VOUT_MIN_OFFSET_CH = 11,
1300bb12606SAntoniu Miclaus 	AD7293_VOUT_MAX_OFFSET_CH = 18,
1310bb12606SAntoniu Miclaus };
1320bb12606SAntoniu Miclaus 
1330bb12606SAntoniu Miclaus static const int dac_offset_table[] = {0, 1, 2};
1340bb12606SAntoniu Miclaus 
1350bb12606SAntoniu Miclaus static const int isense_gain_table[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
1360bb12606SAntoniu Miclaus 
1370bb12606SAntoniu Miclaus static const int adc_range_table[] = {0, 1, 2, 3};
1380bb12606SAntoniu Miclaus 
1390bb12606SAntoniu Miclaus struct ad7293_state {
1400bb12606SAntoniu Miclaus 	struct spi_device *spi;
1410bb12606SAntoniu Miclaus 	/* Protect against concurrent accesses to the device, page selection and data content */
1420bb12606SAntoniu Miclaus 	struct mutex lock;
1430bb12606SAntoniu Miclaus 	struct gpio_desc *gpio_reset;
1440bb12606SAntoniu Miclaus 	struct regulator *reg_avdd;
1450bb12606SAntoniu Miclaus 	struct regulator *reg_vdrive;
1460bb12606SAntoniu Miclaus 	u8 page_select;
147*8482468bSJonathan Cameron 	u8 data[3] __aligned(IIO_DMA_MINALIGN);
1480bb12606SAntoniu Miclaus };
1490bb12606SAntoniu Miclaus 
ad7293_page_select(struct ad7293_state * st,unsigned int reg)1500bb12606SAntoniu Miclaus static int ad7293_page_select(struct ad7293_state *st, unsigned int reg)
1510bb12606SAntoniu Miclaus {
1520bb12606SAntoniu Miclaus 	int ret;
1530bb12606SAntoniu Miclaus 
1540bb12606SAntoniu Miclaus 	if (st->page_select != FIELD_GET(AD7293_PAGE_ADDR_MSK, reg)) {
1550bb12606SAntoniu Miclaus 		st->data[0] = FIELD_GET(AD7293_REG_ADDR_MSK, AD7293_REG_PAGE_SELECT);
1560bb12606SAntoniu Miclaus 		st->data[1] = FIELD_GET(AD7293_PAGE_ADDR_MSK, reg);
1570bb12606SAntoniu Miclaus 
1580bb12606SAntoniu Miclaus 		ret = spi_write(st->spi, &st->data[0], 2);
1590bb12606SAntoniu Miclaus 		if (ret)
1600bb12606SAntoniu Miclaus 			return ret;
1610bb12606SAntoniu Miclaus 
1620bb12606SAntoniu Miclaus 		st->page_select = FIELD_GET(AD7293_PAGE_ADDR_MSK, reg);
1630bb12606SAntoniu Miclaus 	}
1640bb12606SAntoniu Miclaus 
1650bb12606SAntoniu Miclaus 	return 0;
1660bb12606SAntoniu Miclaus }
1670bb12606SAntoniu Miclaus 
__ad7293_spi_read(struct ad7293_state * st,unsigned int reg,u16 * val)1680bb12606SAntoniu Miclaus static int __ad7293_spi_read(struct ad7293_state *st, unsigned int reg,
1690bb12606SAntoniu Miclaus 			     u16 *val)
1700bb12606SAntoniu Miclaus {
1710bb12606SAntoniu Miclaus 	int ret;
1720bb12606SAntoniu Miclaus 	unsigned int length;
1730bb12606SAntoniu Miclaus 	struct spi_transfer t = {0};
1740bb12606SAntoniu Miclaus 
1750bb12606SAntoniu Miclaus 	length = FIELD_GET(AD7293_TRANSF_LEN_MSK, reg);
1760bb12606SAntoniu Miclaus 
1770bb12606SAntoniu Miclaus 	ret = ad7293_page_select(st, reg);
1780bb12606SAntoniu Miclaus 	if (ret)
1790bb12606SAntoniu Miclaus 		return ret;
1800bb12606SAntoniu Miclaus 
1810bb12606SAntoniu Miclaus 	st->data[0] = AD7293_READ | FIELD_GET(AD7293_REG_ADDR_MSK, reg);
1820bb12606SAntoniu Miclaus 	st->data[1] = 0x0;
1830bb12606SAntoniu Miclaus 	st->data[2] = 0x0;
1840bb12606SAntoniu Miclaus 
1850bb12606SAntoniu Miclaus 	t.tx_buf = &st->data[0];
1860bb12606SAntoniu Miclaus 	t.rx_buf = &st->data[0];
1870bb12606SAntoniu Miclaus 	t.len = length + 1;
1880bb12606SAntoniu Miclaus 
1890bb12606SAntoniu Miclaus 	ret = spi_sync_transfer(st->spi, &t, 1);
1900bb12606SAntoniu Miclaus 	if (ret)
1910bb12606SAntoniu Miclaus 		return ret;
1920bb12606SAntoniu Miclaus 
1930bb12606SAntoniu Miclaus 	if (length == 1)
1940bb12606SAntoniu Miclaus 		*val = st->data[1];
1950bb12606SAntoniu Miclaus 	else
1960bb12606SAntoniu Miclaus 		*val = get_unaligned_be16(&st->data[1]);
1970bb12606SAntoniu Miclaus 
1980bb12606SAntoniu Miclaus 	return 0;
1990bb12606SAntoniu Miclaus }
2000bb12606SAntoniu Miclaus 
ad7293_spi_read(struct ad7293_state * st,unsigned int reg,u16 * val)2010bb12606SAntoniu Miclaus static int ad7293_spi_read(struct ad7293_state *st, unsigned int reg,
2020bb12606SAntoniu Miclaus 			   u16 *val)
2030bb12606SAntoniu Miclaus {
2040bb12606SAntoniu Miclaus 	int ret;
2050bb12606SAntoniu Miclaus 
2060bb12606SAntoniu Miclaus 	mutex_lock(&st->lock);
2070bb12606SAntoniu Miclaus 	ret = __ad7293_spi_read(st, reg, val);
2080bb12606SAntoniu Miclaus 	mutex_unlock(&st->lock);
2090bb12606SAntoniu Miclaus 
2100bb12606SAntoniu Miclaus 	return ret;
2110bb12606SAntoniu Miclaus }
2120bb12606SAntoniu Miclaus 
__ad7293_spi_write(struct ad7293_state * st,unsigned int reg,u16 val)2130bb12606SAntoniu Miclaus static int __ad7293_spi_write(struct ad7293_state *st, unsigned int reg,
2140bb12606SAntoniu Miclaus 			      u16 val)
2150bb12606SAntoniu Miclaus {
2160bb12606SAntoniu Miclaus 	int ret;
2170bb12606SAntoniu Miclaus 	unsigned int length;
2180bb12606SAntoniu Miclaus 
2190bb12606SAntoniu Miclaus 	length = FIELD_GET(AD7293_TRANSF_LEN_MSK, reg);
2200bb12606SAntoniu Miclaus 
2210bb12606SAntoniu Miclaus 	ret = ad7293_page_select(st, reg);
2220bb12606SAntoniu Miclaus 	if (ret)
2230bb12606SAntoniu Miclaus 		return ret;
2240bb12606SAntoniu Miclaus 
2250bb12606SAntoniu Miclaus 	st->data[0] = FIELD_GET(AD7293_REG_ADDR_MSK, reg);
2260bb12606SAntoniu Miclaus 
2270bb12606SAntoniu Miclaus 	if (length == 1)
2280bb12606SAntoniu Miclaus 		st->data[1] = val;
2290bb12606SAntoniu Miclaus 	else
2300bb12606SAntoniu Miclaus 		put_unaligned_be16(val, &st->data[1]);
2310bb12606SAntoniu Miclaus 
2320bb12606SAntoniu Miclaus 	return spi_write(st->spi, &st->data[0], length + 1);
2330bb12606SAntoniu Miclaus }
2340bb12606SAntoniu Miclaus 
ad7293_spi_write(struct ad7293_state * st,unsigned int reg,u16 val)2350bb12606SAntoniu Miclaus static int ad7293_spi_write(struct ad7293_state *st, unsigned int reg,
2360bb12606SAntoniu Miclaus 			    u16 val)
2370bb12606SAntoniu Miclaus {
2380bb12606SAntoniu Miclaus 	int ret;
2390bb12606SAntoniu Miclaus 
2400bb12606SAntoniu Miclaus 	mutex_lock(&st->lock);
2410bb12606SAntoniu Miclaus 	ret = __ad7293_spi_write(st, reg, val);
2420bb12606SAntoniu Miclaus 	mutex_unlock(&st->lock);
2430bb12606SAntoniu Miclaus 
2440bb12606SAntoniu Miclaus 	return ret;
2450bb12606SAntoniu Miclaus }
2460bb12606SAntoniu Miclaus 
__ad7293_spi_update_bits(struct ad7293_state * st,unsigned int reg,u16 mask,u16 val)2470bb12606SAntoniu Miclaus static int __ad7293_spi_update_bits(struct ad7293_state *st, unsigned int reg,
2480bb12606SAntoniu Miclaus 				    u16 mask, u16 val)
2490bb12606SAntoniu Miclaus {
2500bb12606SAntoniu Miclaus 	int ret;
2510bb12606SAntoniu Miclaus 	u16 data, temp;
2520bb12606SAntoniu Miclaus 
2530bb12606SAntoniu Miclaus 	ret = __ad7293_spi_read(st, reg, &data);
2540bb12606SAntoniu Miclaus 	if (ret)
2550bb12606SAntoniu Miclaus 		return ret;
2560bb12606SAntoniu Miclaus 
2570bb12606SAntoniu Miclaus 	temp = (data & ~mask) | (val & mask);
2580bb12606SAntoniu Miclaus 
2590bb12606SAntoniu Miclaus 	return __ad7293_spi_write(st, reg, temp);
2600bb12606SAntoniu Miclaus }
2610bb12606SAntoniu Miclaus 
ad7293_spi_update_bits(struct ad7293_state * st,unsigned int reg,u16 mask,u16 val)2620bb12606SAntoniu Miclaus static int ad7293_spi_update_bits(struct ad7293_state *st, unsigned int reg,
2630bb12606SAntoniu Miclaus 				  u16 mask, u16 val)
2640bb12606SAntoniu Miclaus {
2650bb12606SAntoniu Miclaus 	int ret;
2660bb12606SAntoniu Miclaus 
2670bb12606SAntoniu Miclaus 	mutex_lock(&st->lock);
2680bb12606SAntoniu Miclaus 	ret = __ad7293_spi_update_bits(st, reg, mask, val);
2690bb12606SAntoniu Miclaus 	mutex_unlock(&st->lock);
2700bb12606SAntoniu Miclaus 
2710bb12606SAntoniu Miclaus 	return ret;
2720bb12606SAntoniu Miclaus }
2730bb12606SAntoniu Miclaus 
ad7293_adc_get_scale(struct ad7293_state * st,unsigned int ch,u16 * range)2740bb12606SAntoniu Miclaus static int ad7293_adc_get_scale(struct ad7293_state *st, unsigned int ch,
2750bb12606SAntoniu Miclaus 				u16 *range)
2760bb12606SAntoniu Miclaus {
2770bb12606SAntoniu Miclaus 	int ret;
2780bb12606SAntoniu Miclaus 	u16 data;
2790bb12606SAntoniu Miclaus 
2800bb12606SAntoniu Miclaus 	mutex_lock(&st->lock);
2810bb12606SAntoniu Miclaus 
2820bb12606SAntoniu Miclaus 	ret = __ad7293_spi_read(st, AD7293_REG_VINX_RANGE1, &data);
2830bb12606SAntoniu Miclaus 	if (ret)
2840bb12606SAntoniu Miclaus 		goto exit;
2850bb12606SAntoniu Miclaus 
2860bb12606SAntoniu Miclaus 	*range = AD7293_REG_VINX_RANGE_GET_CH_MSK(data, ch);
2870bb12606SAntoniu Miclaus 
2880bb12606SAntoniu Miclaus 	ret = __ad7293_spi_read(st, AD7293_REG_VINX_RANGE0, &data);
2890bb12606SAntoniu Miclaus 	if (ret)
2900bb12606SAntoniu Miclaus 		goto exit;
2910bb12606SAntoniu Miclaus 
2920bb12606SAntoniu Miclaus 	*range |= AD7293_REG_VINX_RANGE_GET_CH_MSK(data, ch) << 1;
2930bb12606SAntoniu Miclaus 
2940bb12606SAntoniu Miclaus exit:
2950bb12606SAntoniu Miclaus 	mutex_unlock(&st->lock);
2960bb12606SAntoniu Miclaus 
2970bb12606SAntoniu Miclaus 	return ret;
2980bb12606SAntoniu Miclaus }
2990bb12606SAntoniu Miclaus 
ad7293_adc_set_scale(struct ad7293_state * st,unsigned int ch,u16 range)3000bb12606SAntoniu Miclaus static int ad7293_adc_set_scale(struct ad7293_state *st, unsigned int ch,
3010bb12606SAntoniu Miclaus 				u16 range)
3020bb12606SAntoniu Miclaus {
3030bb12606SAntoniu Miclaus 	int ret;
3040bb12606SAntoniu Miclaus 	unsigned int ch_msk = BIT(ch);
3050bb12606SAntoniu Miclaus 
3060bb12606SAntoniu Miclaus 	mutex_lock(&st->lock);
3070bb12606SAntoniu Miclaus 	ret = __ad7293_spi_update_bits(st, AD7293_REG_VINX_RANGE1, ch_msk,
3080bb12606SAntoniu Miclaus 				       AD7293_REG_VINX_RANGE_SET_CH_MSK(range, ch));
3090bb12606SAntoniu Miclaus 	if (ret)
3100bb12606SAntoniu Miclaus 		goto exit;
3110bb12606SAntoniu Miclaus 
3120bb12606SAntoniu Miclaus 	ret = __ad7293_spi_update_bits(st, AD7293_REG_VINX_RANGE0, ch_msk,
3130bb12606SAntoniu Miclaus 				       AD7293_REG_VINX_RANGE_SET_CH_MSK((range >> 1), ch));
3140bb12606SAntoniu Miclaus 
3150bb12606SAntoniu Miclaus exit:
3160bb12606SAntoniu Miclaus 	mutex_unlock(&st->lock);
3170bb12606SAntoniu Miclaus 
3180bb12606SAntoniu Miclaus 	return ret;
3190bb12606SAntoniu Miclaus }
3200bb12606SAntoniu Miclaus 
ad7293_get_offset(struct ad7293_state * st,unsigned int ch,u16 * offset)3210bb12606SAntoniu Miclaus static int ad7293_get_offset(struct ad7293_state *st, unsigned int ch,
3220bb12606SAntoniu Miclaus 			     u16 *offset)
3230bb12606SAntoniu Miclaus {
3240bb12606SAntoniu Miclaus 	if (ch < AD7293_TSENSE_MIN_OFFSET_CH)
3250bb12606SAntoniu Miclaus 		return ad7293_spi_read(st, AD7293_REG_VIN0_OFFSET + ch, offset);
3260bb12606SAntoniu Miclaus 	else if (ch < AD7293_ISENSE_MIN_OFFSET_CH)
3270bb12606SAntoniu Miclaus 		return ad7293_spi_read(st, AD7293_REG_TSENSE_INT_OFFSET + (ch - 4), offset);
3280bb12606SAntoniu Miclaus 	else if (ch < AD7293_VOUT_MIN_OFFSET_CH)
3290bb12606SAntoniu Miclaus 		return ad7293_spi_read(st, AD7293_REG_ISENSE0_OFFSET + (ch - 7), offset);
3300bb12606SAntoniu Miclaus 	else if (ch <= AD7293_VOUT_MAX_OFFSET_CH)
3310bb12606SAntoniu Miclaus 		return ad7293_spi_read(st, AD7293_REG_UNI_VOUT0_OFFSET + (ch - 11), offset);
3320bb12606SAntoniu Miclaus 
3330bb12606SAntoniu Miclaus 	return -EINVAL;
3340bb12606SAntoniu Miclaus }
3350bb12606SAntoniu Miclaus 
ad7293_set_offset(struct ad7293_state * st,unsigned int ch,u16 offset)3360bb12606SAntoniu Miclaus static int ad7293_set_offset(struct ad7293_state *st, unsigned int ch,
3370bb12606SAntoniu Miclaus 			     u16 offset)
3380bb12606SAntoniu Miclaus {
3390bb12606SAntoniu Miclaus 	if (ch < AD7293_TSENSE_MIN_OFFSET_CH)
3400bb12606SAntoniu Miclaus 		return ad7293_spi_write(st, AD7293_REG_VIN0_OFFSET + ch,
3410bb12606SAntoniu Miclaus 					offset);
3420bb12606SAntoniu Miclaus 	else if (ch < AD7293_ISENSE_MIN_OFFSET_CH)
3430bb12606SAntoniu Miclaus 		return ad7293_spi_write(st,
3440bb12606SAntoniu Miclaus 					AD7293_REG_TSENSE_INT_OFFSET +
3450bb12606SAntoniu Miclaus 					(ch - AD7293_TSENSE_MIN_OFFSET_CH),
3460bb12606SAntoniu Miclaus 					offset);
3470bb12606SAntoniu Miclaus 	else if (ch < AD7293_VOUT_MIN_OFFSET_CH)
3480bb12606SAntoniu Miclaus 		return ad7293_spi_write(st,
3490bb12606SAntoniu Miclaus 					AD7293_REG_ISENSE0_OFFSET +
3500bb12606SAntoniu Miclaus 					(ch - AD7293_ISENSE_MIN_OFFSET_CH),
3510bb12606SAntoniu Miclaus 					offset);
3520bb12606SAntoniu Miclaus 	else if (ch <= AD7293_VOUT_MAX_OFFSET_CH)
3530bb12606SAntoniu Miclaus 		return ad7293_spi_update_bits(st,
3540bb12606SAntoniu Miclaus 					      AD7293_REG_UNI_VOUT0_OFFSET +
3550bb12606SAntoniu Miclaus 					      (ch - AD7293_VOUT_MIN_OFFSET_CH),
3560bb12606SAntoniu Miclaus 					      AD7293_REG_VOUT_OFFSET_MSK,
3570bb12606SAntoniu Miclaus 					      FIELD_PREP(AD7293_REG_VOUT_OFFSET_MSK, offset));
3580bb12606SAntoniu Miclaus 
3590bb12606SAntoniu Miclaus 	return -EINVAL;
3600bb12606SAntoniu Miclaus }
3610bb12606SAntoniu Miclaus 
ad7293_isense_set_scale(struct ad7293_state * st,unsigned int ch,u16 gain)3620bb12606SAntoniu Miclaus static int ad7293_isense_set_scale(struct ad7293_state *st, unsigned int ch,
3630bb12606SAntoniu Miclaus 				   u16 gain)
3640bb12606SAntoniu Miclaus {
3650bb12606SAntoniu Miclaus 	unsigned int ch_msk = (0xf << (4 * ch));
3660bb12606SAntoniu Miclaus 
3670bb12606SAntoniu Miclaus 	return ad7293_spi_update_bits(st, AD7293_REG_ISENSE_GAIN, ch_msk,
3680bb12606SAntoniu Miclaus 				      gain << (4 * ch));
3690bb12606SAntoniu Miclaus }
3700bb12606SAntoniu Miclaus 
ad7293_isense_get_scale(struct ad7293_state * st,unsigned int ch,u16 * gain)3710bb12606SAntoniu Miclaus static int ad7293_isense_get_scale(struct ad7293_state *st, unsigned int ch,
3720bb12606SAntoniu Miclaus 				   u16 *gain)
3730bb12606SAntoniu Miclaus {
3740bb12606SAntoniu Miclaus 	int ret;
3750bb12606SAntoniu Miclaus 
3760bb12606SAntoniu Miclaus 	ret = ad7293_spi_read(st, AD7293_REG_ISENSE_GAIN, gain);
3770bb12606SAntoniu Miclaus 	if (ret)
3780bb12606SAntoniu Miclaus 		return ret;
3790bb12606SAntoniu Miclaus 
3800bb12606SAntoniu Miclaus 	*gain = (*gain >> (4 * ch)) & 0xf;
3810bb12606SAntoniu Miclaus 
3820bb12606SAntoniu Miclaus 	return ret;
3830bb12606SAntoniu Miclaus }
3840bb12606SAntoniu Miclaus 
ad7293_dac_write_raw(struct ad7293_state * st,unsigned int ch,u16 raw)3850bb12606SAntoniu Miclaus static int ad7293_dac_write_raw(struct ad7293_state *st, unsigned int ch,
3860bb12606SAntoniu Miclaus 				u16 raw)
3870bb12606SAntoniu Miclaus {
3880bb12606SAntoniu Miclaus 	int ret;
3890bb12606SAntoniu Miclaus 
3900bb12606SAntoniu Miclaus 	mutex_lock(&st->lock);
3910bb12606SAntoniu Miclaus 
3920bb12606SAntoniu Miclaus 	ret = __ad7293_spi_update_bits(st, AD7293_REG_DAC_EN, BIT(ch), BIT(ch));
3930bb12606SAntoniu Miclaus 	if (ret)
3940bb12606SAntoniu Miclaus 		goto exit;
3950bb12606SAntoniu Miclaus 
3960bb12606SAntoniu Miclaus 	ret =  __ad7293_spi_write(st, AD7293_REG_UNI_VOUT0 + ch,
3970bb12606SAntoniu Miclaus 				  FIELD_PREP(AD7293_REG_DATA_RAW_MSK, raw));
3980bb12606SAntoniu Miclaus 
3990bb12606SAntoniu Miclaus exit:
4000bb12606SAntoniu Miclaus 	mutex_unlock(&st->lock);
4010bb12606SAntoniu Miclaus 
4020bb12606SAntoniu Miclaus 	return ret;
4030bb12606SAntoniu Miclaus }
4040bb12606SAntoniu Miclaus 
ad7293_ch_read_raw(struct ad7293_state * st,enum ad7293_ch_type type,unsigned int ch,u16 * raw)4050bb12606SAntoniu Miclaus static int ad7293_ch_read_raw(struct ad7293_state *st, enum ad7293_ch_type type,
4060bb12606SAntoniu Miclaus 			      unsigned int ch, u16 *raw)
4070bb12606SAntoniu Miclaus {
4080bb12606SAntoniu Miclaus 	int ret;
4090bb12606SAntoniu Miclaus 	unsigned int reg_wr, reg_rd, data_wr;
4100bb12606SAntoniu Miclaus 
4110bb12606SAntoniu Miclaus 	switch (type) {
4120bb12606SAntoniu Miclaus 	case AD7293_ADC_VINX:
4130bb12606SAntoniu Miclaus 		reg_wr = AD7293_REG_VINX_SEQ;
4140bb12606SAntoniu Miclaus 		reg_rd = AD7293_REG_VIN0 + ch;
4150bb12606SAntoniu Miclaus 		data_wr = BIT(ch);
4160bb12606SAntoniu Miclaus 
4170bb12606SAntoniu Miclaus 		break;
4180bb12606SAntoniu Miclaus 	case AD7293_ADC_TSENSE:
4190bb12606SAntoniu Miclaus 		reg_wr = AD7293_REG_ISENSEX_TSENSEX_SEQ;
4200bb12606SAntoniu Miclaus 		reg_rd = AD7293_REG_TSENSE_INT + ch;
4210bb12606SAntoniu Miclaus 		data_wr = BIT(ch);
4220bb12606SAntoniu Miclaus 
4230bb12606SAntoniu Miclaus 		break;
4240bb12606SAntoniu Miclaus 	case AD7293_ADC_ISENSE:
4250bb12606SAntoniu Miclaus 		reg_wr = AD7293_REG_ISENSEX_TSENSEX_SEQ;
4260bb12606SAntoniu Miclaus 		reg_rd = AD7293_REG_ISENSE_0 + ch;
4270bb12606SAntoniu Miclaus 		data_wr = BIT(ch) << 8;
4280bb12606SAntoniu Miclaus 
4290bb12606SAntoniu Miclaus 		break;
4300bb12606SAntoniu Miclaus 	case AD7293_DAC:
4310bb12606SAntoniu Miclaus 		reg_rd = AD7293_REG_UNI_VOUT0 + ch;
4320bb12606SAntoniu Miclaus 
4330bb12606SAntoniu Miclaus 		break;
4340bb12606SAntoniu Miclaus 	default:
4350bb12606SAntoniu Miclaus 		return -EINVAL;
4360bb12606SAntoniu Miclaus 	}
4370bb12606SAntoniu Miclaus 
4380bb12606SAntoniu Miclaus 	mutex_lock(&st->lock);
4390bb12606SAntoniu Miclaus 
4400bb12606SAntoniu Miclaus 	if (type != AD7293_DAC) {
4410bb12606SAntoniu Miclaus 		if (type == AD7293_ADC_TSENSE) {
4420bb12606SAntoniu Miclaus 			ret = __ad7293_spi_write(st, AD7293_REG_TSENSE_BG_EN,
4430bb12606SAntoniu Miclaus 						 BIT(ch));
4440bb12606SAntoniu Miclaus 			if (ret)
4450bb12606SAntoniu Miclaus 				goto exit;
4460bb12606SAntoniu Miclaus 
4470bb12606SAntoniu Miclaus 			usleep_range(9000, 9900);
4480bb12606SAntoniu Miclaus 		} else if (type == AD7293_ADC_ISENSE) {
4490bb12606SAntoniu Miclaus 			ret = __ad7293_spi_write(st, AD7293_REG_ISENSE_BG_EN,
4500bb12606SAntoniu Miclaus 						 BIT(ch));
4510bb12606SAntoniu Miclaus 			if (ret)
4520bb12606SAntoniu Miclaus 				goto exit;
4530bb12606SAntoniu Miclaus 
4540bb12606SAntoniu Miclaus 			usleep_range(2000, 7000);
4550bb12606SAntoniu Miclaus 		}
4560bb12606SAntoniu Miclaus 
4570bb12606SAntoniu Miclaus 		ret = __ad7293_spi_write(st, reg_wr, data_wr);
4580bb12606SAntoniu Miclaus 		if (ret)
4590bb12606SAntoniu Miclaus 			goto exit;
4600bb12606SAntoniu Miclaus 
4610bb12606SAntoniu Miclaus 		ret = __ad7293_spi_write(st, AD7293_REG_CONV_CMD, 0x82);
4620bb12606SAntoniu Miclaus 		if (ret)
4630bb12606SAntoniu Miclaus 			goto exit;
4640bb12606SAntoniu Miclaus 	}
4650bb12606SAntoniu Miclaus 
4660bb12606SAntoniu Miclaus 	ret = __ad7293_spi_read(st, reg_rd, raw);
4670bb12606SAntoniu Miclaus 
4680bb12606SAntoniu Miclaus 	*raw = FIELD_GET(AD7293_REG_DATA_RAW_MSK, *raw);
4690bb12606SAntoniu Miclaus 
4700bb12606SAntoniu Miclaus exit:
4710bb12606SAntoniu Miclaus 	mutex_unlock(&st->lock);
4720bb12606SAntoniu Miclaus 
4730bb12606SAntoniu Miclaus 	return ret;
4740bb12606SAntoniu Miclaus }
4750bb12606SAntoniu Miclaus 
ad7293_read_raw(struct iio_dev * indio_dev,struct iio_chan_spec const * chan,int * val,int * val2,long info)4760bb12606SAntoniu Miclaus static int ad7293_read_raw(struct iio_dev *indio_dev,
4770bb12606SAntoniu Miclaus 			   struct iio_chan_spec const *chan,
4780bb12606SAntoniu Miclaus 			   int *val, int *val2, long info)
4790bb12606SAntoniu Miclaus {
4800bb12606SAntoniu Miclaus 	struct ad7293_state *st = iio_priv(indio_dev);
4810bb12606SAntoniu Miclaus 	int ret;
4820bb12606SAntoniu Miclaus 	u16 data;
4830bb12606SAntoniu Miclaus 
4840bb12606SAntoniu Miclaus 	switch (info) {
4850bb12606SAntoniu Miclaus 	case IIO_CHAN_INFO_RAW:
4860bb12606SAntoniu Miclaus 		switch (chan->type) {
4870bb12606SAntoniu Miclaus 		case IIO_VOLTAGE:
4880bb12606SAntoniu Miclaus 			if (chan->output)
4890bb12606SAntoniu Miclaus 				ret =  ad7293_ch_read_raw(st, AD7293_DAC,
4900bb12606SAntoniu Miclaus 							  chan->channel, &data);
4910bb12606SAntoniu Miclaus 			else
4920bb12606SAntoniu Miclaus 				ret =  ad7293_ch_read_raw(st, AD7293_ADC_VINX,
4930bb12606SAntoniu Miclaus 							  chan->channel, &data);
4940bb12606SAntoniu Miclaus 
4950bb12606SAntoniu Miclaus 			break;
4960bb12606SAntoniu Miclaus 		case IIO_CURRENT:
4970bb12606SAntoniu Miclaus 			ret =  ad7293_ch_read_raw(st, AD7293_ADC_ISENSE,
4980bb12606SAntoniu Miclaus 						  chan->channel, &data);
4990bb12606SAntoniu Miclaus 
5000bb12606SAntoniu Miclaus 			break;
5010bb12606SAntoniu Miclaus 		case IIO_TEMP:
5020bb12606SAntoniu Miclaus 			ret =  ad7293_ch_read_raw(st, AD7293_ADC_TSENSE,
5030bb12606SAntoniu Miclaus 						  chan->channel, &data);
5040bb12606SAntoniu Miclaus 
5050bb12606SAntoniu Miclaus 			break;
5060bb12606SAntoniu Miclaus 		default:
5070bb12606SAntoniu Miclaus 			return -EINVAL;
5080bb12606SAntoniu Miclaus 		}
5090bb12606SAntoniu Miclaus 
5100bb12606SAntoniu Miclaus 		if (ret)
5110bb12606SAntoniu Miclaus 			return ret;
5120bb12606SAntoniu Miclaus 
5130bb12606SAntoniu Miclaus 		*val = data;
5140bb12606SAntoniu Miclaus 
5150bb12606SAntoniu Miclaus 		return IIO_VAL_INT;
5160bb12606SAntoniu Miclaus 	case IIO_CHAN_INFO_OFFSET:
5170bb12606SAntoniu Miclaus 		switch (chan->type) {
5180bb12606SAntoniu Miclaus 		case IIO_VOLTAGE:
5190bb12606SAntoniu Miclaus 			if (chan->output) {
5200bb12606SAntoniu Miclaus 				ret = ad7293_get_offset(st,
5210bb12606SAntoniu Miclaus 							chan->channel + AD7293_VOUT_MIN_OFFSET_CH,
5220bb12606SAntoniu Miclaus 							&data);
5230bb12606SAntoniu Miclaus 
5240bb12606SAntoniu Miclaus 				data = FIELD_GET(AD7293_REG_VOUT_OFFSET_MSK, data);
5250bb12606SAntoniu Miclaus 			} else {
5260bb12606SAntoniu Miclaus 				ret = ad7293_get_offset(st, chan->channel, &data);
5270bb12606SAntoniu Miclaus 			}
5280bb12606SAntoniu Miclaus 
5290bb12606SAntoniu Miclaus 			break;
5300bb12606SAntoniu Miclaus 		case IIO_CURRENT:
5310bb12606SAntoniu Miclaus 			ret = ad7293_get_offset(st,
5320bb12606SAntoniu Miclaus 						chan->channel + AD7293_ISENSE_MIN_OFFSET_CH,
5330bb12606SAntoniu Miclaus 						&data);
5340bb12606SAntoniu Miclaus 
5350bb12606SAntoniu Miclaus 			break;
5360bb12606SAntoniu Miclaus 		case IIO_TEMP:
5370bb12606SAntoniu Miclaus 			ret = ad7293_get_offset(st,
5380bb12606SAntoniu Miclaus 						chan->channel + AD7293_TSENSE_MIN_OFFSET_CH,
5390bb12606SAntoniu Miclaus 						&data);
5400bb12606SAntoniu Miclaus 
5410bb12606SAntoniu Miclaus 			break;
5420bb12606SAntoniu Miclaus 		default:
5430bb12606SAntoniu Miclaus 			return -EINVAL;
5440bb12606SAntoniu Miclaus 		}
5450bb12606SAntoniu Miclaus 		if (ret)
5460bb12606SAntoniu Miclaus 			return ret;
5470bb12606SAntoniu Miclaus 
5480bb12606SAntoniu Miclaus 		*val = data;
5490bb12606SAntoniu Miclaus 
5500bb12606SAntoniu Miclaus 		return IIO_VAL_INT;
5510bb12606SAntoniu Miclaus 	case IIO_CHAN_INFO_SCALE:
5520bb12606SAntoniu Miclaus 		switch (chan->type) {
5530bb12606SAntoniu Miclaus 		case IIO_VOLTAGE:
5540bb12606SAntoniu Miclaus 			ret = ad7293_adc_get_scale(st, chan->channel, &data);
5550bb12606SAntoniu Miclaus 			if (ret)
5560bb12606SAntoniu Miclaus 				return ret;
5570bb12606SAntoniu Miclaus 
5580bb12606SAntoniu Miclaus 			*val = data;
5590bb12606SAntoniu Miclaus 
5600bb12606SAntoniu Miclaus 			return IIO_VAL_INT;
5610bb12606SAntoniu Miclaus 		case IIO_CURRENT:
5620bb12606SAntoniu Miclaus 			ret = ad7293_isense_get_scale(st, chan->channel, &data);
5630bb12606SAntoniu Miclaus 			if (ret)
5640bb12606SAntoniu Miclaus 				return ret;
5650bb12606SAntoniu Miclaus 
5660bb12606SAntoniu Miclaus 			*val = data;
5670bb12606SAntoniu Miclaus 
5680bb12606SAntoniu Miclaus 			return IIO_VAL_INT;
5690bb12606SAntoniu Miclaus 		case IIO_TEMP:
5700bb12606SAntoniu Miclaus 			*val = 1;
5710bb12606SAntoniu Miclaus 			*val2 = 8;
5720bb12606SAntoniu Miclaus 
5730bb12606SAntoniu Miclaus 			return IIO_VAL_FRACTIONAL;
5740bb12606SAntoniu Miclaus 		default:
5750bb12606SAntoniu Miclaus 			return -EINVAL;
5760bb12606SAntoniu Miclaus 		}
5770bb12606SAntoniu Miclaus 	default:
5780bb12606SAntoniu Miclaus 		return -EINVAL;
5790bb12606SAntoniu Miclaus 	}
5800bb12606SAntoniu Miclaus }
5810bb12606SAntoniu Miclaus 
ad7293_write_raw(struct iio_dev * indio_dev,struct iio_chan_spec const * chan,int val,int val2,long info)5820bb12606SAntoniu Miclaus static int ad7293_write_raw(struct iio_dev *indio_dev,
5830bb12606SAntoniu Miclaus 			    struct iio_chan_spec const *chan,
5840bb12606SAntoniu Miclaus 			    int val, int val2, long info)
5850bb12606SAntoniu Miclaus {
5860bb12606SAntoniu Miclaus 	struct ad7293_state *st = iio_priv(indio_dev);
5870bb12606SAntoniu Miclaus 
5880bb12606SAntoniu Miclaus 	switch (info) {
5890bb12606SAntoniu Miclaus 	case IIO_CHAN_INFO_RAW:
5900bb12606SAntoniu Miclaus 		switch (chan->type) {
5910bb12606SAntoniu Miclaus 		case IIO_VOLTAGE:
5920bb12606SAntoniu Miclaus 			if (!chan->output)
5930bb12606SAntoniu Miclaus 				return -EINVAL;
5940bb12606SAntoniu Miclaus 
5950bb12606SAntoniu Miclaus 			return ad7293_dac_write_raw(st, chan->channel, val);
5960bb12606SAntoniu Miclaus 		default:
5970bb12606SAntoniu Miclaus 			return -EINVAL;
5980bb12606SAntoniu Miclaus 		}
5990bb12606SAntoniu Miclaus 	case IIO_CHAN_INFO_OFFSET:
6000bb12606SAntoniu Miclaus 		switch (chan->type) {
6010bb12606SAntoniu Miclaus 		case IIO_VOLTAGE:
6020bb12606SAntoniu Miclaus 			if (chan->output)
6030bb12606SAntoniu Miclaus 				return ad7293_set_offset(st,
6040bb12606SAntoniu Miclaus 							 chan->channel +
6050bb12606SAntoniu Miclaus 							 AD7293_VOUT_MIN_OFFSET_CH,
6060bb12606SAntoniu Miclaus 							 val);
6070bb12606SAntoniu Miclaus 			else
6080bb12606SAntoniu Miclaus 				return ad7293_set_offset(st, chan->channel, val);
6090bb12606SAntoniu Miclaus 		case IIO_CURRENT:
6100bb12606SAntoniu Miclaus 			return ad7293_set_offset(st,
6110bb12606SAntoniu Miclaus 						 chan->channel +
6120bb12606SAntoniu Miclaus 						 AD7293_ISENSE_MIN_OFFSET_CH,
6130bb12606SAntoniu Miclaus 						 val);
6140bb12606SAntoniu Miclaus 		case IIO_TEMP:
6150bb12606SAntoniu Miclaus 			return ad7293_set_offset(st,
6160bb12606SAntoniu Miclaus 						 chan->channel +
6170bb12606SAntoniu Miclaus 						 AD7293_TSENSE_MIN_OFFSET_CH,
6180bb12606SAntoniu Miclaus 						 val);
6190bb12606SAntoniu Miclaus 		default:
6200bb12606SAntoniu Miclaus 			return -EINVAL;
6210bb12606SAntoniu Miclaus 		}
6220bb12606SAntoniu Miclaus 	case IIO_CHAN_INFO_SCALE:
6230bb12606SAntoniu Miclaus 		switch (chan->type) {
6240bb12606SAntoniu Miclaus 		case IIO_VOLTAGE:
6250bb12606SAntoniu Miclaus 			return ad7293_adc_set_scale(st, chan->channel, val);
6260bb12606SAntoniu Miclaus 		case IIO_CURRENT:
6270bb12606SAntoniu Miclaus 			return ad7293_isense_set_scale(st, chan->channel, val);
6280bb12606SAntoniu Miclaus 		default:
6290bb12606SAntoniu Miclaus 			return -EINVAL;
6300bb12606SAntoniu Miclaus 		}
6310bb12606SAntoniu Miclaus 	default:
6320bb12606SAntoniu Miclaus 		return -EINVAL;
6330bb12606SAntoniu Miclaus 	}
6340bb12606SAntoniu Miclaus }
6350bb12606SAntoniu Miclaus 
ad7293_reg_access(struct iio_dev * indio_dev,unsigned int reg,unsigned int write_val,unsigned int * read_val)6360bb12606SAntoniu Miclaus static int ad7293_reg_access(struct iio_dev *indio_dev,
6370bb12606SAntoniu Miclaus 			     unsigned int reg,
6380bb12606SAntoniu Miclaus 			     unsigned int write_val,
6390bb12606SAntoniu Miclaus 			     unsigned int *read_val)
6400bb12606SAntoniu Miclaus {
6410bb12606SAntoniu Miclaus 	struct ad7293_state *st = iio_priv(indio_dev);
6420bb12606SAntoniu Miclaus 	int ret;
6430bb12606SAntoniu Miclaus 
6440bb12606SAntoniu Miclaus 	if (read_val) {
6450bb12606SAntoniu Miclaus 		u16 temp;
6460bb12606SAntoniu Miclaus 		ret = ad7293_spi_read(st, reg, &temp);
6470bb12606SAntoniu Miclaus 		*read_val = temp;
6480bb12606SAntoniu Miclaus 	} else {
6490bb12606SAntoniu Miclaus 		ret = ad7293_spi_write(st, reg, (u16)write_val);
6500bb12606SAntoniu Miclaus 	}
6510bb12606SAntoniu Miclaus 
6520bb12606SAntoniu Miclaus 	return ret;
6530bb12606SAntoniu Miclaus }
6540bb12606SAntoniu Miclaus 
ad7293_read_avail(struct iio_dev * indio_dev,struct iio_chan_spec const * chan,const int ** vals,int * type,int * length,long info)6550bb12606SAntoniu Miclaus static int ad7293_read_avail(struct iio_dev *indio_dev,
6560bb12606SAntoniu Miclaus 			     struct iio_chan_spec const *chan,
6570bb12606SAntoniu Miclaus 			     const int **vals, int *type, int *length,
6580bb12606SAntoniu Miclaus 			     long info)
6590bb12606SAntoniu Miclaus {
6600bb12606SAntoniu Miclaus 	switch (info) {
6610bb12606SAntoniu Miclaus 	case IIO_CHAN_INFO_OFFSET:
6620bb12606SAntoniu Miclaus 		*vals = dac_offset_table;
6630bb12606SAntoniu Miclaus 		*type = IIO_VAL_INT;
6640bb12606SAntoniu Miclaus 		*length = ARRAY_SIZE(dac_offset_table);
6650bb12606SAntoniu Miclaus 
6660bb12606SAntoniu Miclaus 		return IIO_AVAIL_LIST;
6670bb12606SAntoniu Miclaus 	case IIO_CHAN_INFO_SCALE:
6680bb12606SAntoniu Miclaus 		*type = IIO_VAL_INT;
6690bb12606SAntoniu Miclaus 
6700bb12606SAntoniu Miclaus 		switch (chan->type) {
6710bb12606SAntoniu Miclaus 		case IIO_VOLTAGE:
6720bb12606SAntoniu Miclaus 			*vals = adc_range_table;
6730bb12606SAntoniu Miclaus 			*length = ARRAY_SIZE(adc_range_table);
6740bb12606SAntoniu Miclaus 			return IIO_AVAIL_LIST;
6750bb12606SAntoniu Miclaus 		case IIO_CURRENT:
6760bb12606SAntoniu Miclaus 			*vals = isense_gain_table;
6770bb12606SAntoniu Miclaus 			*length = ARRAY_SIZE(isense_gain_table);
6780bb12606SAntoniu Miclaus 			return IIO_AVAIL_LIST;
6790bb12606SAntoniu Miclaus 		default:
6800bb12606SAntoniu Miclaus 			return -EINVAL;
6810bb12606SAntoniu Miclaus 		}
6820bb12606SAntoniu Miclaus 	default:
6830bb12606SAntoniu Miclaus 		return -EINVAL;
6840bb12606SAntoniu Miclaus 	}
6850bb12606SAntoniu Miclaus }
6860bb12606SAntoniu Miclaus 
6870bb12606SAntoniu Miclaus #define AD7293_CHAN_ADC(_channel) {					\
6880bb12606SAntoniu Miclaus 	.type = IIO_VOLTAGE,						\
6890bb12606SAntoniu Miclaus 	.output = 0,							\
6900bb12606SAntoniu Miclaus 	.indexed = 1,							\
6910bb12606SAntoniu Miclaus 	.channel = _channel,						\
6920bb12606SAntoniu Miclaus 	.info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |			\
6930bb12606SAntoniu Miclaus 			      BIT(IIO_CHAN_INFO_SCALE) |		\
6940bb12606SAntoniu Miclaus 			      BIT(IIO_CHAN_INFO_OFFSET),		\
6950bb12606SAntoniu Miclaus 	.info_mask_shared_by_type_available = BIT(IIO_CHAN_INFO_SCALE)	\
6960bb12606SAntoniu Miclaus }
6970bb12606SAntoniu Miclaus 
6980bb12606SAntoniu Miclaus #define AD7293_CHAN_DAC(_channel) {					\
6990bb12606SAntoniu Miclaus 	.type = IIO_VOLTAGE,						\
7000bb12606SAntoniu Miclaus 	.output = 1,							\
7010bb12606SAntoniu Miclaus 	.indexed = 1,							\
7020bb12606SAntoniu Miclaus 	.channel = _channel,						\
7030bb12606SAntoniu Miclaus 	.info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |			\
7040bb12606SAntoniu Miclaus 			      BIT(IIO_CHAN_INFO_OFFSET),		\
7050bb12606SAntoniu Miclaus 	.info_mask_shared_by_type_available = BIT(IIO_CHAN_INFO_OFFSET)	\
7060bb12606SAntoniu Miclaus }
7070bb12606SAntoniu Miclaus 
7080bb12606SAntoniu Miclaus #define AD7293_CHAN_ISENSE(_channel) {					\
7090bb12606SAntoniu Miclaus 	.type = IIO_CURRENT,						\
7100bb12606SAntoniu Miclaus 	.output = 0,							\
7110bb12606SAntoniu Miclaus 	.indexed = 1,							\
7120bb12606SAntoniu Miclaus 	.channel = _channel,						\
7130bb12606SAntoniu Miclaus 	.info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |			\
7140bb12606SAntoniu Miclaus 			      BIT(IIO_CHAN_INFO_OFFSET) |		\
7150bb12606SAntoniu Miclaus 			      BIT(IIO_CHAN_INFO_SCALE),			\
7160bb12606SAntoniu Miclaus 	.info_mask_shared_by_type_available = BIT(IIO_CHAN_INFO_SCALE)	\
7170bb12606SAntoniu Miclaus }
7180bb12606SAntoniu Miclaus 
7190bb12606SAntoniu Miclaus #define AD7293_CHAN_TEMP(_channel) {					\
7200bb12606SAntoniu Miclaus 	.type = IIO_TEMP,						\
7210bb12606SAntoniu Miclaus 	.output = 0,							\
7220bb12606SAntoniu Miclaus 	.indexed = 1,							\
7230bb12606SAntoniu Miclaus 	.channel = _channel,						\
7240bb12606SAntoniu Miclaus 	.info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |			\
7250bb12606SAntoniu Miclaus 			      BIT(IIO_CHAN_INFO_OFFSET),		\
7260bb12606SAntoniu Miclaus 	.info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE)		\
7270bb12606SAntoniu Miclaus }
7280bb12606SAntoniu Miclaus 
7290bb12606SAntoniu Miclaus static const struct iio_chan_spec ad7293_channels[] = {
7300bb12606SAntoniu Miclaus 	AD7293_CHAN_ADC(0),
7310bb12606SAntoniu Miclaus 	AD7293_CHAN_ADC(1),
7320bb12606SAntoniu Miclaus 	AD7293_CHAN_ADC(2),
7330bb12606SAntoniu Miclaus 	AD7293_CHAN_ADC(3),
7340bb12606SAntoniu Miclaus 	AD7293_CHAN_ISENSE(0),
7350bb12606SAntoniu Miclaus 	AD7293_CHAN_ISENSE(1),
7360bb12606SAntoniu Miclaus 	AD7293_CHAN_ISENSE(2),
7370bb12606SAntoniu Miclaus 	AD7293_CHAN_ISENSE(3),
7380bb12606SAntoniu Miclaus 	AD7293_CHAN_TEMP(0),
7390bb12606SAntoniu Miclaus 	AD7293_CHAN_TEMP(1),
7400bb12606SAntoniu Miclaus 	AD7293_CHAN_TEMP(2),
7410bb12606SAntoniu Miclaus 	AD7293_CHAN_DAC(0),
7420bb12606SAntoniu Miclaus 	AD7293_CHAN_DAC(1),
7430bb12606SAntoniu Miclaus 	AD7293_CHAN_DAC(2),
7440bb12606SAntoniu Miclaus 	AD7293_CHAN_DAC(3),
7450bb12606SAntoniu Miclaus 	AD7293_CHAN_DAC(4),
7460bb12606SAntoniu Miclaus 	AD7293_CHAN_DAC(5),
7470bb12606SAntoniu Miclaus 	AD7293_CHAN_DAC(6),
7480bb12606SAntoniu Miclaus 	AD7293_CHAN_DAC(7)
7490bb12606SAntoniu Miclaus };
7500bb12606SAntoniu Miclaus 
ad7293_soft_reset(struct ad7293_state * st)7510bb12606SAntoniu Miclaus static int ad7293_soft_reset(struct ad7293_state *st)
7520bb12606SAntoniu Miclaus {
7530bb12606SAntoniu Miclaus 	int ret;
7540bb12606SAntoniu Miclaus 
7550bb12606SAntoniu Miclaus 	ret = __ad7293_spi_write(st, AD7293_REG_SOFT_RESET, 0x7293);
7560bb12606SAntoniu Miclaus 	if (ret)
7570bb12606SAntoniu Miclaus 		return ret;
7580bb12606SAntoniu Miclaus 
7590bb12606SAntoniu Miclaus 	return __ad7293_spi_write(st, AD7293_REG_SOFT_RESET, 0x0000);
7600bb12606SAntoniu Miclaus }
7610bb12606SAntoniu Miclaus 
ad7293_reset(struct ad7293_state * st)7620bb12606SAntoniu Miclaus static int ad7293_reset(struct ad7293_state *st)
7630bb12606SAntoniu Miclaus {
7640bb12606SAntoniu Miclaus 	if (st->gpio_reset) {
7650bb12606SAntoniu Miclaus 		gpiod_set_value(st->gpio_reset, 0);
7660bb12606SAntoniu Miclaus 		usleep_range(100, 1000);
7670bb12606SAntoniu Miclaus 		gpiod_set_value(st->gpio_reset, 1);
7680bb12606SAntoniu Miclaus 		usleep_range(100, 1000);
7690bb12606SAntoniu Miclaus 
7700bb12606SAntoniu Miclaus 		return 0;
7710bb12606SAntoniu Miclaus 	}
7720bb12606SAntoniu Miclaus 
7730bb12606SAntoniu Miclaus 	/* Perform a software reset */
7740bb12606SAntoniu Miclaus 	return ad7293_soft_reset(st);
7750bb12606SAntoniu Miclaus }
7760bb12606SAntoniu Miclaus 
ad7293_properties_parse(struct ad7293_state * st)7770bb12606SAntoniu Miclaus static int ad7293_properties_parse(struct ad7293_state *st)
7780bb12606SAntoniu Miclaus {
7790bb12606SAntoniu Miclaus 	struct spi_device *spi = st->spi;
7800bb12606SAntoniu Miclaus 
7810bb12606SAntoniu Miclaus 	st->gpio_reset = devm_gpiod_get_optional(&st->spi->dev, "reset",
7820bb12606SAntoniu Miclaus 						 GPIOD_OUT_HIGH);
7830bb12606SAntoniu Miclaus 	if (IS_ERR(st->gpio_reset))
7840bb12606SAntoniu Miclaus 		return dev_err_probe(&spi->dev, PTR_ERR(st->gpio_reset),
7850bb12606SAntoniu Miclaus 				     "failed to get the reset GPIO\n");
7860bb12606SAntoniu Miclaus 
7870bb12606SAntoniu Miclaus 	st->reg_avdd = devm_regulator_get(&spi->dev, "avdd");
7880bb12606SAntoniu Miclaus 	if (IS_ERR(st->reg_avdd))
7890bb12606SAntoniu Miclaus 		return dev_err_probe(&spi->dev, PTR_ERR(st->reg_avdd),
7900bb12606SAntoniu Miclaus 				     "failed to get the AVDD voltage\n");
7910bb12606SAntoniu Miclaus 
7920bb12606SAntoniu Miclaus 	st->reg_vdrive = devm_regulator_get(&spi->dev, "vdrive");
7930bb12606SAntoniu Miclaus 	if (IS_ERR(st->reg_vdrive))
7940bb12606SAntoniu Miclaus 		return dev_err_probe(&spi->dev, PTR_ERR(st->reg_vdrive),
7950bb12606SAntoniu Miclaus 				     "failed to get the VDRIVE voltage\n");
7960bb12606SAntoniu Miclaus 
7970bb12606SAntoniu Miclaus 	return 0;
7980bb12606SAntoniu Miclaus }
7990bb12606SAntoniu Miclaus 
ad7293_reg_disable(void * data)8000bb12606SAntoniu Miclaus static void ad7293_reg_disable(void *data)
8010bb12606SAntoniu Miclaus {
8020bb12606SAntoniu Miclaus 	regulator_disable(data);
8030bb12606SAntoniu Miclaus }
8040bb12606SAntoniu Miclaus 
ad7293_init(struct ad7293_state * st)8050bb12606SAntoniu Miclaus static int ad7293_init(struct ad7293_state *st)
8060bb12606SAntoniu Miclaus {
8070bb12606SAntoniu Miclaus 	int ret;
8080bb12606SAntoniu Miclaus 	u16 chip_id;
8090bb12606SAntoniu Miclaus 	struct spi_device *spi = st->spi;
8100bb12606SAntoniu Miclaus 
8110bb12606SAntoniu Miclaus 	ret = ad7293_properties_parse(st);
8120bb12606SAntoniu Miclaus 	if (ret)
8130bb12606SAntoniu Miclaus 		return ret;
8140bb12606SAntoniu Miclaus 
8150bb12606SAntoniu Miclaus 	ret = ad7293_reset(st);
8160bb12606SAntoniu Miclaus 	if (ret)
8170bb12606SAntoniu Miclaus 		return ret;
8180bb12606SAntoniu Miclaus 
8190bb12606SAntoniu Miclaus 	ret = regulator_enable(st->reg_avdd);
8200bb12606SAntoniu Miclaus 	if (ret) {
8210bb12606SAntoniu Miclaus 		dev_err(&spi->dev,
8220bb12606SAntoniu Miclaus 			"Failed to enable specified AVDD Voltage!\n");
8230bb12606SAntoniu Miclaus 		return ret;
8240bb12606SAntoniu Miclaus 	}
8250bb12606SAntoniu Miclaus 
8260bb12606SAntoniu Miclaus 	ret = devm_add_action_or_reset(&spi->dev, ad7293_reg_disable,
8270bb12606SAntoniu Miclaus 				       st->reg_avdd);
8280bb12606SAntoniu Miclaus 	if (ret)
8290bb12606SAntoniu Miclaus 		return ret;
8300bb12606SAntoniu Miclaus 
8310bb12606SAntoniu Miclaus 	ret = regulator_enable(st->reg_vdrive);
8320bb12606SAntoniu Miclaus 	if (ret) {
8330bb12606SAntoniu Miclaus 		dev_err(&spi->dev,
8340bb12606SAntoniu Miclaus 			"Failed to enable specified VDRIVE Voltage!\n");
8350bb12606SAntoniu Miclaus 		return ret;
8360bb12606SAntoniu Miclaus 	}
8370bb12606SAntoniu Miclaus 
8380bb12606SAntoniu Miclaus 	ret = devm_add_action_or_reset(&spi->dev, ad7293_reg_disable,
8390bb12606SAntoniu Miclaus 				       st->reg_vdrive);
8400bb12606SAntoniu Miclaus 	if (ret)
8410bb12606SAntoniu Miclaus 		return ret;
8420bb12606SAntoniu Miclaus 
8430bb12606SAntoniu Miclaus 	ret = regulator_get_voltage(st->reg_avdd);
8440bb12606SAntoniu Miclaus 	if (ret < 0) {
8450bb12606SAntoniu Miclaus 		dev_err(&spi->dev, "Failed to read avdd regulator: %d\n", ret);
8460bb12606SAntoniu Miclaus 		return ret;
8470bb12606SAntoniu Miclaus 	}
8480bb12606SAntoniu Miclaus 
8490bb12606SAntoniu Miclaus 	if (ret > 5500000 || ret < 4500000)
8500bb12606SAntoniu Miclaus 		return -EINVAL;
8510bb12606SAntoniu Miclaus 
8520bb12606SAntoniu Miclaus 	ret = regulator_get_voltage(st->reg_vdrive);
8530bb12606SAntoniu Miclaus 	if (ret < 0) {
8540bb12606SAntoniu Miclaus 		dev_err(&spi->dev,
8550bb12606SAntoniu Miclaus 			"Failed to read vdrive regulator: %d\n", ret);
8560bb12606SAntoniu Miclaus 		return ret;
8570bb12606SAntoniu Miclaus 	}
8580bb12606SAntoniu Miclaus 	if (ret > 5500000 || ret < 1700000)
8590bb12606SAntoniu Miclaus 		return -EINVAL;
8600bb12606SAntoniu Miclaus 
8610bb12606SAntoniu Miclaus 	/* Check Chip ID */
8620bb12606SAntoniu Miclaus 	ret = __ad7293_spi_read(st, AD7293_REG_DEVICE_ID, &chip_id);
8630bb12606SAntoniu Miclaus 	if (ret)
8640bb12606SAntoniu Miclaus 		return ret;
8650bb12606SAntoniu Miclaus 
8660bb12606SAntoniu Miclaus 	if (chip_id != AD7293_CHIP_ID) {
8670bb12606SAntoniu Miclaus 		dev_err(&spi->dev, "Invalid Chip ID.\n");
8680bb12606SAntoniu Miclaus 		return -EINVAL;
8690bb12606SAntoniu Miclaus 	}
8700bb12606SAntoniu Miclaus 
8710bb12606SAntoniu Miclaus 	return 0;
8720bb12606SAntoniu Miclaus }
8730bb12606SAntoniu Miclaus 
8740bb12606SAntoniu Miclaus static const struct iio_info ad7293_info = {
8750bb12606SAntoniu Miclaus 	.read_raw = ad7293_read_raw,
8760bb12606SAntoniu Miclaus 	.write_raw = ad7293_write_raw,
8770bb12606SAntoniu Miclaus 	.read_avail = &ad7293_read_avail,
8780bb12606SAntoniu Miclaus 	.debugfs_reg_access = &ad7293_reg_access,
8790bb12606SAntoniu Miclaus };
8800bb12606SAntoniu Miclaus 
ad7293_probe(struct spi_device * spi)8810bb12606SAntoniu Miclaus static int ad7293_probe(struct spi_device *spi)
8820bb12606SAntoniu Miclaus {
8830bb12606SAntoniu Miclaus 	struct iio_dev *indio_dev;
8840bb12606SAntoniu Miclaus 	struct ad7293_state *st;
8850bb12606SAntoniu Miclaus 	int ret;
8860bb12606SAntoniu Miclaus 
8870bb12606SAntoniu Miclaus 	indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*st));
8880bb12606SAntoniu Miclaus 	if (!indio_dev)
8890bb12606SAntoniu Miclaus 		return -ENOMEM;
8900bb12606SAntoniu Miclaus 
8910bb12606SAntoniu Miclaus 	st = iio_priv(indio_dev);
8920bb12606SAntoniu Miclaus 
8930bb12606SAntoniu Miclaus 	indio_dev->info = &ad7293_info;
8940bb12606SAntoniu Miclaus 	indio_dev->name = "ad7293";
8950bb12606SAntoniu Miclaus 	indio_dev->channels = ad7293_channels;
8960bb12606SAntoniu Miclaus 	indio_dev->num_channels = ARRAY_SIZE(ad7293_channels);
8970bb12606SAntoniu Miclaus 
8980bb12606SAntoniu Miclaus 	st->spi = spi;
8990bb12606SAntoniu Miclaus 	st->page_select = 0;
9000bb12606SAntoniu Miclaus 
9010bb12606SAntoniu Miclaus 	mutex_init(&st->lock);
9020bb12606SAntoniu Miclaus 
9030bb12606SAntoniu Miclaus 	ret = ad7293_init(st);
9040bb12606SAntoniu Miclaus 	if (ret)
9050bb12606SAntoniu Miclaus 		return ret;
9060bb12606SAntoniu Miclaus 
9070bb12606SAntoniu Miclaus 	return devm_iio_device_register(&spi->dev, indio_dev);
9080bb12606SAntoniu Miclaus }
9090bb12606SAntoniu Miclaus 
9100bb12606SAntoniu Miclaus static const struct spi_device_id ad7293_id[] = {
9110bb12606SAntoniu Miclaus 	{ "ad7293", 0 },
9120bb12606SAntoniu Miclaus 	{}
9130bb12606SAntoniu Miclaus };
9140bb12606SAntoniu Miclaus MODULE_DEVICE_TABLE(spi, ad7293_id);
9150bb12606SAntoniu Miclaus 
9160bb12606SAntoniu Miclaus static const struct of_device_id ad7293_of_match[] = {
9170bb12606SAntoniu Miclaus 	{ .compatible = "adi,ad7293" },
9180bb12606SAntoniu Miclaus 	{}
9190bb12606SAntoniu Miclaus };
9200bb12606SAntoniu Miclaus MODULE_DEVICE_TABLE(of, ad7293_of_match);
9210bb12606SAntoniu Miclaus 
9220bb12606SAntoniu Miclaus static struct spi_driver ad7293_driver = {
9230bb12606SAntoniu Miclaus 	.driver = {
9240bb12606SAntoniu Miclaus 		.name = "ad7293",
9250bb12606SAntoniu Miclaus 		.of_match_table = ad7293_of_match,
9260bb12606SAntoniu Miclaus 	},
9270bb12606SAntoniu Miclaus 	.probe = ad7293_probe,
9280bb12606SAntoniu Miclaus 	.id_table = ad7293_id,
9290bb12606SAntoniu Miclaus };
9300bb12606SAntoniu Miclaus module_spi_driver(ad7293_driver);
9310bb12606SAntoniu Miclaus 
9320bb12606SAntoniu Miclaus MODULE_AUTHOR("Antoniu Miclaus <antoniu.miclaus@analog.com");
9330bb12606SAntoniu Miclaus MODULE_DESCRIPTION("Analog Devices AD7293");
9340bb12606SAntoniu Miclaus MODULE_LICENSE("GPL v2");
935