root/drivers/iio/adc/ad4695.c
// SPDX-License-Identifier: GPL-2.0-only
/*
 * SPI ADC driver for Analog Devices Inc. AD4695 and similar chips
 *
 * https://www.analog.com/en/products/ad4695.html
 * https://www.analog.com/en/products/ad4696.html
 * https://www.analog.com/en/products/ad4697.html
 * https://www.analog.com/en/products/ad4698.html
 *
 * Copyright 2024 Analog Devices Inc.
 * Copyright 2024 BayLibre, SAS
 */

#include <linux/align.h>
#include <linux/bitfield.h>
#include <linux/bits.h>
#include <linux/compiler.h>
#include <linux/delay.h>
#include <linux/device.h>
#include <linux/err.h>
#include <linux/gpio/consumer.h>
#include <linux/iio/buffer-dmaengine.h>
#include <linux/iio/buffer.h>
#include <linux/iio/iio.h>
#include <linux/iio/triggered_buffer.h>
#include <linux/iio/trigger_consumer.h>
#include <linux/minmax.h>
#include <linux/mutex.h>
#include <linux/property.h>
#include <linux/pwm.h>
#include <linux/regmap.h>
#include <linux/regulator/consumer.h>
#include <linux/spi/offload/consumer.h>
#include <linux/spi/offload/provider.h>
#include <linux/spi/spi.h>
#include <linux/units.h>

#include <dt-bindings/iio/adc/adi,ad4695.h>

/* AD4695 registers */
#define AD4695_REG_SPI_CONFIG_A                         0x0000
#define   AD4695_REG_SPI_CONFIG_A_SW_RST                  (BIT(7) | BIT(0))
#define   AD4695_REG_SPI_CONFIG_A_ADDR_DIR                BIT(5)
#define AD4695_REG_SPI_CONFIG_B                         0x0001
#define   AD4695_REG_SPI_CONFIG_B_INST_MODE               BIT(7)
#define AD4695_REG_DEVICE_TYPE                          0x0003
#define AD4695_REG_SCRATCH_PAD                          0x000A
#define AD4695_REG_VENDOR_L                             0x000C
#define AD4695_REG_VENDOR_H                             0x000D
#define AD4695_REG_LOOP_MODE                            0x000E
#define AD4695_REG_SPI_CONFIG_C                         0x0010
#define   AD4695_REG_SPI_CONFIG_C_MB_STRICT               BIT(7)
#define AD4695_REG_SPI_STATUS                           0x0011
#define AD4695_REG_STATUS                               0x0014
#define AD4695_REG_ALERT_STATUS1                        0x0015
#define AD4695_REG_ALERT_STATUS2                        0x0016
#define AD4695_REG_CLAMP_STATUS                         0x001A
#define AD4695_REG_SETUP                                0x0020
#define   AD4695_REG_SETUP_LDO_EN                         BIT(4)
#define   AD4695_REG_SETUP_SPI_MODE                       BIT(2)
#define   AD4695_REG_SETUP_SPI_CYC_CTRL                   BIT(1)
#define AD4695_REG_REF_CTRL                             0x0021
#define   AD4695_REG_REF_CTRL_OV_MODE                     BIT(7)
#define   AD4695_REG_REF_CTRL_VREF_SET                    GENMASK(4, 2)
#define   AD4695_REG_REF_CTRL_REFHIZ_EN                   BIT(1)
#define   AD4695_REG_REF_CTRL_REFBUF_EN                   BIT(0)
#define AD4695_REG_SEQ_CTRL                             0x0022
#define   AD4695_REG_SEQ_CTRL_STD_SEQ_EN                  BIT(7)
#define   AD4695_REG_SEQ_CTRL_NUM_SLOTS_AS                GENMASK(6, 0)
#define AD4695_REG_AC_CTRL                              0x0023
#define AD4695_REG_STD_SEQ_CONFIG                       0x0024
#define AD4695_REG_GPIO_CTRL                            0x0026
#define AD4695_REG_GP_MODE                              0x0027
#define   AD4695_REG_GP_MODE_BUSY_GP_SEL                  BIT(5)
#define   AD4695_REG_GP_MODE_BUSY_GP_EN                   BIT(1)
#define AD4695_REG_TEMP_CTRL                            0x0029
#define   AD4695_REG_TEMP_CTRL_TEMP_EN                    BIT(0)
#define AD4695_REG_CONFIG_IN(n)                         (0x0030 | (n))
#define   AD4695_REG_CONFIG_IN_MODE                       BIT(6)
#define   AD4695_REG_CONFIG_IN_PAIR                       GENMASK(5, 4)
#define   AD4695_REG_CONFIG_IN_AINHIGHZ_EN                BIT(3)
#define   AD4695_REG_CONFIG_IN_OSR_SET                    GENMASK(1, 0)
#define AD4695_REG_UPPER_IN(n)                          (0x0040 | (2 * (n)))
#define AD4695_REG_LOWER_IN(n)                          (0x0060 | (2 * (n)))
#define AD4695_REG_HYST_IN(n)                           (0x0080 | (2 * (n)))
#define AD4695_REG_OFFSET_IN(n)                         (0x00A0 | (2 * (n)))
#define AD4695_REG_GAIN_IN(n)                           (0x00C0 | (2 * (n)))
#define AD4695_REG_AS_SLOT(n)                           (0x0100 | (n))
#define   AD4695_REG_AS_SLOT_INX                          GENMASK(3, 0)

/* Conversion mode commands */
#define AD4695_CMD_EXIT_CNV_MODE        0x0A
#define AD4695_CMD_TEMP_CHAN            0x0F
#define AD4695_CMD_VOLTAGE_CHAN(n)      (0x10 | (n))

/* timing specs */
#define AD4695_T_CONVERT_NS             415
#define AD4695_T_WAKEUP_HW_MS           3
#define AD4695_T_WAKEUP_SW_MS           3
#define AD4695_T_REFBUF_MS              100
#define AD4695_T_REGCONFIG_NS           20
#define AD4695_T_SCK_CNV_DELAY_NS       80
#define AD4695_T_CNVL_NS                80
#define AD4695_T_CNVH_NS                10
#define AD4695_REG_ACCESS_SCLK_HZ       (10 * MEGA)

/* Max number of voltage input channels. */
#define AD4695_MAX_VIN_CHANNELS         16

enum ad4695_in_pair {
        AD4695_IN_PAIR_REFGND,
        AD4695_IN_PAIR_COM,
        AD4695_IN_PAIR_EVEN_ODD,
};

struct ad4695_chip_info {
        const char *name;
        int max_sample_rate;
        u32 t_acq_ns;
        u8 num_voltage_inputs;
};

struct ad4695_channel_config {
        unsigned int channel;
        bool highz_en;
        bool bipolar;
        enum ad4695_in_pair pin_pairing;
        unsigned int common_mode_mv;
        unsigned int oversampling_ratio;
};

struct ad4695_state {
        struct spi_device *spi;
        struct spi_offload *offload;
        struct spi_offload_trigger *offload_trigger;
        struct regmap *regmap;
        struct regmap *regmap16;
        struct gpio_desc *reset_gpio;
        /* currently PWM CNV only supported with SPI offload use */
        struct pwm_device *cnv_pwm;
        /* protects against concurrent use of cnv_pwm */
        struct mutex cnv_pwm_lock;
        /* offload also requires separate gpio to manually control CNV */
        struct gpio_desc *cnv_gpio;
        /* voltages channels plus temperature and timestamp */
        struct iio_chan_spec iio_chan[AD4695_MAX_VIN_CHANNELS + 2];
        struct ad4695_channel_config channels_cfg[AD4695_MAX_VIN_CHANNELS];
        const struct ad4695_chip_info *chip_info;
        int sample_freq_range[3];
        /* Reference voltage. */
        unsigned int vref_mv;
        /* Common mode input pin voltage. */
        unsigned int com_mv;
        /*
         * 2 per voltage and temperature chan plus 1 xfer to trigger 1st
         * CNV. Excluding the trigger xfer, every 2nd xfer only serves
         * to control CS and add a delay between the last SCLK and next
         * CNV rising edges.
         */
        struct spi_transfer buf_read_xfer[AD4695_MAX_VIN_CHANNELS * 2 + 3];
        struct spi_message buf_read_msg;
        /* Raw conversion data received. */
        IIO_DECLARE_DMA_BUFFER_WITH_TS(u16, buf, AD4695_MAX_VIN_CHANNELS + 1);
        u16 raw_data;
        /* Commands to send for single conversion. */
        u16 cnv_cmd;
        u8 cnv_cmd2;
        /* Buffer for storing data from regmap bus reads/writes */
        u8 regmap_bus_data[4];
};

static const struct regmap_range ad4695_regmap_rd_ranges[] = {
        regmap_reg_range(AD4695_REG_SPI_CONFIG_A, AD4695_REG_SPI_CONFIG_B),
        regmap_reg_range(AD4695_REG_DEVICE_TYPE, AD4695_REG_DEVICE_TYPE),
        regmap_reg_range(AD4695_REG_SCRATCH_PAD, AD4695_REG_SCRATCH_PAD),
        regmap_reg_range(AD4695_REG_VENDOR_L, AD4695_REG_LOOP_MODE),
        regmap_reg_range(AD4695_REG_SPI_CONFIG_C, AD4695_REG_SPI_STATUS),
        regmap_reg_range(AD4695_REG_STATUS, AD4695_REG_ALERT_STATUS2),
        regmap_reg_range(AD4695_REG_CLAMP_STATUS, AD4695_REG_CLAMP_STATUS),
        regmap_reg_range(AD4695_REG_SETUP, AD4695_REG_AC_CTRL),
        regmap_reg_range(AD4695_REG_GPIO_CTRL, AD4695_REG_TEMP_CTRL),
        regmap_reg_range(AD4695_REG_CONFIG_IN(0), AD4695_REG_CONFIG_IN(15)),
        regmap_reg_range(AD4695_REG_AS_SLOT(0), AD4695_REG_AS_SLOT(127)),
};

static const struct regmap_access_table ad4695_regmap_rd_table = {
        .yes_ranges = ad4695_regmap_rd_ranges,
        .n_yes_ranges = ARRAY_SIZE(ad4695_regmap_rd_ranges),
};

static const struct regmap_range ad4695_regmap_wr_ranges[] = {
        regmap_reg_range(AD4695_REG_SPI_CONFIG_A, AD4695_REG_SPI_CONFIG_B),
        regmap_reg_range(AD4695_REG_SCRATCH_PAD, AD4695_REG_SCRATCH_PAD),
        regmap_reg_range(AD4695_REG_LOOP_MODE, AD4695_REG_LOOP_MODE),
        regmap_reg_range(AD4695_REG_SPI_CONFIG_C, AD4695_REG_SPI_STATUS),
        regmap_reg_range(AD4695_REG_SETUP, AD4695_REG_AC_CTRL),
        regmap_reg_range(AD4695_REG_GPIO_CTRL, AD4695_REG_TEMP_CTRL),
        regmap_reg_range(AD4695_REG_CONFIG_IN(0), AD4695_REG_CONFIG_IN(15)),
        regmap_reg_range(AD4695_REG_AS_SLOT(0), AD4695_REG_AS_SLOT(127)),
};

static const struct regmap_access_table ad4695_regmap_wr_table = {
        .yes_ranges = ad4695_regmap_wr_ranges,
        .n_yes_ranges = ARRAY_SIZE(ad4695_regmap_wr_ranges),
};

static const struct regmap_config ad4695_regmap_config = {
        .name = "ad4695-8",
        .reg_bits = 16,
        .val_bits = 8,
        .max_register = AD4695_REG_AS_SLOT(127),
        .rd_table = &ad4695_regmap_rd_table,
        .wr_table = &ad4695_regmap_wr_table,
};

static const struct regmap_range ad4695_regmap16_rd_ranges[] = {
        regmap_reg_range(AD4695_REG_STD_SEQ_CONFIG, AD4695_REG_STD_SEQ_CONFIG),
        regmap_reg_range(AD4695_REG_UPPER_IN(0), AD4695_REG_GAIN_IN(15)),
};

static const struct regmap_access_table ad4695_regmap16_rd_table = {
        .yes_ranges = ad4695_regmap16_rd_ranges,
        .n_yes_ranges = ARRAY_SIZE(ad4695_regmap16_rd_ranges),
};

static const struct regmap_range ad4695_regmap16_wr_ranges[] = {
        regmap_reg_range(AD4695_REG_STD_SEQ_CONFIG, AD4695_REG_STD_SEQ_CONFIG),
        regmap_reg_range(AD4695_REG_UPPER_IN(0), AD4695_REG_GAIN_IN(15)),
};

static const struct regmap_access_table ad4695_regmap16_wr_table = {
        .yes_ranges = ad4695_regmap16_wr_ranges,
        .n_yes_ranges = ARRAY_SIZE(ad4695_regmap16_wr_ranges),
};

static const struct regmap_config ad4695_regmap16_config = {
        .name = "ad4695-16",
        .reg_bits = 16,
        .reg_stride = 2,
        .val_bits = 16,
        .val_format_endian = REGMAP_ENDIAN_LITTLE,
        .max_register = AD4695_REG_GAIN_IN(15),
        .rd_table = &ad4695_regmap16_rd_table,
        .wr_table = &ad4695_regmap16_wr_table,
};

static int ad4695_regmap_bus_reg_write(void *context, const void *data,
                                       size_t count)
{
        struct ad4695_state *st = context;
        struct spi_transfer xfer = {
                        .speed_hz = AD4695_REG_ACCESS_SCLK_HZ,
                        .len = count,
                        .tx_buf = st->regmap_bus_data,
        };

        if (count > ARRAY_SIZE(st->regmap_bus_data))
                return -EINVAL;

        memcpy(st->regmap_bus_data, data, count);

        return spi_sync_transfer(st->spi, &xfer, 1);
}

static int ad4695_regmap_bus_reg_read(void *context, const void *reg,
                                      size_t reg_size, void *val,
                                      size_t val_size)
{
        struct ad4695_state *st = context;
        struct spi_transfer xfers[] = {
                {
                        .speed_hz = AD4695_REG_ACCESS_SCLK_HZ,
                        .len = reg_size,
                        .tx_buf = &st->regmap_bus_data[0],
                }, {
                        .speed_hz = AD4695_REG_ACCESS_SCLK_HZ,
                        .len = val_size,
                        .rx_buf = &st->regmap_bus_data[2],
                },
        };
        int ret;

        if (reg_size > 2)
                return -EINVAL;

        if (val_size > 2)
                return -EINVAL;

        memcpy(&st->regmap_bus_data[0], reg, reg_size);

        ret = spi_sync_transfer(st->spi, xfers, ARRAY_SIZE(xfers));
        if (ret)
                return ret;

        memcpy(val, &st->regmap_bus_data[2], val_size);

        return 0;
}

static const struct regmap_bus ad4695_regmap_bus = {
        .write = ad4695_regmap_bus_reg_write,
        .read = ad4695_regmap_bus_reg_read,
        .read_flag_mask = 0x80,
        .reg_format_endian_default = REGMAP_ENDIAN_BIG,
        .val_format_endian_default = REGMAP_ENDIAN_BIG,
};

enum {
        AD4695_SCAN_TYPE_OSR_1,
        AD4695_SCAN_TYPE_OSR_4,
        AD4695_SCAN_TYPE_OSR_16,
        AD4695_SCAN_TYPE_OSR_64,
};

static const struct iio_scan_type ad4695_scan_type_offload_u[] = {
        [AD4695_SCAN_TYPE_OSR_1] = {
                .sign = 'u',
                .realbits = 16,
                .shift = 3,
                .storagebits = 32,
        },
        [AD4695_SCAN_TYPE_OSR_4] = {
                .sign = 'u',
                .realbits = 17,
                .shift = 2,
                .storagebits = 32,
        },
        [AD4695_SCAN_TYPE_OSR_16] = {
                .sign = 'u',
                .realbits = 18,
                .shift = 1,
                .storagebits = 32,
        },
        [AD4695_SCAN_TYPE_OSR_64] = {
                .sign = 'u',
                .realbits = 19,
                .storagebits = 32,
        },
};

static const struct iio_scan_type ad4695_scan_type_offload_s[] = {
        [AD4695_SCAN_TYPE_OSR_1] = {
                .sign = 's',
                .realbits = 16,
                .shift = 3,
                .storagebits = 32,
        },
        [AD4695_SCAN_TYPE_OSR_4] = {
                .sign = 's',
                .realbits = 17,
                .shift = 2,
                .storagebits = 32,
        },
        [AD4695_SCAN_TYPE_OSR_16] = {
                .sign = 's',
                .realbits = 18,
                .shift = 1,
                .storagebits = 32,
        },
        [AD4695_SCAN_TYPE_OSR_64] = {
                .sign = 's',
                .realbits = 19,
                .storagebits = 32,
        },
};

static const struct iio_chan_spec ad4695_channel_template = {
        .type = IIO_VOLTAGE,
        .indexed = 1,
        .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |
                              BIT(IIO_CHAN_INFO_SCALE) |
                              BIT(IIO_CHAN_INFO_OFFSET) |
                              BIT(IIO_CHAN_INFO_CALIBSCALE) |
                              BIT(IIO_CHAN_INFO_CALIBBIAS),
        .info_mask_separate_available = BIT(IIO_CHAN_INFO_CALIBSCALE) |
                                        BIT(IIO_CHAN_INFO_CALIBBIAS),
        .scan_type = {
                .sign = 'u',
                .realbits = 16,
                .storagebits = 16,
        },
};

static const struct iio_chan_spec ad4695_temp_channel_template = {
        .address = AD4695_CMD_TEMP_CHAN,
        .type = IIO_TEMP,
        .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |
                              BIT(IIO_CHAN_INFO_SCALE) |
                              BIT(IIO_CHAN_INFO_OFFSET),
        .scan_type = {
                .sign = 's',
                .realbits = 16,
                .storagebits = 16,
        },
};

static const struct iio_chan_spec ad4695_soft_timestamp_channel_template =
        IIO_CHAN_SOFT_TIMESTAMP(0);

static const char * const ad4695_power_supplies[] = {
        "avdd", "vio"
};

static const int ad4695_oversampling_ratios[] = {
        1, 4, 16, 64,
};

static const struct ad4695_chip_info ad4695_chip_info = {
        .name = "ad4695",
        .max_sample_rate = 500 * KILO,
        .t_acq_ns = 1715,
        .num_voltage_inputs = 16,
};

static const struct ad4695_chip_info ad4696_chip_info = {
        .name = "ad4696",
        .max_sample_rate = 1 * MEGA,
        .t_acq_ns = 715,
        .num_voltage_inputs = 16,
};

static const struct ad4695_chip_info ad4697_chip_info = {
        .name = "ad4697",
        .max_sample_rate = 500 * KILO,
        .t_acq_ns = 1715,
        .num_voltage_inputs = 8,
};

static const struct ad4695_chip_info ad4698_chip_info = {
        .name = "ad4698",
        .max_sample_rate = 1 * MEGA,
        .t_acq_ns = 715,
        .num_voltage_inputs = 8,
};

static void ad4695_cnv_manual_trigger(struct ad4695_state *st)
{
        gpiod_set_value_cansleep(st->cnv_gpio, 1);
        ndelay(10);
        gpiod_set_value_cansleep(st->cnv_gpio, 0);
}

/**
 * ad4695_set_single_cycle_mode - Set the device in single cycle mode
 * @st: The AD4695 state
 * @channel: The first channel to read
 *
 * As per the datasheet, to enable single cycle mode, we need to set
 * STD_SEQ_EN=0, NUM_SLOTS_AS=0 and CYC_CTRL=1 (Table 15). Setting SPI_MODE=1
 * triggers the first conversion using the channel in AS_SLOT0.
 *
 * Context: can sleep, must be called with iio_device_claim_direct held
 * Return: 0 on success, a negative error code on failure
 */
static int ad4695_set_single_cycle_mode(struct ad4695_state *st,
                                        unsigned int channel)
{
        int ret;

        ret = regmap_clear_bits(st->regmap, AD4695_REG_SEQ_CTRL,
                                AD4695_REG_SEQ_CTRL_STD_SEQ_EN |
                                AD4695_REG_SEQ_CTRL_NUM_SLOTS_AS);
        if (ret)
                return ret;

        ret = regmap_write(st->regmap, AD4695_REG_AS_SLOT(0),
                           FIELD_PREP(AD4695_REG_AS_SLOT_INX, channel));
        if (ret)
                return ret;

        return regmap_set_bits(st->regmap, AD4695_REG_SETUP,
                               AD4695_REG_SETUP_SPI_MODE |
                               AD4695_REG_SETUP_SPI_CYC_CTRL);
}

/**
 * ad4695_enter_advanced_sequencer_mode - Put the ADC in advanced sequencer mode
 * @st: The driver state
 * @n: The number of slots to use - must be >= 2, <= 128
 *
 * As per the datasheet, to enable advanced sequencer, we need to set
 * STD_SEQ_EN=0, NUM_SLOTS_AS=n-1 and CYC_CTRL=0 (Table 15). Setting SPI_MODE=1
 * triggers the first conversion using the channel in AS_SLOT0.
 *
 * Return: 0 on success, a negative error code on failure
 */
static int ad4695_enter_advanced_sequencer_mode(struct ad4695_state *st, u32 n)
{
        int ret;

        ret = regmap_update_bits(st->regmap, AD4695_REG_SEQ_CTRL,
                AD4695_REG_SEQ_CTRL_STD_SEQ_EN |
                AD4695_REG_SEQ_CTRL_NUM_SLOTS_AS,
                FIELD_PREP(AD4695_REG_SEQ_CTRL_STD_SEQ_EN, 0) |
                FIELD_PREP(AD4695_REG_SEQ_CTRL_NUM_SLOTS_AS, n - 1));
        if (ret)
                return ret;

        return regmap_update_bits(st->regmap, AD4695_REG_SETUP,
                AD4695_REG_SETUP_SPI_MODE | AD4695_REG_SETUP_SPI_CYC_CTRL,
                FIELD_PREP(AD4695_REG_SETUP_SPI_MODE, 1) |
                FIELD_PREP(AD4695_REG_SETUP_SPI_CYC_CTRL, 0));
}

/**
 * ad4695_exit_conversion_mode - Exit conversion mode
 * @st: The AD4695 state
 *
 * Sends SPI command to exit conversion mode.
 *
 * Return: 0 on success, a negative error code on failure
 */
static int ad4695_exit_conversion_mode(struct ad4695_state *st)
{
        /*
         * An extra transfer is needed to trigger a conversion here so
         * that we can be 100% sure the command will be processed by the
         * ADC, rather than relying on it to be in the correct state
         * when this function is called (this chip has a quirk where the
         * command only works when reading a conversion, and if the
         * previous conversion was already read then it won't work). The
         * actual conversion command is then run at the slower
         * AD4695_REG_ACCESS_SCLK_HZ speed to guarantee this works.
         */
        struct spi_transfer xfers[] = {
                {
                        .delay.value = AD4695_T_CNVL_NS,
                        .delay.unit = SPI_DELAY_UNIT_NSECS,
                        .cs_change = 1,
                        .cs_change_delay.value = AD4695_T_CNVH_NS,
                        .cs_change_delay.unit = SPI_DELAY_UNIT_NSECS,
                },
                {
                        .speed_hz = AD4695_REG_ACCESS_SCLK_HZ,
                        .tx_buf = &st->cnv_cmd2,
                        .len = 1,
                        .delay.value = AD4695_T_REGCONFIG_NS,
                        .delay.unit = SPI_DELAY_UNIT_NSECS,
                },
        };

        /*
         * Technically, could do a 5-bit transfer, but shifting to start of
         * 8 bits instead for better SPI controller support.
         */
        st->cnv_cmd2 = AD4695_CMD_EXIT_CNV_MODE << 3;

        if (st->cnv_gpio) {
                ad4695_cnv_manual_trigger(st);

                /*
                 * In this case, CNV is not connected to CS, so we don't need
                 * the extra CS toggle to trigger the conversion and toggling
                 * CS would have no effect.
                 */
                return spi_sync_transfer(st->spi, &xfers[1], 1);
        }

        return spi_sync_transfer(st->spi, xfers, ARRAY_SIZE(xfers));
}

static int ad4695_set_ref_voltage(struct ad4695_state *st, int vref_mv)
{
        u8 val;

        if (vref_mv >= 2400 && vref_mv <= 2750)
                val = 0;
        else if (vref_mv > 2750 && vref_mv <= 3250)
                val = 1;
        else if (vref_mv > 3250 && vref_mv <= 3750)
                val = 2;
        else if (vref_mv > 3750 && vref_mv <= 4500)
                val = 3;
        else if (vref_mv > 4500 && vref_mv <= 5100)
                val = 4;
        else
                return -EINVAL;

        return regmap_update_bits(st->regmap, AD4695_REG_REF_CTRL,
                                  AD4695_REG_REF_CTRL_VREF_SET,
                                  FIELD_PREP(AD4695_REG_REF_CTRL_VREF_SET, val));
}

/**
 * ad4695_osr_to_regval - convert ratio to OSR register value
 * @ratio: ratio to check
 *
 * Check if ratio is present in the list of available ratios and return
 * the corresponding value that needs to be written to the register to
 * select that ratio.
 *
 * Returns: register value (0 to 3) or -EINVAL if there is not an exact
 * match
 */
static int ad4695_osr_to_regval(int ratio)
{
        int i;

        for (i = 0; i < ARRAY_SIZE(ad4695_oversampling_ratios); i++) {
                if (ratio == ad4695_oversampling_ratios[i])
                        return i;
        }

        return -EINVAL;
}

static int ad4695_write_chn_cfg(struct ad4695_state *st,
                                struct ad4695_channel_config *cfg)
{
        u32 mask, val;

        mask = AD4695_REG_CONFIG_IN_MODE;
        val = FIELD_PREP(AD4695_REG_CONFIG_IN_MODE, cfg->bipolar ? 1 : 0);

        mask |= AD4695_REG_CONFIG_IN_PAIR;
        val |= FIELD_PREP(AD4695_REG_CONFIG_IN_PAIR, cfg->pin_pairing);

        mask |= AD4695_REG_CONFIG_IN_AINHIGHZ_EN;
        val |= FIELD_PREP(AD4695_REG_CONFIG_IN_AINHIGHZ_EN,
                          cfg->highz_en ? 1 : 0);

        return regmap_update_bits(st->regmap,
                                  AD4695_REG_CONFIG_IN(cfg->channel),
                                  mask, val);
}

static int ad4695_buffer_preenable(struct iio_dev *indio_dev)
{
        struct ad4695_state *st = iio_priv(indio_dev);
        struct spi_transfer *xfer;
        u8 temp_chan_bit = st->chip_info->num_voltage_inputs;
        u32 bit, num_xfer, num_slots;
        u32 temp_en = 0;
        int ret, rx_buf_offset = 0;

        /*
         * We are using the advanced sequencer since it is the only way to read
         * multiple channels that allows individual configuration of each
         * voltage input channel. Slot 0 in the advanced sequencer is used to
         * account for the gap between trigger polls - we don't read data from
         * this slot. Each enabled voltage channel is assigned a slot starting
         * with slot 1.
         */
        num_slots = 1;

        memset(st->buf_read_xfer, 0, sizeof(st->buf_read_xfer));

        /* First xfer is only to trigger conversion of slot 1, so no rx. */
        xfer = &st->buf_read_xfer[0];
        xfer->cs_change = 1;
        xfer->delay.value = st->chip_info->t_acq_ns;
        xfer->delay.unit = SPI_DELAY_UNIT_NSECS;
        xfer->cs_change_delay.value = AD4695_T_CONVERT_NS;
        xfer->cs_change_delay.unit = SPI_DELAY_UNIT_NSECS;
        num_xfer = 1;

        iio_for_each_active_channel(indio_dev, bit) {
                xfer = &st->buf_read_xfer[num_xfer];
                xfer->bits_per_word = 16;
                xfer->rx_buf = &st->buf[rx_buf_offset++];
                xfer->len = 2;

                if (bit == temp_chan_bit) {
                        temp_en = 1;
                } else {
                        ret = regmap_write(st->regmap,
                                AD4695_REG_AS_SLOT(num_slots),
                                FIELD_PREP(AD4695_REG_AS_SLOT_INX, bit));
                        if (ret)
                                return ret;

                        num_slots++;
                }

                num_xfer++;

                /*
                 * We need to add a blank xfer in data reads, to meet the timing
                 * requirement of a minimum delay between the last SCLK rising
                 * edge and the CS deassert.
                 */
                xfer = &st->buf_read_xfer[num_xfer];
                xfer->delay.value = AD4695_T_SCK_CNV_DELAY_NS;
                xfer->delay.unit = SPI_DELAY_UNIT_NSECS;
                xfer->cs_change = 1;
                xfer->cs_change_delay.value = AD4695_T_CONVERT_NS;
                xfer->cs_change_delay.unit = SPI_DELAY_UNIT_NSECS;

                num_xfer++;
        }

        /*
         * The advanced sequencer requires that at least 2 slots are enabled.
         * Since slot 0 is always used for other purposes, we need only 1
         * enabled voltage channel to meet this requirement.  If the temperature
         * channel is the only enabled channel, we need to add one more slot in
         * the sequence but not read from it. This is because the temperature
         * sensor is sampled at the end of the channel sequence in advanced
         * sequencer mode (see datasheet page 38).
         *
         * From the iio_for_each_active_channel() block above, we now have an
         * xfer with data followed by a blank xfer to allow us to meet the
         * timing spec, so move both of those up before adding an extra to
         * handle the temperature-only case.
         */
        if (num_slots < 2) {
                /* Move last two xfers */
                st->buf_read_xfer[num_xfer] = st->buf_read_xfer[num_xfer - 1];
                st->buf_read_xfer[num_xfer - 1] = st->buf_read_xfer[num_xfer - 2];
                num_xfer++;

                /* Modify inserted xfer for extra slot. */
                xfer = &st->buf_read_xfer[num_xfer - 3];
                memset(xfer, 0, sizeof(*xfer));
                xfer->cs_change = 1;
                xfer->delay.value = st->chip_info->t_acq_ns;
                xfer->delay.unit = SPI_DELAY_UNIT_NSECS;
                xfer->cs_change_delay.value = AD4695_T_CONVERT_NS;
                xfer->cs_change_delay.unit = SPI_DELAY_UNIT_NSECS;
                xfer++;

                /* and add the extra slot in the sequencer */
                ret = regmap_write(st->regmap,
                                   AD4695_REG_AS_SLOT(num_slots),
                                   FIELD_PREP(AD4695_REG_AS_SLOT_INX, 0));
                if (ret)
                        return ret;

                num_slots++;

                /*
                 * We still want to point at the last xfer when finished, so
                 * update the pointer.
                 */
                xfer = &st->buf_read_xfer[num_xfer - 1];
        }

        /*
         * Don't keep CS asserted after last xfer. Also triggers conversion of
         * slot 0.
         */
        xfer->cs_change = 0;

        /*
         * Temperature channel isn't included in the sequence, but rather
         * controlled by setting a bit in the TEMP_CTRL register.
         */

        ret = regmap_update_bits(st->regmap, AD4695_REG_TEMP_CTRL,
                AD4695_REG_TEMP_CTRL_TEMP_EN,
                FIELD_PREP(AD4695_REG_TEMP_CTRL_TEMP_EN, temp_en));
        if (ret)
                return ret;

        spi_message_init_with_transfers(&st->buf_read_msg, st->buf_read_xfer,
                                        num_xfer);

        ret = spi_optimize_message(st->spi, &st->buf_read_msg);
        if (ret)
                return ret;

        /* This triggers conversion of slot 0. */
        ret = ad4695_enter_advanced_sequencer_mode(st, num_slots);
        if (ret)
                spi_unoptimize_message(&st->buf_read_msg);

        return ret;
}

static int ad4695_buffer_postdisable(struct iio_dev *indio_dev)
{
        struct ad4695_state *st = iio_priv(indio_dev);
        int ret;

        ret = ad4695_exit_conversion_mode(st);
        if (ret)
                return ret;

        spi_unoptimize_message(&st->buf_read_msg);

        return 0;
}

static const struct iio_buffer_setup_ops ad4695_buffer_setup_ops = {
        .preenable = ad4695_buffer_preenable,
        .postdisable = ad4695_buffer_postdisable,
};

static irqreturn_t ad4695_trigger_handler(int irq, void *p)
{
        struct iio_poll_func *pf = p;
        struct iio_dev *indio_dev = pf->indio_dev;
        struct ad4695_state *st = iio_priv(indio_dev);
        int ret;

        ret = spi_sync(st->spi, &st->buf_read_msg);
        if (ret)
                goto out;

        iio_push_to_buffers_with_ts(indio_dev, st->buf, sizeof(st->buf),
                                    pf->timestamp);

out:
        iio_trigger_notify_done(indio_dev->trig);

        return IRQ_HANDLED;
}

static int ad4695_offload_buffer_postenable(struct iio_dev *indio_dev)
{
        struct ad4695_state *st = iio_priv(indio_dev);
        struct spi_offload_trigger_config config = {
                .type = SPI_OFFLOAD_TRIGGER_DATA_READY,
        };
        struct spi_transfer *xfer = &st->buf_read_xfer[0];
        struct pwm_state state;
        u8 temp_chan_bit = st->chip_info->num_voltage_inputs;
        u8 num_slots = 0;
        u8 temp_en = 0;
        unsigned int bit;
        int ret;

        iio_for_each_active_channel(indio_dev, bit) {
                if (bit == temp_chan_bit) {
                        temp_en = 1;
                        continue;
                }

                ret = regmap_write(st->regmap, AD4695_REG_AS_SLOT(num_slots),
                                   FIELD_PREP(AD4695_REG_AS_SLOT_INX, bit));
                if (ret)
                        return ret;

                num_slots++;
        }

        /*
         * For non-offload, we could discard data to work around this
         * restriction, but with offload, that is not possible.
         */
        if (num_slots < 2) {
                dev_err(&st->spi->dev,
                        "At least two voltage channels must be enabled.\n");
                return -EINVAL;
        }

        ret = regmap_update_bits(st->regmap, AD4695_REG_TEMP_CTRL,
                                 AD4695_REG_TEMP_CTRL_TEMP_EN,
                                 FIELD_PREP(AD4695_REG_TEMP_CTRL_TEMP_EN,
                                            temp_en));
        if (ret)
                return ret;

        /* Each BUSY event means just one sample for one channel is ready. */
        memset(xfer, 0, sizeof(*xfer));
        xfer->offload_flags = SPI_OFFLOAD_XFER_RX_STREAM;
        /* Using 19 bits per word to allow for possible oversampling */
        xfer->bits_per_word = 19;
        xfer->len = 4;

        spi_message_init_with_transfers(&st->buf_read_msg, xfer, 1);
        st->buf_read_msg.offload = st->offload;

        ret = spi_optimize_message(st->spi, &st->buf_read_msg);
        if (ret)
                return ret;

        /*
         * NB: technically, this is part the SPI offload trigger enable, but it
         * doesn't work to call it from the offload trigger enable callback
         * because it requires accessing the SPI bus. Calling it from the
         * trigger enable callback could cause a deadlock.
         */
        ret = regmap_set_bits(st->regmap, AD4695_REG_GP_MODE,
                              AD4695_REG_GP_MODE_BUSY_GP_EN);
        if (ret)
                goto err_unoptimize_message;

        ret = spi_offload_trigger_enable(st->offload, st->offload_trigger,
                                         &config);
        if (ret)
                goto err_disable_busy_output;

        ret = ad4695_enter_advanced_sequencer_mode(st, num_slots);
        if (ret)
                goto err_offload_trigger_disable;

        mutex_lock(&st->cnv_pwm_lock);
        pwm_get_state(st->cnv_pwm, &state);
        /*
         * PWM subsystem generally rounds down, so requesting 2x minimum high
         * time ensures that we meet the minimum high time in any case.
         */
        state.duty_cycle = AD4695_T_CNVH_NS * 2;
        ret = pwm_apply_might_sleep(st->cnv_pwm, &state);
        mutex_unlock(&st->cnv_pwm_lock);
        if (ret)
                goto err_offload_exit_conversion_mode;

        return 0;

err_offload_exit_conversion_mode:
        /*
         * We have to unwind in a different order to avoid triggering offload.
         * ad4695_exit_conversion_mode() triggers a conversion, so it has to be
         * done after spi_offload_trigger_disable().
         */
        spi_offload_trigger_disable(st->offload, st->offload_trigger);
        ad4695_exit_conversion_mode(st);
        goto err_disable_busy_output;

err_offload_trigger_disable:
        spi_offload_trigger_disable(st->offload, st->offload_trigger);

err_disable_busy_output:
        regmap_clear_bits(st->regmap, AD4695_REG_GP_MODE,
                          AD4695_REG_GP_MODE_BUSY_GP_EN);

err_unoptimize_message:
        spi_unoptimize_message(&st->buf_read_msg);

        return ret;
}

static int ad4695_offload_buffer_predisable(struct iio_dev *indio_dev)
{
        struct ad4695_state *st = iio_priv(indio_dev);
        struct pwm_state state;
        int ret;

        scoped_guard(mutex, &st->cnv_pwm_lock) {
                pwm_get_state(st->cnv_pwm, &state);
                state.duty_cycle = 0;
                ret = pwm_apply_might_sleep(st->cnv_pwm, &state);
                if (ret)
                        return ret;
        }

        spi_offload_trigger_disable(st->offload, st->offload_trigger);

        /*
         * ad4695_exit_conversion_mode() triggers a conversion, so it has to be
         * done after spi_offload_trigger_disable().
         */
        ret = ad4695_exit_conversion_mode(st);
        if (ret)
                return ret;

        ret = regmap_clear_bits(st->regmap, AD4695_REG_GP_MODE,
                                AD4695_REG_GP_MODE_BUSY_GP_EN);
        if (ret)
                return ret;

        spi_unoptimize_message(&st->buf_read_msg);

        return 0;
}

static const struct iio_buffer_setup_ops ad4695_offload_buffer_setup_ops = {
        .postenable = ad4695_offload_buffer_postenable,
        .predisable = ad4695_offload_buffer_predisable,
};

/**
 * ad4695_read_one_sample - Read a single sample using single-cycle mode
 * @st: The AD4695 state
 * @address: The address of the channel to read
 *
 * Upon successful return, the sample will be stored in `st->raw_data`.
 *
 * Context: can sleep, must be called with iio_device_claim_direct held
 * Return: 0 on success, a negative error code on failure
 */
static int ad4695_read_one_sample(struct ad4695_state *st, unsigned int address)
{
        struct spi_transfer xfers[2] = {
                {
                        .speed_hz = AD4695_REG_ACCESS_SCLK_HZ,
                        .bits_per_word = 16,
                        .tx_buf = &st->cnv_cmd,
                        .len = 2,
                },
                {
                        /* Required delay between last SCLK and CNV/CS */
                        .delay.value = AD4695_T_SCK_CNV_DELAY_NS,
                        .delay.unit = SPI_DELAY_UNIT_NSECS,
                }
        };
        int ret;

        ret = ad4695_set_single_cycle_mode(st, address);
        if (ret)
                return ret;

        /*
         * If CNV is connected to CS, the previous function will have triggered
         * the conversion, otherwise, we do it manually.
         */
        if (st->cnv_gpio)
                ad4695_cnv_manual_trigger(st);

        /*
         * Setting the first channel to the temperature channel isn't supported
         * in single-cycle mode, so we have to do an extra conversion to read
         * the temperature.
         */
        if (address == AD4695_CMD_TEMP_CHAN) {
                st->cnv_cmd = AD4695_CMD_TEMP_CHAN << 11;

                ret = spi_sync_transfer(st->spi, xfers, ARRAY_SIZE(xfers));
                if (ret)
                        return ret;

                /*
                 * If CNV is connected to CS, the previous function will have
                 * triggered the conversion, otherwise, we do it manually.
                 */
                if (st->cnv_gpio)
                        ad4695_cnv_manual_trigger(st);
        }

        /* Then read the result and exit conversion mode. */
        st->cnv_cmd = AD4695_CMD_EXIT_CNV_MODE << 11;
        xfers[0].rx_buf = &st->raw_data;

        return spi_sync_transfer(st->spi, xfers, ARRAY_SIZE(xfers));
}

static int __ad4695_read_info_raw(struct ad4695_state *st,
                                  struct iio_chan_spec const *chan,
                                  int *val)
{
        u8 realbits = chan->scan_type.realbits;
        int ret;

        ret = ad4695_read_one_sample(st, chan->address);
        if (ret)
                return ret;

        if (chan->scan_type.sign == 's')
                *val = sign_extend32(st->raw_data, realbits - 1);
        else
                *val = st->raw_data;

        return IIO_VAL_INT;
}

static int ad4695_read_raw(struct iio_dev *indio_dev,
                           struct iio_chan_spec const *chan,
                           int *val, int *val2, long mask)
{
        struct ad4695_state *st = iio_priv(indio_dev);
        const struct iio_scan_type *scan_type;
        struct ad4695_channel_config *cfg;
        unsigned int reg_val;
        int ret, tmp;
        u8 realbits;

        if (chan->type == IIO_VOLTAGE)
                cfg = &st->channels_cfg[chan->scan_index];

        scan_type = iio_get_current_scan_type(indio_dev, chan);
        if (IS_ERR(scan_type))
                return PTR_ERR(scan_type);

        realbits = scan_type->realbits;

        switch (mask) {
        case IIO_CHAN_INFO_RAW:
                if (!iio_device_claim_direct(indio_dev))
                        return -EBUSY;

                ret = __ad4695_read_info_raw(st, chan, val);
                iio_device_release_direct(indio_dev);
                return ret;
        case IIO_CHAN_INFO_SCALE:
                switch (chan->type) {
                case IIO_VOLTAGE:
                        *val = st->vref_mv;
                        *val2 = realbits;
                        return IIO_VAL_FRACTIONAL_LOG2;
                case IIO_TEMP:
                        /* T_scale (°C) = raw * V_REF (mV) / (-1.8 mV/°C * 2^16) */
                        *val = st->vref_mv * -556;
                        *val2 = 16;
                        return IIO_VAL_FRACTIONAL_LOG2;
                default:
                        return -EINVAL;
                }
        case IIO_CHAN_INFO_OFFSET:
                switch (chan->type) {
                case IIO_VOLTAGE:
                        if (cfg->pin_pairing == AD4695_IN_PAIR_COM)
                                *val = st->com_mv * (1 << realbits) / st->vref_mv;
                        else if (cfg->pin_pairing == AD4695_IN_PAIR_EVEN_ODD)
                                *val = cfg->common_mode_mv * (1 << realbits) / st->vref_mv;
                        else
                                *val = 0;

                        return IIO_VAL_INT;
                case IIO_TEMP:
                        /* T_offset (°C) = -725 mV / (-1.8 mV/°C) */
                        /* T_offset (raw) = T_offset (°C) * (-1.8 mV/°C) * 2^16 / V_REF (mV) */
                        *val = -47513600;
                        *val2 = st->vref_mv;
                        return IIO_VAL_FRACTIONAL;
                default:
                        return -EINVAL;
                }
        case IIO_CHAN_INFO_CALIBSCALE:
                switch (chan->type) {
                case IIO_VOLTAGE:
                        if (!iio_device_claim_direct(indio_dev))
                                return -EBUSY;
                        ret = regmap_read(st->regmap16,
                                          AD4695_REG_GAIN_IN(chan->scan_index),
                                          &reg_val);
                        iio_device_release_direct(indio_dev);
                        if (ret)
                                return ret;
                        *val = reg_val;
                        *val2 = 15;

                        return IIO_VAL_FRACTIONAL_LOG2;
                default:
                        return -EINVAL;
                }
        case IIO_CHAN_INFO_CALIBBIAS:
                switch (chan->type)
                case IIO_VOLTAGE: {
                        if (!iio_device_claim_direct(indio_dev))
                                return -EBUSY;
                        ret = regmap_read(st->regmap16,
                                          AD4695_REG_OFFSET_IN(chan->scan_index),
                                          &reg_val);
                        iio_device_release_direct(indio_dev);
                        if (ret)
                                return ret;

                        tmp = sign_extend32(reg_val, 15);

                        switch (cfg->oversampling_ratio) {
                        case 1:
                                *val = tmp / 4;
                                *val2 = abs(tmp) % 4 * MICRO / 4;
                                break;
                        case 4:
                                *val = tmp / 2;
                                *val2 = abs(tmp) % 2 * MICRO / 2;
                                break;
                        case 16:
                                *val = tmp;
                                *val2 = 0;
                                break;
                        case 64:
                                *val = tmp * 2;
                                *val2 = 0;
                                break;
                        default:
                                return -EINVAL;
                        }

                        if (tmp < 0 && *val2) {
                                *val *= -1;
                                *val2 *= -1;
                        }

                        return IIO_VAL_INT_PLUS_MICRO;
                default:
                        return -EINVAL;
                }
        case IIO_CHAN_INFO_OVERSAMPLING_RATIO:
                switch (chan->type) {
                case IIO_VOLTAGE:
                        *val = cfg->oversampling_ratio;
                        return IIO_VAL_INT;
                default:
                        return -EINVAL;
                }
        case IIO_CHAN_INFO_SAMP_FREQ: {
                struct pwm_state state;
                unsigned int osr = 1;

                if (chan->type == IIO_VOLTAGE)
                        osr = cfg->oversampling_ratio;

                ret = pwm_get_state_hw(st->cnv_pwm, &state);
                if (ret)
                        return ret;

                /*
                 * The effective sampling frequency for a channel is the input
                 * frequency divided by the channel's OSR value.
                 */
                *val = DIV_ROUND_UP_ULL(NSEC_PER_SEC, state.period * osr);

                return IIO_VAL_INT;
        }
        default:
                return -EINVAL;
        }
}

static int ad4695_write_raw_get_fmt(struct iio_dev *indio_dev,
                                    struct iio_chan_spec const *chan,
                                    long mask)
{
        switch (mask) {
        case IIO_CHAN_INFO_SAMP_FREQ:
                return IIO_VAL_INT;
        default:
                return IIO_VAL_INT_PLUS_MICRO;
        }
}

static int ad4695_set_osr_val(struct ad4695_state *st,
                              struct iio_chan_spec const *chan,
                              int val)
{
        int osr = ad4695_osr_to_regval(val);

        if (osr < 0)
                return osr;

        switch (chan->type) {
        case IIO_VOLTAGE:
                st->channels_cfg[chan->scan_index].oversampling_ratio = val;
                return regmap_update_bits(st->regmap,
                                AD4695_REG_CONFIG_IN(chan->scan_index),
                                AD4695_REG_CONFIG_IN_OSR_SET,
                                FIELD_PREP(AD4695_REG_CONFIG_IN_OSR_SET, osr));
        default:
                return -EINVAL;
        }
}

static unsigned int ad4695_get_calibbias(int val, int val2, int osr)
{
        int val_calc, scale;

        switch (osr) {
        case 4:
                scale = 4;
                break;
        case 16:
                scale = 2;
                break;
        case 64:
                scale = 1;
                break;
        default:
                scale = 8;
                break;
        }

        val = clamp_t(int, val, S32_MIN / 8, S32_MAX / 8);

        /* val2 range is (-MICRO, MICRO) if val == 0, otherwise [0, MICRO) */
        if (val < 0)
                val_calc = val * scale - val2 * scale / MICRO;
        else if (val2 < 0)
                /* if val2 < 0 then val == 0 */
                val_calc = val2 * scale / (int)MICRO;
        else
                val_calc = val * scale + val2 * scale / MICRO;

        val_calc /= 2;

        return clamp_t(int, val_calc, S16_MIN, S16_MAX);
}

static int __ad4695_write_raw(struct iio_dev *indio_dev,
                              struct iio_chan_spec const *chan,
                              int val, int val2, long mask)
{
        struct ad4695_state *st = iio_priv(indio_dev);
        unsigned int reg_val;
        unsigned int osr = 1;

        if (chan->type == IIO_VOLTAGE)
                osr = st->channels_cfg[chan->scan_index].oversampling_ratio;

        switch (mask) {
        case IIO_CHAN_INFO_CALIBSCALE:
                switch (chan->type) {
                case IIO_VOLTAGE:
                        if (val < 0 || val2 < 0)
                                reg_val = 0;
                        else if (val > 1)
                                reg_val = U16_MAX;
                        else
                                reg_val = (val * (1 << 16) +
                                           mul_u64_u32_div(val2, 1 << 16,
                                                           MICRO)) / 2;

                        return regmap_write(st->regmap16,
                                            AD4695_REG_GAIN_IN(chan->scan_index),
                                            reg_val);
                default:
                        return -EINVAL;
                }
        case IIO_CHAN_INFO_CALIBBIAS:
                switch (chan->type) {
                case IIO_VOLTAGE:
                        reg_val = ad4695_get_calibbias(val, val2, osr);
                        return regmap_write(st->regmap16,
                                            AD4695_REG_OFFSET_IN(chan->scan_index),
                                            reg_val);
                default:
                        return -EINVAL;
                }
        case IIO_CHAN_INFO_SAMP_FREQ: {
                struct pwm_state state;
                /*
                 * Limit the maximum acceptable sample rate according to
                 * the channel's oversampling ratio.
                 */
                u64 max_osr_rate = DIV_ROUND_UP_ULL(st->chip_info->max_sample_rate,
                                                    osr);

                if (val <= 0 || val > max_osr_rate)
                        return -EINVAL;

                guard(mutex)(&st->cnv_pwm_lock);
                pwm_get_state(st->cnv_pwm, &state);
                /*
                 * The required sample frequency for a given OSR is the
                 * input frequency multiplied by it.
                 */
                state.period = DIV_ROUND_UP_ULL(NSEC_PER_SEC, val * osr);
                return pwm_apply_might_sleep(st->cnv_pwm, &state);
        }
        case IIO_CHAN_INFO_OVERSAMPLING_RATIO:
                return ad4695_set_osr_val(st, chan, val);
        default:
                return -EINVAL;
        }
}

static int ad4695_write_raw(struct iio_dev *indio_dev,
                            struct iio_chan_spec const *chan,
                            int val, int val2, long mask)
{
        int ret;

        if (!iio_device_claim_direct(indio_dev))
                return -EBUSY;
        ret = __ad4695_write_raw(indio_dev, chan, val, val2, mask);
        iio_device_release_direct(indio_dev);

        return ret;
}

static int ad4695_read_avail(struct iio_dev *indio_dev,
                             struct iio_chan_spec const *chan,
                             const int **vals, int *type, int *length,
                             long mask)
{
        int ret;
        static const int ad4695_calibscale_available[6] = {
                /* Range of 0 (inclusive) to 2 (exclusive) */
                0, 15, 1, 15, U16_MAX, 15
        };
        static const int ad4695_calibbias_available[4][6] = {
                /*
                 * Datasheet says FSR/8 which translates to signed/4. The step
                 * depends on oversampling ratio, so we need four different
                 * ranges to select from.
                 */
                {
                        S16_MIN / 4, 0,
                        0, MICRO / 4,
                        S16_MAX / 4, S16_MAX % 4 * MICRO / 4
                },
                {
                        S16_MIN / 2, 0,
                        0, MICRO / 2,
                        S16_MAX / 2, S16_MAX % 2 * MICRO / 2,
                },
                {
                        S16_MIN, 0,
                        1, 0,
                        S16_MAX, 0,
                },
                {
                        S16_MIN * 2, 0,
                        2, 0,
                        S16_MAX * 2, 0,
                },
        };
        struct ad4695_state *st = iio_priv(indio_dev);
        unsigned int osr = 1;

        if (chan->type == IIO_VOLTAGE)
                osr = st->channels_cfg[chan->scan_index].oversampling_ratio;

        switch (mask) {
        case IIO_CHAN_INFO_CALIBSCALE:
                switch (chan->type) {
                case IIO_VOLTAGE:
                        *vals = ad4695_calibscale_available;
                        *type = IIO_VAL_FRACTIONAL_LOG2;
                        return IIO_AVAIL_RANGE;
                default:
                        return -EINVAL;
                }
        case IIO_CHAN_INFO_CALIBBIAS:
                switch (chan->type) {
                case IIO_VOLTAGE:
                        ret = ad4695_osr_to_regval(osr);
                        if (ret < 0)
                                return ret;
                        /*
                         * Select the appropriate calibbias array based on the
                         * OSR value in the register.
                         */
                        *vals = ad4695_calibbias_available[ret];
                        *type = IIO_VAL_INT_PLUS_MICRO;
                        return IIO_AVAIL_RANGE;
                default:
                        return -EINVAL;
                }
        case IIO_CHAN_INFO_SAMP_FREQ:
                /* Max sample rate for the channel depends on OSR */
                st->sample_freq_range[2] =
                        DIV_ROUND_UP_ULL(st->chip_info->max_sample_rate, osr);
                *vals = st->sample_freq_range;
                *type = IIO_VAL_INT;
                return IIO_AVAIL_RANGE;
        case IIO_CHAN_INFO_OVERSAMPLING_RATIO:
                switch (chan->type) {
                case IIO_VOLTAGE:
                        *vals = ad4695_oversampling_ratios;
                        *length = ARRAY_SIZE(ad4695_oversampling_ratios);
                        *type = IIO_VAL_INT;
                        return IIO_AVAIL_LIST;
                default:
                        return -EINVAL;
                }
        default:
                return -EINVAL;
        }
}

static int ad4695_debugfs_reg_access(struct iio_dev *indio_dev,
                                     unsigned int reg,
                                     unsigned int writeval,
                                     unsigned int *readval)
{
        struct ad4695_state *st = iio_priv(indio_dev);
        int ret = -EINVAL;

        if (!iio_device_claim_direct(indio_dev))
                return -EBUSY;

        if (readval) {
                if (regmap_check_range_table(st->regmap, reg,
                                             &ad4695_regmap_rd_table))
                        ret = regmap_read(st->regmap, reg, readval);
                if (regmap_check_range_table(st->regmap16, reg,
                                             &ad4695_regmap16_rd_table))
                        ret = regmap_read(st->regmap16, reg, readval);
        } else {
                if (regmap_check_range_table(st->regmap, reg,
                                             &ad4695_regmap_wr_table))
                        ret = regmap_write(st->regmap, reg, writeval);
                if (regmap_check_range_table(st->regmap16, reg,
                                             &ad4695_regmap16_wr_table))
                        ret = regmap_write(st->regmap16, reg, writeval);
        }
        iio_device_release_direct(indio_dev);

        return ret;
}

static int ad4695_get_current_scan_type(const struct iio_dev *indio_dev,
                                        const struct iio_chan_spec *chan)
{
        struct ad4695_state *st = iio_priv(indio_dev);
        unsigned int osr = st->channels_cfg[chan->scan_index].oversampling_ratio;

        switch (osr) {
        case 1:
                return AD4695_SCAN_TYPE_OSR_1;
        case 4:
                return AD4695_SCAN_TYPE_OSR_4;
        case 16:
                return AD4695_SCAN_TYPE_OSR_16;
        case 64:
                return AD4695_SCAN_TYPE_OSR_64;
        default:
                return -EINVAL;
        }
}

static const struct iio_info ad4695_info = {
        .read_raw = &ad4695_read_raw,
        .write_raw_get_fmt = &ad4695_write_raw_get_fmt,
        .write_raw = &ad4695_write_raw,
        .read_avail = &ad4695_read_avail,
        .debugfs_reg_access = &ad4695_debugfs_reg_access,
};

static const struct iio_info ad4695_offload_info = {
        .read_raw = &ad4695_read_raw,
        .write_raw_get_fmt = &ad4695_write_raw_get_fmt,
        .write_raw = &ad4695_write_raw,
        .get_current_scan_type = &ad4695_get_current_scan_type,
        .read_avail = &ad4695_read_avail,
        .debugfs_reg_access = &ad4695_debugfs_reg_access,
};

static int ad4695_parse_channel_cfg(struct ad4695_state *st)
{
        struct device *dev = &st->spi->dev;
        struct ad4695_channel_config *chan_cfg;
        struct iio_chan_spec *iio_chan;
        int ret, i;

        /* populate defaults */
        for (i = 0; i < st->chip_info->num_voltage_inputs; i++) {
                chan_cfg = &st->channels_cfg[i];
                iio_chan = &st->iio_chan[i];

                chan_cfg->highz_en = true;
                chan_cfg->channel = i;

                /* This is the default OSR after reset */
                chan_cfg->oversampling_ratio = 1;

                *iio_chan = ad4695_channel_template;
                iio_chan->channel = i;
                iio_chan->scan_index = i;
                iio_chan->address = AD4695_CMD_VOLTAGE_CHAN(i);
        }

        /* modify based on firmware description */
        device_for_each_child_node_scoped(dev, child) {
                u32 reg, val;

                ret = fwnode_property_read_u32(child, "reg", &reg);
                if (ret)
                        return dev_err_probe(dev, ret,
                                "failed to read reg property (%s)\n",
                                fwnode_get_name(child));

                if (reg >= st->chip_info->num_voltage_inputs)
                        return dev_err_probe(dev, -EINVAL,
                                "reg out of range (%s)\n",
                                fwnode_get_name(child));

                iio_chan = &st->iio_chan[reg];
                chan_cfg = &st->channels_cfg[reg];

                chan_cfg->highz_en =
                        !fwnode_property_read_bool(child, "adi,no-high-z");
                chan_cfg->bipolar = fwnode_property_read_bool(child, "bipolar");

                ret = fwnode_property_read_u32(child, "common-mode-channel",
                                               &val);
                if (ret && ret != -EINVAL)
                        return dev_err_probe(dev, ret,
                                "failed to read common-mode-channel (%s)\n",
                                fwnode_get_name(child));

                if (ret == -EINVAL || val == AD4695_COMMON_MODE_REFGND)
                        chan_cfg->pin_pairing = AD4695_IN_PAIR_REFGND;
                else if (val == AD4695_COMMON_MODE_COM)
                        chan_cfg->pin_pairing = AD4695_IN_PAIR_COM;
                else
                        chan_cfg->pin_pairing = AD4695_IN_PAIR_EVEN_ODD;

                if (chan_cfg->pin_pairing == AD4695_IN_PAIR_EVEN_ODD &&
                    val % 2 == 0)
                        return dev_err_probe(dev, -EINVAL,
                                "common-mode-channel must be odd number (%s)\n",
                                fwnode_get_name(child));

                if (chan_cfg->pin_pairing == AD4695_IN_PAIR_EVEN_ODD &&
                    val != reg + 1)
                        return dev_err_probe(dev, -EINVAL,
                                "common-mode-channel must be next consecutive channel (%s)\n",
                                fwnode_get_name(child));

                if (chan_cfg->pin_pairing == AD4695_IN_PAIR_EVEN_ODD) {
                        char name[5];

                        snprintf(name, sizeof(name), "in%d", reg + 1);

                        ret = devm_regulator_get_enable_read_voltage(dev, name);
                        if (ret < 0)
                                return dev_err_probe(dev, ret,
                                        "failed to get %s voltage (%s)\n",
                                        name, fwnode_get_name(child));

                        chan_cfg->common_mode_mv = ret / 1000;
                }

                if (chan_cfg->bipolar &&
                    chan_cfg->pin_pairing == AD4695_IN_PAIR_REFGND)
                        return dev_err_probe(dev, -EINVAL,
                                "bipolar mode is not available for inputs paired with REFGND (%s).\n",
                                fwnode_get_name(child));

                if (chan_cfg->bipolar)
                        iio_chan->scan_type.sign = 's';

                ret = ad4695_write_chn_cfg(st, chan_cfg);
                if (ret)
                        return ret;
        }

        /* Temperature channel must be next scan index after voltage channels. */
        st->iio_chan[i] = ad4695_temp_channel_template;
        st->iio_chan[i].scan_index = i;
        i++;

        st->iio_chan[i] = ad4695_soft_timestamp_channel_template;
        st->iio_chan[i].scan_index = i;

        return 0;
}

static bool ad4695_offload_trigger_match(struct spi_offload_trigger *trigger,
                                         enum spi_offload_trigger_type type,
                                         u64 *args, u32 nargs)
{
        if (type != SPI_OFFLOAD_TRIGGER_DATA_READY)
                return false;

        /*
         * Requires 2 args:
         * args[0] is the trigger event.
         * args[1] is the GPIO pin number.
         */
        if (nargs != 2 || args[0] != AD4695_TRIGGER_EVENT_BUSY)
                return false;

        return true;
}

static int ad4695_offload_trigger_request(struct spi_offload_trigger *trigger,
                                          enum spi_offload_trigger_type type,
                                          u64 *args, u32 nargs)
{
        struct ad4695_state *st = spi_offload_trigger_get_priv(trigger);

        /* Should already be validated by match, but just in case. */
        if (nargs != 2)
                return -EINVAL;

        /* DT tells us if BUSY event uses GP0 or GP3. */
        if (args[1] == AD4695_TRIGGER_PIN_GP3)
                return regmap_set_bits(st->regmap, AD4695_REG_GP_MODE,
                                       AD4695_REG_GP_MODE_BUSY_GP_SEL);

        return regmap_clear_bits(st->regmap, AD4695_REG_GP_MODE,
                                 AD4695_REG_GP_MODE_BUSY_GP_SEL);
}

static int
ad4695_offload_trigger_validate(struct spi_offload_trigger *trigger,
                                struct spi_offload_trigger_config *config)
{
        if (config->type != SPI_OFFLOAD_TRIGGER_DATA_READY)
                return -EINVAL;

        return 0;
}

/*
 * NB: There are no enable/disable callbacks here due to requiring a SPI
 * message to enable or disable the BUSY output on the ADC.
 */
static const struct spi_offload_trigger_ops ad4695_offload_trigger_ops = {
        .match = ad4695_offload_trigger_match,
        .request = ad4695_offload_trigger_request,
        .validate = ad4695_offload_trigger_validate,
};

static void ad4695_pwm_disable(void *pwm)
{
        pwm_disable(pwm);
}

static int ad4695_probe_spi_offload(struct iio_dev *indio_dev,
                                    struct ad4695_state *st)
{
        struct device *dev = &st->spi->dev;
        struct spi_offload_trigger_info trigger_info = {
                .fwnode = dev_fwnode(dev),
                .ops = &ad4695_offload_trigger_ops,
                .priv = st,
        };
        struct pwm_state pwm_state;
        struct dma_chan *rx_dma;
        int ret, i;

        indio_dev->info = &ad4695_offload_info;
        indio_dev->num_channels = st->chip_info->num_voltage_inputs + 1;
        indio_dev->setup_ops = &ad4695_offload_buffer_setup_ops;

        if (!st->cnv_gpio)
                return dev_err_probe(dev, -ENODEV,
                                     "CNV GPIO is required for SPI offload\n");

        ret = devm_spi_offload_trigger_register(dev, &trigger_info);
        if (ret)
                return dev_err_probe(dev, ret,
                                     "failed to register offload trigger\n");

        st->offload_trigger = devm_spi_offload_trigger_get(dev, st->offload,
                SPI_OFFLOAD_TRIGGER_DATA_READY);
        if (IS_ERR(st->offload_trigger))
                return dev_err_probe(dev, PTR_ERR(st->offload_trigger),
                                     "failed to get offload trigger\n");

        ret = devm_mutex_init(dev, &st->cnv_pwm_lock);
        if (ret)
                return ret;

        st->cnv_pwm = devm_pwm_get(dev, NULL);
        if (IS_ERR(st->cnv_pwm))
                return dev_err_probe(dev, PTR_ERR(st->cnv_pwm),
                                     "failed to get CNV PWM\n");

        pwm_init_state(st->cnv_pwm, &pwm_state);

        /* If firmware didn't provide default rate, use 10kHz (arbitrary). */
        if (pwm_state.period == 0)
                pwm_state.period = 100 * MILLI;

        pwm_state.enabled = true;

        ret = pwm_apply_might_sleep(st->cnv_pwm, &pwm_state);
        if (ret)
                return dev_err_probe(dev, ret, "failed to apply CNV PWM\n");

        ret = devm_add_action_or_reset(dev, ad4695_pwm_disable, st->cnv_pwm);
        if (ret)
                return ret;

        rx_dma = devm_spi_offload_rx_stream_request_dma_chan(dev, st->offload);
        if (IS_ERR(rx_dma))
                return dev_err_probe(dev, PTR_ERR(rx_dma),
                                     "failed to get offload RX DMA\n");

        for (i = 0; i < indio_dev->num_channels; i++) {
                struct iio_chan_spec *chan = &st->iio_chan[i];
                struct ad4695_channel_config *cfg;

                /*
                 * NB: When using offload support, all channels need to have the
                 * same bits_per_word because they all use the same SPI message
                 * for reading one sample. In order to prevent breaking
                 * userspace in the future when oversampling support is added,
                 * all channels are set read 19 bits with a shift of 3 to mask
                 * out the extra bits even though we currently only support 16
                 * bit samples (oversampling ratio == 1).
                 */
                chan->scan_type.shift = 3;
                chan->scan_type.storagebits = 32;
                /* add sample frequency for PWM CNV trigger */
                chan->info_mask_separate |= BIT(IIO_CHAN_INFO_SAMP_FREQ);
                chan->info_mask_separate_available |= BIT(IIO_CHAN_INFO_SAMP_FREQ);

                /* Add the oversampling properties only for voltage channels */
                if (chan->type != IIO_VOLTAGE)
                        continue;

                cfg = &st->channels_cfg[i];

                chan->info_mask_separate |= BIT(IIO_CHAN_INFO_OVERSAMPLING_RATIO);
                chan->info_mask_separate_available |=
                        BIT(IIO_CHAN_INFO_OVERSAMPLING_RATIO);
                chan->has_ext_scan_type = 1;
                if (cfg->bipolar) {
                        chan->ext_scan_type = ad4695_scan_type_offload_s;
                        chan->num_ext_scan_type =
                                ARRAY_SIZE(ad4695_scan_type_offload_s);
                } else {
                        chan->ext_scan_type = ad4695_scan_type_offload_u;
                        chan->num_ext_scan_type =
                                ARRAY_SIZE(ad4695_scan_type_offload_u);
                }
        }

        return devm_iio_dmaengine_buffer_setup_with_handle(dev, indio_dev,
                rx_dma, IIO_BUFFER_DIRECTION_IN);
}

static const struct spi_offload_config ad4695_spi_offload_config = {
        .capability_flags = SPI_OFFLOAD_CAP_TRIGGER |
                            SPI_OFFLOAD_CAP_RX_STREAM_DMA,
};

static int ad4695_probe(struct spi_device *spi)
{
        struct device *dev = &spi->dev;
        struct ad4695_state *st;
        struct iio_dev *indio_dev;
        bool use_internal_ldo_supply;
        bool use_internal_ref_buffer;
        int ret;

        indio_dev = devm_iio_device_alloc(dev, sizeof(*st));
        if (!indio_dev)
                return -ENOMEM;

        st = iio_priv(indio_dev);
        st->spi = spi;

        st->chip_info = spi_get_device_match_data(spi);
        if (!st->chip_info)
                return -EINVAL;

        st->sample_freq_range[0] = 1; /* min */
        st->sample_freq_range[1] = 1; /* step */
        st->sample_freq_range[2] = st->chip_info->max_sample_rate; /* max */

        st->regmap = devm_regmap_init(dev, &ad4695_regmap_bus, st,
                                      &ad4695_regmap_config);
        if (IS_ERR(st->regmap))
                return dev_err_probe(dev, PTR_ERR(st->regmap),
                                     "Failed to initialize regmap\n");

        st->regmap16 = devm_regmap_init(dev, &ad4695_regmap_bus, st,
                                        &ad4695_regmap16_config);
        if (IS_ERR(st->regmap16))
                return dev_err_probe(dev, PTR_ERR(st->regmap16),
                                     "Failed to initialize regmap16\n");

        st->cnv_gpio = devm_gpiod_get_optional(dev, "cnv", GPIOD_OUT_LOW);
        if (IS_ERR(st->cnv_gpio))
                return dev_err_probe(dev, PTR_ERR(st->cnv_gpio),
                                     "Failed to get CNV GPIO\n");

        ret = devm_regulator_bulk_get_enable(dev,
                                             ARRAY_SIZE(ad4695_power_supplies),
                                             ad4695_power_supplies);
        if (ret)
                return dev_err_probe(dev, ret,
                                     "Failed to enable power supplies\n");

        /* If LDO_IN supply is present, then we are using internal LDO. */
        ret = devm_regulator_get_enable_optional(dev, "ldo-in");
        if (ret < 0 && ret != -ENODEV)
                return dev_err_probe(dev, ret,
                                     "Failed to enable LDO_IN supply\n");

        use_internal_ldo_supply = ret == 0;

        if (!use_internal_ldo_supply) {
                /* Otherwise we need an external VDD supply. */
                ret = devm_regulator_get_enable(dev, "vdd");
                if (ret < 0)
                        return dev_err_probe(dev, ret,
                                             "Failed to enable VDD supply\n");
        }

        /* If REFIN supply is given, then we are using internal buffer */
        ret = devm_regulator_get_enable_read_voltage(dev, "refin");
        if (ret < 0 && ret != -ENODEV)
                return dev_err_probe(dev, ret, "Failed to get REFIN voltage\n");

        if (ret != -ENODEV) {
                st->vref_mv = ret / 1000;
                use_internal_ref_buffer = true;
        } else {
                /* Otherwise, we need an external reference. */
                ret = devm_regulator_get_enable_read_voltage(dev, "ref");
                if (ret < 0)
                        return dev_err_probe(dev, ret,
                                             "Failed to get REF voltage\n");

                st->vref_mv = ret / 1000;
                use_internal_ref_buffer = false;
        }

        ret = devm_regulator_get_enable_read_voltage(dev, "com");
        if (ret < 0 && ret != -ENODEV)
                return dev_err_probe(dev, ret, "Failed to get COM voltage\n");

        st->com_mv = ret == -ENODEV ? 0 : ret / 1000;

        /*
         * Reset the device using hardware reset if available or fall back to
         * software reset.
         */

        st->reset_gpio = devm_gpiod_get_optional(dev, "reset", GPIOD_OUT_HIGH);
        if (IS_ERR(st->reset_gpio))
                return PTR_ERR(st->reset_gpio);

        if (st->reset_gpio) {
                gpiod_set_value(st->reset_gpio, 0);
                msleep(AD4695_T_WAKEUP_HW_MS);
        } else {
                ret = regmap_write(st->regmap, AD4695_REG_SPI_CONFIG_A,
                                   AD4695_REG_SPI_CONFIG_A_SW_RST);
                if (ret)
                        return ret;

                msleep(AD4695_T_WAKEUP_SW_MS);
        }

        /* Needed for regmap16 to be able to work correctly. */
        ret = regmap_set_bits(st->regmap, AD4695_REG_SPI_CONFIG_A,
                              AD4695_REG_SPI_CONFIG_A_ADDR_DIR);
        if (ret)
                return ret;

        /* Disable internal LDO if it isn't needed. */
        ret = regmap_update_bits(st->regmap, AD4695_REG_SETUP,
                                 AD4695_REG_SETUP_LDO_EN,
                                 FIELD_PREP(AD4695_REG_SETUP_LDO_EN,
                                            use_internal_ldo_supply ? 1 : 0));
        if (ret)
                return ret;

        /* configure reference supply */

        if (device_property_present(dev, "adi,no-ref-current-limit")) {
                ret = regmap_set_bits(st->regmap, AD4695_REG_REF_CTRL,
                                      AD4695_REG_REF_CTRL_OV_MODE);
                if (ret)
                        return ret;
        }

        if (device_property_present(dev, "adi,no-ref-high-z")) {
                if (use_internal_ref_buffer)
                        return dev_err_probe(dev, -EINVAL,
                                "Cannot disable high-Z mode for internal reference buffer\n");

                ret = regmap_clear_bits(st->regmap, AD4695_REG_REF_CTRL,
                                        AD4695_REG_REF_CTRL_REFHIZ_EN);
                if (ret)
                        return ret;
        }

        ret = ad4695_set_ref_voltage(st, st->vref_mv);
        if (ret)
                return ret;

        if (use_internal_ref_buffer) {
                ret = regmap_set_bits(st->regmap, AD4695_REG_REF_CTRL,
                                      AD4695_REG_REF_CTRL_REFBUF_EN);
                if (ret)
                        return ret;

                /* Give the capacitor some time to charge up. */
                msleep(AD4695_T_REFBUF_MS);
        }

        ret = ad4695_parse_channel_cfg(st);
        if (ret)
                return ret;

        indio_dev->name = st->chip_info->name;
        indio_dev->info = &ad4695_info;
        indio_dev->modes = INDIO_DIRECT_MODE;
        indio_dev->channels = st->iio_chan;
        indio_dev->num_channels = st->chip_info->num_voltage_inputs + 2;

        st->offload = devm_spi_offload_get(dev, spi, &ad4695_spi_offload_config);
        ret = PTR_ERR_OR_ZERO(st->offload);
        if (ret && ret != -ENODEV)
                return dev_err_probe(dev, ret, "failed to get SPI offload\n");

        /* If no SPI offload, fall back to low speed usage. */
        if (ret == -ENODEV) {
                /* Driver currently requires CNV pin to be connected to SPI CS */
                if (st->cnv_gpio)
                        return dev_err_probe(dev, -EINVAL,
                                             "CNV GPIO is not supported\n");

                indio_dev->num_channels = st->chip_info->num_voltage_inputs + 2;

                ret = devm_iio_triggered_buffer_setup(dev, indio_dev,
                                                      iio_pollfunc_store_time,
                                                      ad4695_trigger_handler,
                                                      &ad4695_buffer_setup_ops);
                if (ret)
                        return ret;
        } else {
                ret = ad4695_probe_spi_offload(indio_dev, st);
                if (ret)
                        return ret;
        }

        return devm_iio_device_register(dev, indio_dev);
}

static const struct spi_device_id ad4695_spi_id_table[] = {
        { .name = "ad4695", .driver_data = (kernel_ulong_t)&ad4695_chip_info },
        { .name = "ad4696", .driver_data = (kernel_ulong_t)&ad4696_chip_info },
        { .name = "ad4697", .driver_data = (kernel_ulong_t)&ad4697_chip_info },
        { .name = "ad4698", .driver_data = (kernel_ulong_t)&ad4698_chip_info },
        { }
};
MODULE_DEVICE_TABLE(spi, ad4695_spi_id_table);

static const struct of_device_id ad4695_of_match_table[] = {
        { .compatible = "adi,ad4695", .data = &ad4695_chip_info, },
        { .compatible = "adi,ad4696", .data = &ad4696_chip_info, },
        { .compatible = "adi,ad4697", .data = &ad4697_chip_info, },
        { .compatible = "adi,ad4698", .data = &ad4698_chip_info, },
        { }
};
MODULE_DEVICE_TABLE(of, ad4695_of_match_table);

static struct spi_driver ad4695_driver = {
        .driver = {
                .name = "ad4695",
                .of_match_table = ad4695_of_match_table,
        },
        .probe = ad4695_probe,
        .id_table = ad4695_spi_id_table,
};
module_spi_driver(ad4695_driver);

MODULE_AUTHOR("Ramona Gradinariu <ramona.gradinariu@analog.com>");
MODULE_AUTHOR("David Lechner <dlechner@baylibre.com>");
MODULE_DESCRIPTION("Analog Devices AD4695 ADC driver");
MODULE_LICENSE("GPL");
MODULE_IMPORT_NS("IIO_DMAENGINE_BUFFER");