Oliver Neukum f9fd00
From 0cf1ea040a7e2cae4776216d16d33d3898ea58de Mon Sep 17 00:00:00 2001
Oliver Neukum f9fd00
From: Heiner Kallweit <hkallweit1@gmail.com>
Oliver Neukum f9fd00
Date: Thu, 12 May 2022 01:04:44 +0300
Oliver Neukum f9fd00
Subject: [PATCH] usb: host: xhci-plat: create shared hcd after having added
Oliver Neukum f9fd00
 main hcd
Oliver Neukum f9fd00
Git-commit: 0cf1ea040a7e2cae4776216d16d33d3898ea58de
Oliver Neukum f9fd00
References: jsc#PED-531
Oliver Neukum f9fd00
Patch-mainline: v5.19-rc1
Oliver Neukum f9fd00
Oliver Neukum f9fd00
This patch is in preparation of an extension where in case of a
Oliver Neukum f9fd00
root hub with no ports no shared hcd will be created.
Oliver Neukum f9fd00
Whether one of the root hubs has no ports we figure our in
Oliver Neukum f9fd00
usb_add_hcd() for the primary hcd. Therefore create the shared hcd
Oliver Neukum f9fd00
only after this call.
Oliver Neukum f9fd00
Oliver Neukum f9fd00
Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
Oliver Neukum f9fd00
Signed-off-by: Mathias Nyman <mathias.nyman@linux.intel.com>
Oliver Neukum f9fd00
Link: https://lore.kernel.org/r/20220511220450.85367-4-mathias.nyman@linux.intel.com
Oliver Neukum f9fd00
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Oliver Neukum f9fd00
Signed-off-by: Oliver Neukum <oneukum@suse.com>
Oliver Neukum f9fd00
---
Oliver Neukum f9fd00
 drivers/usb/host/xhci-plat.c | 29 ++++++++++++++++-------------
Oliver Neukum f9fd00
 1 file changed, 16 insertions(+), 13 deletions(-)
Oliver Neukum f9fd00
Oliver Neukum f9fd00
diff --git a/drivers/usb/host/xhci-plat.c b/drivers/usb/host/xhci-plat.c
Oliver Neukum f9fd00
index 649ffd861b44..5d752b384de2 100644
Oliver Neukum f9fd00
--- a/drivers/usb/host/xhci-plat.c
Oliver Neukum f9fd00
+++ b/drivers/usb/host/xhci-plat.c
Oliver Neukum f9fd00
@@ -283,12 +283,6 @@ static int xhci_plat_probe(struct platform_device *pdev)
Oliver Neukum f9fd00
 	device_set_wakeup_capable(&pdev->dev, true);
Oliver Neukum f9fd00
 
Oliver Neukum f9fd00
 	xhci->main_hcd = hcd;
Oliver Neukum f9fd00
-	xhci->shared_hcd = __usb_create_hcd(driver, sysdev, &pdev->dev,
Oliver Neukum f9fd00
-			dev_name(&pdev->dev), hcd);
Oliver Neukum f9fd00
-	if (!xhci->shared_hcd) {
Oliver Neukum f9fd00
-		ret = -ENOMEM;
Oliver Neukum f9fd00
-		goto disable_clk;
Oliver Neukum f9fd00
-	}
Oliver Neukum f9fd00
 
Oliver Neukum f9fd00
 	/* imod_interval is the interrupt moderation value in nanoseconds. */
Oliver Neukum f9fd00
 	xhci->imod_interval = 40000;
Oliver Neukum f9fd00
@@ -313,16 +307,16 @@ static int xhci_plat_probe(struct platform_device *pdev)
Oliver Neukum f9fd00
 	if (IS_ERR(hcd->usb_phy)) {
Oliver Neukum f9fd00
 		ret = PTR_ERR(hcd->usb_phy);
Oliver Neukum f9fd00
 		if (ret == -EPROBE_DEFER)
Oliver Neukum f9fd00
-			goto put_usb3_hcd;
Oliver Neukum f9fd00
+			goto disable_clk;
Oliver Neukum f9fd00
 		hcd->usb_phy = NULL;
Oliver Neukum f9fd00
 	} else {
Oliver Neukum f9fd00
 		ret = usb_phy_init(hcd->usb_phy);
Oliver Neukum f9fd00
 		if (ret)
Oliver Neukum f9fd00
-			goto put_usb3_hcd;
Oliver Neukum f9fd00
+			goto disable_clk;
Oliver Neukum f9fd00
 	}
Oliver Neukum f9fd00
 
Oliver Neukum f9fd00
 	hcd->tpl_support = of_usb_host_tpl_support(sysdev->of_node);
Oliver Neukum f9fd00
-	xhci->shared_hcd->tpl_support = hcd->tpl_support;
Oliver Neukum f9fd00
+
Oliver Neukum f9fd00
 	if (priv && (priv->quirks & XHCI_SKIP_PHY_INIT))
Oliver Neukum f9fd00
 		hcd->skip_phy_initialization = 1;
Oliver Neukum f9fd00
 
Oliver Neukum f9fd00
@@ -333,12 +327,21 @@ static int xhci_plat_probe(struct platform_device *pdev)
Oliver Neukum f9fd00
 	if (ret)
Oliver Neukum f9fd00
 		goto disable_usb_phy;
Oliver Neukum f9fd00
 
Oliver Neukum f9fd00
+	xhci->shared_hcd = __usb_create_hcd(driver, sysdev, &pdev->dev,
Oliver Neukum f9fd00
+			dev_name(&pdev->dev), hcd);
Oliver Neukum f9fd00
+	if (!xhci->shared_hcd) {
Oliver Neukum f9fd00
+		ret = -ENOMEM;
Oliver Neukum f9fd00
+		goto dealloc_usb2_hcd;
Oliver Neukum f9fd00
+	}
Oliver Neukum f9fd00
+
Oliver Neukum f9fd00
+	xhci->shared_hcd->tpl_support = hcd->tpl_support;
Oliver Neukum f9fd00
+
Oliver Neukum f9fd00
 	if (HCC_MAX_PSA(xhci->hcc_params) >= 4)
Oliver Neukum f9fd00
 		xhci->shared_hcd->can_do_streams = 1;
Oliver Neukum f9fd00
 
Oliver Neukum f9fd00
 	ret = usb_add_hcd(xhci->shared_hcd, irq, IRQF_SHARED);
Oliver Neukum f9fd00
 	if (ret)
Oliver Neukum f9fd00
-		goto dealloc_usb2_hcd;
Oliver Neukum f9fd00
+		goto put_usb3_hcd;
Oliver Neukum f9fd00
 
Oliver Neukum f9fd00
 	device_enable_async_suspend(&pdev->dev);
Oliver Neukum f9fd00
 	pm_runtime_put_noidle(&pdev->dev);
Oliver Neukum f9fd00
@@ -352,15 +355,15 @@ static int xhci_plat_probe(struct platform_device *pdev)
Oliver Neukum f9fd00
 	return 0;
Oliver Neukum f9fd00
 
Oliver Neukum f9fd00
 
Oliver Neukum f9fd00
+put_usb3_hcd:
Oliver Neukum f9fd00
+	usb_put_hcd(xhci->shared_hcd);
Oliver Neukum f9fd00
+
Oliver Neukum f9fd00
 dealloc_usb2_hcd:
Oliver Neukum f9fd00
 	usb_remove_hcd(hcd);
Oliver Neukum f9fd00
 
Oliver Neukum f9fd00
 disable_usb_phy:
Oliver Neukum f9fd00
 	usb_phy_shutdown(hcd->usb_phy);
Oliver Neukum f9fd00
 
Oliver Neukum f9fd00
-put_usb3_hcd:
Oliver Neukum f9fd00
-	usb_put_hcd(xhci->shared_hcd);
Oliver Neukum f9fd00
-
Oliver Neukum f9fd00
 disable_clk:
Oliver Neukum f9fd00
 	clk_disable_unprepare(xhci->clk);
Oliver Neukum f9fd00
 
Oliver Neukum f9fd00
-- 
Oliver Neukum f9fd00
2.35.3
Oliver Neukum f9fd00