mirror of
https://github.com/torvalds/linux.git
synced 2024-11-22 04:38:03 +00:00
usb: dwc3: core: Fix system suspend on TI AM62 platforms
Since commit6d73572206
("usb: dwc3: core: Prevent phy suspend during init"), system suspend is broken on AM62 TI platforms. Before that commit, both DWC3_GUSB3PIPECTL_SUSPHY and DWC3_GUSB2PHYCFG_SUSPHY bits (hence forth called 2 SUSPHY bits) were being set during core initialization and even during core re-initialization after a system suspend/resume. These bits are required to be set for system suspend/resume to work correctly on AM62 platforms. Since that commit, the 2 SUSPHY bits are not set for DEVICE/OTG mode if gadget driver is not loaded and started. For Host mode, the 2 SUSPHY bits are set before the first system suspend but get cleared at system resume during core re-init and are never set again. This patch resovles these two issues by ensuring the 2 SUSPHY bits are set before system suspend and restored to the original state during system resume. Cc: stable@vger.kernel.org # v6.9+ Fixes:6d73572206
("usb: dwc3: core: Prevent phy suspend during init") Link: https://lore.kernel.org/all/1519dbe7-73b6-4afc-bfe3-23f4f75d772f@kernel.org/ Signed-off-by: Roger Quadros <rogerq@kernel.org> Acked-by: Thinh Nguyen <Thinh.Nguyen@synopsys.com> Tested-by: Markus Schneider-Pargmann <msp@baylibre.com> Reviewed-by: Dhruva Gole <d-gole@ti.com> Link: https://lore.kernel.org/r/20241011-am62-lpm-usb-v3-1-562d445625b5@kernel.org Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
7d381137cb
commit
705e3ce37b
@ -2342,6 +2342,11 @@ static int dwc3_suspend_common(struct dwc3 *dwc, pm_message_t msg)
|
|||||||
u32 reg;
|
u32 reg;
|
||||||
int i;
|
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) {
|
switch (dwc->current_dr_role) {
|
||||||
case DWC3_GCTL_PRTCAP_DEVICE:
|
case DWC3_GCTL_PRTCAP_DEVICE:
|
||||||
if (pm_runtime_suspended(dwc->dev))
|
if (pm_runtime_suspended(dwc->dev))
|
||||||
@ -2393,6 +2398,15 @@ static int dwc3_suspend_common(struct dwc3 *dwc, pm_message_t msg)
|
|||||||
break;
|
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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2460,6 +2474,11 @@ static int dwc3_resume_common(struct dwc3 *dwc, pm_message_t msg)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!PMSG_IS_AUTO(msg)) {
|
||||||
|
/* restore SUSPHY state to that before system suspend. */
|
||||||
|
dwc3_enable_susphy(dwc, dwc->susphy_state);
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1150,6 +1150,8 @@ struct dwc3_scratchpad_array {
|
|||||||
* @sys_wakeup: set if the device may do system wakeup.
|
* @sys_wakeup: set if the device may do system wakeup.
|
||||||
* @wakeup_configured: set if the device is configured for remote wakeup.
|
* @wakeup_configured: set if the device is configured for remote wakeup.
|
||||||
* @suspended: set to track suspend event due to U3/L2.
|
* @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
|
* @imod_interval: set the interrupt moderation interval in 250ns
|
||||||
* increments or 0 to disable.
|
* increments or 0 to disable.
|
||||||
* @max_cfg_eps: current max number of IN eps used across all USB configs.
|
* @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 sys_wakeup:1;
|
||||||
unsigned wakeup_configured:1;
|
unsigned wakeup_configured:1;
|
||||||
unsigned suspended:1;
|
unsigned suspended:1;
|
||||||
|
unsigned susphy_state:1;
|
||||||
|
|
||||||
u16 imod_interval;
|
u16 imod_interval;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user