cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

ad7606.c (18008B)


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