]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
iio: core: Match iio_device_claim_*() semantics and implementation
authorKurt Borja <kuurtb@gmail.com>
Tue, 20 Jan 2026 06:20:43 +0000 (01:20 -0500)
committerJonathan Cameron <Jonathan.Cameron@huawei.com>
Thu, 22 Jan 2026 20:53:17 +0000 (20:53 +0000)
Implement iio_device_claim_buffer_mode() fully inline with the use of
__iio_dev_mode_lock(), which takes care of sparse annotations.

To completely match iio_device_claim_direct() semantics, we need to
also change iio_device_claim_buffer_mode() return semantics to usual
true/false conditional lock semantics.

Additionally, to avoid silently breaking out-of-tree drivers, rename
iio_device_claim_buffer_mode() to iio_device_claim_try_buffer_mode().

Reviewed-by: David Lechner <dlechner@baylibre.com>
Reviewed-by: Nuno Sá <nuno.sa@analog.com>
Signed-off-by: Kurt Borja <kuurtb@gmail.com>
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
drivers/iio/adc/ade9000.c
drivers/iio/common/cros_ec_sensors/cros_ec_sensors_core.c
drivers/iio/health/max30100.c
drivers/iio/health/max30102.c
drivers/iio/industrialio-core.c
drivers/iio/light/opt4060.c
include/linux/iio/iio.h

index 2de8a718d62af03e77374bcebe702eb375391c13..db085dc5e526618ebe2c70797225f33295f0695b 100644 (file)
@@ -964,7 +964,7 @@ static irqreturn_t ade9000_dready_thread(int irq, void *data)
        struct iio_dev *indio_dev = data;
 
        /* Handle data ready interrupt from C4/EVENT/DREADY pin */
-       if (!iio_device_claim_buffer_mode(indio_dev)) {
+       if (iio_device_try_claim_buffer_mode(indio_dev)) {
                ade9000_iio_push_buffer(indio_dev);
                iio_device_release_buffer_mode(indio_dev);
        }
index 9ac80e4b7d756d048e7a1bba66070ed81fa49a81..ef53066b1735bc366749911bc1d4f4f94b382270 100644 (file)
@@ -188,11 +188,8 @@ int cros_ec_sensors_push_data(struct iio_dev *indio_dev,
        /*
         * Ignore samples if the buffer is not set: it is needed if the ODR is
         * set but the buffer is not enabled yet.
-        *
-        * Note: iio_device_claim_buffer_mode() returns -EBUSY if the buffer
-        * is not enabled.
         */
-       if (iio_device_claim_buffer_mode(indio_dev) < 0)
+       if (!iio_device_try_claim_buffer_mode(indio_dev))
                return 0;
 
        out = (s16 *)st->samples;
index 3d441013893c767022fc81144773bcc6fc2b5c94..7dfdb5eb305eba016eab3b06c5905857ce2b9c25 100644 (file)
@@ -417,13 +417,7 @@ static int max30100_read_raw(struct iio_dev *indio_dev,
                 * Temperature reading can only be acquired while engine
                 * is running
                 */
-               if (iio_device_claim_buffer_mode(indio_dev)) {
-                       /*
-                        * Replacing -EBUSY or other error code
-                        * returned by iio_device_claim_buffer_mode()
-                        * because user space may rely on the current
-                        * one.
-                        */
+               if (!iio_device_try_claim_buffer_mode(indio_dev)) {
                        ret = -EAGAIN;
                } else {
                        ret = max30100_get_temp(data, val);
index a48c0881a4c728f081ee7525f693f582e6d894fb..6918fcb5de2bca8a080295f179beba89d38f4e9e 100644 (file)
@@ -476,7 +476,7 @@ static int max30102_read_raw(struct iio_dev *indio_dev,
                 * shutdown; leave shutdown briefly when buffer not running
                 */
 any_mode_retry:
-               if (iio_device_claim_buffer_mode(indio_dev)) {
+               if (!iio_device_try_claim_buffer_mode(indio_dev)) {
                        /*
                         * This one is a *bit* hacky. If we cannot claim buffer
                         * mode, then try direct mode so that we make sure
index 0f8e3aa98b72f10bf02576566735ab1c99000bfc..3115d59c1372fbd1fdbfa66db0d9cbb968da3fa5 100644 (file)
@@ -2183,7 +2183,7 @@ EXPORT_SYMBOL_GPL(__devm_iio_device_register);
  *
  * There are very few cases where a driver actually needs to lock the current
  * mode unconditionally. It's recommended to use iio_device_claim_direct() or
- * iio_device_claim_buffer_mode() pairs or related helpers instead.
+ * iio_device_try_claim_buffer_mode() pairs or related helpers instead.
  */
 void __iio_dev_mode_lock(struct iio_dev *indio_dev)
 {
@@ -2201,46 +2201,6 @@ void __iio_dev_mode_unlock(struct iio_dev *indio_dev)
 }
 EXPORT_SYMBOL_GPL(__iio_dev_mode_unlock);
 
-/**
- * iio_device_claim_buffer_mode - Keep device in buffer mode
- * @indio_dev: the iio_dev associated with the device
- *
- * If the device is in buffer mode it is guaranteed to stay
- * that way until iio_device_release_buffer_mode() is called.
- *
- * Use with iio_device_release_buffer_mode().
- *
- * Returns: 0 on success, -EBUSY on failure.
- */
-int iio_device_claim_buffer_mode(struct iio_dev *indio_dev)
-{
-       struct iio_dev_opaque *iio_dev_opaque = to_iio_dev_opaque(indio_dev);
-
-       mutex_lock(&iio_dev_opaque->mlock);
-
-       if (iio_buffer_enabled(indio_dev))
-               return 0;
-
-       mutex_unlock(&iio_dev_opaque->mlock);
-       return -EBUSY;
-}
-EXPORT_SYMBOL_GPL(iio_device_claim_buffer_mode);
-
-/**
- * iio_device_release_buffer_mode - releases claim on buffer mode
- * @indio_dev: the iio_dev associated with the device
- *
- * Release the claim. Device is no longer guaranteed to stay
- * in buffer mode.
- *
- * Use with iio_device_claim_buffer_mode().
- */
-void iio_device_release_buffer_mode(struct iio_dev *indio_dev)
-{
-       mutex_unlock(&to_iio_dev_opaque(indio_dev)->mlock);
-}
-EXPORT_SYMBOL_GPL(iio_device_release_buffer_mode);
-
 /**
  * iio_device_get_current_mode() - helper function providing read-only access to
  *                                the opaque @currentmode variable
index 981c704e7df56ea14f160648acc7bdd40b5f1e1b..8c4a1f562a832a021fd77f0a7ec30797de16d5a0 100644 (file)
@@ -304,7 +304,7 @@ static int opt4060_set_driver_state(struct iio_dev *indio_dev,
        struct opt4060_chip *chip = iio_priv(indio_dev);
        int ret = 0;
 any_mode_retry:
-       if (iio_device_claim_buffer_mode(indio_dev)) {
+       if (!iio_device_try_claim_buffer_mode(indio_dev)) {
                /*
                 * This one is a *bit* hacky. If we cannot claim buffer mode,
                 * then try direct mode so that we make sure things cannot
index e263ab5eeccf1cfaccf5c72c4a6c91da0fbefe71..36bd14e93a75db8530632a518936ca53eadf14ac 100644 (file)
@@ -706,8 +706,39 @@ static inline bool iio_device_claim_direct(struct iio_dev *indio_dev)
  */
 #define iio_device_release_direct(indio_dev) __iio_dev_mode_unlock(indio_dev)
 
-int iio_device_claim_buffer_mode(struct iio_dev *indio_dev);
-void iio_device_release_buffer_mode(struct iio_dev *indio_dev);
+/**
+ * iio_device_try_claim_buffer_mode() - Keep device in buffer mode
+ * @indio_dev: the iio_dev associated with the device
+ *
+ * If the device is in buffer mode it is guaranteed to stay
+ * that way until iio_device_release_buffer_mode() is called.
+ *
+ * Use with iio_device_release_buffer_mode().
+ *
+ * Returns: true on success, false on failure.
+ */
+static inline bool iio_device_try_claim_buffer_mode(struct iio_dev *indio_dev)
+{
+       __iio_dev_mode_lock(indio_dev);
+
+       if (!iio_buffer_enabled(indio_dev)) {
+               __iio_dev_mode_unlock(indio_dev);
+               return false;
+       }
+
+       return true;
+}
+
+/**
+ * iio_device_release_buffer_mode() - releases claim on buffer mode
+ * @indio_dev: the iio_dev associated with the device
+ *
+ * Release the claim. Device is no longer guaranteed to stay
+ * in buffer mode.
+ *
+ * Use with iio_device_try_claim_buffer_mode().
+ */
+#define iio_device_release_buffer_mode(indio_dev) __iio_dev_mode_unlock(indio_dev)
 
 extern const struct bus_type iio_bus_type;