iio: adc: stm32-dfsdm: claim direct mode for raw read and settings
authorFabrice Gasnier <fabrice.gasnier@st.com>
Thu, 21 Mar 2019 16:47:29 +0000 (17:47 +0100)
committerJonathan Cameron <Jonathan.Cameron@huawei.com>
Thu, 4 Apr 2019 19:20:41 +0000 (20:20 +0100)
Claim direct mode to ensure no buffer mode is in use for:
- single conversion
- sample rate setting (must be set when filter isn't enabled).
- oversampling ratio (must be set when filter isn't enabled).

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

index bf0d89eae3efc00652ba5389c945f030dd90fe47..531ca7ef086ed6e8b8bf0a19210027d6181c2e22 100644 (file)
@@ -1039,16 +1039,23 @@ static int stm32_dfsdm_write_raw(struct iio_dev *indio_dev,
 
        switch (mask) {
        case IIO_CHAN_INFO_OVERSAMPLING_RATIO:
+               ret = iio_device_claim_direct_mode(indio_dev);
+               if (ret)
+                       return ret;
                ret = stm32_dfsdm_set_osrs(fl, 0, val);
                if (!ret)
                        adc->oversamp = val;
-
+               iio_device_release_direct_mode(indio_dev);
                return ret;
 
        case IIO_CHAN_INFO_SAMP_FREQ:
                if (!val)
                        return -EINVAL;
 
+               ret = iio_device_claim_direct_mode(indio_dev);
+               if (ret)
+                       return ret;
+
                switch (ch->src) {
                case DFSDM_CHANNEL_SPI_CLOCK_INTERNAL:
                        spi_freq = adc->dfsdm->spi_master_freq;
@@ -1070,9 +1077,11 @@ static int stm32_dfsdm_write_raw(struct iio_dev *indio_dev,
                if (ret < 0) {
                        dev_err(&indio_dev->dev,
                                "Not able to find parameter that match!\n");
+                       iio_device_release_direct_mode(indio_dev);
                        return ret;
                }
                adc->sample_freq = val;
+               iio_device_release_direct_mode(indio_dev);
 
                return 0;
        }
@@ -1089,11 +1098,15 @@ static int stm32_dfsdm_read_raw(struct iio_dev *indio_dev,
 
        switch (mask) {
        case IIO_CHAN_INFO_RAW:
+               ret = iio_device_claim_direct_mode(indio_dev);
+               if (ret)
+                       return ret;
                ret = iio_hw_consumer_enable(adc->hwc);
                if (ret < 0) {
                        dev_err(&indio_dev->dev,
                                "%s: IIO enable failed (channel %d)\n",
                                __func__, chan->channel);
+                       iio_device_release_direct_mode(indio_dev);
                        return ret;
                }
                ret = stm32_dfsdm_single_conv(indio_dev, chan, val);
@@ -1102,8 +1115,10 @@ static int stm32_dfsdm_read_raw(struct iio_dev *indio_dev,
                        dev_err(&indio_dev->dev,
                                "%s: Conversion failed (channel %d)\n",
                                __func__, chan->channel);
+                       iio_device_release_direct_mode(indio_dev);
                        return ret;
                }
+               iio_device_release_direct_mode(indio_dev);
                return IIO_VAL_INT;
 
        case IIO_CHAN_INFO_OVERSAMPLING_RATIO: