From dd4a9bfbf0393c828f468e0cc50c4b14adb69c6e Mon Sep 17 00:00:00 2001 From: Sriharsha Allenki Date: Thu, 17 May 2018 11:34:11 +0530 Subject: [PATCH] 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: Sriharsha Allenki Signed-off-by: Ajay Agarwal --- drivers/usb/host/xhci-plat.c | 39 +++++++++++++++++++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/drivers/usb/host/xhci-plat.c b/drivers/usb/host/xhci-plat.c index b8ff368e4464..efe1924e0875 100644 --- a/drivers/usb/host/xhci-plat.c +++ b/drivers/usb/host/xhci-plat.c @@ -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) };