lkml.org 
[lkml]   [2020]   [Jun]   [29]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.4 035/178] usb: dwc2: Postponed gadget registration to the udc class driver
    Date
    From: Minas Harutyunyan <Minas.Harutyunyan@synopsys.com>

    commit 207324a321a866401b098cadf19e4a2dd6584622 upstream.

    During dwc2 driver probe, after gadget registration to the udc class
    driver, if exist any builtin function driver it immediately bound to
    dwc2 and after init host side (dwc2_hcd_init()) stucked in host mode.
    Patch postpone gadget registration after host side initialization done.

    Fixes: 117777b2c3bb9 ("usb: dwc2: Move gadget probe function into platform code")
    Reported-by: kbuild test robot <lkp@intel.com>
    Tested-by: Marek Vasut <marex@denx.de>
    Cc: stable <stable@vger.kernel.org>
    Signed-off-by: Minas Harutyunyan <hminas@synopsys.com>
    Link: https://lore.kernel.org/r/f21cb38fecc72a230b86155d94c7e60c9cb66f58.1591690938.git.hminas@synopsys.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    drivers/usb/dwc2/gadget.c | 6 ------
    drivers/usb/dwc2/platform.c | 11 +++++++++++
    2 files changed, 11 insertions(+), 6 deletions(-)

    diff --git a/drivers/usb/dwc2/gadget.c b/drivers/usb/dwc2/gadget.c
    index 7fd0900a9cb0c..f7528f732b2aa 100644
    --- a/drivers/usb/dwc2/gadget.c
    +++ b/drivers/usb/dwc2/gadget.c
    @@ -4886,12 +4886,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 3c6ce09a6db56..15e55808cf4ea 100644
    --- a/drivers/usb/dwc2/platform.c
    +++ b/drivers/usb/dwc2/platform.c
    @@ -507,6 +507,17 @@ static int dwc2_driver_probe(struct platform_device *dev)
    if (hsotg->dr_mode == USB_DR_MODE_PERIPHERAL)
    dwc2_lowlevel_hw_disable(hsotg);

    +#if IS_ENABLED(CONFIG_USB_DWC2_PERIPHERAL) || \
    + IS_ENABLED(CONFIG_USB_DWC2_DUAL_ROLE)
    + /* 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;
    + }
    + }
    +#endif /* CONFIG_USB_DWC2_PERIPHERAL || CONFIG_USB_DWC2_DUAL_ROLE */
    return 0;

    error:
    --
    2.25.1
    \
     
     \ /
      Last update: 2020-06-29 22:00    [W:4.204 / U:0.072 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site