usb: host: xhci-plat: prepare operation w/o shared hcd

This patch prepares xhci-plat for the following scenario
- If either of the root hubs has no ports, then omit shared hcd
- Main hcd can be USB3 if there are no USB2 ports

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-5-mathias.nyman@linux.intel.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
Heiner Kallweit 2022-05-12 01:04:45 +03:00 committed by Greg Kroah-Hartman
parent 0cf1ea040a
commit e0fe986972

View file

@ -180,7 +180,7 @@ static int xhci_plat_probe(struct platform_device *pdev)
struct device *sysdev, *tmpdev; struct device *sysdev, *tmpdev;
struct xhci_hcd *xhci; struct xhci_hcd *xhci;
struct resource *res; struct resource *res;
struct usb_hcd *hcd; struct usb_hcd *hcd, *usb3_hcd;
int ret; int ret;
int irq; int irq;
struct xhci_plat_priv *priv = NULL; struct xhci_plat_priv *priv = NULL;
@ -327,21 +327,26 @@ static int xhci_plat_probe(struct platform_device *pdev)
if (ret) if (ret)
goto disable_usb_phy; goto disable_usb_phy;
xhci->shared_hcd = __usb_create_hcd(driver, sysdev, &pdev->dev, if (!xhci_has_one_roothub(xhci)) {
dev_name(&pdev->dev), hcd); xhci->shared_hcd = __usb_create_hcd(driver, sysdev, &pdev->dev,
if (!xhci->shared_hcd) { dev_name(&pdev->dev), hcd);
ret = -ENOMEM; if (!xhci->shared_hcd) {
goto dealloc_usb2_hcd; ret = -ENOMEM;
goto dealloc_usb2_hcd;
}
xhci->shared_hcd->tpl_support = hcd->tpl_support;
} }
xhci->shared_hcd->tpl_support = hcd->tpl_support; usb3_hcd = xhci_get_usb3_hcd(xhci);
if (usb3_hcd && HCC_MAX_PSA(xhci->hcc_params) >= 4)
usb3_hcd->can_do_streams = 1;
if (HCC_MAX_PSA(xhci->hcc_params) >= 4) if (xhci->shared_hcd) {
xhci->shared_hcd->can_do_streams = 1; ret = usb_add_hcd(xhci->shared_hcd, irq, IRQF_SHARED);
if (ret)
ret = usb_add_hcd(xhci->shared_hcd, irq, IRQF_SHARED); goto put_usb3_hcd;
if (ret) }
goto put_usb3_hcd;
device_enable_async_suspend(&pdev->dev); device_enable_async_suspend(&pdev->dev);
pm_runtime_put_noidle(&pdev->dev); pm_runtime_put_noidle(&pdev->dev);