mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-11 00:42:56 -04:00
iio: adc: ad4000: Add timestamp channel
The ADC data is pushed to the IIO buffer along with timestamp but no timestamp channel was provided to retried the time data. Add a timestamp channel to provide sample capture time. Suggested-by: David Lechner <dlechner@baylibre.com> Reviewed-by: David Lechner <dlechner@baylibre.com> Signed-off-by: Marcelo Schmitt <marcelo.schmitt@analog.com> Link: https://patch.msgid.link/d1f1bb1b726b90a3a7c1148c65d2f7fe073e2b15.1733147444.git.marcelo.schmitt@analog.com Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
This commit is contained in:
committed by
Jonathan Cameron
parent
c54b909481
commit
646acd46fc
@@ -49,6 +49,7 @@
|
||||
.info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \
|
||||
BIT(IIO_CHAN_INFO_SCALE), \
|
||||
.info_mask_separate_available = _reg_access ? BIT(IIO_CHAN_INFO_SCALE) : 0,\
|
||||
.scan_index = 0, \
|
||||
.scan_type = { \
|
||||
.sign = _sign, \
|
||||
.realbits = _real_bits, \
|
||||
@@ -62,6 +63,12 @@
|
||||
__AD4000_DIFF_CHANNEL((_sign), (_real_bits), \
|
||||
((_real_bits) > 16 ? 32 : 16), (_reg_access))
|
||||
|
||||
#define AD4000_DIFF_CHANNELS(_sign, _real_bits, _reg_access) \
|
||||
{ \
|
||||
AD4000_DIFF_CHANNEL(_sign, _real_bits, _reg_access), \
|
||||
IIO_CHAN_SOFT_TIMESTAMP(1), \
|
||||
}
|
||||
|
||||
#define __AD4000_PSEUDO_DIFF_CHANNEL(_sign, _real_bits, _storage_bits, _reg_access)\
|
||||
{ \
|
||||
.type = IIO_VOLTAGE, \
|
||||
@@ -71,6 +78,7 @@
|
||||
BIT(IIO_CHAN_INFO_SCALE) | \
|
||||
BIT(IIO_CHAN_INFO_OFFSET), \
|
||||
.info_mask_separate_available = _reg_access ? BIT(IIO_CHAN_INFO_SCALE) : 0,\
|
||||
.scan_index = 0, \
|
||||
.scan_type = { \
|
||||
.sign = _sign, \
|
||||
.realbits = _real_bits, \
|
||||
@@ -84,6 +92,12 @@
|
||||
__AD4000_PSEUDO_DIFF_CHANNEL((_sign), (_real_bits), \
|
||||
((_real_bits) > 16 ? 32 : 16), (_reg_access))
|
||||
|
||||
#define AD4000_PSEUDO_DIFF_CHANNELS(_sign, _real_bits, _reg_access) \
|
||||
{ \
|
||||
AD4000_PSEUDO_DIFF_CHANNEL(_sign, _real_bits, _reg_access), \
|
||||
IIO_CHAN_SOFT_TIMESTAMP(1), \
|
||||
}
|
||||
|
||||
static const char * const ad4000_power_supplies[] = {
|
||||
"vdd", "vio"
|
||||
};
|
||||
@@ -110,106 +124,106 @@ static const int ad4000_gains[] = {
|
||||
|
||||
struct ad4000_chip_info {
|
||||
const char *dev_name;
|
||||
struct iio_chan_spec chan_spec;
|
||||
struct iio_chan_spec reg_access_chan_spec;
|
||||
struct iio_chan_spec chan_spec[2];
|
||||
struct iio_chan_spec reg_access_chan_spec[2];
|
||||
bool has_hardware_gain;
|
||||
};
|
||||
|
||||
static const struct ad4000_chip_info ad4000_chip_info = {
|
||||
.dev_name = "ad4000",
|
||||
.chan_spec = AD4000_PSEUDO_DIFF_CHANNEL('u', 16, 0),
|
||||
.reg_access_chan_spec = AD4000_PSEUDO_DIFF_CHANNEL('u', 16, 1),
|
||||
.chan_spec = AD4000_PSEUDO_DIFF_CHANNELS('u', 16, 0),
|
||||
.reg_access_chan_spec = AD4000_PSEUDO_DIFF_CHANNELS('u', 16, 1),
|
||||
};
|
||||
|
||||
static const struct ad4000_chip_info ad4001_chip_info = {
|
||||
.dev_name = "ad4001",
|
||||
.chan_spec = AD4000_DIFF_CHANNEL('s', 16, 0),
|
||||
.reg_access_chan_spec = AD4000_DIFF_CHANNEL('s', 16, 1),
|
||||
.chan_spec = AD4000_DIFF_CHANNELS('s', 16, 0),
|
||||
.reg_access_chan_spec = AD4000_DIFF_CHANNELS('s', 16, 1),
|
||||
};
|
||||
|
||||
static const struct ad4000_chip_info ad4002_chip_info = {
|
||||
.dev_name = "ad4002",
|
||||
.chan_spec = AD4000_PSEUDO_DIFF_CHANNEL('u', 18, 0),
|
||||
.reg_access_chan_spec = AD4000_PSEUDO_DIFF_CHANNEL('u', 18, 1),
|
||||
.chan_spec = AD4000_PSEUDO_DIFF_CHANNELS('u', 18, 0),
|
||||
.reg_access_chan_spec = AD4000_PSEUDO_DIFF_CHANNELS('u', 18, 1),
|
||||
};
|
||||
|
||||
static const struct ad4000_chip_info ad4003_chip_info = {
|
||||
.dev_name = "ad4003",
|
||||
.chan_spec = AD4000_DIFF_CHANNEL('s', 18, 0),
|
||||
.reg_access_chan_spec = AD4000_DIFF_CHANNEL('s', 18, 1),
|
||||
.chan_spec = AD4000_DIFF_CHANNELS('s', 18, 0),
|
||||
.reg_access_chan_spec = AD4000_DIFF_CHANNELS('s', 18, 1),
|
||||
};
|
||||
|
||||
static const struct ad4000_chip_info ad4004_chip_info = {
|
||||
.dev_name = "ad4004",
|
||||
.chan_spec = AD4000_PSEUDO_DIFF_CHANNEL('u', 16, 0),
|
||||
.reg_access_chan_spec = AD4000_PSEUDO_DIFF_CHANNEL('u', 16, 1),
|
||||
.chan_spec = AD4000_PSEUDO_DIFF_CHANNELS('u', 16, 0),
|
||||
.reg_access_chan_spec = AD4000_PSEUDO_DIFF_CHANNELS('u', 16, 1),
|
||||
};
|
||||
|
||||
static const struct ad4000_chip_info ad4005_chip_info = {
|
||||
.dev_name = "ad4005",
|
||||
.chan_spec = AD4000_DIFF_CHANNEL('s', 16, 0),
|
||||
.reg_access_chan_spec = AD4000_DIFF_CHANNEL('s', 16, 1),
|
||||
.chan_spec = AD4000_DIFF_CHANNELS('s', 16, 0),
|
||||
.reg_access_chan_spec = AD4000_DIFF_CHANNELS('s', 16, 1),
|
||||
};
|
||||
|
||||
static const struct ad4000_chip_info ad4006_chip_info = {
|
||||
.dev_name = "ad4006",
|
||||
.chan_spec = AD4000_PSEUDO_DIFF_CHANNEL('u', 18, 0),
|
||||
.reg_access_chan_spec = AD4000_PSEUDO_DIFF_CHANNEL('u', 18, 1),
|
||||
.chan_spec = AD4000_PSEUDO_DIFF_CHANNELS('u', 18, 0),
|
||||
.reg_access_chan_spec = AD4000_PSEUDO_DIFF_CHANNELS('u', 18, 1),
|
||||
};
|
||||
|
||||
static const struct ad4000_chip_info ad4007_chip_info = {
|
||||
.dev_name = "ad4007",
|
||||
.chan_spec = AD4000_DIFF_CHANNEL('s', 18, 0),
|
||||
.reg_access_chan_spec = AD4000_DIFF_CHANNEL('s', 18, 1),
|
||||
.chan_spec = AD4000_DIFF_CHANNELS('s', 18, 0),
|
||||
.reg_access_chan_spec = AD4000_DIFF_CHANNELS('s', 18, 1),
|
||||
};
|
||||
|
||||
static const struct ad4000_chip_info ad4008_chip_info = {
|
||||
.dev_name = "ad4008",
|
||||
.chan_spec = AD4000_PSEUDO_DIFF_CHANNEL('u', 16, 0),
|
||||
.reg_access_chan_spec = AD4000_PSEUDO_DIFF_CHANNEL('u', 16, 1),
|
||||
.chan_spec = AD4000_PSEUDO_DIFF_CHANNELS('u', 16, 0),
|
||||
.reg_access_chan_spec = AD4000_PSEUDO_DIFF_CHANNELS('u', 16, 1),
|
||||
};
|
||||
|
||||
static const struct ad4000_chip_info ad4010_chip_info = {
|
||||
.dev_name = "ad4010",
|
||||
.chan_spec = AD4000_PSEUDO_DIFF_CHANNEL('u', 18, 0),
|
||||
.reg_access_chan_spec = AD4000_PSEUDO_DIFF_CHANNEL('u', 18, 1),
|
||||
.chan_spec = AD4000_PSEUDO_DIFF_CHANNELS('u', 18, 0),
|
||||
.reg_access_chan_spec = AD4000_PSEUDO_DIFF_CHANNELS('u', 18, 1),
|
||||
};
|
||||
|
||||
static const struct ad4000_chip_info ad4011_chip_info = {
|
||||
.dev_name = "ad4011",
|
||||
.chan_spec = AD4000_DIFF_CHANNEL('s', 18, 0),
|
||||
.reg_access_chan_spec = AD4000_DIFF_CHANNEL('s', 18, 1),
|
||||
.chan_spec = AD4000_DIFF_CHANNELS('s', 18, 0),
|
||||
.reg_access_chan_spec = AD4000_DIFF_CHANNELS('s', 18, 1),
|
||||
};
|
||||
|
||||
static const struct ad4000_chip_info ad4020_chip_info = {
|
||||
.dev_name = "ad4020",
|
||||
.chan_spec = AD4000_DIFF_CHANNEL('s', 20, 0),
|
||||
.reg_access_chan_spec = AD4000_DIFF_CHANNEL('s', 20, 1),
|
||||
.chan_spec = AD4000_DIFF_CHANNELS('s', 20, 0),
|
||||
.reg_access_chan_spec = AD4000_DIFF_CHANNELS('s', 20, 1),
|
||||
};
|
||||
|
||||
static const struct ad4000_chip_info ad4021_chip_info = {
|
||||
.dev_name = "ad4021",
|
||||
.chan_spec = AD4000_DIFF_CHANNEL('s', 20, 0),
|
||||
.reg_access_chan_spec = AD4000_DIFF_CHANNEL('s', 20, 1),
|
||||
.chan_spec = AD4000_DIFF_CHANNELS('s', 20, 0),
|
||||
.reg_access_chan_spec = AD4000_DIFF_CHANNELS('s', 20, 1),
|
||||
};
|
||||
|
||||
static const struct ad4000_chip_info ad4022_chip_info = {
|
||||
.dev_name = "ad4022",
|
||||
.chan_spec = AD4000_DIFF_CHANNEL('s', 20, 0),
|
||||
.reg_access_chan_spec = AD4000_DIFF_CHANNEL('s', 20, 1),
|
||||
.chan_spec = AD4000_DIFF_CHANNELS('s', 20, 0),
|
||||
.reg_access_chan_spec = AD4000_DIFF_CHANNELS('s', 20, 1),
|
||||
};
|
||||
|
||||
static const struct ad4000_chip_info adaq4001_chip_info = {
|
||||
.dev_name = "adaq4001",
|
||||
.chan_spec = AD4000_DIFF_CHANNEL('s', 16, 0),
|
||||
.reg_access_chan_spec = AD4000_DIFF_CHANNEL('s', 16, 1),
|
||||
.chan_spec = AD4000_DIFF_CHANNELS('s', 16, 0),
|
||||
.reg_access_chan_spec = AD4000_DIFF_CHANNELS('s', 16, 1),
|
||||
.has_hardware_gain = true,
|
||||
};
|
||||
|
||||
static const struct ad4000_chip_info adaq4003_chip_info = {
|
||||
.dev_name = "adaq4003",
|
||||
.chan_spec = AD4000_DIFF_CHANNEL('s', 18, 0),
|
||||
.reg_access_chan_spec = AD4000_DIFF_CHANNEL('s', 18, 1),
|
||||
.chan_spec = AD4000_DIFF_CHANNELS('s', 18, 0),
|
||||
.reg_access_chan_spec = AD4000_DIFF_CHANNELS('s', 18, 1),
|
||||
.has_hardware_gain = true,
|
||||
};
|
||||
|
||||
@@ -591,7 +605,7 @@ static int ad4000_probe(struct spi_device *spi)
|
||||
switch (st->sdi_pin) {
|
||||
case AD4000_SDI_MOSI:
|
||||
indio_dev->info = &ad4000_reg_access_info;
|
||||
indio_dev->channels = &chip->reg_access_chan_spec;
|
||||
indio_dev->channels = chip->reg_access_chan_spec;
|
||||
|
||||
/*
|
||||
* In "3-wire mode", the ADC SDI line must be kept high when
|
||||
@@ -603,7 +617,7 @@ static int ad4000_probe(struct spi_device *spi)
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
ret = ad4000_prepare_3wire_mode_message(st, indio_dev->channels);
|
||||
ret = ad4000_prepare_3wire_mode_message(st, &indio_dev->channels[0]);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
@@ -614,16 +628,16 @@ static int ad4000_probe(struct spi_device *spi)
|
||||
break;
|
||||
case AD4000_SDI_VIO:
|
||||
indio_dev->info = &ad4000_info;
|
||||
indio_dev->channels = &chip->chan_spec;
|
||||
ret = ad4000_prepare_3wire_mode_message(st, indio_dev->channels);
|
||||
indio_dev->channels = chip->chan_spec;
|
||||
ret = ad4000_prepare_3wire_mode_message(st, &indio_dev->channels[0]);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
break;
|
||||
case AD4000_SDI_CS:
|
||||
indio_dev->info = &ad4000_info;
|
||||
indio_dev->channels = &chip->chan_spec;
|
||||
ret = ad4000_prepare_4wire_mode_message(st, indio_dev->channels);
|
||||
indio_dev->channels = chip->chan_spec;
|
||||
ret = ad4000_prepare_4wire_mode_message(st, &indio_dev->channels[0]);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
@@ -637,7 +651,7 @@ static int ad4000_probe(struct spi_device *spi)
|
||||
}
|
||||
|
||||
indio_dev->name = chip->dev_name;
|
||||
indio_dev->num_channels = 1;
|
||||
indio_dev->num_channels = 2;
|
||||
|
||||
ret = devm_mutex_init(dev, &st->lock);
|
||||
if (ret)
|
||||
@@ -658,7 +672,7 @@ static int ad4000_probe(struct spi_device *spi)
|
||||
}
|
||||
}
|
||||
|
||||
ad4000_fill_scale_tbl(st, indio_dev->channels);
|
||||
ad4000_fill_scale_tbl(st, &indio_dev->channels[0]);
|
||||
|
||||
ret = devm_iio_triggered_buffer_setup(dev, indio_dev,
|
||||
&iio_pollfunc_store_time,
|
||||
|
||||
Reference in New Issue
Block a user