summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGrygorii Strashko <grygorii.strashko@ti.com>2015-05-14 13:56:49 +0300
committerGrygorii Strashko <Grygorii.Strashko@linaro.org>2015-05-26 17:05:49 +0300
commit4ac4ea8e0c7688bc7cee8f82d5c811c9baebbc8f (patch)
tree06e362f42e6c4f1b5086ffd5f9cf3c2281085646
parent2edc54559be9283ab8327400f8f4d99f29764656 (diff)
usb: dwc3: reset dwc3 instance while restorep-ti-linux-3.14.y-android-hib-dra7
While restore from hibernate, when context was lost, only DWC3 instance worked in OTG mode could be resumed. The DWC3 instance worked in HOST mode couldn't be resumed. This change introduces restore PM handler to issue software reset for DWC3 instance before resume. This allows to do correct restore and resume for DWC3 instances in all the modes. Signed-off-by: Illia Smyrnov <illia.smyrnov@globallogic.com> Signed-off-by: Grygorii Strashko <Grygorii.Strashko@linaro.org>
-rw-r--r--drivers/usb/dwc3/core.c46
1 files changed, 45 insertions, 1 deletions
diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c
index 717ff4e47f0..f397846c324 100644
--- a/drivers/usb/dwc3/core.c
+++ b/drivers/usb/dwc3/core.c
@@ -914,8 +914,52 @@ err_usb2phy_init:
return ret;
}
+static int dwc3_restore(struct device *dev)
+{
+ struct dwc3 *dwc = dev_get_drvdata(dev);
+ unsigned long flags;
+ int ret;
+
+ ret = dwc3_core_soft_reset(dwc);
+ if (ret)
+ goto err;
+
+ spin_lock_irqsave(&dwc->lock, flags);
+
+ dwc3_event_buffers_setup(dwc);
+ dwc3_writel(dwc->regs, DWC3_GCTL, dwc->gctl);
+
+ switch (dwc->dr_mode) {
+ case USB_DR_MODE_OTG:
+ dwc3_otg_resume(dwc);
+ case USB_DR_MODE_PERIPHERAL:
+ dwc3_gadget_resume(dwc);
+ /* FALLTHROUGH */
+ case USB_DR_MODE_HOST:
+ default:
+ /* do nothing */
+ break;
+ }
+
+ spin_unlock_irqrestore(&dwc->lock, flags);
+
+ pm_runtime_disable(dev);
+ pm_runtime_set_active(dev);
+ pm_runtime_enable(dev);
+
+ return 0;
+
+err:
+ return ret;
+}
+
static const struct dev_pm_ops dwc3_dev_pm_ops = {
- SET_SYSTEM_SLEEP_PM_OPS(dwc3_suspend, dwc3_resume)
+ .suspend = dwc3_suspend,
+ .resume = dwc3_resume,
+ .freeze = dwc3_suspend,
+ .thaw = dwc3_resume,
+ .poweroff = dwc3_suspend,
+ .restore = dwc3_restore,
};
#define DWC3_PM_OPS &(dwc3_dev_pm_ops)