]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
iio: adc: ad7173: Fix sampling frequency setting
authorDumitru Ceclan <dumitru.ceclan@analog.com>
Thu, 30 May 2024 12:07:53 +0000 (15:07 +0300)
committerJonathan Cameron <Jonathan.Cameron@huawei.com>
Mon, 3 Jun 2024 18:05:45 +0000 (19:05 +0100)
This patch fixes two issues regarding the sampling frequency setting:
-The attribute was set as per device, not per channel. As such, when
 setting the sampling frequency, the configuration was always done for
 the slot 0, and the correct configuration was applied on the next
 channel configuration call by the LRU mechanism.
-The LRU implementation does not take into account external settings of
 the slot registers. When setting the sampling frequency directly to a
 slot register in write_raw(), there is no guarantee that other channels
 were not also using that slot and now incorrectly retain their config
 as live.

Set the sampling frequency attribute as separate in the channel templates.
Do not set the sampling directly to the slot register in write_raw(),
just mark the config as not live and let the LRU mechanism handle it.
As the reg variable is no longer used, remove it.

Fixes: 76a1e6a42802 ("iio: adc: ad7173: add AD7173 driver")
Signed-off-by: Dumitru Ceclan <dumitru.ceclan@analog.com>
Link: https://lore.kernel.org/r/20240530-ad7173-fixes-v3-5-b85f33079e18@analog.com
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
drivers/iio/adc/ad7173.c

index e2f17292409cb3341922db6766ae04fc86186a68..b26d4575e2569d3238658ae611d3e6c01df3644c 100644 (file)
@@ -717,7 +717,7 @@ static int ad7173_write_raw(struct iio_dev *indio_dev,
 {
        struct ad7173_state *st = iio_priv(indio_dev);
        struct ad7173_channel_config *cfg;
-       unsigned int freq, i, reg;
+       unsigned int freq, i;
        int ret;
 
        ret = iio_device_claim_direct_mode(indio_dev);
@@ -733,16 +733,7 @@ static int ad7173_write_raw(struct iio_dev *indio_dev,
 
                cfg = &st->channels[chan->address].cfg;
                cfg->odr = i;
-
-               if (!cfg->live)
-                       break;
-
-               ret = ad_sd_read_reg(&st->sd, AD7173_REG_FILTER(cfg->cfg_slot), 2, &reg);
-               if (ret)
-                       break;
-               reg &= ~AD7173_FILTER_ODR0_MASK;
-               reg |= FIELD_PREP(AD7173_FILTER_ODR0_MASK, i);
-               ret = ad_sd_write_reg(&st->sd, AD7173_REG_FILTER(cfg->cfg_slot), 2, reg);
+               cfg->live = false;
                break;
 
        default:
@@ -804,8 +795,7 @@ static const struct iio_chan_spec ad7173_channel_template = {
        .type = IIO_VOLTAGE,
        .indexed = 1,
        .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |
-               BIT(IIO_CHAN_INFO_SCALE),
-       .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ),
+               BIT(IIO_CHAN_INFO_SCALE) | BIT(IIO_CHAN_INFO_SAMP_FREQ),
        .scan_type = {
                .sign = 'u',
                .realbits = 24,
@@ -819,8 +809,8 @@ static const struct iio_chan_spec ad7173_temp_iio_channel_template = {
        .channel = AD7173_AIN_TEMP_POS,
        .channel2 = AD7173_AIN_TEMP_NEG,
        .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |
-               BIT(IIO_CHAN_INFO_SCALE) | BIT(IIO_CHAN_INFO_OFFSET),
-       .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ),
+               BIT(IIO_CHAN_INFO_SCALE) | BIT(IIO_CHAN_INFO_OFFSET) |
+               BIT(IIO_CHAN_INFO_SAMP_FREQ),
        .scan_type = {
                .sign = 'u',
                .realbits = 24,