[PATCH] usb: cdns3: fix cdns3_bind() to avoid returning error and probe parent
Marek Vasut
marek.vasut at mailbox.org
Tue Mar 3 15:07:34 CET 2026
On 3/1/26 6:25 AM, Siddharth Vadapalli wrote:
>>> There are two users of cdns3_bind() which have registered their
>>> own .bind() callback as cdns3_bind():
>>> 1. cdns3-starfive.c driver
>>> 2. cdns3-ti.c driver
>>> Since .bind() is called before .probe()
>>
>> .bind callback is meant to BIND the driver instance (to a DT node), it
>> is not meant to initialize the hardware. .probe callback is meant to
>
> I agree. But that's exactly where the issue lies. When 'dr_mode' is set
> to OTG, cdns3_bind() is unable to determine if the driver to bind to the
> DT node is "cdns-usb3-host" or "cdns-usb3-peripheral".
>
> Since [0], we attempt to identify if OTG should imply 'peripheral' or
> 'host'. But to do that, [0] needs to read the VBUS Valid field of the
> OTG Status register. And register access requires the USB Controller to
> be powered ON.
Correct, so bind is the wrong place to do any HW access .
> [0]: bfb530e06ca6 ("usb: cdns3: use VBUS Valid to determine role for
> dr_mode OTG")
>
>> initialize the hardware. This is fundamental part of the U-Boot DM
>> lazy initialization scheme. If something does initialize hardware
>> in .bind, then it is very likely wrong.
>>
>>> , and, since cdns3_bind() is also the .bind() callback of the above
>>> drivers, device_probe() has to be added here itself. Moreover, it is
>>> only due to the register accesses being performed by the recently
>>> introduced cdns3_get_otg_mode() function that we need the USB
>>> Controller to be powered ON at this stage.
>> So, can we fix this so the HW initialization won't be happening in
>> bind, but instead in .probe ?
>
> That isn't possible
Can you investigate how to make that possible ? Maybe by having some
common .probe implementation that would determine the OTG state, or by
having some stub driver which handles the OTG selection ?
More information about the U-Boot
mailing list