]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
iio: adc: stm32-dfsdm: adapt sampling rate to oversampling ratio
authorOlivier Moysan <olivier.moysan@st.com>
Wed, 27 Nov 2019 13:10:08 +0000 (14:10 +0100)
committerJonathan Cameron <Jonathan.Cameron@huawei.com>
Mon, 13 Jan 2020 22:00:03 +0000 (22:00 +0000)
Update sampling rate when oversampling ratio is changed
through the IIO ABI.

Signed-off-by: Olivier Moysan <olivier.moysan@st.com>
Acked-by: Fabrice Gasnier <fabrice.gasnier@st.com>
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
drivers/iio/adc/stm32-dfsdm-adc.c

index 1c9b05d11dc57148544425f14ab47f077b47829c..2aad2cda6943e1bd1e17340b38c64ba20c1d195c 100644 (file)
@@ -1221,14 +1221,32 @@ static int stm32_dfsdm_write_raw(struct iio_dev *indio_dev,
        unsigned int spi_freq;
        int ret = -EINVAL;
 
+       switch (ch->src) {
+       case DFSDM_CHANNEL_SPI_CLOCK_INTERNAL:
+               spi_freq = adc->dfsdm->spi_master_freq;
+               break;
+       case DFSDM_CHANNEL_SPI_CLOCK_INTERNAL_DIV2_FALLING:
+       case DFSDM_CHANNEL_SPI_CLOCK_INTERNAL_DIV2_RISING:
+               spi_freq = adc->dfsdm->spi_master_freq / 2;
+               break;
+       default:
+               spi_freq = adc->spi_freq;
+       }
+
        switch (mask) {
        case IIO_CHAN_INFO_OVERSAMPLING_RATIO:
                ret = iio_device_claim_direct_mode(indio_dev);
                if (ret)
                        return ret;
+
                ret = stm32_dfsdm_compute_all_osrs(indio_dev, val);
-               if (!ret)
+               if (!ret) {
+                       dev_dbg(&indio_dev->dev,
+                               "Sampling rate changed from (%u) to (%u)\n",
+                               adc->sample_freq, spi_freq / val);
                        adc->oversamp = val;
+                       adc->sample_freq = spi_freq / val;
+               }
                iio_device_release_direct_mode(indio_dev);
                return ret;
 
@@ -1240,18 +1258,6 @@ static int stm32_dfsdm_write_raw(struct iio_dev *indio_dev,
                if (ret)
                        return ret;
 
-               switch (ch->src) {
-               case DFSDM_CHANNEL_SPI_CLOCK_INTERNAL:
-                       spi_freq = adc->dfsdm->spi_master_freq;
-                       break;
-               case DFSDM_CHANNEL_SPI_CLOCK_INTERNAL_DIV2_FALLING:
-               case DFSDM_CHANNEL_SPI_CLOCK_INTERNAL_DIV2_RISING:
-                       spi_freq = adc->dfsdm->spi_master_freq / 2;
-                       break;
-               default:
-                       spi_freq = adc->spi_freq;
-               }
-
                ret = dfsdm_adc_set_samp_freq(indio_dev, val, spi_freq);
                iio_device_release_direct_mode(indio_dev);
                return ret;