From 2f6edaae3c630bd4756fc68faad20fd5212e5f50 Mon Sep 17 00:00:00 2001 From: Jean-Jacques Hiblot Date: Wed, 11 Sep 2019 11:33:45 +0200 Subject: [PATCH] UPSTREAM: usb: dwc3: switch to peripheral mode when exiting This allow the phy to enter idle and then suspend. the K2 platforms require the PHY to be suspended before the USB domain clock can be turned off. Change-Id: Id674a95ff3cacb9e614cdc583f4a755e8301b7d7 Signed-off-by: Jean-Jacques Hiblot Signed-off-by: Frank Wang (cherry picked from commit bbe3d4a6c14e17d251029e4dde07f184244e9a4a) --- drivers/usb/dwc3/core.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c index d31ab8eaad..1768009494 100644 --- a/drivers/usb/dwc3/core.c +++ b/drivers/usb/dwc3/core.c @@ -590,6 +590,12 @@ static int dwc3_core_init_mode(struct dwc3 *dwc) return 0; } +static void dwc3_gadget_run(struct dwc3 *dwc) +{ + dwc3_writel(dwc->regs, DWC3_DCTL, DWC3_DCTL_RUN_STOP); + mdelay(100); +} + static void dwc3_core_exit_mode(struct dwc3 *dwc) { switch (dwc->dr_mode) { @@ -607,6 +613,13 @@ static void dwc3_core_exit_mode(struct dwc3 *dwc) /* do nothing */ break; } + + /* + * switch back to peripheral mode + * This enables the phy to enter idle and then, if enabled, suspend. + */ + dwc3_set_mode(dwc, DWC3_GCTL_PRTCAP_DEVICE); + dwc3_gadget_run(dwc); } #define DWC3_ALIGN_MASK (16 - 1)