Message ID | 20250124173325.2747710-1-fabrice.gasnier@foss.st.com |
---|---|
State | New |
Headers | show |
Series | usb: dwc2: gadget: remove of_node reference upon udc_stop | expand |
diff --git a/drivers/usb/dwc2/gadget.c b/drivers/usb/dwc2/gadget.c index e7bf9cc635be..bd4c788f03bc 100644 --- a/drivers/usb/dwc2/gadget.c +++ b/drivers/usb/dwc2/gadget.c @@ -4615,6 +4615,7 @@ static int dwc2_hsotg_udc_stop(struct usb_gadget *gadget) spin_lock_irqsave(&hsotg->lock, flags); hsotg->driver = NULL; + hsotg->gadget.dev.of_node = NULL; hsotg->gadget.speed = USB_SPEED_UNKNOWN; hsotg->enabled = 0;
In dwc2_hsotg_udc_start(), e.g. when binding composite driver, "of_node" is set to hsotg->dev->of_node. It causes errors when binding the gadget driver several times, on stm32mp157c-ev1 board. Below error is seen: "pin PA10 already requested by 49000000.usb-otg; cannot claim for gadget.0" The first time, no issue is seen as when registering the driver, of_node isn't NULL: -> gadget_dev_desc_UDC_store -> usb_gadget_register_driver_owner -> driver_register ... -> really_probe -> pinctrl_bind_pins (no effect) Then dwc2_hsotg_udc_start() sets of_node. The second time (stop the gadget, reconfigure it, then start it again), of_node has been set, so the probing code tries to acquire pins for the gadget. These pins are hold by the controller, hence the error. So clear gadget.dev.of_node in udc_stop() routine to avoid the issue. Fixes: 7d7b22928b90 ("usb: gadget: s3c-hsotg: Propagate devicetree to gadget drivers") Signed-off-by: Fabrice Gasnier <fabrice.gasnier@foss.st.com> --- Note: I'd have been tempted to remove of_node setting from udc_start: - hsotg->gadget.dev.of_node = hsotg->dev->of_node; I can't find the original code that parses the device node [1] from composite_bind() routine, originally part of the series that introduces this. I'm not sure if setting the gadget of_node is really useful, but I chose safe approach to simply clear it in udc_stop(). [1] http://lore.kernel.org/lkml/1340720833-781-6-git-send-email-aletes.xgr@gmail.com/ --- drivers/usb/dwc2/gadget.c | 1 + 1 file changed, 1 insertion(+)