On Thu, Jun 30, 2022 at 06:10:50PM -0700, Matthias Kaehlcke wrote: > > > dwc3-qcom should wait for dwc3 core to call component_add() and then do > > > whatever needs to be done once the dwc3 core is registered in the > > > dwc3-qcom bind callback. Honestly this may all be a little overkill if > > > there's only two drivers here, dwc3-qcom and dwc3 core. It could > > > probably just be some callback from dwc3 core at the end of probe that > > > calls some function in dwc3-qcom. > > Since the issue we are facing is that the ssphy device links are not ready > > causing the dwc3 probe not being invoked, can we add an API as Pavan > > suggested > > to check if deferred_probe listfor dwc3 device is empty or not andbased on > > that we can choose to defer our qcomprobe ? In this case, we don't need to > > touch the dwc3 core driver and would be making changesonly in qcom glue > > driver. > > As mentioned above, it shouldn't be necessary to add component support to > all the glue drivers. An API to check for deferred probing is an option, > however there is a possible race condition: When the dwc3-qcom driver checks > for a deferred probe the core could still be probing, in that situation the > glue would proceed before the core driver is ready. That could be avoided > with the component based approach. The race can happen only if asynchronous probe is enabled, otherwise the child's probe happens synchronously in of_platform_populate() OTOH, would the below condition suffice for our needs here? if our device is not bounded to a driver, we check the state of initcalls and return either error or -EPROBE_DEFER diff --git a/drivers/usb/dwc3/dwc3-qcom.c b/drivers/usb/dwc3/dwc3-qcom.c index 7b6eff5..519a503 100644 --- a/drivers/usb/dwc3/dwc3-qcom.c +++ b/drivers/usb/dwc3/dwc3-qcom.c @@ -722,6 +722,9 @@ static int dwc3_qcom_of_register_core(struct platform_device *pdev) dev_err(dev, "failed to get dwc3 platform device\n"); } + if (!qcom->dwc3->dev.driver) + return driver_deferred_probe_check_state(&qcom->dwc3->dev); + node_put: of_node_put(dwc3_np); Thanks, Pavan