diff options
author | Grygorii Strashko <grygorii.strashko@ti.com> | 2015-05-14 13:56:49 +0300 |
---|---|---|
committer | Grygorii Strashko <Grygorii.Strashko@linaro.org> | 2015-05-26 17:05:49 +0300 |
commit | 4ac4ea8e0c7688bc7cee8f82d5c811c9baebbc8f (patch) | |
tree | 06e362f42e6c4f1b5086ffd5f9cf3c2281085646 | |
parent | 2edc54559be9283ab8327400f8f4d99f29764656 (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.c | 46 |
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) |