Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a0ab9470 authored by Roger Quadros's avatar Roger Quadros Committed by Mayank Rana
Browse files

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>
Git-commit: 9fa733f24bb54dd532b5f5d7abc275c4a547c69f
Git-repo: git://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git


[mrana@codeaurora.org: Fix minor merge conflict]
Change-Id: If064778fa56a8e41ebfd80884802b2abced514ca
Signed-off-by: default avatarMayank Rana <mrana@codeaurora.org>
parent 93718650
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -151,6 +151,7 @@ static int xhci_plat_probe(struct platform_device *pdev)
	hcd = platform_get_drvdata(pdev);
	xhci = hcd_to_xhci(hcd);
	xhci->clk = clk;
	xhci->main_hcd = hcd;
	xhci->shared_hcd = usb_create_shared_hcd(driver, &pdev->dev,
			dev_name(&pdev->dev), hcd);
	if (!xhci->shared_hcd) {
+6 −0
Original line number Diff line number Diff line
@@ -901,6 +901,9 @@ int xhci_suspend(struct xhci_hcd *xhci, bool do_wakeup)
	struct usb_hcd		*hcd = xhci_to_hcd(xhci);
	u32			command;

	if (!hcd->state)
		return 0;

	if (hcd->state != HC_STATE_SUSPENDED ||
			xhci->shared_hcd->state != HC_STATE_SUSPENDED)
		return -EINVAL;
@@ -987,6 +990,9 @@ int xhci_resume(struct xhci_hcd *xhci, bool hibernated)
	int			retval = 0;
	bool			comp_timer_running = false;

	if (!hcd->state)
		return 0;

	/* Wait a bit if either of the roothubs need to settle from the
	 * transition into bus suspend.
	 */