]> git.ipfire.org Git - thirdparty/kernel/stable.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)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 10 Apr 2025 12:37:33 +0000 (14:37 +0200)
[ Upstream commit 60a0cf2ebab92011055ab7db6553c0fc3c546938 ]

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>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/iio/accel/msa311.c

index 6ddcc3c2f840915d7ed2fb447d3c1154874c1d69..5927df633e1f94fb219093bc4b52714c6d16bf7f 100644 (file)
@@ -593,23 +593,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));
@@ -755,10 +757,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
@@ -768,6 +766,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 &&
@@ -778,11 +782,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));