]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
slimbus: core: fix runtime PM imbalance on report present
authorJohan Hovold <johan@kernel.org>
Wed, 26 Nov 2025 14:53:25 +0000 (15:53 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 16 Jan 2026 15:43:04 +0000 (16:43 +0100)
Make sure to balance the runtime PM usage count in case slimbus device
or address allocation fails on report present, which would otherwise
prevent the controller from suspending.

Fixes: 4b14e62ad3c9 ("slimbus: Add support for 'clock-pause' feature")
Cc: stable@vger.kernel.org # 4.16
Signed-off-by: Johan Hovold <johan@kernel.org>
Link: https://patch.msgid.link/20251126145329.5022-3-johan@kernel.org
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/slimbus/core.c

index c808233692ee4678d983058353cc5d2124ab0156..9f85c4280171e4744f2fab904b962d850e13bfce 100644 (file)
@@ -489,21 +489,23 @@ int slim_device_report_present(struct slim_controller *ctrl,
        if (ctrl->sched.clk_state != SLIM_CLK_ACTIVE) {
                dev_err(ctrl->dev, "slim ctrl not active,state:%d, ret:%d\n",
                                    ctrl->sched.clk_state, ret);
-               goto slimbus_not_active;
+               goto out_put_rpm;
        }
 
        sbdev = slim_get_device(ctrl, e_addr);
-       if (IS_ERR(sbdev))
-               return -ENODEV;
+       if (IS_ERR(sbdev)) {
+               ret = -ENODEV;
+               goto out_put_rpm;
+       }
 
        if (sbdev->is_laddr_valid) {
                *laddr = sbdev->laddr;
-               return 0;
+               ret = 0;
+       } else {
+               ret = slim_device_alloc_laddr(sbdev, true);
        }
 
-       ret = slim_device_alloc_laddr(sbdev, true);
-
-slimbus_not_active:
+out_put_rpm:
        pm_runtime_mark_last_busy(ctrl->dev);
        pm_runtime_put_autosuspend(ctrl->dev);
        return ret;