Skip to content

Commit

Permalink
usb: host: xhci-plat: create shared hcd after having added main hcd
Browse files Browse the repository at this point in the history
This patch is in preparation of an extension where in case of a
root hub with no ports no shared hcd will be created.
Whether one of the root hubs has no ports we figure our in
usb_add_hcd() for the primary hcd. Therefore create the shared hcd
only after this call.

Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
Signed-off-by: Mathias Nyman <mathias.nyman@linux.intel.com>
Link: https://lore.kernel.org/r/20220511220450.85367-4-mathias.nyman@linux.intel.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
  • Loading branch information
Heiner Kallweit authored and Greg Kroah-Hartman committed May 12, 2022
1 parent 873f323 commit 0cf1ea0
Showing 1 changed file with 16 additions and 13 deletions.
29 changes: 16 additions & 13 deletions drivers/usb/host/xhci-plat.c
Original file line number Diff line number Diff line change
Expand Up @@ -283,12 +283,6 @@ static int xhci_plat_probe(struct platform_device *pdev)
device_set_wakeup_capable(&pdev->dev, true);

xhci->main_hcd = hcd;
xhci->shared_hcd = __usb_create_hcd(driver, sysdev, &pdev->dev,
dev_name(&pdev->dev), hcd);
if (!xhci->shared_hcd) {
ret = -ENOMEM;
goto disable_clk;
}

/* imod_interval is the interrupt moderation value in nanoseconds. */
xhci->imod_interval = 40000;
Expand All @@ -313,16 +307,16 @@ static int xhci_plat_probe(struct platform_device *pdev)
if (IS_ERR(hcd->usb_phy)) {
ret = PTR_ERR(hcd->usb_phy);
if (ret == -EPROBE_DEFER)
goto put_usb3_hcd;
goto disable_clk;
hcd->usb_phy = NULL;
} else {
ret = usb_phy_init(hcd->usb_phy);
if (ret)
goto put_usb3_hcd;
goto disable_clk;
}

hcd->tpl_support = of_usb_host_tpl_support(sysdev->of_node);
xhci->shared_hcd->tpl_support = hcd->tpl_support;

if (priv && (priv->quirks & XHCI_SKIP_PHY_INIT))
hcd->skip_phy_initialization = 1;

Expand All @@ -333,12 +327,21 @@ static int xhci_plat_probe(struct platform_device *pdev)
if (ret)
goto disable_usb_phy;

xhci->shared_hcd = __usb_create_hcd(driver, sysdev, &pdev->dev,
dev_name(&pdev->dev), hcd);
if (!xhci->shared_hcd) {
ret = -ENOMEM;
goto dealloc_usb2_hcd;
}

xhci->shared_hcd->tpl_support = hcd->tpl_support;

if (HCC_MAX_PSA(xhci->hcc_params) >= 4)
xhci->shared_hcd->can_do_streams = 1;

ret = usb_add_hcd(xhci->shared_hcd, irq, IRQF_SHARED);
if (ret)
goto dealloc_usb2_hcd;
goto put_usb3_hcd;

device_enable_async_suspend(&pdev->dev);
pm_runtime_put_noidle(&pdev->dev);
Expand All @@ -352,15 +355,15 @@ static int xhci_plat_probe(struct platform_device *pdev)
return 0;


put_usb3_hcd:
usb_put_hcd(xhci->shared_hcd);

dealloc_usb2_hcd:
usb_remove_hcd(hcd);

disable_usb_phy:
usb_phy_shutdown(hcd->usb_phy);

put_usb3_hcd:
usb_put_hcd(xhci->shared_hcd);

disable_clk:
clk_disable_unprepare(xhci->clk);

Expand Down

0 comments on commit 0cf1ea0

Please sign in to comment.