Message ID | 20241104-am62-lpm-usb-fix-v1-1-e93df73a4f0d@kernel.org (mailing list archive) |
---|---|
State | Accepted |
Commit | 9cfb31e4c89d200d8ab7cb1e0bb9e6e8d621ca0b |
Headers | show |
Series | usb: dwc3: fix fault at system suspend if device was already runtime suspended | expand |
Hi Roger, On 11/04/2024, Roger Quadros wrote: > If the device was already runtime suspended then during system suspend > we cannot access the device registers else it will crash. > > Also we cannot access any registers after dwc3_core_exit() on some > platforms so move the dwc3_enable_susphy() call to the top. > > Cc: stable@vger.kernel.org # v5.15+ > Reported-by: William McVicker <willmcvicker@google.com> > Closes: https://lore.kernel.org/all/ZyVfcUuPq56R2m1Y@google.com > Fixes: 705e3ce37bcc ("usb: dwc3: core: Fix system suspend on TI AM62 platforms") > Signed-off-by: Roger Quadros <rogerq@kernel.org> I verified the patch works on my Pixel 6 device with runtime PM enabled. Thanks for the fix! Feel free to add Tested-by: Will McVicker <willmcvicker@google.com> Thanks, Will > --- > drivers/usb/dwc3/core.c | 25 ++++++++++++------------- > 1 file changed, 12 insertions(+), 13 deletions(-) > > diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c > index 427e5660f87c..98114c2827c0 100644 > --- a/drivers/usb/dwc3/core.c > +++ b/drivers/usb/dwc3/core.c > @@ -2342,10 +2342,18 @@ 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); > + if (!pm_runtime_suspended(dwc->dev) && !PMSG_IS_AUTO(msg)) { > + dwc->susphy_state = (dwc3_readl(dwc->regs, DWC3_GUSB2PHYCFG(0)) & > + DWC3_GUSB2PHYCFG_SUSPHY) || > + (dwc3_readl(dwc->regs, DWC3_GUSB3PIPECTL(0)) & > + DWC3_GUSB3PIPECTL_SUSPHY); > + /* > + * TI AM62 platform requires SUSPHY to be > + * enabled for system suspend to work. > + */ > + if (!dwc->susphy_state) > + dwc3_enable_susphy(dwc, true); > + } > > switch (dwc->current_dr_role) { > case DWC3_GCTL_PRTCAP_DEVICE: > @@ -2398,15 +2406,6 @@ 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; > } > > > --- > base-commit: 42f7652d3eb527d03665b09edac47f85fb600924 > change-id: 20241102-am62-lpm-usb-fix-347dd86135c1 > > Best regards, > -- > Roger Quadros <rogerq@kernel.org> >
Hi Roger, On Mon, Nov 04, 2024, Roger Quadros wrote: > If the device was already runtime suspended then during system suspend > we cannot access the device registers else it will crash. > > Also we cannot access any registers after dwc3_core_exit() on some > platforms so move the dwc3_enable_susphy() call to the top. > > Cc: stable@vger.kernel.org # v5.15+ > Reported-by: William McVicker <willmcvicker@google.com> > Closes: https://urldefense.com/v3/__https://lore.kernel.org/all/ZyVfcUuPq56R2m1Y@google.com__;!!A4F2R9G_pg!a2ySn942v8-FZqAgru6elfn0Auxnl1JyBveK9z2iAeLZpEpVajfl3pbfl5K2hVlGx5YqfRazbhqF8ZJ2t3f_$ > Fixes: 705e3ce37bcc ("usb: dwc3: core: Fix system suspend on TI AM62 platforms") > Signed-off-by: Roger Quadros <rogerq@kernel.org> > --- > drivers/usb/dwc3/core.c | 25 ++++++++++++------------- > 1 file changed, 12 insertions(+), 13 deletions(-) > > diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c > index 427e5660f87c..98114c2827c0 100644 > --- a/drivers/usb/dwc3/core.c > +++ b/drivers/usb/dwc3/core.c > @@ -2342,10 +2342,18 @@ 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); > + if (!pm_runtime_suspended(dwc->dev) && !PMSG_IS_AUTO(msg)) { > + dwc->susphy_state = (dwc3_readl(dwc->regs, DWC3_GUSB2PHYCFG(0)) & > + DWC3_GUSB2PHYCFG_SUSPHY) || > + (dwc3_readl(dwc->regs, DWC3_GUSB3PIPECTL(0)) & > + DWC3_GUSB3PIPECTL_SUSPHY); > + /* > + * TI AM62 platform requires SUSPHY to be > + * enabled for system suspend to work. > + */ > + if (!dwc->susphy_state) > + dwc3_enable_susphy(dwc, true); > + } > > switch (dwc->current_dr_role) { > case DWC3_GCTL_PRTCAP_DEVICE: > @@ -2398,15 +2406,6 @@ 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; > } > > > --- > base-commit: 42f7652d3eb527d03665b09edac47f85fb600924 > change-id: 20241102-am62-lpm-usb-fix-347dd86135c1 > > Best regards, > -- > Roger Quadros <rogerq@kernel.org> > Thanks for the catch and quick turnaround! Acked-by: Thinh Nguyen <Thinh.Nguyen@synopsys.com> Thanks, Thinh
diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c index 427e5660f87c..98114c2827c0 100644 --- a/drivers/usb/dwc3/core.c +++ b/drivers/usb/dwc3/core.c @@ -2342,10 +2342,18 @@ 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); + if (!pm_runtime_suspended(dwc->dev) && !PMSG_IS_AUTO(msg)) { + dwc->susphy_state = (dwc3_readl(dwc->regs, DWC3_GUSB2PHYCFG(0)) & + DWC3_GUSB2PHYCFG_SUSPHY) || + (dwc3_readl(dwc->regs, DWC3_GUSB3PIPECTL(0)) & + DWC3_GUSB3PIPECTL_SUSPHY); + /* + * TI AM62 platform requires SUSPHY to be + * enabled for system suspend to work. + */ + if (!dwc->susphy_state) + dwc3_enable_susphy(dwc, true); + } switch (dwc->current_dr_role) { case DWC3_GCTL_PRTCAP_DEVICE: @@ -2398,15 +2406,6 @@ 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; }
If the device was already runtime suspended then during system suspend we cannot access the device registers else it will crash. Also we cannot access any registers after dwc3_core_exit() on some platforms so move the dwc3_enable_susphy() call to the top. Cc: stable@vger.kernel.org # v5.15+ Reported-by: William McVicker <willmcvicker@google.com> Closes: https://lore.kernel.org/all/ZyVfcUuPq56R2m1Y@google.com Fixes: 705e3ce37bcc ("usb: dwc3: core: Fix system suspend on TI AM62 platforms") Signed-off-by: Roger Quadros <rogerq@kernel.org> --- drivers/usb/dwc3/core.c | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) --- base-commit: 42f7652d3eb527d03665b09edac47f85fb600924 change-id: 20241102-am62-lpm-usb-fix-347dd86135c1 Best regards,