Messages in this thread Patch in this message | | | Date | Tue, 16 Feb 2021 10:30:52 +0900 | From | Jung Daehwan <> | Subject | Re: usb: dwc3: gadget: Change runtime pm function for DWC3 runtime suspend |
| |
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 <dh10.jung@samsung.com> > > --- > > 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 > > >
| |