xref: /openbmc/linux/drivers/iio/dac/ad7293.c (revision 26b32974)
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * AD7293 driver
4  *
5  * Copyright 2021 Analog Devices Inc.
6  */
7 
8 #include <linux/bitfield.h>
9 #include <linux/bits.h>
10 #include <linux/delay.h>
11 #include <linux/device.h>
12 #include <linux/gpio/consumer.h>
13 #include <linux/iio/iio.h>
14 #include <linux/mod_devicetable.h>
15 #include <linux/module.h>
16 #include <linux/regulator/consumer.h>
17 #include <linux/spi/spi.h>
18 
19 #include <asm/unaligned.h>
20 
21 #define AD7293_R1B				BIT(16)
22 #define AD7293_R2B				BIT(17)
23 #define AD7293_PAGE_ADDR_MSK			GENMASK(15, 8)
24 #define AD7293_PAGE(x)				FIELD_PREP(AD7293_PAGE_ADDR_MSK, x)
25 
26 /* AD7293 Register Map Common */
27 #define AD7293_REG_NO_OP			(AD7293_R1B | AD7293_PAGE(0x0) | 0x0)
28 #define AD7293_REG_PAGE_SELECT			(AD7293_R1B | AD7293_PAGE(0x0) | 0x1)
29 #define AD7293_REG_CONV_CMD			(AD7293_R2B | AD7293_PAGE(0x0) | 0x2)
30 #define AD7293_REG_RESULT			(AD7293_R1B | AD7293_PAGE(0x0) | 0x3)
31 #define AD7293_REG_DAC_EN			(AD7293_R1B | AD7293_PAGE(0x0) | 0x4)
32 #define AD7293_REG_DEVICE_ID			(AD7293_R2B | AD7293_PAGE(0x0) | 0xC)
33 #define AD7293_REG_SOFT_RESET			(AD7293_R2B | AD7293_PAGE(0x0) | 0xF)
34 
35 /* AD7293 Register Map Page 0x0 */
36 #define AD7293_REG_VIN0				(AD7293_R2B | AD7293_PAGE(0x0) | 0x10)
37 #define AD7293_REG_VIN1				(AD7293_R2B | AD7293_PAGE(0x0) | 0x11)
38 #define AD7293_REG_VIN2				(AD7293_R2B | AD7293_PAGE(0x0) | 0x12)
39 #define AD7293_REG_VIN3				(AD7293_R2B | AD7293_PAGE(0x0) | 0x13)
40 #define AD7293_REG_TSENSE_INT			(AD7293_R2B | AD7293_PAGE(0x0) | 0x20)
41 #define AD7293_REG_TSENSE_D0			(AD7293_R2B | AD7293_PAGE(0x0) | 0x21)
42 #define AD7293_REG_TSENSE_D1			(AD7293_R2B | AD7293_PAGE(0x0) | 0x22)
43 #define AD7293_REG_ISENSE_0			(AD7293_R2B | AD7293_PAGE(0x0) | 0x28)
44 #define AD7293_REG_ISENSE_1			(AD7293_R2B | AD7293_PAGE(0x0) | 0x29)
45 #define AD7293_REG_ISENSE_2			(AD7293_R2B | AD7293_PAGE(0x0) | 0x2A)
46 #define AD7293_REG_ISENSE_3			(AD7293_R2B | AD7293_PAGE(0x0) | 0x2B)
47 #define AD7293_REG_UNI_VOUT0			(AD7293_R2B | AD7293_PAGE(0x0) | 0x30)
48 #define AD7293_REG_UNI_VOUT1			(AD7293_R2B | AD7293_PAGE(0x0) | 0x31)
49 #define AD7293_REG_UNI_VOUT2			(AD7293_R2B | AD7293_PAGE(0x0) | 0x32)
50 #define AD7293_REG_UNI_VOUT3			(AD7293_R2B | AD7293_PAGE(0x0) | 0x33)
51 #define AD7293_REG_BI_VOUT0			(AD7293_R2B | AD7293_PAGE(0x0) | 0x34)
52 #define AD7293_REG_BI_VOUT1			(AD7293_R2B | AD7293_PAGE(0x0) | 0x35)
53 #define AD7293_REG_BI_VOUT2			(AD7293_R2B | AD7293_PAGE(0x0) | 0x36)
54 #define AD7293_REG_BI_VOUT3			(AD7293_R2B | AD7293_PAGE(0x0) | 0x37)
55 
56 /* AD7293 Register Map Page 0x2 */
57 #define AD7293_REG_DIGITAL_OUT_EN		(AD7293_R2B | AD7293_PAGE(0x2) | 0x11)
58 #define AD7293_REG_DIGITAL_INOUT_FUNC		(AD7293_R2B | AD7293_PAGE(0x2) | 0x12)
59 #define AD7293_REG_DIGITAL_FUNC_POL		(AD7293_R2B | AD7293_PAGE(0x2) | 0x13)
60 #define AD7293_REG_GENERAL			(AD7293_R2B | AD7293_PAGE(0x2) | 0x14)
61 #define AD7293_REG_VINX_RANGE0			(AD7293_R2B | AD7293_PAGE(0x2) | 0x15)
62 #define AD7293_REG_VINX_RANGE1			(AD7293_R2B | AD7293_PAGE(0x2) | 0x16)
63 #define AD7293_REG_VINX_DIFF_SE			(AD7293_R2B | AD7293_PAGE(0x2) | 0x17)
64 #define AD7293_REG_VINX_FILTER			(AD7293_R2B | AD7293_PAGE(0x2) | 0x18)
65 #define AD7293_REG_BG_EN			(AD7293_R2B | AD7293_PAGE(0x2) | 0x19)
66 #define AD7293_REG_CONV_DELAY			(AD7293_R2B | AD7293_PAGE(0x2) | 0x1A)
67 #define AD7293_REG_TSENSE_BG_EN			(AD7293_R2B | AD7293_PAGE(0x2) | 0x1B)
68 #define AD7293_REG_ISENSE_BG_EN			(AD7293_R2B | AD7293_PAGE(0x2) | 0x1C)
69 #define AD7293_REG_ISENSE_GAIN			(AD7293_R2B | AD7293_PAGE(0x2) | 0x1D)
70 #define AD7293_REG_DAC_SNOOZE_O			(AD7293_R2B | AD7293_PAGE(0x2) | 0x1F)
71 #define AD7293_REG_DAC_SNOOZE_1			(AD7293_R2B | AD7293_PAGE(0x2) | 0x20)
72 #define AD7293_REG_RSX_MON_BG_EN		(AD7293_R2B | AD7293_PAGE(0x2) | 0x23)
73 #define AD7293_REG_INTEGR_CL			(AD7293_R2B | AD7293_PAGE(0x2) | 0x28)
74 #define AD7293_REG_PA_ON_CTRL			(AD7293_R2B | AD7293_PAGE(0x2) | 0x29)
75 #define AD7293_REG_RAMP_TIME_0			(AD7293_R2B | AD7293_PAGE(0x2) | 0x2A)
76 #define AD7293_REG_RAMP_TIME_1			(AD7293_R2B | AD7293_PAGE(0x2) | 0x2B)
77 #define AD7293_REG_RAMP_TIME_2			(AD7293_R2B | AD7293_PAGE(0x2) | 0x2C)
78 #define AD7293_REG_RAMP_TIME_3			(AD7293_R2B | AD7293_PAGE(0x2) | 0x2D)
79 #define AD7293_REG_CL_FR_IT			(AD7293_R2B | AD7293_PAGE(0x2) | 0x2E)
80 #define AD7293_REG_INTX_AVSS_AVDD		(AD7293_R2B | AD7293_PAGE(0x2) | 0x2F)
81 
82 /* AD7293 Register Map Page 0x3 */
83 #define AD7293_REG_VINX_SEQ			(AD7293_R2B | AD7293_PAGE(0x3) | 0x10)
84 #define AD7293_REG_ISENSEX_TSENSEX_SEQ		(AD7293_R2B | AD7293_PAGE(0x3) | 0x11)
85 #define AD7293_REG_RSX_MON_BI_VOUTX_SEQ		(AD7293_R2B | AD7293_PAGE(0x3) | 0x12)
86 
87 /* AD7293 Register Map Page 0xE */
88 #define AD7293_REG_VIN0_OFFSET			(AD7293_R1B | AD7293_PAGE(0xE) | 0x10)
89 #define AD7293_REG_VIN1_OFFSET			(AD7293_R1B | AD7293_PAGE(0xE) | 0x11)
90 #define AD7293_REG_VIN2_OFFSET			(AD7293_R1B | AD7293_PAGE(0xE) | 0x12)
91 #define AD7293_REG_VIN3_OFFSET			(AD7293_R1B | AD7293_PAGE(0xE) | 0x13)
92 #define AD7293_REG_TSENSE_INT_OFFSET		(AD7293_R1B | AD7293_PAGE(0xE) | 0x20)
93 #define AD7293_REG_TSENSE_D0_OFFSET		(AD7293_R1B | AD7293_PAGE(0xE) | 0x21)
94 #define AD7293_REG_TSENSE_D1_OFFSET		(AD7293_R1B | AD7293_PAGE(0xE) | 0x22)
95 #define AD7293_REG_ISENSE0_OFFSET		(AD7293_R1B | AD7293_PAGE(0xE) | 0x28)
96 #define AD7293_REG_ISENSE1_OFFSET		(AD7293_R1B | AD7293_PAGE(0xE) | 0x29)
97 #define AD7293_REG_ISENSE2_OFFSET		(AD7293_R1B | AD7293_PAGE(0xE) | 0x2A)
98 #define AD7293_REG_ISENSE3_OFFSET		(AD7293_R1B | AD7293_PAGE(0xE) | 0x2B)
99 #define AD7293_REG_UNI_VOUT0_OFFSET		(AD7293_R1B | AD7293_PAGE(0xE) | 0x30)
100 #define AD7293_REG_UNI_VOUT1_OFFSET		(AD7293_R1B | AD7293_PAGE(0xE) | 0x31)
101 #define AD7293_REG_UNI_VOUT2_OFFSET		(AD7293_R1B | AD7293_PAGE(0xE) | 0x32)
102 #define AD7293_REG_UNI_VOUT3_OFFSET		(AD7293_R1B | AD7293_PAGE(0xE) | 0x33)
103 #define AD7293_REG_BI_VOUT0_OFFSET		(AD7293_R1B | AD7293_PAGE(0xE) | 0x34)
104 #define AD7293_REG_BI_VOUT1_OFFSET		(AD7293_R1B | AD7293_PAGE(0xE) | 0x35)
105 #define AD7293_REG_BI_VOUT2_OFFSET		(AD7293_R1B | AD7293_PAGE(0xE) | 0x36)
106 #define AD7293_REG_BI_VOUT3_OFFSET		(AD7293_R1B | AD7293_PAGE(0xE) | 0x37)
107 
108 /* AD7293 Miscellaneous Definitions */
109 #define AD7293_READ				BIT(7)
110 #define AD7293_TRANSF_LEN_MSK			GENMASK(17, 16)
111 
112 #define AD7293_REG_ADDR_MSK			GENMASK(7, 0)
113 #define AD7293_REG_VOUT_OFFSET_MSK		GENMASK(5, 4)
114 #define AD7293_REG_DATA_RAW_MSK			GENMASK(15, 4)
115 #define AD7293_REG_VINX_RANGE_GET_CH_MSK(x, ch)	(((x) >> (ch)) & 0x1)
116 #define AD7293_REG_VINX_RANGE_SET_CH_MSK(x, ch)	(((x) & 0x1) << (ch))
117 #define AD7293_CHIP_ID				0x18
118 
119 enum ad7293_ch_type {
120 	AD7293_ADC_VINX,
121 	AD7293_ADC_TSENSE,
122 	AD7293_ADC_ISENSE,
123 	AD7293_DAC,
124 };
125 
126 enum ad7293_max_offset {
127 	AD7293_TSENSE_MIN_OFFSET_CH = 4,
128 	AD7293_ISENSE_MIN_OFFSET_CH = 7,
129 	AD7293_VOUT_MIN_OFFSET_CH = 11,
130 	AD7293_VOUT_MAX_OFFSET_CH = 18,
131 };
132 
133 static const int dac_offset_table[] = {0, 1, 2};
134 
135 static const int isense_gain_table[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
136 
137 static const int adc_range_table[] = {0, 1, 2, 3};
138 
139 struct ad7293_state {
140 	struct spi_device *spi;
141 	/* Protect against concurrent accesses to the device, page selection and data content */
142 	struct mutex lock;
143 	struct gpio_desc *gpio_reset;
144 	struct regulator *reg_avdd;
145 	struct regulator *reg_vdrive;
146 	u8 page_select;
147 	u8 data[3] __aligned(IIO_DMA_MINALIGN);
148 };
149 
150 static int ad7293_page_select(struct ad7293_state *st, unsigned int reg)
151 {
152 	int ret;
153 
154 	if (st->page_select != FIELD_GET(AD7293_PAGE_ADDR_MSK, reg)) {
155 		st->data[0] = FIELD_GET(AD7293_REG_ADDR_MSK, AD7293_REG_PAGE_SELECT);
156 		st->data[1] = FIELD_GET(AD7293_PAGE_ADDR_MSK, reg);
157 
158 		ret = spi_write(st->spi, &st->data[0], 2);
159 		if (ret)
160 			return ret;
161 
162 		st->page_select = FIELD_GET(AD7293_PAGE_ADDR_MSK, reg);
163 	}
164 
165 	return 0;
166 }
167 
168 static int __ad7293_spi_read(struct ad7293_state *st, unsigned int reg,
169 			     u16 *val)
170 {
171 	int ret;
172 	unsigned int length;
173 	struct spi_transfer t = {0};
174 
175 	length = FIELD_GET(AD7293_TRANSF_LEN_MSK, reg);
176 
177 	ret = ad7293_page_select(st, reg);
178 	if (ret)
179 		return ret;
180 
181 	st->data[0] = AD7293_READ | FIELD_GET(AD7293_REG_ADDR_MSK, reg);
182 	st->data[1] = 0x0;
183 	st->data[2] = 0x0;
184 
185 	t.tx_buf = &st->data[0];
186 	t.rx_buf = &st->data[0];
187 	t.len = length + 1;
188 
189 	ret = spi_sync_transfer(st->spi, &t, 1);
190 	if (ret)
191 		return ret;
192 
193 	if (length == 1)
194 		*val = st->data[1];
195 	else
196 		*val = get_unaligned_be16(&st->data[1]);
197 
198 	return 0;
199 }
200 
201 static int ad7293_spi_read(struct ad7293_state *st, unsigned int reg,
202 			   u16 *val)
203 {
204 	int ret;
205 
206 	mutex_lock(&st->lock);
207 	ret = __ad7293_spi_read(st, reg, val);
208 	mutex_unlock(&st->lock);
209 
210 	return ret;
211 }
212 
213 static int __ad7293_spi_write(struct ad7293_state *st, unsigned int reg,
214 			      u16 val)
215 {
216 	int ret;
217 	unsigned int length;
218 
219 	length = FIELD_GET(AD7293_TRANSF_LEN_MSK, reg);
220 
221 	ret = ad7293_page_select(st, reg);
222 	if (ret)
223 		return ret;
224 
225 	st->data[0] = FIELD_GET(AD7293_REG_ADDR_MSK, reg);
226 
227 	if (length == 1)
228 		st->data[1] = val;
229 	else
230 		put_unaligned_be16(val, &st->data[1]);
231 
232 	return spi_write(st->spi, &st->data[0], length + 1);
233 }
234 
235 static int ad7293_spi_write(struct ad7293_state *st, unsigned int reg,
236 			    u16 val)
237 {
238 	int ret;
239 
240 	mutex_lock(&st->lock);
241 	ret = __ad7293_spi_write(st, reg, val);
242 	mutex_unlock(&st->lock);
243 
244 	return ret;
245 }
246 
247 static int __ad7293_spi_update_bits(struct ad7293_state *st, unsigned int reg,
248 				    u16 mask, u16 val)
249 {
250 	int ret;
251 	u16 data, temp;
252 
253 	ret = __ad7293_spi_read(st, reg, &data);
254 	if (ret)
255 		return ret;
256 
257 	temp = (data & ~mask) | (val & mask);
258 
259 	return __ad7293_spi_write(st, reg, temp);
260 }
261 
262 static int ad7293_spi_update_bits(struct ad7293_state *st, unsigned int reg,
263 				  u16 mask, u16 val)
264 {
265 	int ret;
266 
267 	mutex_lock(&st->lock);
268 	ret = __ad7293_spi_update_bits(st, reg, mask, val);
269 	mutex_unlock(&st->lock);
270 
271 	return ret;
272 }
273 
274 static int ad7293_adc_get_scale(struct ad7293_state *st, unsigned int ch,
275 				u16 *range)
276 {
277 	int ret;
278 	u16 data;
279 
280 	mutex_lock(&st->lock);
281 
282 	ret = __ad7293_spi_read(st, AD7293_REG_VINX_RANGE1, &data);
283 	if (ret)
284 		goto exit;
285 
286 	*range = AD7293_REG_VINX_RANGE_GET_CH_MSK(data, ch);
287 
288 	ret = __ad7293_spi_read(st, AD7293_REG_VINX_RANGE0, &data);
289 	if (ret)
290 		goto exit;
291 
292 	*range |= AD7293_REG_VINX_RANGE_GET_CH_MSK(data, ch) << 1;
293 
294 exit:
295 	mutex_unlock(&st->lock);
296 
297 	return ret;
298 }
299 
300 static int ad7293_adc_set_scale(struct ad7293_state *st, unsigned int ch,
301 				u16 range)
302 {
303 	int ret;
304 	unsigned int ch_msk = BIT(ch);
305 
306 	mutex_lock(&st->lock);
307 	ret = __ad7293_spi_update_bits(st, AD7293_REG_VINX_RANGE1, ch_msk,
308 				       AD7293_REG_VINX_RANGE_SET_CH_MSK(range, ch));
309 	if (ret)
310 		goto exit;
311 
312 	ret = __ad7293_spi_update_bits(st, AD7293_REG_VINX_RANGE0, ch_msk,
313 				       AD7293_REG_VINX_RANGE_SET_CH_MSK((range >> 1), ch));
314 
315 exit:
316 	mutex_unlock(&st->lock);
317 
318 	return ret;
319 }
320 
321 static int ad7293_get_offset(struct ad7293_state *st, unsigned int ch,
322 			     u16 *offset)
323 {
324 	if (ch < AD7293_TSENSE_MIN_OFFSET_CH)
325 		return ad7293_spi_read(st, AD7293_REG_VIN0_OFFSET + ch, offset);
326 	else if (ch < AD7293_ISENSE_MIN_OFFSET_CH)
327 		return ad7293_spi_read(st, AD7293_REG_TSENSE_INT_OFFSET + (ch - 4), offset);
328 	else if (ch < AD7293_VOUT_MIN_OFFSET_CH)
329 		return ad7293_spi_read(st, AD7293_REG_ISENSE0_OFFSET + (ch - 7), offset);
330 	else if (ch <= AD7293_VOUT_MAX_OFFSET_CH)
331 		return ad7293_spi_read(st, AD7293_REG_UNI_VOUT0_OFFSET + (ch - 11), offset);
332 
333 	return -EINVAL;
334 }
335 
336 static int ad7293_set_offset(struct ad7293_state *st, unsigned int ch,
337 			     u16 offset)
338 {
339 	if (ch < AD7293_TSENSE_MIN_OFFSET_CH)
340 		return ad7293_spi_write(st, AD7293_REG_VIN0_OFFSET + ch,
341 					offset);
342 	else if (ch < AD7293_ISENSE_MIN_OFFSET_CH)
343 		return ad7293_spi_write(st,
344 					AD7293_REG_TSENSE_INT_OFFSET +
345 					(ch - AD7293_TSENSE_MIN_OFFSET_CH),
346 					offset);
347 	else if (ch < AD7293_VOUT_MIN_OFFSET_CH)
348 		return ad7293_spi_write(st,
349 					AD7293_REG_ISENSE0_OFFSET +
350 					(ch - AD7293_ISENSE_MIN_OFFSET_CH),
351 					offset);
352 	else if (ch <= AD7293_VOUT_MAX_OFFSET_CH)
353 		return ad7293_spi_update_bits(st,
354 					      AD7293_REG_UNI_VOUT0_OFFSET +
355 					      (ch - AD7293_VOUT_MIN_OFFSET_CH),
356 					      AD7293_REG_VOUT_OFFSET_MSK,
357 					      FIELD_PREP(AD7293_REG_VOUT_OFFSET_MSK, offset));
358 
359 	return -EINVAL;
360 }
361 
362 static int ad7293_isense_set_scale(struct ad7293_state *st, unsigned int ch,
363 				   u16 gain)
364 {
365 	unsigned int ch_msk = (0xf << (4 * ch));
366 
367 	return ad7293_spi_update_bits(st, AD7293_REG_ISENSE_GAIN, ch_msk,
368 				      gain << (4 * ch));
369 }
370 
371 static int ad7293_isense_get_scale(struct ad7293_state *st, unsigned int ch,
372 				   u16 *gain)
373 {
374 	int ret;
375 
376 	ret = ad7293_spi_read(st, AD7293_REG_ISENSE_GAIN, gain);
377 	if (ret)
378 		return ret;
379 
380 	*gain = (*gain >> (4 * ch)) & 0xf;
381 
382 	return ret;
383 }
384 
385 static int ad7293_dac_write_raw(struct ad7293_state *st, unsigned int ch,
386 				u16 raw)
387 {
388 	int ret;
389 
390 	mutex_lock(&st->lock);
391 
392 	ret = __ad7293_spi_update_bits(st, AD7293_REG_DAC_EN, BIT(ch), BIT(ch));
393 	if (ret)
394 		goto exit;
395 
396 	ret =  __ad7293_spi_write(st, AD7293_REG_UNI_VOUT0 + ch,
397 				  FIELD_PREP(AD7293_REG_DATA_RAW_MSK, raw));
398 
399 exit:
400 	mutex_unlock(&st->lock);
401 
402 	return ret;
403 }
404 
405 static int ad7293_ch_read_raw(struct ad7293_state *st, enum ad7293_ch_type type,
406 			      unsigned int ch, u16 *raw)
407 {
408 	int ret;
409 	unsigned int reg_wr, reg_rd, data_wr;
410 
411 	switch (type) {
412 	case AD7293_ADC_VINX:
413 		reg_wr = AD7293_REG_VINX_SEQ;
414 		reg_rd = AD7293_REG_VIN0 + ch;
415 		data_wr = BIT(ch);
416 
417 		break;
418 	case AD7293_ADC_TSENSE:
419 		reg_wr = AD7293_REG_ISENSEX_TSENSEX_SEQ;
420 		reg_rd = AD7293_REG_TSENSE_INT + ch;
421 		data_wr = BIT(ch);
422 
423 		break;
424 	case AD7293_ADC_ISENSE:
425 		reg_wr = AD7293_REG_ISENSEX_TSENSEX_SEQ;
426 		reg_rd = AD7293_REG_ISENSE_0 + ch;
427 		data_wr = BIT(ch) << 8;
428 
429 		break;
430 	case AD7293_DAC:
431 		reg_rd = AD7293_REG_UNI_VOUT0 + ch;
432 
433 		break;
434 	default:
435 		return -EINVAL;
436 	}
437 
438 	mutex_lock(&st->lock);
439 
440 	if (type != AD7293_DAC) {
441 		if (type == AD7293_ADC_TSENSE) {
442 			ret = __ad7293_spi_write(st, AD7293_REG_TSENSE_BG_EN,
443 						 BIT(ch));
444 			if (ret)
445 				goto exit;
446 
447 			usleep_range(9000, 9900);
448 		} else if (type == AD7293_ADC_ISENSE) {
449 			ret = __ad7293_spi_write(st, AD7293_REG_ISENSE_BG_EN,
450 						 BIT(ch));
451 			if (ret)
452 				goto exit;
453 
454 			usleep_range(2000, 7000);
455 		}
456 
457 		ret = __ad7293_spi_write(st, reg_wr, data_wr);
458 		if (ret)
459 			goto exit;
460 
461 		ret = __ad7293_spi_write(st, AD7293_REG_CONV_CMD, 0x82);
462 		if (ret)
463 			goto exit;
464 	}
465 
466 	ret = __ad7293_spi_read(st, reg_rd, raw);
467 
468 	*raw = FIELD_GET(AD7293_REG_DATA_RAW_MSK, *raw);
469 
470 exit:
471 	mutex_unlock(&st->lock);
472 
473 	return ret;
474 }
475 
476 static int ad7293_read_raw(struct iio_dev *indio_dev,
477 			   struct iio_chan_spec const *chan,
478 			   int *val, int *val2, long info)
479 {
480 	struct ad7293_state *st = iio_priv(indio_dev);
481 	int ret;
482 	u16 data;
483 
484 	switch (info) {
485 	case IIO_CHAN_INFO_RAW:
486 		switch (chan->type) {
487 		case IIO_VOLTAGE:
488 			if (chan->output)
489 				ret =  ad7293_ch_read_raw(st, AD7293_DAC,
490 							  chan->channel, &data);
491 			else
492 				ret =  ad7293_ch_read_raw(st, AD7293_ADC_VINX,
493 							  chan->channel, &data);
494 
495 			break;
496 		case IIO_CURRENT:
497 			ret =  ad7293_ch_read_raw(st, AD7293_ADC_ISENSE,
498 						  chan->channel, &data);
499 
500 			break;
501 		case IIO_TEMP:
502 			ret =  ad7293_ch_read_raw(st, AD7293_ADC_TSENSE,
503 						  chan->channel, &data);
504 
505 			break;
506 		default:
507 			return -EINVAL;
508 		}
509 
510 		if (ret)
511 			return ret;
512 
513 		*val = data;
514 
515 		return IIO_VAL_INT;
516 	case IIO_CHAN_INFO_OFFSET:
517 		switch (chan->type) {
518 		case IIO_VOLTAGE:
519 			if (chan->output) {
520 				ret = ad7293_get_offset(st,
521 							chan->channel + AD7293_VOUT_MIN_OFFSET_CH,
522 							&data);
523 
524 				data = FIELD_GET(AD7293_REG_VOUT_OFFSET_MSK, data);
525 			} else {
526 				ret = ad7293_get_offset(st, chan->channel, &data);
527 			}
528 
529 			break;
530 		case IIO_CURRENT:
531 			ret = ad7293_get_offset(st,
532 						chan->channel + AD7293_ISENSE_MIN_OFFSET_CH,
533 						&data);
534 
535 			break;
536 		case IIO_TEMP:
537 			ret = ad7293_get_offset(st,
538 						chan->channel + AD7293_TSENSE_MIN_OFFSET_CH,
539 						&data);
540 
541 			break;
542 		default:
543 			return -EINVAL;
544 		}
545 		if (ret)
546 			return ret;
547 
548 		*val = data;
549 
550 		return IIO_VAL_INT;
551 	case IIO_CHAN_INFO_SCALE:
552 		switch (chan->type) {
553 		case IIO_VOLTAGE:
554 			ret = ad7293_adc_get_scale(st, chan->channel, &data);
555 			if (ret)
556 				return ret;
557 
558 			*val = data;
559 
560 			return IIO_VAL_INT;
561 		case IIO_CURRENT:
562 			ret = ad7293_isense_get_scale(st, chan->channel, &data);
563 			if (ret)
564 				return ret;
565 
566 			*val = data;
567 
568 			return IIO_VAL_INT;
569 		case IIO_TEMP:
570 			*val = 1;
571 			*val2 = 8;
572 
573 			return IIO_VAL_FRACTIONAL;
574 		default:
575 			return -EINVAL;
576 		}
577 	default:
578 		return -EINVAL;
579 	}
580 }
581 
582 static int ad7293_write_raw(struct iio_dev *indio_dev,
583 			    struct iio_chan_spec const *chan,
584 			    int val, int val2, long info)
585 {
586 	struct ad7293_state *st = iio_priv(indio_dev);
587 
588 	switch (info) {
589 	case IIO_CHAN_INFO_RAW:
590 		switch (chan->type) {
591 		case IIO_VOLTAGE:
592 			if (!chan->output)
593 				return -EINVAL;
594 
595 			return ad7293_dac_write_raw(st, chan->channel, val);
596 		default:
597 			return -EINVAL;
598 		}
599 	case IIO_CHAN_INFO_OFFSET:
600 		switch (chan->type) {
601 		case IIO_VOLTAGE:
602 			if (chan->output)
603 				return ad7293_set_offset(st,
604 							 chan->channel +
605 							 AD7293_VOUT_MIN_OFFSET_CH,
606 							 val);
607 			else
608 				return ad7293_set_offset(st, chan->channel, val);
609 		case IIO_CURRENT:
610 			return ad7293_set_offset(st,
611 						 chan->channel +
612 						 AD7293_ISENSE_MIN_OFFSET_CH,
613 						 val);
614 		case IIO_TEMP:
615 			return ad7293_set_offset(st,
616 						 chan->channel +
617 						 AD7293_TSENSE_MIN_OFFSET_CH,
618 						 val);
619 		default:
620 			return -EINVAL;
621 		}
622 	case IIO_CHAN_INFO_SCALE:
623 		switch (chan->type) {
624 		case IIO_VOLTAGE:
625 			return ad7293_adc_set_scale(st, chan->channel, val);
626 		case IIO_CURRENT:
627 			return ad7293_isense_set_scale(st, chan->channel, val);
628 		default:
629 			return -EINVAL;
630 		}
631 	default:
632 		return -EINVAL;
633 	}
634 }
635 
636 static int ad7293_reg_access(struct iio_dev *indio_dev,
637 			     unsigned int reg,
638 			     unsigned int write_val,
639 			     unsigned int *read_val)
640 {
641 	struct ad7293_state *st = iio_priv(indio_dev);
642 	int ret;
643 
644 	if (read_val) {
645 		u16 temp;
646 		ret = ad7293_spi_read(st, reg, &temp);
647 		*read_val = temp;
648 	} else {
649 		ret = ad7293_spi_write(st, reg, (u16)write_val);
650 	}
651 
652 	return ret;
653 }
654 
655 static int ad7293_read_avail(struct iio_dev *indio_dev,
656 			     struct iio_chan_spec const *chan,
657 			     const int **vals, int *type, int *length,
658 			     long info)
659 {
660 	switch (info) {
661 	case IIO_CHAN_INFO_OFFSET:
662 		*vals = dac_offset_table;
663 		*type = IIO_VAL_INT;
664 		*length = ARRAY_SIZE(dac_offset_table);
665 
666 		return IIO_AVAIL_LIST;
667 	case IIO_CHAN_INFO_SCALE:
668 		*type = IIO_VAL_INT;
669 
670 		switch (chan->type) {
671 		case IIO_VOLTAGE:
672 			*vals = adc_range_table;
673 			*length = ARRAY_SIZE(adc_range_table);
674 			return IIO_AVAIL_LIST;
675 		case IIO_CURRENT:
676 			*vals = isense_gain_table;
677 			*length = ARRAY_SIZE(isense_gain_table);
678 			return IIO_AVAIL_LIST;
679 		default:
680 			return -EINVAL;
681 		}
682 	default:
683 		return -EINVAL;
684 	}
685 }
686 
687 #define AD7293_CHAN_ADC(_channel) {					\
688 	.type = IIO_VOLTAGE,						\
689 	.output = 0,							\
690 	.indexed = 1,							\
691 	.channel = _channel,						\
692 	.info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |			\
693 			      BIT(IIO_CHAN_INFO_SCALE) |		\
694 			      BIT(IIO_CHAN_INFO_OFFSET),		\
695 	.info_mask_shared_by_type_available = BIT(IIO_CHAN_INFO_SCALE)	\
696 }
697 
698 #define AD7293_CHAN_DAC(_channel) {					\
699 	.type = IIO_VOLTAGE,						\
700 	.output = 1,							\
701 	.indexed = 1,							\
702 	.channel = _channel,						\
703 	.info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |			\
704 			      BIT(IIO_CHAN_INFO_OFFSET),		\
705 	.info_mask_shared_by_type_available = BIT(IIO_CHAN_INFO_OFFSET)	\
706 }
707 
708 #define AD7293_CHAN_ISENSE(_channel) {					\
709 	.type = IIO_CURRENT,						\
710 	.output = 0,							\
711 	.indexed = 1,							\
712 	.channel = _channel,						\
713 	.info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |			\
714 			      BIT(IIO_CHAN_INFO_OFFSET) |		\
715 			      BIT(IIO_CHAN_INFO_SCALE),			\
716 	.info_mask_shared_by_type_available = BIT(IIO_CHAN_INFO_SCALE)	\
717 }
718 
719 #define AD7293_CHAN_TEMP(_channel) {					\
720 	.type = IIO_TEMP,						\
721 	.output = 0,							\
722 	.indexed = 1,							\
723 	.channel = _channel,						\
724 	.info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |			\
725 			      BIT(IIO_CHAN_INFO_OFFSET),		\
726 	.info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE)		\
727 }
728 
729 static const struct iio_chan_spec ad7293_channels[] = {
730 	AD7293_CHAN_ADC(0),
731 	AD7293_CHAN_ADC(1),
732 	AD7293_CHAN_ADC(2),
733 	AD7293_CHAN_ADC(3),
734 	AD7293_CHAN_ISENSE(0),
735 	AD7293_CHAN_ISENSE(1),
736 	AD7293_CHAN_ISENSE(2),
737 	AD7293_CHAN_ISENSE(3),
738 	AD7293_CHAN_TEMP(0),
739 	AD7293_CHAN_TEMP(1),
740 	AD7293_CHAN_TEMP(2),
741 	AD7293_CHAN_DAC(0),
742 	AD7293_CHAN_DAC(1),
743 	AD7293_CHAN_DAC(2),
744 	AD7293_CHAN_DAC(3),
745 	AD7293_CHAN_DAC(4),
746 	AD7293_CHAN_DAC(5),
747 	AD7293_CHAN_DAC(6),
748 	AD7293_CHAN_DAC(7)
749 };
750 
751 static int ad7293_soft_reset(struct ad7293_state *st)
752 {
753 	int ret;
754 
755 	ret = __ad7293_spi_write(st, AD7293_REG_SOFT_RESET, 0x7293);
756 	if (ret)
757 		return ret;
758 
759 	return __ad7293_spi_write(st, AD7293_REG_SOFT_RESET, 0x0000);
760 }
761 
762 static int ad7293_reset(struct ad7293_state *st)
763 {
764 	if (st->gpio_reset) {
765 		gpiod_set_value(st->gpio_reset, 0);
766 		usleep_range(100, 1000);
767 		gpiod_set_value(st->gpio_reset, 1);
768 		usleep_range(100, 1000);
769 
770 		return 0;
771 	}
772 
773 	/* Perform a software reset */
774 	return ad7293_soft_reset(st);
775 }
776 
777 static int ad7293_properties_parse(struct ad7293_state *st)
778 {
779 	struct spi_device *spi = st->spi;
780 
781 	st->gpio_reset = devm_gpiod_get_optional(&st->spi->dev, "reset",
782 						 GPIOD_OUT_HIGH);
783 	if (IS_ERR(st->gpio_reset))
784 		return dev_err_probe(&spi->dev, PTR_ERR(st->gpio_reset),
785 				     "failed to get the reset GPIO\n");
786 
787 	st->reg_avdd = devm_regulator_get(&spi->dev, "avdd");
788 	if (IS_ERR(st->reg_avdd))
789 		return dev_err_probe(&spi->dev, PTR_ERR(st->reg_avdd),
790 				     "failed to get the AVDD voltage\n");
791 
792 	st->reg_vdrive = devm_regulator_get(&spi->dev, "vdrive");
793 	if (IS_ERR(st->reg_vdrive))
794 		return dev_err_probe(&spi->dev, PTR_ERR(st->reg_vdrive),
795 				     "failed to get the VDRIVE voltage\n");
796 
797 	return 0;
798 }
799 
800 static void ad7293_reg_disable(void *data)
801 {
802 	regulator_disable(data);
803 }
804 
805 static int ad7293_init(struct ad7293_state *st)
806 {
807 	int ret;
808 	u16 chip_id;
809 	struct spi_device *spi = st->spi;
810 
811 	ret = ad7293_properties_parse(st);
812 	if (ret)
813 		return ret;
814 
815 	ret = ad7293_reset(st);
816 	if (ret)
817 		return ret;
818 
819 	ret = regulator_enable(st->reg_avdd);
820 	if (ret) {
821 		dev_err(&spi->dev,
822 			"Failed to enable specified AVDD Voltage!\n");
823 		return ret;
824 	}
825 
826 	ret = devm_add_action_or_reset(&spi->dev, ad7293_reg_disable,
827 				       st->reg_avdd);
828 	if (ret)
829 		return ret;
830 
831 	ret = regulator_enable(st->reg_vdrive);
832 	if (ret) {
833 		dev_err(&spi->dev,
834 			"Failed to enable specified VDRIVE Voltage!\n");
835 		return ret;
836 	}
837 
838 	ret = devm_add_action_or_reset(&spi->dev, ad7293_reg_disable,
839 				       st->reg_vdrive);
840 	if (ret)
841 		return ret;
842 
843 	ret = regulator_get_voltage(st->reg_avdd);
844 	if (ret < 0) {
845 		dev_err(&spi->dev, "Failed to read avdd regulator: %d\n", ret);
846 		return ret;
847 	}
848 
849 	if (ret > 5500000 || ret < 4500000)
850 		return -EINVAL;
851 
852 	ret = regulator_get_voltage(st->reg_vdrive);
853 	if (ret < 0) {
854 		dev_err(&spi->dev,
855 			"Failed to read vdrive regulator: %d\n", ret);
856 		return ret;
857 	}
858 	if (ret > 5500000 || ret < 1700000)
859 		return -EINVAL;
860 
861 	/* Check Chip ID */
862 	ret = __ad7293_spi_read(st, AD7293_REG_DEVICE_ID, &chip_id);
863 	if (ret)
864 		return ret;
865 
866 	if (chip_id != AD7293_CHIP_ID) {
867 		dev_err(&spi->dev, "Invalid Chip ID.\n");
868 		return -EINVAL;
869 	}
870 
871 	return 0;
872 }
873 
874 static const struct iio_info ad7293_info = {
875 	.read_raw = ad7293_read_raw,
876 	.write_raw = ad7293_write_raw,
877 	.read_avail = &ad7293_read_avail,
878 	.debugfs_reg_access = &ad7293_reg_access,
879 };
880 
881 static int ad7293_probe(struct spi_device *spi)
882 {
883 	struct iio_dev *indio_dev;
884 	struct ad7293_state *st;
885 	int ret;
886 
887 	indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*st));
888 	if (!indio_dev)
889 		return -ENOMEM;
890 
891 	st = iio_priv(indio_dev);
892 
893 	indio_dev->info = &ad7293_info;
894 	indio_dev->name = "ad7293";
895 	indio_dev->channels = ad7293_channels;
896 	indio_dev->num_channels = ARRAY_SIZE(ad7293_channels);
897 
898 	st->spi = spi;
899 	st->page_select = 0;
900 
901 	mutex_init(&st->lock);
902 
903 	ret = ad7293_init(st);
904 	if (ret)
905 		return ret;
906 
907 	return devm_iio_device_register(&spi->dev, indio_dev);
908 }
909 
910 static const struct spi_device_id ad7293_id[] = {
911 	{ "ad7293", 0 },
912 	{}
913 };
914 MODULE_DEVICE_TABLE(spi, ad7293_id);
915 
916 static const struct of_device_id ad7293_of_match[] = {
917 	{ .compatible = "adi,ad7293" },
918 	{}
919 };
920 MODULE_DEVICE_TABLE(of, ad7293_of_match);
921 
922 static struct spi_driver ad7293_driver = {
923 	.driver = {
924 		.name = "ad7293",
925 		.of_match_table = ad7293_of_match,
926 	},
927 	.probe = ad7293_probe,
928 	.id_table = ad7293_id,
929 };
930 module_spi_driver(ad7293_driver);
931 
932 MODULE_AUTHOR("Antoniu Miclaus <antoniu.miclaus@analog.com");
933 MODULE_DESCRIPTION("Analog Devices AD7293");
934 MODULE_LICENSE("GPL v2");
935