xref: /openbmc/linux/drivers/iio/adc/ad7606.c (revision 61f4d204)
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * AD7606 SPI ADC driver
4  *
5  * Copyright 2011 Analog Devices Inc.
6  */
7 
8 #include <linux/delay.h>
9 #include <linux/device.h>
10 #include <linux/err.h>
11 #include <linux/gpio/consumer.h>
12 #include <linux/interrupt.h>
13 #include <linux/kernel.h>
14 #include <linux/module.h>
15 #include <linux/property.h>
16 #include <linux/regulator/consumer.h>
17 #include <linux/sched.h>
18 #include <linux/slab.h>
19 #include <linux/sysfs.h>
20 #include <linux/util_macros.h>
21 
22 #include <linux/iio/iio.h>
23 #include <linux/iio/buffer.h>
24 #include <linux/iio/sysfs.h>
25 #include <linux/iio/trigger.h>
26 #include <linux/iio/triggered_buffer.h>
27 #include <linux/iio/trigger_consumer.h>
28 
29 #include "ad7606.h"
30 
31 /*
32  * Scales are computed as 5000/32768 and 10000/32768 respectively,
33  * so that when applied to the raw values they provide mV values
34  */
35 static const unsigned int ad7606_scale_avail[2] = {
36 	152588, 305176
37 };
38 
39 
40 static const unsigned int ad7616_sw_scale_avail[3] = {
41 	76293, 152588, 305176
42 };
43 
44 static const unsigned int ad7606_oversampling_avail[7] = {
45 	1, 2, 4, 8, 16, 32, 64,
46 };
47 
48 static const unsigned int ad7616_oversampling_avail[8] = {
49 	1, 2, 4, 8, 16, 32, 64, 128,
50 };
51 
52 static int ad7606_reset(struct ad7606_state *st)
53 {
54 	if (st->gpio_reset) {
55 		gpiod_set_value(st->gpio_reset, 1);
56 		ndelay(100); /* t_reset >= 100ns */
57 		gpiod_set_value(st->gpio_reset, 0);
58 		return 0;
59 	}
60 
61 	return -ENODEV;
62 }
63 
64 static int ad7606_reg_access(struct iio_dev *indio_dev,
65 			     unsigned int reg,
66 			     unsigned int writeval,
67 			     unsigned int *readval)
68 {
69 	struct ad7606_state *st = iio_priv(indio_dev);
70 	int ret;
71 
72 	mutex_lock(&st->lock);
73 	if (readval) {
74 		ret = st->bops->reg_read(st, reg);
75 		if (ret < 0)
76 			goto err_unlock;
77 		*readval = ret;
78 		ret = 0;
79 	} else {
80 		ret = st->bops->reg_write(st, reg, writeval);
81 	}
82 err_unlock:
83 	mutex_unlock(&st->lock);
84 	return ret;
85 }
86 
87 static int ad7606_read_samples(struct ad7606_state *st)
88 {
89 	unsigned int num = st->chip_info->num_channels - 1;
90 	u16 *data = st->data;
91 	int ret;
92 
93 	/*
94 	 * The frstdata signal is set to high while and after reading the sample
95 	 * of the first channel and low for all other channels. This can be used
96 	 * to check that the incoming data is correctly aligned. During normal
97 	 * operation the data should never become unaligned, but some glitch or
98 	 * electrostatic discharge might cause an extra read or clock cycle.
99 	 * Monitoring the frstdata signal allows to recover from such failure
100 	 * situations.
101 	 */
102 
103 	if (st->gpio_frstdata) {
104 		ret = st->bops->read_block(st->dev, 1, data);
105 		if (ret)
106 			return ret;
107 
108 		if (!gpiod_get_value(st->gpio_frstdata)) {
109 			ad7606_reset(st);
110 			return -EIO;
111 		}
112 
113 		data++;
114 		num--;
115 	}
116 
117 	return st->bops->read_block(st->dev, num, data);
118 }
119 
120 static irqreturn_t ad7606_trigger_handler(int irq, void *p)
121 {
122 	struct iio_poll_func *pf = p;
123 	struct iio_dev *indio_dev = pf->indio_dev;
124 	struct ad7606_state *st = iio_priv(indio_dev);
125 	int ret;
126 
127 	mutex_lock(&st->lock);
128 
129 	ret = ad7606_read_samples(st);
130 	if (ret == 0)
131 		iio_push_to_buffers_with_timestamp(indio_dev, st->data,
132 						   iio_get_time_ns(indio_dev));
133 
134 	iio_trigger_notify_done(indio_dev->trig);
135 	/* The rising edge of the CONVST signal starts a new conversion. */
136 	gpiod_set_value(st->gpio_convst, 1);
137 
138 	mutex_unlock(&st->lock);
139 
140 	return IRQ_HANDLED;
141 }
142 
143 static int ad7606_scan_direct(struct iio_dev *indio_dev, unsigned int ch)
144 {
145 	struct ad7606_state *st = iio_priv(indio_dev);
146 	int ret;
147 
148 	gpiod_set_value(st->gpio_convst, 1);
149 	ret = wait_for_completion_timeout(&st->completion,
150 					  msecs_to_jiffies(1000));
151 	if (!ret) {
152 		ret = -ETIMEDOUT;
153 		goto error_ret;
154 	}
155 
156 	ret = ad7606_read_samples(st);
157 	if (ret == 0)
158 		ret = st->data[ch];
159 
160 error_ret:
161 	gpiod_set_value(st->gpio_convst, 0);
162 
163 	return ret;
164 }
165 
166 static int ad7606_read_raw(struct iio_dev *indio_dev,
167 			   struct iio_chan_spec const *chan,
168 			   int *val,
169 			   int *val2,
170 			   long m)
171 {
172 	int ret, ch = 0;
173 	struct ad7606_state *st = iio_priv(indio_dev);
174 
175 	switch (m) {
176 	case IIO_CHAN_INFO_RAW:
177 		ret = iio_device_claim_direct_mode(indio_dev);
178 		if (ret)
179 			return ret;
180 
181 		ret = ad7606_scan_direct(indio_dev, chan->address);
182 		iio_device_release_direct_mode(indio_dev);
183 
184 		if (ret < 0)
185 			return ret;
186 		*val = (short)ret;
187 		return IIO_VAL_INT;
188 	case IIO_CHAN_INFO_SCALE:
189 		if (st->sw_mode_en)
190 			ch = chan->address;
191 		*val = 0;
192 		*val2 = st->scale_avail[st->range[ch]];
193 		return IIO_VAL_INT_PLUS_MICRO;
194 	case IIO_CHAN_INFO_OVERSAMPLING_RATIO:
195 		*val = st->oversampling;
196 		return IIO_VAL_INT;
197 	}
198 	return -EINVAL;
199 }
200 
201 static ssize_t ad7606_show_avail(char *buf, const unsigned int *vals,
202 				 unsigned int n, bool micros)
203 {
204 	size_t len = 0;
205 	int i;
206 
207 	for (i = 0; i < n; i++) {
208 		len += scnprintf(buf + len, PAGE_SIZE - len,
209 			micros ? "0.%06u " : "%u ", vals[i]);
210 	}
211 	buf[len - 1] = '\n';
212 
213 	return len;
214 }
215 
216 static ssize_t in_voltage_scale_available_show(struct device *dev,
217 					       struct device_attribute *attr,
218 					       char *buf)
219 {
220 	struct iio_dev *indio_dev = dev_to_iio_dev(dev);
221 	struct ad7606_state *st = iio_priv(indio_dev);
222 
223 	return ad7606_show_avail(buf, st->scale_avail, st->num_scales, true);
224 }
225 
226 static IIO_DEVICE_ATTR_RO(in_voltage_scale_available, 0);
227 
228 static int ad7606_write_scale_hw(struct iio_dev *indio_dev, int ch, int val)
229 {
230 	struct ad7606_state *st = iio_priv(indio_dev);
231 
232 	gpiod_set_value(st->gpio_range, val);
233 
234 	return 0;
235 }
236 
237 static int ad7606_write_os_hw(struct iio_dev *indio_dev, int val)
238 {
239 	struct ad7606_state *st = iio_priv(indio_dev);
240 	DECLARE_BITMAP(values, 3);
241 
242 	values[0] = val;
243 
244 	gpiod_set_array_value(ARRAY_SIZE(values), st->gpio_os->desc,
245 			      st->gpio_os->info, values);
246 
247 	/* AD7616 requires a reset to update value */
248 	if (st->chip_info->os_req_reset)
249 		ad7606_reset(st);
250 
251 	return 0;
252 }
253 
254 static int ad7606_write_raw(struct iio_dev *indio_dev,
255 			    struct iio_chan_spec const *chan,
256 			    int val,
257 			    int val2,
258 			    long mask)
259 {
260 	struct ad7606_state *st = iio_priv(indio_dev);
261 	int i, ret, ch = 0;
262 
263 	switch (mask) {
264 	case IIO_CHAN_INFO_SCALE:
265 		mutex_lock(&st->lock);
266 		i = find_closest(val2, st->scale_avail, st->num_scales);
267 		if (st->sw_mode_en)
268 			ch = chan->address;
269 		ret = st->write_scale(indio_dev, ch, i);
270 		if (ret < 0) {
271 			mutex_unlock(&st->lock);
272 			return ret;
273 		}
274 		st->range[ch] = i;
275 		mutex_unlock(&st->lock);
276 
277 		return 0;
278 	case IIO_CHAN_INFO_OVERSAMPLING_RATIO:
279 		if (val2)
280 			return -EINVAL;
281 		i = find_closest(val, st->oversampling_avail,
282 				 st->num_os_ratios);
283 		mutex_lock(&st->lock);
284 		ret = st->write_os(indio_dev, i);
285 		if (ret < 0) {
286 			mutex_unlock(&st->lock);
287 			return ret;
288 		}
289 		st->oversampling = st->oversampling_avail[i];
290 		mutex_unlock(&st->lock);
291 
292 		return 0;
293 	default:
294 		return -EINVAL;
295 	}
296 }
297 
298 static ssize_t ad7606_oversampling_ratio_avail(struct device *dev,
299 					       struct device_attribute *attr,
300 					       char *buf)
301 {
302 	struct iio_dev *indio_dev = dev_to_iio_dev(dev);
303 	struct ad7606_state *st = iio_priv(indio_dev);
304 
305 	return ad7606_show_avail(buf, st->oversampling_avail,
306 				 st->num_os_ratios, false);
307 }
308 
309 static IIO_DEVICE_ATTR(oversampling_ratio_available, 0444,
310 		       ad7606_oversampling_ratio_avail, NULL, 0);
311 
312 static struct attribute *ad7606_attributes_os_and_range[] = {
313 	&iio_dev_attr_in_voltage_scale_available.dev_attr.attr,
314 	&iio_dev_attr_oversampling_ratio_available.dev_attr.attr,
315 	NULL,
316 };
317 
318 static const struct attribute_group ad7606_attribute_group_os_and_range = {
319 	.attrs = ad7606_attributes_os_and_range,
320 };
321 
322 static struct attribute *ad7606_attributes_os[] = {
323 	&iio_dev_attr_oversampling_ratio_available.dev_attr.attr,
324 	NULL,
325 };
326 
327 static const struct attribute_group ad7606_attribute_group_os = {
328 	.attrs = ad7606_attributes_os,
329 };
330 
331 static struct attribute *ad7606_attributes_range[] = {
332 	&iio_dev_attr_in_voltage_scale_available.dev_attr.attr,
333 	NULL,
334 };
335 
336 static const struct attribute_group ad7606_attribute_group_range = {
337 	.attrs = ad7606_attributes_range,
338 };
339 
340 static const struct iio_chan_spec ad7605_channels[] = {
341 	IIO_CHAN_SOFT_TIMESTAMP(4),
342 	AD7605_CHANNEL(0),
343 	AD7605_CHANNEL(1),
344 	AD7605_CHANNEL(2),
345 	AD7605_CHANNEL(3),
346 };
347 
348 static const struct iio_chan_spec ad7606_channels[] = {
349 	IIO_CHAN_SOFT_TIMESTAMP(8),
350 	AD7606_CHANNEL(0),
351 	AD7606_CHANNEL(1),
352 	AD7606_CHANNEL(2),
353 	AD7606_CHANNEL(3),
354 	AD7606_CHANNEL(4),
355 	AD7606_CHANNEL(5),
356 	AD7606_CHANNEL(6),
357 	AD7606_CHANNEL(7),
358 };
359 
360 /*
361  * The current assumption that this driver makes for AD7616, is that it's
362  * working in Hardware Mode with Serial, Burst and Sequencer modes activated.
363  * To activate them, following pins must be pulled high:
364  *	-SER/PAR
365  *	-SEQEN
366  * And following pins must be pulled low:
367  *	-WR/BURST
368  *	-DB4/SER1W
369  */
370 static const struct iio_chan_spec ad7616_channels[] = {
371 	IIO_CHAN_SOFT_TIMESTAMP(16),
372 	AD7606_CHANNEL(0),
373 	AD7606_CHANNEL(1),
374 	AD7606_CHANNEL(2),
375 	AD7606_CHANNEL(3),
376 	AD7606_CHANNEL(4),
377 	AD7606_CHANNEL(5),
378 	AD7606_CHANNEL(6),
379 	AD7606_CHANNEL(7),
380 	AD7606_CHANNEL(8),
381 	AD7606_CHANNEL(9),
382 	AD7606_CHANNEL(10),
383 	AD7606_CHANNEL(11),
384 	AD7606_CHANNEL(12),
385 	AD7606_CHANNEL(13),
386 	AD7606_CHANNEL(14),
387 	AD7606_CHANNEL(15),
388 };
389 
390 static const struct ad7606_chip_info ad7606_chip_info_tbl[] = {
391 	/* More devices added in future */
392 	[ID_AD7605_4] = {
393 		.channels = ad7605_channels,
394 		.num_channels = 5,
395 	},
396 	[ID_AD7606_8] = {
397 		.channels = ad7606_channels,
398 		.num_channels = 9,
399 		.oversampling_avail = ad7606_oversampling_avail,
400 		.oversampling_num = ARRAY_SIZE(ad7606_oversampling_avail),
401 	},
402 	[ID_AD7606_6] = {
403 		.channels = ad7606_channels,
404 		.num_channels = 7,
405 		.oversampling_avail = ad7606_oversampling_avail,
406 		.oversampling_num = ARRAY_SIZE(ad7606_oversampling_avail),
407 	},
408 	[ID_AD7606_4] = {
409 		.channels = ad7606_channels,
410 		.num_channels = 5,
411 		.oversampling_avail = ad7606_oversampling_avail,
412 		.oversampling_num = ARRAY_SIZE(ad7606_oversampling_avail),
413 	},
414 	[ID_AD7606B] = {
415 		.channels = ad7606_channels,
416 		.num_channels = 9,
417 		.oversampling_avail = ad7606_oversampling_avail,
418 		.oversampling_num = ARRAY_SIZE(ad7606_oversampling_avail),
419 	},
420 	[ID_AD7616] = {
421 		.channels = ad7616_channels,
422 		.num_channels = 17,
423 		.oversampling_avail = ad7616_oversampling_avail,
424 		.oversampling_num = ARRAY_SIZE(ad7616_oversampling_avail),
425 		.os_req_reset = true,
426 		.init_delay_ms = 15,
427 	},
428 };
429 
430 static int ad7606_request_gpios(struct ad7606_state *st)
431 {
432 	struct device *dev = st->dev;
433 
434 	st->gpio_convst = devm_gpiod_get(dev, "adi,conversion-start",
435 					 GPIOD_OUT_LOW);
436 	if (IS_ERR(st->gpio_convst))
437 		return PTR_ERR(st->gpio_convst);
438 
439 	st->gpio_reset = devm_gpiod_get_optional(dev, "reset", GPIOD_OUT_LOW);
440 	if (IS_ERR(st->gpio_reset))
441 		return PTR_ERR(st->gpio_reset);
442 
443 	st->gpio_range = devm_gpiod_get_optional(dev, "adi,range",
444 						 GPIOD_OUT_LOW);
445 	if (IS_ERR(st->gpio_range))
446 		return PTR_ERR(st->gpio_range);
447 
448 	st->gpio_standby = devm_gpiod_get_optional(dev, "standby",
449 						   GPIOD_OUT_HIGH);
450 	if (IS_ERR(st->gpio_standby))
451 		return PTR_ERR(st->gpio_standby);
452 
453 	st->gpio_frstdata = devm_gpiod_get_optional(dev, "adi,first-data",
454 						    GPIOD_IN);
455 	if (IS_ERR(st->gpio_frstdata))
456 		return PTR_ERR(st->gpio_frstdata);
457 
458 	if (!st->chip_info->oversampling_num)
459 		return 0;
460 
461 	st->gpio_os = devm_gpiod_get_array_optional(dev,
462 						    "adi,oversampling-ratio",
463 						    GPIOD_OUT_LOW);
464 	return PTR_ERR_OR_ZERO(st->gpio_os);
465 }
466 
467 /*
468  * The BUSY signal indicates when conversions are in progress, so when a rising
469  * edge of CONVST is applied, BUSY goes logic high and transitions low at the
470  * end of the entire conversion process. The falling edge of the BUSY signal
471  * triggers this interrupt.
472  */
473 static irqreturn_t ad7606_interrupt(int irq, void *dev_id)
474 {
475 	struct iio_dev *indio_dev = dev_id;
476 	struct ad7606_state *st = iio_priv(indio_dev);
477 
478 	if (iio_buffer_enabled(indio_dev)) {
479 		gpiod_set_value(st->gpio_convst, 0);
480 		iio_trigger_poll_nested(st->trig);
481 	} else {
482 		complete(&st->completion);
483 	}
484 
485 	return IRQ_HANDLED;
486 };
487 
488 static int ad7606_validate_trigger(struct iio_dev *indio_dev,
489 				   struct iio_trigger *trig)
490 {
491 	struct ad7606_state *st = iio_priv(indio_dev);
492 
493 	if (st->trig != trig)
494 		return -EINVAL;
495 
496 	return 0;
497 }
498 
499 static int ad7606_buffer_postenable(struct iio_dev *indio_dev)
500 {
501 	struct ad7606_state *st = iio_priv(indio_dev);
502 
503 	gpiod_set_value(st->gpio_convst, 1);
504 
505 	return 0;
506 }
507 
508 static int ad7606_buffer_predisable(struct iio_dev *indio_dev)
509 {
510 	struct ad7606_state *st = iio_priv(indio_dev);
511 
512 	gpiod_set_value(st->gpio_convst, 0);
513 
514 	return 0;
515 }
516 
517 static const struct iio_buffer_setup_ops ad7606_buffer_ops = {
518 	.postenable = &ad7606_buffer_postenable,
519 	.predisable = &ad7606_buffer_predisable,
520 };
521 
522 static const struct iio_info ad7606_info_no_os_or_range = {
523 	.read_raw = &ad7606_read_raw,
524 	.validate_trigger = &ad7606_validate_trigger,
525 };
526 
527 static const struct iio_info ad7606_info_os_and_range = {
528 	.read_raw = &ad7606_read_raw,
529 	.write_raw = &ad7606_write_raw,
530 	.attrs = &ad7606_attribute_group_os_and_range,
531 	.validate_trigger = &ad7606_validate_trigger,
532 };
533 
534 static const struct iio_info ad7606_info_os_range_and_debug = {
535 	.read_raw = &ad7606_read_raw,
536 	.write_raw = &ad7606_write_raw,
537 	.debugfs_reg_access = &ad7606_reg_access,
538 	.attrs = &ad7606_attribute_group_os_and_range,
539 	.validate_trigger = &ad7606_validate_trigger,
540 };
541 
542 static const struct iio_info ad7606_info_os = {
543 	.read_raw = &ad7606_read_raw,
544 	.write_raw = &ad7606_write_raw,
545 	.attrs = &ad7606_attribute_group_os,
546 	.validate_trigger = &ad7606_validate_trigger,
547 };
548 
549 static const struct iio_info ad7606_info_range = {
550 	.read_raw = &ad7606_read_raw,
551 	.write_raw = &ad7606_write_raw,
552 	.attrs = &ad7606_attribute_group_range,
553 	.validate_trigger = &ad7606_validate_trigger,
554 };
555 
556 static const struct iio_trigger_ops ad7606_trigger_ops = {
557 	.validate_device = iio_trigger_validate_own_device,
558 };
559 
560 int ad7606_probe(struct device *dev, int irq, void __iomem *base_address,
561 		 const char *name, unsigned int id,
562 		 const struct ad7606_bus_ops *bops)
563 {
564 	struct ad7606_state *st;
565 	int ret;
566 	struct iio_dev *indio_dev;
567 
568 	indio_dev = devm_iio_device_alloc(dev, sizeof(*st));
569 	if (!indio_dev)
570 		return -ENOMEM;
571 
572 	st = iio_priv(indio_dev);
573 	dev_set_drvdata(dev, indio_dev);
574 
575 	st->dev = dev;
576 	mutex_init(&st->lock);
577 	st->bops = bops;
578 	st->base_address = base_address;
579 	/* tied to logic low, analog input range is +/- 5V */
580 	st->range[0] = 0;
581 	st->oversampling = 1;
582 	st->scale_avail = ad7606_scale_avail;
583 	st->num_scales = ARRAY_SIZE(ad7606_scale_avail);
584 
585 	ret = devm_regulator_get_enable(dev, "avcc");
586 	if (ret)
587 		return dev_err_probe(dev, ret,
588 				     "Failed to enable specified AVcc supply\n");
589 
590 	st->chip_info = &ad7606_chip_info_tbl[id];
591 
592 	if (st->chip_info->oversampling_num) {
593 		st->oversampling_avail = st->chip_info->oversampling_avail;
594 		st->num_os_ratios = st->chip_info->oversampling_num;
595 	}
596 
597 	ret = ad7606_request_gpios(st);
598 	if (ret)
599 		return ret;
600 
601 	if (st->gpio_os) {
602 		if (st->gpio_range)
603 			indio_dev->info = &ad7606_info_os_and_range;
604 		else
605 			indio_dev->info = &ad7606_info_os;
606 	} else {
607 		if (st->gpio_range)
608 			indio_dev->info = &ad7606_info_range;
609 		else
610 			indio_dev->info = &ad7606_info_no_os_or_range;
611 	}
612 	indio_dev->modes = INDIO_DIRECT_MODE;
613 	indio_dev->name = name;
614 	indio_dev->channels = st->chip_info->channels;
615 	indio_dev->num_channels = st->chip_info->num_channels;
616 
617 	init_completion(&st->completion);
618 
619 	ret = ad7606_reset(st);
620 	if (ret)
621 		dev_warn(st->dev, "failed to RESET: no RESET GPIO specified\n");
622 
623 	/* AD7616 requires al least 15ms to reconfigure after a reset */
624 	if (st->chip_info->init_delay_ms) {
625 		if (msleep_interruptible(st->chip_info->init_delay_ms))
626 			return -ERESTARTSYS;
627 	}
628 
629 	st->write_scale = ad7606_write_scale_hw;
630 	st->write_os = ad7606_write_os_hw;
631 
632 	if (st->bops->sw_mode_config)
633 		st->sw_mode_en = device_property_present(st->dev,
634 							 "adi,sw-mode");
635 
636 	if (st->sw_mode_en) {
637 		/* Scale of 0.076293 is only available in sw mode */
638 		st->scale_avail = ad7616_sw_scale_avail;
639 		st->num_scales = ARRAY_SIZE(ad7616_sw_scale_avail);
640 
641 		/* After reset, in software mode, ±10 V is set by default */
642 		memset32(st->range, 2, ARRAY_SIZE(st->range));
643 		indio_dev->info = &ad7606_info_os_range_and_debug;
644 
645 		ret = st->bops->sw_mode_config(indio_dev);
646 		if (ret < 0)
647 			return ret;
648 	}
649 
650 	st->trig = devm_iio_trigger_alloc(dev, "%s-dev%d",
651 					  indio_dev->name,
652 					  iio_device_id(indio_dev));
653 	if (!st->trig)
654 		return -ENOMEM;
655 
656 	st->trig->ops = &ad7606_trigger_ops;
657 	iio_trigger_set_drvdata(st->trig, indio_dev);
658 	ret = devm_iio_trigger_register(dev, st->trig);
659 	if (ret)
660 		return ret;
661 
662 	indio_dev->trig = iio_trigger_get(st->trig);
663 
664 	ret = devm_request_threaded_irq(dev, irq,
665 					NULL,
666 					&ad7606_interrupt,
667 					IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
668 					name, indio_dev);
669 	if (ret)
670 		return ret;
671 
672 	ret = devm_iio_triggered_buffer_setup(dev, indio_dev,
673 					      &iio_pollfunc_store_time,
674 					      &ad7606_trigger_handler,
675 					      &ad7606_buffer_ops);
676 	if (ret)
677 		return ret;
678 
679 	return devm_iio_device_register(dev, indio_dev);
680 }
681 EXPORT_SYMBOL_NS_GPL(ad7606_probe, IIO_AD7606);
682 
683 #ifdef CONFIG_PM_SLEEP
684 
685 static int ad7606_suspend(struct device *dev)
686 {
687 	struct iio_dev *indio_dev = dev_get_drvdata(dev);
688 	struct ad7606_state *st = iio_priv(indio_dev);
689 
690 	if (st->gpio_standby) {
691 		gpiod_set_value(st->gpio_range, 1);
692 		gpiod_set_value(st->gpio_standby, 0);
693 	}
694 
695 	return 0;
696 }
697 
698 static int ad7606_resume(struct device *dev)
699 {
700 	struct iio_dev *indio_dev = dev_get_drvdata(dev);
701 	struct ad7606_state *st = iio_priv(indio_dev);
702 
703 	if (st->gpio_standby) {
704 		gpiod_set_value(st->gpio_range, st->range[0]);
705 		gpiod_set_value(st->gpio_standby, 1);
706 		ad7606_reset(st);
707 	}
708 
709 	return 0;
710 }
711 
712 SIMPLE_DEV_PM_OPS(ad7606_pm_ops, ad7606_suspend, ad7606_resume);
713 EXPORT_SYMBOL_NS_GPL(ad7606_pm_ops, IIO_AD7606);
714 
715 #endif
716 
717 MODULE_AUTHOR("Michael Hennerich <michael.hennerich@analog.com>");
718 MODULE_DESCRIPTION("Analog Devices AD7606 ADC");
719 MODULE_LICENSE("GPL v2");
720