dm writecache: add cond_resched to loop in persistent_memory_claim()
[linux/fpc-iii.git] / drivers / iio / adc / ad7124.c
bloba3c0647a539124dabd65608aa3d59fa08042d4c8
1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3 * AD7124 SPI ADC driver
5 * Copyright 2018 Analog Devices Inc.
6 */
7 #include <linux/bitfield.h>
8 #include <linux/clk.h>
9 #include <linux/delay.h>
10 #include <linux/device.h>
11 #include <linux/err.h>
12 #include <linux/interrupt.h>
13 #include <linux/kernel.h>
14 #include <linux/module.h>
15 #include <linux/regulator/consumer.h>
16 #include <linux/spi/spi.h>
18 #include <linux/iio/iio.h>
19 #include <linux/iio/adc/ad_sigma_delta.h>
20 #include <linux/iio/sysfs.h>
22 /* AD7124 registers */
23 #define AD7124_COMMS 0x00
24 #define AD7124_STATUS 0x00
25 #define AD7124_ADC_CONTROL 0x01
26 #define AD7124_DATA 0x02
27 #define AD7124_IO_CONTROL_1 0x03
28 #define AD7124_IO_CONTROL_2 0x04
29 #define AD7124_ID 0x05
30 #define AD7124_ERROR 0x06
31 #define AD7124_ERROR_EN 0x07
32 #define AD7124_MCLK_COUNT 0x08
33 #define AD7124_CHANNEL(x) (0x09 + (x))
34 #define AD7124_CONFIG(x) (0x19 + (x))
35 #define AD7124_FILTER(x) (0x21 + (x))
36 #define AD7124_OFFSET(x) (0x29 + (x))
37 #define AD7124_GAIN(x) (0x31 + (x))
39 /* AD7124_STATUS */
40 #define AD7124_STATUS_POR_FLAG_MSK BIT(4)
42 /* AD7124_ADC_CONTROL */
43 #define AD7124_ADC_CTRL_REF_EN_MSK BIT(8)
44 #define AD7124_ADC_CTRL_REF_EN(x) FIELD_PREP(AD7124_ADC_CTRL_REF_EN_MSK, x)
45 #define AD7124_ADC_CTRL_PWR_MSK GENMASK(7, 6)
46 #define AD7124_ADC_CTRL_PWR(x) FIELD_PREP(AD7124_ADC_CTRL_PWR_MSK, x)
47 #define AD7124_ADC_CTRL_MODE_MSK GENMASK(5, 2)
48 #define AD7124_ADC_CTRL_MODE(x) FIELD_PREP(AD7124_ADC_CTRL_MODE_MSK, x)
50 /* AD7124_CHANNEL_X */
51 #define AD7124_CHANNEL_EN_MSK BIT(15)
52 #define AD7124_CHANNEL_EN(x) FIELD_PREP(AD7124_CHANNEL_EN_MSK, x)
53 #define AD7124_CHANNEL_SETUP_MSK GENMASK(14, 12)
54 #define AD7124_CHANNEL_SETUP(x) FIELD_PREP(AD7124_CHANNEL_SETUP_MSK, x)
55 #define AD7124_CHANNEL_AINP_MSK GENMASK(9, 5)
56 #define AD7124_CHANNEL_AINP(x) FIELD_PREP(AD7124_CHANNEL_AINP_MSK, x)
57 #define AD7124_CHANNEL_AINM_MSK GENMASK(4, 0)
58 #define AD7124_CHANNEL_AINM(x) FIELD_PREP(AD7124_CHANNEL_AINM_MSK, x)
60 /* AD7124_CONFIG_X */
61 #define AD7124_CONFIG_BIPOLAR_MSK BIT(11)
62 #define AD7124_CONFIG_BIPOLAR(x) FIELD_PREP(AD7124_CONFIG_BIPOLAR_MSK, x)
63 #define AD7124_CONFIG_REF_SEL_MSK GENMASK(4, 3)
64 #define AD7124_CONFIG_REF_SEL(x) FIELD_PREP(AD7124_CONFIG_REF_SEL_MSK, x)
65 #define AD7124_CONFIG_PGA_MSK GENMASK(2, 0)
66 #define AD7124_CONFIG_PGA(x) FIELD_PREP(AD7124_CONFIG_PGA_MSK, x)
67 #define AD7124_CONFIG_IN_BUFF_MSK GENMASK(7, 6)
68 #define AD7124_CONFIG_IN_BUFF(x) FIELD_PREP(AD7124_CONFIG_IN_BUFF_MSK, x)
70 /* AD7124_FILTER_X */
71 #define AD7124_FILTER_FS_MSK GENMASK(10, 0)
72 #define AD7124_FILTER_FS(x) FIELD_PREP(AD7124_FILTER_FS_MSK, x)
73 #define AD7124_FILTER_TYPE_MSK GENMASK(23, 21)
74 #define AD7124_FILTER_TYPE_SEL(x) FIELD_PREP(AD7124_FILTER_TYPE_MSK, x)
76 #define AD7124_SINC3_FILTER 2
77 #define AD7124_SINC4_FILTER 0
79 enum ad7124_ids {
80 ID_AD7124_4,
81 ID_AD7124_8,
84 enum ad7124_ref_sel {
85 AD7124_REFIN1,
86 AD7124_REFIN2,
87 AD7124_INT_REF,
88 AD7124_AVDD_REF,
91 enum ad7124_power_mode {
92 AD7124_LOW_POWER,
93 AD7124_MID_POWER,
94 AD7124_FULL_POWER,
97 static const unsigned int ad7124_gain[8] = {
98 1, 2, 4, 8, 16, 32, 64, 128
101 static const unsigned int ad7124_reg_size[] = {
102 1, 2, 3, 3, 2, 1, 3, 3, 1, 2, 2, 2, 2,
103 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
104 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3,
105 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
106 3, 3, 3, 3, 3
109 static const int ad7124_master_clk_freq_hz[3] = {
110 [AD7124_LOW_POWER] = 76800,
111 [AD7124_MID_POWER] = 153600,
112 [AD7124_FULL_POWER] = 614400,
115 static const char * const ad7124_ref_names[] = {
116 [AD7124_REFIN1] = "refin1",
117 [AD7124_REFIN2] = "refin2",
118 [AD7124_INT_REF] = "int",
119 [AD7124_AVDD_REF] = "avdd",
122 struct ad7124_chip_info {
123 unsigned int num_inputs;
126 struct ad7124_channel_config {
127 enum ad7124_ref_sel refsel;
128 bool bipolar;
129 bool buf_positive;
130 bool buf_negative;
131 unsigned int ain;
132 unsigned int vref_mv;
133 unsigned int pga_bits;
134 unsigned int odr;
135 unsigned int filter_type;
138 struct ad7124_state {
139 const struct ad7124_chip_info *chip_info;
140 struct ad_sigma_delta sd;
141 struct ad7124_channel_config *channel_config;
142 struct regulator *vref[4];
143 struct clk *mclk;
144 unsigned int adc_control;
145 unsigned int num_channels;
148 static const struct iio_chan_spec ad7124_channel_template = {
149 .type = IIO_VOLTAGE,
150 .indexed = 1,
151 .differential = 1,
152 .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |
153 BIT(IIO_CHAN_INFO_SCALE) |
154 BIT(IIO_CHAN_INFO_OFFSET) |
155 BIT(IIO_CHAN_INFO_SAMP_FREQ) |
156 BIT(IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY),
157 .scan_type = {
158 .sign = 'u',
159 .realbits = 24,
160 .storagebits = 32,
161 .shift = 8,
162 .endianness = IIO_BE,
166 static struct ad7124_chip_info ad7124_chip_info_tbl[] = {
167 [ID_AD7124_4] = {
168 .num_inputs = 8,
170 [ID_AD7124_8] = {
171 .num_inputs = 16,
175 static int ad7124_find_closest_match(const int *array,
176 unsigned int size, int val)
178 int i, idx;
179 unsigned int diff_new, diff_old;
181 diff_old = U32_MAX;
182 idx = 0;
184 for (i = 0; i < size; i++) {
185 diff_new = abs(val - array[i]);
186 if (diff_new < diff_old) {
187 diff_old = diff_new;
188 idx = i;
192 return idx;
195 static int ad7124_spi_write_mask(struct ad7124_state *st,
196 unsigned int addr,
197 unsigned long mask,
198 unsigned int val,
199 unsigned int bytes)
201 unsigned int readval;
202 int ret;
204 ret = ad_sd_read_reg(&st->sd, addr, bytes, &readval);
205 if (ret < 0)
206 return ret;
208 readval &= ~mask;
209 readval |= val;
211 return ad_sd_write_reg(&st->sd, addr, bytes, readval);
214 static int ad7124_set_mode(struct ad_sigma_delta *sd,
215 enum ad_sigma_delta_mode mode)
217 struct ad7124_state *st = container_of(sd, struct ad7124_state, sd);
219 st->adc_control &= ~AD7124_ADC_CTRL_MODE_MSK;
220 st->adc_control |= AD7124_ADC_CTRL_MODE(mode);
222 return ad_sd_write_reg(&st->sd, AD7124_ADC_CONTROL, 2, st->adc_control);
225 static int ad7124_set_channel(struct ad_sigma_delta *sd, unsigned int channel)
227 struct ad7124_state *st = container_of(sd, struct ad7124_state, sd);
228 unsigned int val;
230 val = st->channel_config[channel].ain | AD7124_CHANNEL_EN(1) |
231 AD7124_CHANNEL_SETUP(channel);
233 return ad_sd_write_reg(&st->sd, AD7124_CHANNEL(channel), 2, val);
236 static const struct ad_sigma_delta_info ad7124_sigma_delta_info = {
237 .set_channel = ad7124_set_channel,
238 .set_mode = ad7124_set_mode,
239 .has_registers = true,
240 .addr_shift = 0,
241 .read_mask = BIT(6),
242 .data_reg = AD7124_DATA,
243 .irq_flags = IRQF_TRIGGER_FALLING,
246 static int ad7124_set_channel_odr(struct ad7124_state *st,
247 unsigned int channel,
248 unsigned int odr)
250 unsigned int fclk, odr_sel_bits;
251 int ret;
253 fclk = clk_get_rate(st->mclk);
255 * FS[10:0] = fCLK / (fADC x 32) where:
256 * fADC is the output data rate
257 * fCLK is the master clock frequency
258 * FS[10:0] are the bits in the filter register
259 * FS[10:0] can have a value from 1 to 2047
261 odr_sel_bits = DIV_ROUND_CLOSEST(fclk, odr * 32);
262 if (odr_sel_bits < 1)
263 odr_sel_bits = 1;
264 else if (odr_sel_bits > 2047)
265 odr_sel_bits = 2047;
267 ret = ad7124_spi_write_mask(st, AD7124_FILTER(channel),
268 AD7124_FILTER_FS_MSK,
269 AD7124_FILTER_FS(odr_sel_bits), 3);
270 if (ret < 0)
271 return ret;
272 /* fADC = fCLK / (FS[10:0] x 32) */
273 st->channel_config[channel].odr =
274 DIV_ROUND_CLOSEST(fclk, odr_sel_bits * 32);
276 return 0;
279 static int ad7124_set_channel_gain(struct ad7124_state *st,
280 unsigned int channel,
281 unsigned int gain)
283 unsigned int res;
284 int ret;
286 res = ad7124_find_closest_match(ad7124_gain,
287 ARRAY_SIZE(ad7124_gain), gain);
288 ret = ad7124_spi_write_mask(st, AD7124_CONFIG(channel),
289 AD7124_CONFIG_PGA_MSK,
290 AD7124_CONFIG_PGA(res), 2);
291 if (ret < 0)
292 return ret;
294 st->channel_config[channel].pga_bits = res;
296 return 0;
299 static int ad7124_get_3db_filter_freq(struct ad7124_state *st,
300 unsigned int channel)
302 unsigned int fadc;
304 fadc = st->channel_config[channel].odr;
306 switch (st->channel_config[channel].filter_type) {
307 case AD7124_SINC3_FILTER:
308 return DIV_ROUND_CLOSEST(fadc * 230, 1000);
309 case AD7124_SINC4_FILTER:
310 return DIV_ROUND_CLOSEST(fadc * 262, 1000);
311 default:
312 return -EINVAL;
316 static int ad7124_set_3db_filter_freq(struct ad7124_state *st,
317 unsigned int channel,
318 unsigned int freq)
320 unsigned int sinc4_3db_odr;
321 unsigned int sinc3_3db_odr;
322 unsigned int new_filter;
323 unsigned int new_odr;
325 sinc4_3db_odr = DIV_ROUND_CLOSEST(freq * 1000, 230);
326 sinc3_3db_odr = DIV_ROUND_CLOSEST(freq * 1000, 262);
328 if (sinc4_3db_odr > sinc3_3db_odr) {
329 new_filter = AD7124_SINC3_FILTER;
330 new_odr = sinc4_3db_odr;
331 } else {
332 new_filter = AD7124_SINC4_FILTER;
333 new_odr = sinc3_3db_odr;
336 if (st->channel_config[channel].filter_type != new_filter) {
337 int ret;
339 st->channel_config[channel].filter_type = new_filter;
340 ret = ad7124_spi_write_mask(st, AD7124_FILTER(channel),
341 AD7124_FILTER_TYPE_MSK,
342 AD7124_FILTER_TYPE_SEL(new_filter),
344 if (ret < 0)
345 return ret;
348 return ad7124_set_channel_odr(st, channel, new_odr);
351 static int ad7124_read_raw(struct iio_dev *indio_dev,
352 struct iio_chan_spec const *chan,
353 int *val, int *val2, long info)
355 struct ad7124_state *st = iio_priv(indio_dev);
356 int idx, ret;
358 switch (info) {
359 case IIO_CHAN_INFO_RAW:
360 ret = ad_sigma_delta_single_conversion(indio_dev, chan, val);
361 if (ret < 0)
362 return ret;
364 /* After the conversion is performed, disable the channel */
365 ret = ad_sd_write_reg(&st->sd,
366 AD7124_CHANNEL(chan->address), 2,
367 st->channel_config[chan->address].ain |
368 AD7124_CHANNEL_EN(0));
369 if (ret < 0)
370 return ret;
372 return IIO_VAL_INT;
373 case IIO_CHAN_INFO_SCALE:
374 idx = st->channel_config[chan->address].pga_bits;
375 *val = st->channel_config[chan->address].vref_mv;
376 if (st->channel_config[chan->address].bipolar)
377 *val2 = chan->scan_type.realbits - 1 + idx;
378 else
379 *val2 = chan->scan_type.realbits + idx;
381 return IIO_VAL_FRACTIONAL_LOG2;
382 case IIO_CHAN_INFO_OFFSET:
383 if (st->channel_config[chan->address].bipolar)
384 *val = -(1 << (chan->scan_type.realbits - 1));
385 else
386 *val = 0;
388 return IIO_VAL_INT;
389 case IIO_CHAN_INFO_SAMP_FREQ:
390 *val = st->channel_config[chan->address].odr;
392 return IIO_VAL_INT;
393 case IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY:
394 *val = ad7124_get_3db_filter_freq(st, chan->scan_index);
395 return IIO_VAL_INT;
396 default:
397 return -EINVAL;
401 static int ad7124_write_raw(struct iio_dev *indio_dev,
402 struct iio_chan_spec const *chan,
403 int val, int val2, long info)
405 struct ad7124_state *st = iio_priv(indio_dev);
406 unsigned int res, gain, full_scale, vref;
408 switch (info) {
409 case IIO_CHAN_INFO_SAMP_FREQ:
410 if (val2 != 0)
411 return -EINVAL;
413 return ad7124_set_channel_odr(st, chan->address, val);
414 case IIO_CHAN_INFO_SCALE:
415 if (val != 0)
416 return -EINVAL;
418 if (st->channel_config[chan->address].bipolar)
419 full_scale = 1 << (chan->scan_type.realbits - 1);
420 else
421 full_scale = 1 << chan->scan_type.realbits;
423 vref = st->channel_config[chan->address].vref_mv * 1000000LL;
424 res = DIV_ROUND_CLOSEST(vref, full_scale);
425 gain = DIV_ROUND_CLOSEST(res, val2);
427 return ad7124_set_channel_gain(st, chan->address, gain);
428 case IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY:
429 if (val2 != 0)
430 return -EINVAL;
432 return ad7124_set_3db_filter_freq(st, chan->address, val);
433 default:
434 return -EINVAL;
438 static int ad7124_reg_access(struct iio_dev *indio_dev,
439 unsigned int reg,
440 unsigned int writeval,
441 unsigned int *readval)
443 struct ad7124_state *st = iio_priv(indio_dev);
444 int ret;
446 if (reg >= ARRAY_SIZE(ad7124_reg_size))
447 return -EINVAL;
449 if (readval)
450 ret = ad_sd_read_reg(&st->sd, reg, ad7124_reg_size[reg],
451 readval);
452 else
453 ret = ad_sd_write_reg(&st->sd, reg, ad7124_reg_size[reg],
454 writeval);
456 return ret;
459 static IIO_CONST_ATTR(in_voltage_scale_available,
460 "0.000001164 0.000002328 0.000004656 0.000009313 0.000018626 0.000037252 0.000074505 0.000149011 0.000298023");
462 static struct attribute *ad7124_attributes[] = {
463 &iio_const_attr_in_voltage_scale_available.dev_attr.attr,
464 NULL,
467 static const struct attribute_group ad7124_attrs_group = {
468 .attrs = ad7124_attributes,
471 static const struct iio_info ad7124_info = {
472 .read_raw = ad7124_read_raw,
473 .write_raw = ad7124_write_raw,
474 .debugfs_reg_access = &ad7124_reg_access,
475 .validate_trigger = ad_sd_validate_trigger,
476 .attrs = &ad7124_attrs_group,
479 static int ad7124_soft_reset(struct ad7124_state *st)
481 unsigned int readval, timeout;
482 int ret;
484 ret = ad_sd_reset(&st->sd, 64);
485 if (ret < 0)
486 return ret;
488 timeout = 100;
489 do {
490 ret = ad_sd_read_reg(&st->sd, AD7124_STATUS, 1, &readval);
491 if (ret < 0)
492 return ret;
494 if (!(readval & AD7124_STATUS_POR_FLAG_MSK))
495 return 0;
497 /* The AD7124 requires typically 2ms to power up and settle */
498 usleep_range(100, 2000);
499 } while (--timeout);
501 dev_err(&st->sd.spi->dev, "Soft reset failed\n");
503 return -EIO;
506 static int ad7124_init_channel_vref(struct ad7124_state *st,
507 unsigned int channel_number)
509 unsigned int refsel = st->channel_config[channel_number].refsel;
511 switch (refsel) {
512 case AD7124_REFIN1:
513 case AD7124_REFIN2:
514 case AD7124_AVDD_REF:
515 if (IS_ERR(st->vref[refsel])) {
516 dev_err(&st->sd.spi->dev,
517 "Error, trying to use external voltage reference without a %s regulator.\n",
518 ad7124_ref_names[refsel]);
519 return PTR_ERR(st->vref[refsel]);
521 st->channel_config[channel_number].vref_mv =
522 regulator_get_voltage(st->vref[refsel]);
523 /* Conversion from uV to mV */
524 st->channel_config[channel_number].vref_mv /= 1000;
525 break;
526 case AD7124_INT_REF:
527 st->channel_config[channel_number].vref_mv = 2500;
528 st->adc_control &= ~AD7124_ADC_CTRL_REF_EN_MSK;
529 st->adc_control |= AD7124_ADC_CTRL_REF_EN(1);
530 return ad_sd_write_reg(&st->sd, AD7124_ADC_CONTROL,
531 2, st->adc_control);
532 default:
533 dev_err(&st->sd.spi->dev, "Invalid reference %d\n", refsel);
534 return -EINVAL;
537 return 0;
540 static int ad7124_of_parse_channel_config(struct iio_dev *indio_dev,
541 struct device_node *np)
543 struct ad7124_state *st = iio_priv(indio_dev);
544 struct device_node *child;
545 struct iio_chan_spec *chan;
546 struct ad7124_channel_config *chan_config;
547 unsigned int ain[2], channel = 0, tmp;
548 int ret;
550 st->num_channels = of_get_available_child_count(np);
551 if (!st->num_channels) {
552 dev_err(indio_dev->dev.parent, "no channel children\n");
553 return -ENODEV;
556 chan = devm_kcalloc(indio_dev->dev.parent, st->num_channels,
557 sizeof(*chan), GFP_KERNEL);
558 if (!chan)
559 return -ENOMEM;
561 chan_config = devm_kcalloc(indio_dev->dev.parent, st->num_channels,
562 sizeof(*chan_config), GFP_KERNEL);
563 if (!chan_config)
564 return -ENOMEM;
566 indio_dev->channels = chan;
567 indio_dev->num_channels = st->num_channels;
568 st->channel_config = chan_config;
570 for_each_available_child_of_node(np, child) {
571 ret = of_property_read_u32(child, "reg", &channel);
572 if (ret)
573 goto err;
575 ret = of_property_read_u32_array(child, "diff-channels",
576 ain, 2);
577 if (ret)
578 goto err;
580 st->channel_config[channel].ain = AD7124_CHANNEL_AINP(ain[0]) |
581 AD7124_CHANNEL_AINM(ain[1]);
582 st->channel_config[channel].bipolar =
583 of_property_read_bool(child, "bipolar");
585 ret = of_property_read_u32(child, "adi,reference-select", &tmp);
586 if (ret)
587 st->channel_config[channel].refsel = AD7124_INT_REF;
588 else
589 st->channel_config[channel].refsel = tmp;
591 st->channel_config[channel].buf_positive =
592 of_property_read_bool(child, "adi,buffered-positive");
593 st->channel_config[channel].buf_negative =
594 of_property_read_bool(child, "adi,buffered-negative");
596 chan[channel] = ad7124_channel_template;
597 chan[channel].address = channel;
598 chan[channel].scan_index = channel;
599 chan[channel].channel = ain[0];
600 chan[channel].channel2 = ain[1];
603 return 0;
604 err:
605 of_node_put(child);
607 return ret;
610 static int ad7124_setup(struct ad7124_state *st)
612 unsigned int val, fclk, power_mode;
613 int i, ret, tmp;
615 fclk = clk_get_rate(st->mclk);
616 if (!fclk)
617 return -EINVAL;
619 /* The power mode changes the master clock frequency */
620 power_mode = ad7124_find_closest_match(ad7124_master_clk_freq_hz,
621 ARRAY_SIZE(ad7124_master_clk_freq_hz),
622 fclk);
623 if (fclk != ad7124_master_clk_freq_hz[power_mode]) {
624 ret = clk_set_rate(st->mclk, fclk);
625 if (ret)
626 return ret;
629 /* Set the power mode */
630 st->adc_control &= ~AD7124_ADC_CTRL_PWR_MSK;
631 st->adc_control |= AD7124_ADC_CTRL_PWR(power_mode);
632 ret = ad_sd_write_reg(&st->sd, AD7124_ADC_CONTROL, 2, st->adc_control);
633 if (ret < 0)
634 return ret;
636 for (i = 0; i < st->num_channels; i++) {
637 val = st->channel_config[i].ain | AD7124_CHANNEL_SETUP(i);
638 ret = ad_sd_write_reg(&st->sd, AD7124_CHANNEL(i), 2, val);
639 if (ret < 0)
640 return ret;
642 ret = ad7124_init_channel_vref(st, i);
643 if (ret < 0)
644 return ret;
646 tmp = (st->channel_config[i].buf_positive << 1) +
647 st->channel_config[i].buf_negative;
649 val = AD7124_CONFIG_BIPOLAR(st->channel_config[i].bipolar) |
650 AD7124_CONFIG_REF_SEL(st->channel_config[i].refsel) |
651 AD7124_CONFIG_IN_BUFF(tmp);
652 ret = ad_sd_write_reg(&st->sd, AD7124_CONFIG(i), 2, val);
653 if (ret < 0)
654 return ret;
656 * 9.38 SPS is the minimum output data rate supported
657 * regardless of the selected power mode. Round it up to 10 and
658 * set all the enabled channels to this default value.
660 ret = ad7124_set_channel_odr(st, i, 10);
663 return ret;
666 static int ad7124_probe(struct spi_device *spi)
668 const struct spi_device_id *id;
669 struct ad7124_state *st;
670 struct iio_dev *indio_dev;
671 int i, ret;
673 indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*st));
674 if (!indio_dev)
675 return -ENOMEM;
677 st = iio_priv(indio_dev);
679 id = spi_get_device_id(spi);
680 st->chip_info = &ad7124_chip_info_tbl[id->driver_data];
682 ad_sd_init(&st->sd, indio_dev, spi, &ad7124_sigma_delta_info);
684 spi_set_drvdata(spi, indio_dev);
686 indio_dev->dev.parent = &spi->dev;
687 indio_dev->name = spi_get_device_id(spi)->name;
688 indio_dev->modes = INDIO_DIRECT_MODE;
689 indio_dev->info = &ad7124_info;
691 ret = ad7124_of_parse_channel_config(indio_dev, spi->dev.of_node);
692 if (ret < 0)
693 return ret;
695 for (i = 0; i < ARRAY_SIZE(st->vref); i++) {
696 if (i == AD7124_INT_REF)
697 continue;
699 st->vref[i] = devm_regulator_get_optional(&spi->dev,
700 ad7124_ref_names[i]);
701 if (PTR_ERR(st->vref[i]) == -ENODEV)
702 continue;
703 else if (IS_ERR(st->vref[i]))
704 return PTR_ERR(st->vref[i]);
706 ret = regulator_enable(st->vref[i]);
707 if (ret)
708 return ret;
711 st->mclk = devm_clk_get(&spi->dev, "mclk");
712 if (IS_ERR(st->mclk)) {
713 ret = PTR_ERR(st->mclk);
714 goto error_regulator_disable;
717 ret = clk_prepare_enable(st->mclk);
718 if (ret < 0)
719 goto error_regulator_disable;
721 ret = ad7124_soft_reset(st);
722 if (ret < 0)
723 goto error_clk_disable_unprepare;
725 ret = ad7124_setup(st);
726 if (ret < 0)
727 goto error_clk_disable_unprepare;
729 ret = ad_sd_setup_buffer_and_trigger(indio_dev);
730 if (ret < 0)
731 goto error_clk_disable_unprepare;
733 ret = iio_device_register(indio_dev);
734 if (ret < 0) {
735 dev_err(&spi->dev, "Failed to register iio device\n");
736 goto error_remove_trigger;
739 return 0;
741 error_remove_trigger:
742 ad_sd_cleanup_buffer_and_trigger(indio_dev);
743 error_clk_disable_unprepare:
744 clk_disable_unprepare(st->mclk);
745 error_regulator_disable:
746 for (i = ARRAY_SIZE(st->vref) - 1; i >= 0; i--) {
747 if (!IS_ERR_OR_NULL(st->vref[i]))
748 regulator_disable(st->vref[i]);
751 return ret;
754 static int ad7124_remove(struct spi_device *spi)
756 struct iio_dev *indio_dev = spi_get_drvdata(spi);
757 struct ad7124_state *st = iio_priv(indio_dev);
758 int i;
760 iio_device_unregister(indio_dev);
761 ad_sd_cleanup_buffer_and_trigger(indio_dev);
762 clk_disable_unprepare(st->mclk);
764 for (i = ARRAY_SIZE(st->vref) - 1; i >= 0; i--) {
765 if (!IS_ERR_OR_NULL(st->vref[i]))
766 regulator_disable(st->vref[i]);
769 return 0;
772 static const struct spi_device_id ad7124_id_table[] = {
773 { "ad7124-4", ID_AD7124_4 },
774 { "ad7124-8", ID_AD7124_8 },
777 MODULE_DEVICE_TABLE(spi, ad7124_id_table);
779 static const struct of_device_id ad7124_of_match[] = {
780 { .compatible = "adi,ad7124-4" },
781 { .compatible = "adi,ad7124-8" },
782 { },
784 MODULE_DEVICE_TABLE(of, ad7124_of_match);
786 static struct spi_driver ad71124_driver = {
787 .driver = {
788 .name = "ad7124",
789 .of_match_table = ad7124_of_match,
791 .probe = ad7124_probe,
792 .remove = ad7124_remove,
793 .id_table = ad7124_id_table,
795 module_spi_driver(ad71124_driver);
797 MODULE_AUTHOR("Stefan Popa <stefan.popa@analog.com>");
798 MODULE_DESCRIPTION("Analog Devices AD7124 SPI driver");
799 MODULE_LICENSE("GPL");