On Fri, Jul 01, 2022 at 03:45:26PM +0530, Pavan Kondeti wrote: > 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() I was thinking about the case where the dwc3-qcom probe is initially deferred, then the deferred probe starts shortly after (asynchronously) and now the dwc3-qcom driver does its check. Probably it's not very likely to happen ... > 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); I like the simplicity of it, no need for new APIs. The components based approach would be slightly safer, but in practice I think this should be good enough.