|
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 |
|