Hi, Baolin Wang writes: >>> @@ -1485,16 +1490,11 @@ static int dwc3_gadget_run_stop(struct dwc3 >>> *dwc, int is_on, int suspend) >>> { >>> u32 reg; >>> u32 timeout = 500, i; >>> >>> + if (pm_runtime_suspended(dwc->dev)) >>> + return 0; >>> >>> (2) >>> @@ -1748,15 +1754,25 @@ static int dwc3_gadget_start(struct usb_gadget *g, >>> * even though host mode might be active. Don't actually perform >>> * device-specific initialization until device mode is activated. >>> */ >>> >>> + if (pm_runtime_suspended(dwc->dev)) { >>> + spin_unlock_irqrestore(&dwc->lock, flags); >>> + return 0; >>> + } >>> >>> + ret = __dwc3_gadget_start(dwc); >>> + if (ret) >>> + goto err1; >>> >>> So I think the dwc3 core can enter suspend mode before gadget function >>> is ready to call the 'usb_gadget_udc_start()' and >>> 'usb_udc_connect_control()', then if the dwc3 core has entered >>> suspended mode, we need to return success when starting the gadget, >>> and leave the gadget starting action from gadget resume. What do you >>> think about that? Thanks. >> >> Well, if this makes it work properly. Then, yeah; looks okay to me. I'll >> add this to the patch introducing runtime PM. > > OK. I've updated the branch with slightly modified version of your changes. Can you test again just to make sure it still works ? Basically, here's what I did: on dwc3_gadget_start: - __dwc3_gadget_start(dwc); + if (pm_runtime_active(dwc->dev)) + __dwc3_gadget_start(dwc); + on run_stop, I kept the same thing. you just need to replace "usb: dwc3: implement runtime PM" with the new version from my branch. cheers -- balbi