summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSriharsha Allenki <sallenki@codeaurora.org>2018-05-17 11:34:11 +0530
committerAjay Agarwal <ajaya@codeaurora.org>2018-06-01 14:14:17 +0530
commitdd4a9bfbf0393c828f468e0cc50c4b14adb69c6e (patch)
tree66f524e5dd1e62c0813fa55f5bda1361b57f78ed
parent6a6d52ab38238000ad93009270ee9bec4dc9410f (diff)
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 <sallenki@codeaurora.org> Signed-off-by: Ajay Agarwal <ajaya@codeaurora.org>
-rw-r--r--drivers/usb/host/xhci-plat.c39
1 files changed, 38 insertions, 1 deletions
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)
};