// 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 0 x0000
#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 0 x0001
#define AD4695_REG_SPI_CONFIG_B_INST_MODE BIT(7 )
#define AD4695_REG_DEVICE_TYPE 0 x0003
#define AD4695_REG_SCRATCH_PAD 0 x000A
#define AD4695_REG_VENDOR_L 0 x000C
#define AD4695_REG_VENDOR_H 0 x000D
#define AD4695_REG_LOOP_MODE 0 x000E
#define AD4695_REG_SPI_CONFIG_C 0 x0010
#define AD4695_REG_SPI_CONFIG_C_MB_STRICT BIT(7 )
#define AD4695_REG_SPI_STATUS 0 x0011
#define AD4695_REG_STATUS 0 x0014
#define AD4695_REG_ALERT_STATUS1 0 x0015
#define AD4695_REG_ALERT_STATUS2 0 x0016
#define AD4695_REG_CLAMP_STATUS 0 x001A
#define AD4695_REG_SETUP 0 x0020
#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 0 x0021
#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 0 x0022
#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 0 x0023
#define AD4695_REG_STD_SEQ_CONFIG 0 x0024
#define AD4695_REG_GPIO_CTRL 0 x0026
#define AD4695_REG_GP_MODE 0 x0027
#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 0 x0029
#define AD4695_REG_TEMP_CTRL_TEMP_EN BIT(0 )
#define AD4695_REG_CONFIG_IN(n) (0 x0030 | (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) (0 x0040 | (2 * (n)))
#define AD4695_REG_LOWER_IN(n) (0 x0060 | (2 * (n)))
#define AD4695_REG_HYST_IN(n) (0 x0080 | (2 * (n)))
#define AD4695_REG_OFFSET_IN(n) (0 x00A0 | (2 * (n)))
#define AD4695_REG_GAIN_IN(n) (0 x00C0 | (2 * (n)))
#define AD4695_REG_AS_SLOT(n) (0 x0100 | (n))
#define AD4695_REG_AS_SLOT_INX GENMASK(3 , 0 )
/* Conversion mode commands */
#define AD4695_CMD_EXIT_CNV_MODE 0 x0A
#define AD4695_CMD_TEMP_CHAN 0 x0F
#define AD4695_CMD_VOLTAGE_CHAN(n) (0 x10 | (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 1 st
* CNV . Excluding the trigger xfer , every 2 nd 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 = 0 x80,
.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 2 x 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),
®_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),
®_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" , ®);
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" );
Messung V0.5 in Prozent C=95 H=97 G=95
¤ Diese beiden folgenden Angebotsgruppen bietet das Unternehmen0.41Angebot
(Wie Sie bei der Firma Beratungs- und Dienstleistungen beauftragen können 2026-09-27)
¤
*Eine klare Vorstellung vom Zielzustand