]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
iio: adc: ad4000: Add timestamp channel
authorMarcelo Schmitt <marcelo.schmitt@analog.com>
Mon, 2 Dec 2024 14:07:56 +0000 (11:07 -0300)
committerJonathan Cameron <Jonathan.Cameron@huawei.com>
Wed, 11 Dec 2024 19:20:49 +0000 (19:20 +0000)
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>
drivers/iio/adc/ad4000.c

index b3b82535f5c14dfe4a5db1c8aa69fd13d1283de7..e73c285b343836162d487d340a6db6c2c1d31af6 100644 (file)
@@ -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,                                         \
        __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,                                         \
        __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,