On Fri, Aug 09, 2024, Frank Li wrote: > On Wed, Aug 07, 2024 at 01:13:52AM +0000, Thinh Nguyen wrote: > > On Fri, Jul 12, 2024, Frank Li wrote: > > > From: Li Jun <jun.li@xxxxxxx> > > > > > > The runtime resume will happen before system resume if system wakeup by > > > device mode wakeup event(e.g, VBUS). Add a flag to avoid init twice. > > > > What's the consequence of going through the resuming sequence twice? > > Will this cause any functional issue? > > static int dwc3_core_init_for_resume(struct dwc3 *dwc) > { > > ... > ret = dwc3_clk_enable(dwc); > if (ret) > goto assert_reset; > > ... > } > > clk will be enabled twice, the reference count in clk will be wrong because > clk_disable() only once at suspend. Please capture these info in the commit message. > > So clk will be always ON at next suspend. > > Frank Li > dwc3_clk_enable() happens in probe() and dwc3_core_init_for_resume(), but you're checking dwc->core_inited in dwc3_core_init(). Why? If the issue is only related to clk_enable(), perhaps just check that? (minor nit: rename core_inited to core_initialized if you plan to do that) Thanks, Thinh > > > > > > Reviewed-by: Peter Chen <peter.chen@xxxxxxx> > > > Signed-off-by: Li Jun <jun.li@xxxxxxx> > > > Signed-off-by: Frank Li <Frank.Li@xxxxxxx> > > > --- > > > drivers/usb/dwc3/core.c | 13 +++++++++++++ > > > drivers/usb/dwc3/core.h | 1 + > > > 2 files changed, 14 insertions(+) > > > > > > diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c > > > index 734de2a8bd212..d60917fad8c52 100644 > > > --- a/drivers/usb/dwc3/core.c > > > +++ b/drivers/usb/dwc3/core.c > > > @@ -950,6 +950,8 @@ static void dwc3_core_exit(struct dwc3 *dwc) > > > dwc3_phy_exit(dwc); > > > dwc3_clk_disable(dwc); > > > reset_control_assert(dwc->reset); > > > + > > > + dwc->core_inited = false; > > > } > > > > > > static bool dwc3_core_is_valid(struct dwc3 *dwc) > > > @@ -1446,6 +1448,8 @@ static int dwc3_core_init(struct dwc3 *dwc) > > > dwc3_writel(dwc->regs, DWC3_LLUCTL, reg); > > > } > > > > > > + dwc->core_inited = true; > > > + > > > return 0; > > > > > > err_power_off_phy: > > > @@ -2375,6 +2379,15 @@ static int dwc3_resume_common(struct dwc3 *dwc, pm_message_t msg) > > > > > > switch (dwc->current_dr_role) { > > > case DWC3_GCTL_PRTCAP_DEVICE: > > > + /* > > > + * system resume may come after runtime resume > > > + * e.g. rpm suspend -> pm suspend -> wakeup > > > + * -> rpm resume -> system resume, so if already > > > + * runtime resumed, system resume should skip it. > > > + */ > > > + if (dwc->core_inited) > > > + break; > > > + > > > ret = dwc3_core_init_for_resume(dwc); > > > if (ret) > > > return ret; > > > diff --git a/drivers/usb/dwc3/core.h b/drivers/usb/dwc3/core.h > > > index 1e561fd8b86e2..8a4bfd9a25b19 100644 > > > --- a/drivers/usb/dwc3/core.h > > > +++ b/drivers/usb/dwc3/core.h > > > @@ -1195,6 +1195,7 @@ struct dwc3 { > > > struct clk *utmi_clk; > > > struct clk *pipe_clk; > > > > > > + bool core_inited; > > > struct reset_control *reset; > > > > > > struct usb_phy *usb2_phy; > > > > > > -- > > > 2.34.1 > > >