]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
iio: accel: msa311: Fix failure to release runtime pm if direct mode claim fails.
authorJonathan Cameron <Jonathan.Cameron@huawei.com>
Mon, 17 Feb 2025 14:01:33 +0000 (14:01 +0000)
committerJonathan Cameron <Jonathan.Cameron@huawei.com>
Tue, 4 Mar 2025 13:17:48 +0000 (13:17 +0000)
Reorder the claiming of direct mode and runtime pm calls to simplify
handling a little.  For correct error handling, after the reorder
iio_device_release_direct_mode() must be claimed in an error occurs
in pm_runtime_resume_and_get()

Fixes: 1ca2cfbc0c33 ("iio: add MEMSensing MSA311 3-axis accelerometer driver")
Reviewed-by: David Lechner <dlechner@baylibre.com>
Link: https://patch.msgid.link/20250217140135.896574-7-jic23@kernel.org
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
drivers/iio/accel/msa311.c

index fe4c32a9558af649a29c0bb7dd9acf093e0b9829..7f4ab7cdbc4aafc1a0c45f664a77205046adbc07 100644 (file)
@@ -594,23 +594,25 @@ static int msa311_read_raw_data(struct iio_dev *indio_dev,
        __le16 axis;
        int err;
 
-       err = pm_runtime_resume_and_get(dev);
+       err = iio_device_claim_direct_mode(indio_dev);
        if (err)
                return err;
 
-       err = iio_device_claim_direct_mode(indio_dev);
-       if (err)
+       err = pm_runtime_resume_and_get(dev);
+       if (err) {
+               iio_device_release_direct_mode(indio_dev);
                return err;
+       }
 
        mutex_lock(&msa311->lock);
        err = msa311_get_axis(msa311, chan, &axis);
        mutex_unlock(&msa311->lock);
 
-       iio_device_release_direct_mode(indio_dev);
-
        pm_runtime_mark_last_busy(dev);
        pm_runtime_put_autosuspend(dev);
 
+       iio_device_release_direct_mode(indio_dev);
+
        if (err) {
                dev_err(dev, "can't get axis %s (%pe)\n",
                        chan->datasheet_name, ERR_PTR(err));
@@ -756,10 +758,6 @@ static int msa311_write_samp_freq(struct iio_dev *indio_dev, int val, int val2)
        unsigned int odr;
        int err;
 
-       err = pm_runtime_resume_and_get(dev);
-       if (err)
-               return err;
-
        /*
         * Sampling frequency changing is prohibited when buffer mode is
         * enabled, because sometimes MSA311 chip returns outliers during
@@ -769,6 +767,12 @@ static int msa311_write_samp_freq(struct iio_dev *indio_dev, int val, int val2)
        if (err)
                return err;
 
+       err = pm_runtime_resume_and_get(dev);
+       if (err) {
+               iio_device_release_direct_mode(indio_dev);
+               return err;
+       }
+
        err = -EINVAL;
        for (odr = 0; odr < ARRAY_SIZE(msa311_odr_table); odr++)
                if (val == msa311_odr_table[odr].integral &&
@@ -779,11 +783,11 @@ static int msa311_write_samp_freq(struct iio_dev *indio_dev, int val, int val2)
                        break;
                }
 
-       iio_device_release_direct_mode(indio_dev);
-
        pm_runtime_mark_last_busy(dev);
        pm_runtime_put_autosuspend(dev);
 
+       iio_device_release_direct_mode(indio_dev);
+
        if (err)
                dev_err(dev, "can't update frequency (%pe)\n", ERR_PTR(err));