]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
i2c: xiic: xiic_xfer(): Fix runtime PM leak on error path
authorLars-Peter Clausen <lars@metafoo.de>
Fri, 14 Apr 2023 02:10:22 +0000 (19:10 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 17 Oct 2024 13:08:08 +0000 (15:08 +0200)
[ Upstream commit d663d93bb47e7ab45602b227701022d8aa16040a ]

The xiic_xfer() function gets a runtime PM reference when the function is
entered. This reference is released when the function is exited. There is
currently one error path where the function exits directly, which leads to
a leak of the runtime PM reference.

Make sure that this error path also releases the runtime PM reference.

Fixes: fdacc3c7405d ("i2c: xiic: Switch from waitqueue to completion")
Signed-off-by: Lars-Peter Clausen <lars@metafoo.de>
Reviewed-by: Michal Simek <michal.simek@amd.com>
Signed-off-by: Wolfram Sang <wsa@kernel.org>
Stable-dep-of: 1d4a1adbed25 ("i2c: xiic: Try re-initialization on bus busy timeout")
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/i2c/busses/i2c-xiic.c

index b91ea900aae3a00e789a678fdfd8c101833c2e00..bd5fc4ace0667fa3b3257e512ef2a4266cbb88b0 100644 (file)
@@ -744,7 +744,7 @@ static int xiic_xfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num)
        err = xiic_start_xfer(i2c, msgs, num);
        if (err < 0) {
                dev_err(adap->dev.parent, "Error xiic_start_xfer\n");
-               return err;
+               goto out;
        }
 
        err = wait_for_completion_timeout(&i2c->completion, XIIC_XFER_TIMEOUT);
@@ -762,6 +762,8 @@ static int xiic_xfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num)
                err = (i2c->state == STATE_DONE) ? num : -EIO;
        }
        mutex_unlock(&i2c->lock);
+
+out:
        pm_runtime_mark_last_busy(i2c->dev);
        pm_runtime_put_autosuspend(i2c->dev);
        return err;