xref: /kernel/linux/linux-6.6/drivers/iio/dac/ad7293.c (revision 62306a36)
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
119enum ad7293_ch_type {
120	AD7293_ADC_VINX,
121	AD7293_ADC_TSENSE,
122	AD7293_ADC_ISENSE,
123	AD7293_DAC,
124};
125
126enum 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
133static const int dac_offset_table[] = {0, 1, 2};
134
135static const int isense_gain_table[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
136
137static const int adc_range_table[] = {0, 1, 2, 3};
138
139struct 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
150static 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
168static 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
201static 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
213static 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
235static 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
247static 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
262static 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
274static 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
294exit:
295	mutex_unlock(&st->lock);
296
297	return ret;
298}
299
300static 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
315exit:
316	mutex_unlock(&st->lock);
317
318	return ret;
319}
320
321static 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
336static 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
362static 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
371static 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
385static 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
399exit:
400	mutex_unlock(&st->lock);
401
402	return ret;
403}
404
405static 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
470exit:
471	mutex_unlock(&st->lock);
472
473	return ret;
474}
475
476static 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
582static 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
636static 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
655static 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
729static 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
751static 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
762static 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
777static 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
800static void ad7293_reg_disable(void *data)
801{
802	regulator_disable(data);
803}
804
805static 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
874static 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
881static 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
910static const struct spi_device_id ad7293_id[] = {
911	{ "ad7293", 0 },
912	{}
913};
914MODULE_DEVICE_TABLE(spi, ad7293_id);
915
916static const struct of_device_id ad7293_of_match[] = {
917	{ .compatible = "adi,ad7293" },
918	{}
919};
920MODULE_DEVICE_TABLE(of, ad7293_of_match);
921
922static 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};
930module_spi_driver(ad7293_driver);
931
932MODULE_AUTHOR("Antoniu Miclaus <antoniu.miclaus@analog.com");
933MODULE_DESCRIPTION("Analog Devices AD7293");
934MODULE_LICENSE("GPL v2");
935