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

Commit dd4a9bfb authored by Sriharsha Allenki's avatar Sriharsha Allenki Committed by Ajay Agarwal
Browse files

xhci-plat: Add hibernation support to xhci platform



Add hibernation support to xhci platform by adding
the proper PM ops freeze and restore.
Also set the hibernated argument to xhci_resume which
will trigger the reset-resume of the connected
root-hubs and the devices.

Change-Id: Ib536bb2485928326f34bfc3422b672cc62309efe
Signed-off-by: default avatarSriharsha Allenki <sallenki@codeaurora.org>
Signed-off-by: default avatarAjay Agarwal <ajaya@codeaurora.org>
parent 6a6d52ab
Loading
Loading
Loading
Loading
+38 −1
Original line number Diff line number Diff line
@@ -370,6 +370,39 @@ static int xhci_plat_runtime_idle(struct device *dev)
	return -EBUSY;
}

static int xhci_plat_pm_freeze(struct device *dev)
{
	struct usb_hcd *hcd = dev_get_drvdata(dev);
	struct xhci_hcd *xhci = hcd_to_xhci(hcd);

	if (!xhci)
		return 0;

	dev_dbg(dev, "xhci-plat freeze\n");

	return xhci_suspend(xhci, false);
}

static int xhci_plat_pm_restore(struct device *dev)
{
	struct usb_hcd *hcd = dev_get_drvdata(dev);
	struct xhci_hcd *xhci = hcd_to_xhci(hcd);
	int ret;

	if (!xhci)
		return 0;

	dev_dbg(dev, "xhci-plat restore\n");

	ret = xhci_resume(xhci, true);
	pm_runtime_disable(dev);
	pm_runtime_set_active(dev);
	pm_runtime_enable(dev);
	pm_runtime_mark_last_busy(dev);

	return ret;
}

static int xhci_plat_runtime_suspend(struct device *dev)
{
	struct usb_hcd *hcd = dev_get_drvdata(dev);
@@ -401,7 +434,11 @@ static int xhci_plat_runtime_resume(struct device *dev)
}

static const struct dev_pm_ops xhci_plat_pm_ops = {
	SET_SYSTEM_SLEEP_PM_OPS(xhci_plat_suspend, xhci_plat_resume)
	.suspend	= xhci_plat_suspend,
	.resume		= xhci_plat_resume,
	.freeze		= xhci_plat_pm_freeze,
	.restore	= xhci_plat_pm_restore,
	.thaw		= xhci_plat_pm_restore,
	SET_RUNTIME_PM_OPS(xhci_plat_runtime_suspend, xhci_plat_runtime_resume,
			   xhci_plat_runtime_idle)
};