Message ID | 20240530-ad7173-fixes-v3-5-b85f33079e18@analog.com (mailing list archive) |
---|---|
State | Accepted |
Headers | show |
Series | AD7173 fixes | expand |
On Thu, 30 May 2024 15:07:53 +0300 Dumitru Ceclan via B4 Relay <devnull+dumitru.ceclan.analog.com@kernel.org> wrote: > From: Dumitru Ceclan <dumitru.ceclan@analog.com> > > 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: 8eb903272f75 ("iio: adc: ad7173: add AD7173 driver") > Signed-off-by: Dumitru Ceclan <dumitru.ceclan@analog.com> Applied to the fixes-togreg branch of iio.git. Thanks, Jonathan
diff --git a/drivers/iio/adc/ad7173.c b/drivers/iio/adc/ad7173.c index e66a137a76be..ebf248741b34 100644 --- a/drivers/iio/adc/ad7173.c +++ b/drivers/iio/adc/ad7173.c @@ -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, ®); - 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,