Skip to content

Commit 37ada02

Browse files
Fabrice Gasnierjic23
authored andcommitted
iio: adc: stm32-dfsdm: claim direct mode for raw read and settings
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 <[email protected]> Signed-off-by: Jonathan Cameron <[email protected]>
1 parent 11646e8 commit 37ada02

File tree

1 file changed

+16
-1
lines changed

1 file changed

+16
-1
lines changed

drivers/iio/adc/stm32-dfsdm-adc.c

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1039,16 +1039,23 @@ static int stm32_dfsdm_write_raw(struct iio_dev *indio_dev,
10391039

10401040
switch (mask) {
10411041
case IIO_CHAN_INFO_OVERSAMPLING_RATIO:
1042+
ret = iio_device_claim_direct_mode(indio_dev);
1043+
if (ret)
1044+
return ret;
10421045
ret = stm32_dfsdm_set_osrs(fl, 0, val);
10431046
if (!ret)
10441047
adc->oversamp = val;
1045-
1048+
iio_device_release_direct_mode(indio_dev);
10461049
return ret;
10471050

10481051
case IIO_CHAN_INFO_SAMP_FREQ:
10491052
if (!val)
10501053
return -EINVAL;
10511054

1055+
ret = iio_device_claim_direct_mode(indio_dev);
1056+
if (ret)
1057+
return ret;
1058+
10521059
switch (ch->src) {
10531060
case DFSDM_CHANNEL_SPI_CLOCK_INTERNAL:
10541061
spi_freq = adc->dfsdm->spi_master_freq;
@@ -1070,9 +1077,11 @@ static int stm32_dfsdm_write_raw(struct iio_dev *indio_dev,
10701077
if (ret < 0) {
10711078
dev_err(&indio_dev->dev,
10721079
"Not able to find parameter that match!\n");
1080+
iio_device_release_direct_mode(indio_dev);
10731081
return ret;
10741082
}
10751083
adc->sample_freq = val;
1084+
iio_device_release_direct_mode(indio_dev);
10761085

10771086
return 0;
10781087
}
@@ -1089,11 +1098,15 @@ static int stm32_dfsdm_read_raw(struct iio_dev *indio_dev,
10891098

10901099
switch (mask) {
10911100
case IIO_CHAN_INFO_RAW:
1101+
ret = iio_device_claim_direct_mode(indio_dev);
1102+
if (ret)
1103+
return ret;
10921104
ret = iio_hw_consumer_enable(adc->hwc);
10931105
if (ret < 0) {
10941106
dev_err(&indio_dev->dev,
10951107
"%s: IIO enable failed (channel %d)\n",
10961108
__func__, chan->channel);
1109+
iio_device_release_direct_mode(indio_dev);
10971110
return ret;
10981111
}
10991112
ret = stm32_dfsdm_single_conv(indio_dev, chan, val);
@@ -1102,8 +1115,10 @@ static int stm32_dfsdm_read_raw(struct iio_dev *indio_dev,
11021115
dev_err(&indio_dev->dev,
11031116
"%s: Conversion failed (channel %d)\n",
11041117
__func__, chan->channel);
1118+
iio_device_release_direct_mode(indio_dev);
11051119
return ret;
11061120
}
1121+
iio_device_release_direct_mode(indio_dev);
11071122
return IIO_VAL_INT;
11081123

11091124
case IIO_CHAN_INFO_OVERSAMPLING_RATIO:

0 commit comments

Comments
 (0)