Commit 9fa733f2 authored by Roger Quadros's avatar Roger Quadros Committed by Greg Kroah-Hartman

usb: xhci: Fix suspend/resume when used with OTG core

In the OTG case, the controller might not yet have been
added or is removed before the system suspends.

Assign xhci->main_hcd during probe to prevent NULL
pointer de-reference in xhci_suspend/resume().

Use the hcd->state flag to check if HCD is halted
and if that is so do nothing for xhci_suspend/resume().

[Only for xhci-plat devices, pci devices need it in gen_setup -Mathias]
Signed-off-by: default avatarRoger Quadros <rogerq@ti.com>
Signed-off-by: default avatarMathias Nyman <mathias.nyman@linux.intel.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent ad6b1d91
...@@ -140,6 +140,7 @@ static int xhci_plat_probe(struct platform_device *pdev) ...@@ -140,6 +140,7 @@ static int xhci_plat_probe(struct platform_device *pdev)
xhci = hcd_to_xhci(hcd); xhci = hcd_to_xhci(hcd);
xhci->clk = clk; xhci->clk = clk;
xhci->main_hcd = hcd;
xhci->shared_hcd = usb_create_shared_hcd(driver, &pdev->dev, xhci->shared_hcd = usb_create_shared_hcd(driver, &pdev->dev,
dev_name(&pdev->dev), hcd); dev_name(&pdev->dev), hcd);
if (!xhci->shared_hcd) { if (!xhci->shared_hcd) {
......
...@@ -891,6 +891,9 @@ int xhci_suspend(struct xhci_hcd *xhci, bool do_wakeup) ...@@ -891,6 +891,9 @@ int xhci_suspend(struct xhci_hcd *xhci, bool do_wakeup)
struct usb_hcd *hcd = xhci_to_hcd(xhci); struct usb_hcd *hcd = xhci_to_hcd(xhci);
u32 command; u32 command;
if (!hcd->state)
return 0;
if (hcd->state != HC_STATE_SUSPENDED || if (hcd->state != HC_STATE_SUSPENDED ||
xhci->shared_hcd->state != HC_STATE_SUSPENDED) xhci->shared_hcd->state != HC_STATE_SUSPENDED)
return -EINVAL; return -EINVAL;
...@@ -977,6 +980,9 @@ int xhci_resume(struct xhci_hcd *xhci, bool hibernated) ...@@ -977,6 +980,9 @@ int xhci_resume(struct xhci_hcd *xhci, bool hibernated)
int retval = 0; int retval = 0;
bool comp_timer_running = false; bool comp_timer_running = false;
if (!hcd->state)
return 0;
/* Wait a bit if either of the roothubs need to settle from the /* Wait a bit if either of the roothubs need to settle from the
* transition into bus suspend. * transition into bus suspend.
*/ */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment