Oliver Neukum 07dd46
From 9a8ad10c9f2e0925ff26308ec6756b93fc2f4977 Mon Sep 17 00:00:00 2001
Oliver Neukum 07dd46
From: Johan Hovold <johan+linaro@kernel.org>
Oliver Neukum 07dd46
Date: Tue, 4 Apr 2023 09:25:14 +0200
Oliver Neukum 07dd46
Subject: [PATCH] USB: dwc3: fix runtime pm imbalance on probe errors
Oliver Neukum 07dd46
Git-commit: 9a8ad10c9f2e0925ff26308ec6756b93fc2f4977
Oliver Neukum 07dd46
References: git-fixes
Oliver Neukum 07dd46
Patch-mainline: v6.4-rc1
Oliver Neukum 07dd46
Oliver Neukum 07dd46
Make sure not to suspend the device when probe fails to avoid disabling
Oliver Neukum 07dd46
clocks and phys multiple times.
Oliver Neukum 07dd46
Oliver Neukum 07dd46
Fixes: 328082376aea ("usb: dwc3: fix runtime PM in error path")
Oliver Neukum 07dd46
Cc: stable@vger.kernel.org      # 4.8
Oliver Neukum 07dd46
Cc: Roger Quadros <rogerq@ti.com>
Oliver Neukum 07dd46
Acked-by: Thinh Nguyen <Thinh.Nguyen@synopsys.com>
Oliver Neukum 07dd46
Signed-off-by: Johan Hovold <johan+linaro@kernel.org>
Oliver Neukum 07dd46
Link: https://lore.kernel.org/r/20230404072524.19014-2-johan+linaro@kernel.org
Oliver Neukum 07dd46
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Oliver Neukum 07dd46
Signed-off-by: Oliver Neukum <oneukum@suse.com>
Oliver Neukum 07dd46
---
Oliver Neukum 07dd46
 drivers/usb/dwc3/core.c |   13 +++++--------
Oliver Neukum 07dd46
 1 file changed, 5 insertions(+), 8 deletions(-)
Oliver Neukum 07dd46
Oliver Neukum 07dd46
--- a/drivers/usb/dwc3/core.c
Oliver Neukum 07dd46
+++ b/drivers/usb/dwc3/core.c
Oliver Neukum 07dd46
@@ -1239,13 +1239,11 @@ static int dwc3_probe(struct platform_de
Oliver Neukum 07dd46
 
Oliver Neukum 07dd46
 	spin_lock_init(&dwc->lock);
Oliver Neukum 07dd46
 
Oliver Neukum 07dd46
+	pm_runtime_get_noresume(dev);
Oliver Neukum 07dd46
 	pm_runtime_set_active(dev);
Oliver Neukum 07dd46
 	pm_runtime_use_autosuspend(dev);
Oliver Neukum 07dd46
 	pm_runtime_set_autosuspend_delay(dev, DWC3_DEFAULT_AUTOSUSPEND_DELAY);
Oliver Neukum 07dd46
 	pm_runtime_enable(dev);
Oliver Neukum 07dd46
-	ret = pm_runtime_get_sync(dev);
Oliver Neukum 07dd46
-	if (ret < 0)
Oliver Neukum 07dd46
-		goto err1;
Oliver Neukum 07dd46
 
Oliver Neukum 07dd46
 	pm_runtime_forbid(dev);
Oliver Neukum 07dd46
 
Oliver Neukum 07dd46
@@ -1304,11 +1302,10 @@ err3:
Oliver Neukum 07dd46
 	dwc3_free_event_buffers(dwc);
Oliver Neukum 07dd46
 
Oliver Neukum 07dd46
 err2:
Oliver Neukum 07dd46
-	pm_runtime_allow(&pdev->dev);
Oliver Neukum 07dd46
-
Oliver Neukum 07dd46
-err1:
Oliver Neukum 07dd46
-	pm_runtime_put_sync(&pdev->dev);
Oliver Neukum 07dd46
-	pm_runtime_disable(&pdev->dev);
Oliver Neukum 07dd46
+	pm_runtime_allow(dev);
Oliver Neukum 07dd46
+	pm_runtime_disable(dev);
Oliver Neukum 07dd46
+	pm_runtime_set_suspended(dev);
Oliver Neukum 07dd46
+	pm_runtime_put_noidle(dev);
Oliver Neukum 07dd46
 
Oliver Neukum 07dd46
 err0:
Oliver Neukum 07dd46
 	/*