Hi Marek, On 5/14/2020 4:10 AM, Marek Vasut wrote: > On 4/22/20 4:21 PM, Marek Vasut wrote: >> On 4/22/20 3:45 PM, Minas Harutyunyan wrote: >>> Hi, >> >> Hi, >> >>> On 4/20/2020 4:09 PM, Marek Vasut wrote: >>>> On 4/17/20 11:00 AM, Minas Harutyunyan wrote: >>>>> Hi, >>>> >>>> Hi, >>>> >>>>> On 4/16/2020 6:31 PM, Marek Vasut wrote: >>>>>> On 4/16/20 3:37 PM, Minas Harutyunyan wrote: >>>>> >>> Looks like I found cause of issue. According to your logs GINTMSK set >>> host masks, at least USB Reset not unmasked which required for device mode. >>> Why it happen. During dwc2 driver probe first initialized device part >>> then host part. Because of your g_zero is builtin in Kernel it >>> immediately bound to dwc2, as result called main device initialization >>> dwc2_hsotg_core_init_disconnected() which at least set GINTMSK for >>> device mode. After gadget side initialization done, dwc2 go to host >>> initialization hcd_init() and reset GINTMSK to host masks. In this case >>> connecting cable to host will ignore USBReset and stacked. Your initial >>> patch including call to function dwc2_hsotg_core_init_disconnected(), >>> which allow to restore device mode masks and on cable connect start >>> working as device. >>> First to check my assumption, please build g_zero as module and modprobe >>> it after dwc2 modprobe will be done. If the tests will pass then will >>> think how resolve issue with builtin functions. >> >> Using g_zero as a module seems to work too, so please proceed. > > Any news on using g_zero as built-in ? > Could you please test with this patch. diff --git a/drivers/usb/dwc2/gadget.c b/drivers/usb/dwc2/gadget.c index 12b98b466287..7faf5f8c056d 100644 --- a/drivers/usb/dwc2/gadget.c +++ b/drivers/usb/dwc2/gadget.c @@ -4920,12 +4920,6 @@ int dwc2_gadget_init(struct dwc2_hsotg *hsotg) epnum, 0); } - ret = usb_add_gadget_udc(dev, &hsotg->gadget); - if (ret) { - dwc2_hsotg_ep_free_request(&hsotg->eps_out[0]->ep, - hsotg->ctrl_req); - return ret; - } dwc2_hsotg_dump(hsotg); return 0; diff --git a/drivers/usb/dwc2/platform.c b/drivers/usb/dwc2/platform.c index 8ea4a24637fa..603b85cd8ed3 100644 --- a/drivers/usb/dwc2/platform.c +++ b/drivers/usb/dwc2/platform.c @@ -537,6 +537,16 @@ static int dwc2_driver_probe(struct platform_device *dev) if (hsotg->dr_mode == USB_DR_MODE_PERIPHERAL) dwc2_lowlevel_hw_disable(hsotg); + /* Postponed adding a new gadget to the udc class driver list */ + if (hsotg->gadget_enabled) { + retval = usb_add_gadget_udc(hsotg->dev, &hsotg->gadget); + if (retval) { + dwc2_hsotg_remove(hsotg); + goto error_init; + } + + } + return 0; error_init: Thanks, Minas