iio: light: tsl2583: Balance runtime pm + use pm_runtime_resume_and_get()
authorJonathan Cameron <Jonathan.Cameron@huawei.com>
Sun, 9 May 2021 11:33:29 +0000 (12:33 +0100)
committerJonathan Cameron <Jonathan.Cameron@huawei.com>
Mon, 17 May 2021 12:54:25 +0000 (13:54 +0100)
Error paths in read_raw() and write_raw() callbacks failed to perform and
type of runtime pm put().  Remove called pm_runtime_put_noidle()
but there is no equivalent get (this is safe because the reference
count is protected against going below zero, but it is misleading.

Whilst here use pm_runtime_resume_and_get() to replace boilerplate.

Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
Cc: Brian Masney <masneyb@onstation.org>
Reviewed-by: Brian Masney <masneyb@onstation.org>
Reviewed-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
Link: https://lore.kernel.org/r/20210509113354.660190-4-jic23@kernel.org
drivers/iio/light/tsl2583.c

index c9d8f07a6fcdd9e38785ef5b9bf96cb91f184194..7e101d5f72eea464ea08a540dd29bcb0ad37cfb1 100644 (file)
@@ -644,9 +644,7 @@ static int tsl2583_set_pm_runtime_busy(struct tsl2583_chip *chip, bool on)
        int ret;
 
        if (on) {
-               ret = pm_runtime_get_sync(&chip->client->dev);
-               if (ret < 0)
-                       pm_runtime_put_noidle(&chip->client->dev);
+               ret = pm_runtime_resume_and_get(&chip->client->dev);
        } else {
                pm_runtime_mark_last_busy(&chip->client->dev);
                ret = pm_runtime_put_autosuspend(&chip->client->dev);
@@ -729,8 +727,10 @@ static int tsl2583_read_raw(struct iio_dev *indio_dev,
 read_done:
        mutex_unlock(&chip->als_mutex);
 
-       if (ret < 0)
+       if (ret < 0) {
+               tsl2583_set_pm_runtime_busy(chip, false);
                return ret;
+       }
 
        /*
         * Preserve the ret variable if the call to
@@ -791,8 +791,10 @@ static int tsl2583_write_raw(struct iio_dev *indio_dev,
 
        mutex_unlock(&chip->als_mutex);
 
-       if (ret < 0)
+       if (ret < 0) {
+               tsl2583_set_pm_runtime_busy(chip, false);
                return ret;
+       }
 
        ret = tsl2583_set_pm_runtime_busy(chip, false);
        if (ret < 0)
@@ -880,7 +882,6 @@ static int tsl2583_remove(struct i2c_client *client)
 
        pm_runtime_disable(&client->dev);
        pm_runtime_set_suspended(&client->dev);
-       pm_runtime_put_noidle(&client->dev);
 
        return tsl2583_set_power_state(chip, TSL2583_CNTL_PWR_OFF);
 }