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