Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 52404065 authored by Minas Harutyunyan's avatar Minas Harutyunyan Committed by Sasha Levin
Browse files

usb: dwc2: Postponed gadget registration to the udc class driver



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: 117777b2 ("usb: dwc2: Move gadget probe function into platform code")
Reported-by: default avatarkbuild test robot <lkp@intel.com>
Tested-by: default avatarMarek Vasut <marex@denx.de>
Cc: stable <stable@vger.kernel.org>
Signed-off-by: default avatarMinas Harutyunyan <hminas@synopsys.com>
Link: https://lore.kernel.org/r/f21cb38fecc72a230b86155d94c7e60c9cb66f58.1591690938.git.hminas@synopsys.com


Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent b9baada6
Loading
Loading
Loading
Loading
+0 −6
Original line number Diff line number Diff line
@@ -4759,12 +4759,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;
+11 −0
Original line number Diff line number Diff line
@@ -492,6 +492,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: