xref: /openbmc/linux/drivers/iio/adc/ad7292.c (revision 1ac731c529cd4d6adbce134754b51ff7d822b145)
1506d2e31SMarcelo Schmitt // SPDX-License-Identifier: GPL-2.0
2506d2e31SMarcelo Schmitt /*
3506d2e31SMarcelo Schmitt  * Analog Devices AD7292 SPI ADC driver
4506d2e31SMarcelo Schmitt  *
5506d2e31SMarcelo Schmitt  * Copyright 2019 Analog Devices Inc.
6506d2e31SMarcelo Schmitt  */
7506d2e31SMarcelo Schmitt 
8506d2e31SMarcelo Schmitt #include <linux/bitfield.h>
9506d2e31SMarcelo Schmitt #include <linux/device.h>
10506d2e31SMarcelo Schmitt #include <linux/module.h>
11*ff7f85e3SRob Herring #include <linux/of.h>
12506d2e31SMarcelo Schmitt #include <linux/regulator/consumer.h>
13506d2e31SMarcelo Schmitt #include <linux/spi/spi.h>
14506d2e31SMarcelo Schmitt 
15506d2e31SMarcelo Schmitt #include <linux/iio/iio.h>
16506d2e31SMarcelo Schmitt 
17506d2e31SMarcelo Schmitt #define ADI_VENDOR_ID 0x0018
18506d2e31SMarcelo Schmitt 
19506d2e31SMarcelo Schmitt /* AD7292 registers definition */
20506d2e31SMarcelo Schmitt #define AD7292_REG_VENDOR_ID		0x00
21506d2e31SMarcelo Schmitt #define AD7292_REG_CONF_BANK		0x05
22506d2e31SMarcelo Schmitt #define AD7292_REG_CONV_COMM		0x0E
23506d2e31SMarcelo Schmitt #define AD7292_REG_ADC_CH(x)		(0x10 + (x))
24506d2e31SMarcelo Schmitt 
25506d2e31SMarcelo Schmitt /* AD7292 configuration bank subregisters definition */
26506d2e31SMarcelo Schmitt #define AD7292_BANK_REG_VIN_RNG0	0x10
27506d2e31SMarcelo Schmitt #define AD7292_BANK_REG_VIN_RNG1	0x11
28506d2e31SMarcelo Schmitt #define AD7292_BANK_REG_SAMP_MODE	0x12
29506d2e31SMarcelo Schmitt 
30506d2e31SMarcelo Schmitt #define AD7292_RD_FLAG_MSK(x)		(BIT(7) | ((x) & 0x3F))
31506d2e31SMarcelo Schmitt 
32506d2e31SMarcelo Schmitt /* AD7292_REG_ADC_CONVERSION */
33506d2e31SMarcelo Schmitt #define AD7292_ADC_DATA_MASK		GENMASK(15, 6)
34506d2e31SMarcelo Schmitt #define AD7292_ADC_DATA(x)		FIELD_GET(AD7292_ADC_DATA_MASK, x)
35506d2e31SMarcelo Schmitt 
36506d2e31SMarcelo Schmitt /* AD7292_CHANNEL_SAMPLING_MODE */
37506d2e31SMarcelo Schmitt #define AD7292_CH_SAMP_MODE(reg, ch)	(((reg) >> 8) & BIT(ch))
38506d2e31SMarcelo Schmitt 
39506d2e31SMarcelo Schmitt /* AD7292_CHANNEL_VIN_RANGE */
40506d2e31SMarcelo Schmitt #define AD7292_CH_VIN_RANGE(reg, ch)	((reg) & BIT(ch))
41506d2e31SMarcelo Schmitt 
42506d2e31SMarcelo Schmitt #define AD7292_VOLTAGE_CHAN(_chan)					\
43506d2e31SMarcelo Schmitt {									\
44506d2e31SMarcelo Schmitt 	.type = IIO_VOLTAGE,						\
45506d2e31SMarcelo Schmitt 	.info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |			\
46506d2e31SMarcelo Schmitt 			      BIT(IIO_CHAN_INFO_SCALE),			\
47506d2e31SMarcelo Schmitt 	.indexed = 1,							\
48506d2e31SMarcelo Schmitt 	.channel = _chan,						\
49506d2e31SMarcelo Schmitt }
50506d2e31SMarcelo Schmitt 
51506d2e31SMarcelo Schmitt static const struct iio_chan_spec ad7292_channels[] = {
52506d2e31SMarcelo Schmitt 	AD7292_VOLTAGE_CHAN(0),
53506d2e31SMarcelo Schmitt 	AD7292_VOLTAGE_CHAN(1),
54506d2e31SMarcelo Schmitt 	AD7292_VOLTAGE_CHAN(2),
55506d2e31SMarcelo Schmitt 	AD7292_VOLTAGE_CHAN(3),
56506d2e31SMarcelo Schmitt 	AD7292_VOLTAGE_CHAN(4),
57506d2e31SMarcelo Schmitt 	AD7292_VOLTAGE_CHAN(5),
58506d2e31SMarcelo Schmitt 	AD7292_VOLTAGE_CHAN(6),
59506d2e31SMarcelo Schmitt 	AD7292_VOLTAGE_CHAN(7)
60506d2e31SMarcelo Schmitt };
61506d2e31SMarcelo Schmitt 
62506d2e31SMarcelo Schmitt static const struct iio_chan_spec ad7292_channels_diff[] = {
63506d2e31SMarcelo Schmitt 	{
64506d2e31SMarcelo Schmitt 		.type = IIO_VOLTAGE,
65506d2e31SMarcelo Schmitt 		.info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
66506d2e31SMarcelo Schmitt 		.indexed = 1,
67506d2e31SMarcelo Schmitt 		.differential = 1,
68506d2e31SMarcelo Schmitt 		.channel = 0,
69506d2e31SMarcelo Schmitt 		.channel2 = 1,
70506d2e31SMarcelo Schmitt 	},
71506d2e31SMarcelo Schmitt 	AD7292_VOLTAGE_CHAN(2),
72506d2e31SMarcelo Schmitt 	AD7292_VOLTAGE_CHAN(3),
73506d2e31SMarcelo Schmitt 	AD7292_VOLTAGE_CHAN(4),
74506d2e31SMarcelo Schmitt 	AD7292_VOLTAGE_CHAN(5),
75506d2e31SMarcelo Schmitt 	AD7292_VOLTAGE_CHAN(6),
76506d2e31SMarcelo Schmitt 	AD7292_VOLTAGE_CHAN(7)
77506d2e31SMarcelo Schmitt };
78506d2e31SMarcelo Schmitt 
79506d2e31SMarcelo Schmitt struct ad7292_state {
80506d2e31SMarcelo Schmitt 	struct spi_device *spi;
81506d2e31SMarcelo Schmitt 	struct regulator *reg;
82506d2e31SMarcelo Schmitt 	unsigned short vref_mv;
83506d2e31SMarcelo Schmitt 
8498295a20SJonathan Cameron 	__be16 d16 __aligned(IIO_DMA_MINALIGN);
85506d2e31SMarcelo Schmitt 	u8 d8[2];
86506d2e31SMarcelo Schmitt };
87506d2e31SMarcelo Schmitt 
ad7292_spi_reg_read(struct ad7292_state * st,unsigned int addr)88506d2e31SMarcelo Schmitt static int ad7292_spi_reg_read(struct ad7292_state *st, unsigned int addr)
89506d2e31SMarcelo Schmitt {
90506d2e31SMarcelo Schmitt 	int ret;
91506d2e31SMarcelo Schmitt 
92506d2e31SMarcelo Schmitt 	st->d8[0] = AD7292_RD_FLAG_MSK(addr);
93506d2e31SMarcelo Schmitt 
94506d2e31SMarcelo Schmitt 	ret = spi_write_then_read(st->spi, st->d8, 1, &st->d16, 2);
95506d2e31SMarcelo Schmitt 	if (ret < 0)
96506d2e31SMarcelo Schmitt 		return ret;
97506d2e31SMarcelo Schmitt 
98506d2e31SMarcelo Schmitt 	return be16_to_cpu(st->d16);
99506d2e31SMarcelo Schmitt }
100506d2e31SMarcelo Schmitt 
ad7292_spi_subreg_read(struct ad7292_state * st,unsigned int addr,unsigned int sub_addr,unsigned int len)101506d2e31SMarcelo Schmitt static int ad7292_spi_subreg_read(struct ad7292_state *st, unsigned int addr,
102506d2e31SMarcelo Schmitt 				  unsigned int sub_addr, unsigned int len)
103506d2e31SMarcelo Schmitt {
104506d2e31SMarcelo Schmitt 	unsigned int shift = 16 - (8 * len);
105506d2e31SMarcelo Schmitt 	int ret;
106506d2e31SMarcelo Schmitt 
107506d2e31SMarcelo Schmitt 	st->d8[0] = AD7292_RD_FLAG_MSK(addr);
108506d2e31SMarcelo Schmitt 	st->d8[1] = sub_addr;
109506d2e31SMarcelo Schmitt 
110506d2e31SMarcelo Schmitt 	ret = spi_write_then_read(st->spi, st->d8, 2, &st->d16, len);
111506d2e31SMarcelo Schmitt 	if (ret < 0)
112506d2e31SMarcelo Schmitt 		return ret;
113506d2e31SMarcelo Schmitt 
114506d2e31SMarcelo Schmitt 	return (be16_to_cpu(st->d16) >> shift);
115506d2e31SMarcelo Schmitt }
116506d2e31SMarcelo Schmitt 
ad7292_single_conversion(struct ad7292_state * st,unsigned int chan_addr)117506d2e31SMarcelo Schmitt static int ad7292_single_conversion(struct ad7292_state *st,
118506d2e31SMarcelo Schmitt 				    unsigned int chan_addr)
119506d2e31SMarcelo Schmitt {
120506d2e31SMarcelo Schmitt 	int ret;
121506d2e31SMarcelo Schmitt 
122506d2e31SMarcelo Schmitt 	struct spi_transfer t[] = {
123506d2e31SMarcelo Schmitt 		{
124506d2e31SMarcelo Schmitt 			.tx_buf = &st->d8,
125506d2e31SMarcelo Schmitt 			.len = 4,
126e89602c3SSergiu Cuciurean 			.delay = {
127e89602c3SSergiu Cuciurean 				.value = 6,
128e89602c3SSergiu Cuciurean 				.unit = SPI_DELAY_UNIT_USECS
129e89602c3SSergiu Cuciurean 			},
130506d2e31SMarcelo Schmitt 		}, {
131506d2e31SMarcelo Schmitt 			.rx_buf = &st->d16,
132506d2e31SMarcelo Schmitt 			.len = 2,
133506d2e31SMarcelo Schmitt 		},
134506d2e31SMarcelo Schmitt 	};
135506d2e31SMarcelo Schmitt 
136506d2e31SMarcelo Schmitt 	st->d8[0] = chan_addr;
137506d2e31SMarcelo Schmitt 	st->d8[1] = AD7292_RD_FLAG_MSK(AD7292_REG_CONV_COMM);
138506d2e31SMarcelo Schmitt 
139506d2e31SMarcelo Schmitt 	ret = spi_sync_transfer(st->spi, t, ARRAY_SIZE(t));
140506d2e31SMarcelo Schmitt 
141506d2e31SMarcelo Schmitt 	if (ret < 0)
142506d2e31SMarcelo Schmitt 		return ret;
143506d2e31SMarcelo Schmitt 
144506d2e31SMarcelo Schmitt 	return be16_to_cpu(st->d16);
145506d2e31SMarcelo Schmitt }
146506d2e31SMarcelo Schmitt 
ad7292_vin_range_multiplier(struct ad7292_state * st,int channel)147506d2e31SMarcelo Schmitt static int ad7292_vin_range_multiplier(struct ad7292_state *st, int channel)
148506d2e31SMarcelo Schmitt {
149506d2e31SMarcelo Schmitt 	int samp_mode, range0, range1, factor = 1;
150506d2e31SMarcelo Schmitt 
151506d2e31SMarcelo Schmitt 	/*
152506d2e31SMarcelo Schmitt 	 * Every AD7292 ADC channel may have its input range adjusted according
153506d2e31SMarcelo Schmitt 	 * to the settings at the ADC sampling mode and VIN range subregisters.
154506d2e31SMarcelo Schmitt 	 * For a given channel, the minimum input range is equal to Vref, and it
155506d2e31SMarcelo Schmitt 	 * may be increased by a multiplier factor of 2 or 4 according to the
156506d2e31SMarcelo Schmitt 	 * following rule:
157506d2e31SMarcelo Schmitt 	 * If channel is being sampled with respect to AGND:
158506d2e31SMarcelo Schmitt 	 *	factor = 4 if VIN range0 and VIN range1 equal 0
159506d2e31SMarcelo Schmitt 	 *	factor = 2 if only one of VIN ranges equal 1
160506d2e31SMarcelo Schmitt 	 *	factor = 1 if both VIN range0 and VIN range1 equal 1
161506d2e31SMarcelo Schmitt 	 * If channel is being sampled with respect to AVDD:
162506d2e31SMarcelo Schmitt 	 *	factor = 4 if VIN range0 and VIN range1 equal 0
163506d2e31SMarcelo Schmitt 	 *	Behavior is undefined if any of VIN range doesn't equal 0
164506d2e31SMarcelo Schmitt 	 */
165506d2e31SMarcelo Schmitt 
166506d2e31SMarcelo Schmitt 	samp_mode = ad7292_spi_subreg_read(st, AD7292_REG_CONF_BANK,
167506d2e31SMarcelo Schmitt 					   AD7292_BANK_REG_SAMP_MODE, 2);
168506d2e31SMarcelo Schmitt 
169506d2e31SMarcelo Schmitt 	if (samp_mode < 0)
170506d2e31SMarcelo Schmitt 		return samp_mode;
171506d2e31SMarcelo Schmitt 
172506d2e31SMarcelo Schmitt 	range0 = ad7292_spi_subreg_read(st, AD7292_REG_CONF_BANK,
173506d2e31SMarcelo Schmitt 					AD7292_BANK_REG_VIN_RNG0, 2);
174506d2e31SMarcelo Schmitt 
175506d2e31SMarcelo Schmitt 	if (range0 < 0)
176506d2e31SMarcelo Schmitt 		return range0;
177506d2e31SMarcelo Schmitt 
178506d2e31SMarcelo Schmitt 	range1 = ad7292_spi_subreg_read(st, AD7292_REG_CONF_BANK,
179506d2e31SMarcelo Schmitt 					AD7292_BANK_REG_VIN_RNG1, 2);
180506d2e31SMarcelo Schmitt 
181506d2e31SMarcelo Schmitt 	if (range1 < 0)
182506d2e31SMarcelo Schmitt 		return range1;
183506d2e31SMarcelo Schmitt 
184506d2e31SMarcelo Schmitt 	if (AD7292_CH_SAMP_MODE(samp_mode, channel)) {
185506d2e31SMarcelo Schmitt 		/* Sampling with respect to AGND */
186506d2e31SMarcelo Schmitt 		if (!AD7292_CH_VIN_RANGE(range0, channel))
187506d2e31SMarcelo Schmitt 			factor *= 2;
188506d2e31SMarcelo Schmitt 
189506d2e31SMarcelo Schmitt 		if (!AD7292_CH_VIN_RANGE(range1, channel))
190506d2e31SMarcelo Schmitt 			factor *= 2;
191506d2e31SMarcelo Schmitt 
192506d2e31SMarcelo Schmitt 	} else {
193506d2e31SMarcelo Schmitt 		/* Sampling with respect to AVDD */
194506d2e31SMarcelo Schmitt 		if (AD7292_CH_VIN_RANGE(range0, channel) ||
195506d2e31SMarcelo Schmitt 		    AD7292_CH_VIN_RANGE(range1, channel))
196506d2e31SMarcelo Schmitt 			return -EPERM;
197506d2e31SMarcelo Schmitt 
198506d2e31SMarcelo Schmitt 		factor = 4;
199506d2e31SMarcelo Schmitt 	}
200506d2e31SMarcelo Schmitt 
201506d2e31SMarcelo Schmitt 	return factor;
202506d2e31SMarcelo Schmitt }
203506d2e31SMarcelo Schmitt 
ad7292_read_raw(struct iio_dev * indio_dev,const struct iio_chan_spec * chan,int * val,int * val2,long info)204506d2e31SMarcelo Schmitt static int ad7292_read_raw(struct iio_dev *indio_dev,
205506d2e31SMarcelo Schmitt 			   const struct iio_chan_spec *chan,
206506d2e31SMarcelo Schmitt 			   int *val, int *val2, long info)
207506d2e31SMarcelo Schmitt {
208506d2e31SMarcelo Schmitt 	struct ad7292_state *st = iio_priv(indio_dev);
209506d2e31SMarcelo Schmitt 	unsigned int ch_addr;
210506d2e31SMarcelo Schmitt 	int ret;
211506d2e31SMarcelo Schmitt 
212506d2e31SMarcelo Schmitt 	switch (info) {
213506d2e31SMarcelo Schmitt 	case IIO_CHAN_INFO_RAW:
214506d2e31SMarcelo Schmitt 		ch_addr = AD7292_REG_ADC_CH(chan->channel);
215506d2e31SMarcelo Schmitt 		ret = ad7292_single_conversion(st, ch_addr);
216506d2e31SMarcelo Schmitt 		if (ret < 0)
217506d2e31SMarcelo Schmitt 			return ret;
218506d2e31SMarcelo Schmitt 
219506d2e31SMarcelo Schmitt 		*val = AD7292_ADC_DATA(ret);
220506d2e31SMarcelo Schmitt 
221506d2e31SMarcelo Schmitt 		return IIO_VAL_INT;
222506d2e31SMarcelo Schmitt 	case IIO_CHAN_INFO_SCALE:
223506d2e31SMarcelo Schmitt 		/*
224506d2e31SMarcelo Schmitt 		 * To convert a raw value to standard units, the IIO defines
225506d2e31SMarcelo Schmitt 		 * this formula: Scaled value = (raw + offset) * scale.
226506d2e31SMarcelo Schmitt 		 * For the scale to be a correct multiplier for (raw + offset),
227506d2e31SMarcelo Schmitt 		 * it must be calculated as the input range divided by the
228506d2e31SMarcelo Schmitt 		 * number of possible distinct input values. Given the ADC data
229506d2e31SMarcelo Schmitt 		 * is 10 bit long, it may assume 2^10 distinct values.
230506d2e31SMarcelo Schmitt 		 * Hence, scale = range / 2^10. The IIO_VAL_FRACTIONAL_LOG2
231506d2e31SMarcelo Schmitt 		 * return type indicates to the IIO API to divide *val by 2 to
232506d2e31SMarcelo Schmitt 		 * the power of *val2 when returning from read_raw.
233506d2e31SMarcelo Schmitt 		 */
234506d2e31SMarcelo Schmitt 
235506d2e31SMarcelo Schmitt 		ret = ad7292_vin_range_multiplier(st, chan->channel);
236506d2e31SMarcelo Schmitt 		if (ret < 0)
237506d2e31SMarcelo Schmitt 			return ret;
238506d2e31SMarcelo Schmitt 
239506d2e31SMarcelo Schmitt 		*val = st->vref_mv * ret;
240506d2e31SMarcelo Schmitt 		*val2 = 10;
241506d2e31SMarcelo Schmitt 		return IIO_VAL_FRACTIONAL_LOG2;
242506d2e31SMarcelo Schmitt 	default:
243506d2e31SMarcelo Schmitt 		break;
244506d2e31SMarcelo Schmitt 	}
245506d2e31SMarcelo Schmitt 	return -EINVAL;
246506d2e31SMarcelo Schmitt }
247506d2e31SMarcelo Schmitt 
248506d2e31SMarcelo Schmitt static const struct iio_info ad7292_info = {
249506d2e31SMarcelo Schmitt 	.read_raw = ad7292_read_raw,
250506d2e31SMarcelo Schmitt };
251506d2e31SMarcelo Schmitt 
ad7292_regulator_disable(void * data)252506d2e31SMarcelo Schmitt static void ad7292_regulator_disable(void *data)
253506d2e31SMarcelo Schmitt {
254506d2e31SMarcelo Schmitt 	struct ad7292_state *st = data;
255506d2e31SMarcelo Schmitt 
256506d2e31SMarcelo Schmitt 	regulator_disable(st->reg);
257506d2e31SMarcelo Schmitt }
258506d2e31SMarcelo Schmitt 
ad7292_probe(struct spi_device * spi)259506d2e31SMarcelo Schmitt static int ad7292_probe(struct spi_device *spi)
260506d2e31SMarcelo Schmitt {
261506d2e31SMarcelo Schmitt 	struct ad7292_state *st;
262506d2e31SMarcelo Schmitt 	struct iio_dev *indio_dev;
263506d2e31SMarcelo Schmitt 	struct device_node *child;
264707182b4SGuoqing Chi 	bool diff_channels = false;
265506d2e31SMarcelo Schmitt 	int ret;
266506d2e31SMarcelo Schmitt 
267506d2e31SMarcelo Schmitt 	indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*st));
268506d2e31SMarcelo Schmitt 	if (!indio_dev)
269506d2e31SMarcelo Schmitt 		return -ENOMEM;
270506d2e31SMarcelo Schmitt 
271506d2e31SMarcelo Schmitt 	st = iio_priv(indio_dev);
272506d2e31SMarcelo Schmitt 	st->spi = spi;
273506d2e31SMarcelo Schmitt 
274506d2e31SMarcelo Schmitt 	ret = ad7292_spi_reg_read(st, AD7292_REG_VENDOR_ID);
275506d2e31SMarcelo Schmitt 	if (ret != ADI_VENDOR_ID) {
276506d2e31SMarcelo Schmitt 		dev_err(&spi->dev, "Wrong vendor id 0x%x\n", ret);
277506d2e31SMarcelo Schmitt 		return -EINVAL;
278506d2e31SMarcelo Schmitt 	}
279506d2e31SMarcelo Schmitt 
280506d2e31SMarcelo Schmitt 	st->reg = devm_regulator_get_optional(&spi->dev, "vref");
281506d2e31SMarcelo Schmitt 	if (!IS_ERR(st->reg)) {
282506d2e31SMarcelo Schmitt 		ret = regulator_enable(st->reg);
283506d2e31SMarcelo Schmitt 		if (ret) {
284506d2e31SMarcelo Schmitt 			dev_err(&spi->dev,
285506d2e31SMarcelo Schmitt 				"Failed to enable external vref supply\n");
286506d2e31SMarcelo Schmitt 			return ret;
287506d2e31SMarcelo Schmitt 		}
288506d2e31SMarcelo Schmitt 
289506d2e31SMarcelo Schmitt 		ret = devm_add_action_or_reset(&spi->dev,
290506d2e31SMarcelo Schmitt 					       ad7292_regulator_disable, st);
29122b42776SMatti Vaittinen 		if (ret)
292506d2e31SMarcelo Schmitt 			return ret;
293506d2e31SMarcelo Schmitt 
294506d2e31SMarcelo Schmitt 		ret = regulator_get_voltage(st->reg);
295506d2e31SMarcelo Schmitt 		if (ret < 0)
296506d2e31SMarcelo Schmitt 			return ret;
297506d2e31SMarcelo Schmitt 
298506d2e31SMarcelo Schmitt 		st->vref_mv = ret / 1000;
299506d2e31SMarcelo Schmitt 	} else {
300506d2e31SMarcelo Schmitt 		/* Use the internal voltage reference. */
301506d2e31SMarcelo Schmitt 		st->vref_mv = 1250;
302506d2e31SMarcelo Schmitt 	}
303506d2e31SMarcelo Schmitt 
304506d2e31SMarcelo Schmitt 	indio_dev->name = spi_get_device_id(spi)->name;
305506d2e31SMarcelo Schmitt 	indio_dev->modes = INDIO_DIRECT_MODE;
306506d2e31SMarcelo Schmitt 	indio_dev->info = &ad7292_info;
307506d2e31SMarcelo Schmitt 
308506d2e31SMarcelo Schmitt 	for_each_available_child_of_node(spi->dev.of_node, child) {
309506d2e31SMarcelo Schmitt 		diff_channels = of_property_read_bool(child, "diff-channels");
310b8a533f3SNuno Sá 		if (diff_channels) {
311b8a533f3SNuno Sá 			of_node_put(child);
312506d2e31SMarcelo Schmitt 			break;
313506d2e31SMarcelo Schmitt 		}
314b8a533f3SNuno Sá 	}
315506d2e31SMarcelo Schmitt 
316506d2e31SMarcelo Schmitt 	if (diff_channels) {
317506d2e31SMarcelo Schmitt 		indio_dev->num_channels = ARRAY_SIZE(ad7292_channels_diff);
318506d2e31SMarcelo Schmitt 		indio_dev->channels = ad7292_channels_diff;
319506d2e31SMarcelo Schmitt 	} else {
320506d2e31SMarcelo Schmitt 		indio_dev->num_channels = ARRAY_SIZE(ad7292_channels);
321506d2e31SMarcelo Schmitt 		indio_dev->channels = ad7292_channels;
322506d2e31SMarcelo Schmitt 	}
323506d2e31SMarcelo Schmitt 
324506d2e31SMarcelo Schmitt 	return devm_iio_device_register(&spi->dev, indio_dev);
325506d2e31SMarcelo Schmitt }
326506d2e31SMarcelo Schmitt 
327506d2e31SMarcelo Schmitt static const struct spi_device_id ad7292_id_table[] = {
328506d2e31SMarcelo Schmitt 	{ "ad7292", 0 },
329506d2e31SMarcelo Schmitt 	{}
330506d2e31SMarcelo Schmitt };
331506d2e31SMarcelo Schmitt MODULE_DEVICE_TABLE(spi, ad7292_id_table);
332506d2e31SMarcelo Schmitt 
333506d2e31SMarcelo Schmitt static const struct of_device_id ad7292_of_match[] = {
334506d2e31SMarcelo Schmitt 	{ .compatible = "adi,ad7292" },
335506d2e31SMarcelo Schmitt 	{ },
336506d2e31SMarcelo Schmitt };
337506d2e31SMarcelo Schmitt MODULE_DEVICE_TABLE(of, ad7292_of_match);
338506d2e31SMarcelo Schmitt 
339506d2e31SMarcelo Schmitt static struct spi_driver ad7292_driver = {
340506d2e31SMarcelo Schmitt 	.driver = {
341506d2e31SMarcelo Schmitt 		.name = "ad7292",
342506d2e31SMarcelo Schmitt 		.of_match_table = ad7292_of_match,
343506d2e31SMarcelo Schmitt 	},
344506d2e31SMarcelo Schmitt 	.probe = ad7292_probe,
345506d2e31SMarcelo Schmitt 	.id_table = ad7292_id_table,
346506d2e31SMarcelo Schmitt };
347506d2e31SMarcelo Schmitt module_spi_driver(ad7292_driver);
348506d2e31SMarcelo Schmitt 
349506d2e31SMarcelo Schmitt MODULE_AUTHOR("Marcelo Schmitt <marcelo.schmitt1@gmail.com>");
350506d2e31SMarcelo Schmitt MODULE_DESCRIPTION("Analog Devices AD7292 ADC driver");
351506d2e31SMarcelo Schmitt MODULE_LICENSE("GPL v2");
352