diff options
| -rw-r--r-- | drivers/usb/dwc3/core.c | 19 | ||||
| -rw-r--r-- | drivers/usb/dwc3/core.h | 3 | 
2 files changed, 22 insertions, 0 deletions
| diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c index 21740e2b8f07..427e5660f87c 100644 --- a/drivers/usb/dwc3/core.c +++ b/drivers/usb/dwc3/core.c @@ -2342,6 +2342,11 @@ static int dwc3_suspend_common(struct dwc3 *dwc, pm_message_t msg)  	u32 reg;  	int i; +	dwc->susphy_state = (dwc3_readl(dwc->regs, DWC3_GUSB2PHYCFG(0)) & +			    DWC3_GUSB2PHYCFG_SUSPHY) || +			    (dwc3_readl(dwc->regs, DWC3_GUSB3PIPECTL(0)) & +			    DWC3_GUSB3PIPECTL_SUSPHY); +  	switch (dwc->current_dr_role) {  	case DWC3_GCTL_PRTCAP_DEVICE:  		if (pm_runtime_suspended(dwc->dev)) @@ -2393,6 +2398,15 @@ static int dwc3_suspend_common(struct dwc3 *dwc, pm_message_t msg)  		break;  	} +	if (!PMSG_IS_AUTO(msg)) { +		/* +		 * TI AM62 platform requires SUSPHY to be +		 * enabled for system suspend to work. +		 */ +		if (!dwc->susphy_state) +			dwc3_enable_susphy(dwc, true); +	} +  	return 0;  } @@ -2460,6 +2474,11 @@ static int dwc3_resume_common(struct dwc3 *dwc, pm_message_t msg)  		break;  	} +	if (!PMSG_IS_AUTO(msg)) { +		/* restore SUSPHY state to that before system suspend. */ +		dwc3_enable_susphy(dwc, dwc->susphy_state); +	} +  	return 0;  } diff --git a/drivers/usb/dwc3/core.h b/drivers/usb/dwc3/core.h index 9c508e0c5cdf..eab81dfdcc35 100644 --- a/drivers/usb/dwc3/core.h +++ b/drivers/usb/dwc3/core.h @@ -1150,6 +1150,8 @@ struct dwc3_scratchpad_array {   * @sys_wakeup: set if the device may do system wakeup.   * @wakeup_configured: set if the device is configured for remote wakeup.   * @suspended: set to track suspend event due to U3/L2. + * @susphy_state: state of DWC3_GUSB2PHYCFG_SUSPHY + DWC3_GUSB3PIPECTL_SUSPHY + *		  before PM suspend.   * @imod_interval: set the interrupt moderation interval in 250ns   *			increments or 0 to disable.   * @max_cfg_eps: current max number of IN eps used across all USB configs. @@ -1382,6 +1384,7 @@ struct dwc3 {  	unsigned		sys_wakeup:1;  	unsigned		wakeup_configured:1;  	unsigned		suspended:1; +	unsigned		susphy_state:1;  	u16			imod_interval; | 
