]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
iio: adc: ad7606: protect register access
authorAngelo Dureghello <adureghello@baylibre.com>
Mon, 10 Feb 2025 16:10:57 +0000 (17:10 +0100)
committerJonathan Cameron <Jonathan.Cameron@huawei.com>
Tue, 11 Feb 2025 19:56:25 +0000 (19:56 +0000)
Protect register (and bus) access from concurrent
read / write. Needed in the backend operating mode.

Signed-off-by: Angelo Dureghello <adureghello@baylibre.com>
Link: https://patch.msgid.link/20250210-wip-bl-ad7606_add_backend_sw_mode-v4-7-160df18b1da7@baylibre.com
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
drivers/iio/adc/ad7606.c

index b88c3e248b7eaa00fcf3293f405426ceb96a447a..612fe73396d74740d0dd2b671da4eb88e2aa69d0 100644 (file)
@@ -862,7 +862,12 @@ static int ad7606_write_raw(struct iio_dev *indio_dev,
                }
                val = (val * MICRO) + val2;
                i = find_closest(val, scale_avail_uv, cs->num_scales);
+
+               ret = iio_device_claim_direct_mode(indio_dev);
+               if (ret < 0)
+                       return ret;
                ret = st->write_scale(indio_dev, ch, i + cs->reg_offset);
+               iio_device_release_direct_mode(indio_dev);
                if (ret < 0)
                        return ret;
                cs->range = i;
@@ -873,7 +878,12 @@ static int ad7606_write_raw(struct iio_dev *indio_dev,
                        return -EINVAL;
                i = find_closest(val, st->oversampling_avail,
                                 st->num_os_ratios);
+
+               ret = iio_device_claim_direct_mode(indio_dev);
+               if (ret < 0)
+                       return ret;
                ret = st->write_os(indio_dev, i);
+               iio_device_release_direct_mode(indio_dev);
                if (ret < 0)
                        return ret;
                st->oversampling = st->oversampling_avail[i];