Hello, Alan On Mon, Feb 15, 2021 at 12:41:45PM -0500, Alan Stern wrote: > On Mon, Feb 15, 2021 at 11:38:58AM +0900, Daehwan Jung wrote: > > It seems pm_runtime_put calls runtime_idle callback not runtime_suspend callback. > > How is this fact related to your patch? I think we should cause dwc3_runtime_suspend at the time. That's why I use pm_runtime_put_sync_suspend. > > > It's better to use pm_runtime_put_sync_suspend to allow DWC3 runtime suspend. > > Why do you think it is better? The advantage of pm_runtime_put is that > it allows the suspend to occur at a later time in a workqueue thread, so > the caller doesn't have to wait for the device to go into suspend. > We can assume DWC3 was already in suspend state if pm_runtime_get_sync returns 0. DWC3 resumes due to pm_rumtime_get_sync but it doesn't re-enter runtime_suspend but runtime_idle. pm_runtime_put decreases usage_count but doesn't cause runtime_suspend. 1. USB disconnected 2. UDC unbinded 3. DWC3 runtime suspend 4. UDC binded unexpectedly 5. DWC3 runtime resume (pm_runtime_get_sync) 6. DWC3 runtime idle (pm_runtime_put) -> DWC3 runtime suspend again (pm_runtime_put_sync_suspend) I've talked with Wesley in other patch. usbb: dwc3: gadget: skip pullup and set_speed after suspend patchwork.kernel.org/project/linux-usb/patch/1611113968-102424-1-git-send-email-dh10.jung@samsung.com @ Wesley I think We should guarantee DWC3 enters suspend again at the time. How do you think? Best Regards, Jung Daehwan > Alan Stern > > > Signed-off-by: Daehwan Jung > > --- > > drivers/usb/dwc3/gadget.c | 2 +- > > 1 file changed, 1 insertion(+), 1 deletion(-) > > > > diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c > > index aebcf8e..4a4b93b 100644 > > --- a/drivers/usb/dwc3/gadget.c > > +++ b/drivers/usb/dwc3/gadget.c > > @@ -2229,7 +2229,7 @@ static int dwc3_gadget_pullup(struct usb_gadget *g, int is_on) > > */ > > ret = pm_runtime_get_sync(dwc->dev); > > if (!ret || ret < 0) { > > - pm_runtime_put(dwc->dev); > > + pm_runtime_put_sync_suspend(dwc->dev); > > return 0; > > } > > > > -- > > 2.7.4 > > >