[PATCH v2 2/7] drivers: usb: dwc3: Add delay after core soft reset

Balaji Selvanathan balaji.selvanathan at oss.qualcomm.com
Wed Dec 24 06:56:12 CET 2025


On 12/23/2025 2:35 PM, Sumit Garg wrote:
> On Mon, Nov 24, 2025 at 09:24:58PM +0530, Balaji Selvanathan wrote:
>> Add a 100 ms delay after clearing the core soft reset bit to ensure
>> the DWC3 controller has sufficient time to complete its reset
>> sequence before subsequent register accesses.
>>
>> Without this delay, USB initialization can fail on some Qualcomm
>> platforms, particularly when using super-speed capable PHYs like
>> the QMP USB3-DP Combo PHY on SC7280/QCM6490.
>>
>> The change is taken from following upstream Linux implementation:
>> https://web.git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/drivers/usb/dwc3/core.c?id=f88359e1588b85cf0e8209ab7d6620085f3441d9
> If I understand correctly the kernel change here especially following
> comment:
>
> 	/*
> 	 * Wait for internal clocks to synchronized. DWC_usb31 and
> 	 * DWC_usb32 may need at least 50ms (less for DWC_usb3). To
> 	 * keep it consistent across different IPs, let's wait up to
> 	 * 100ms before clearing GCTL.CORESOFTRESET.
> 	 */
>
> the delay is required before clearing GCTL.CORESOFTRESET and not after
> which your change seems to do. Also, here we aren't doing any role
> switch too, right?

Hi Sumit,

You're correct about the Linux implementation. However, in U-Boot's 
case, the context is different:

1. Linux: The delay is during role switching in dwc3_set_mode(), where 
only GCTL.CORESOFTRESET is toggled.

2. U-Boot: The delay is in dwc3_core_soft_reset() during initial boot, 
which has a more complex sequence:

    - Sets GCTL.CORESOFTRESET
    - Asserts PHY resets (USB2/USB3)
    - Waits 100ms
    - Clears PHY resets
    - Waits 100ms (for PHY stabilization)
    - Clears GCTL.CORESOFTRESET
The additional delay after clearing the reset bit is needed in U-Boot to 
ensure the controller is fully operational before subsequent register 
accesses, particularly for super-speed PHYs on QCM6490/SC7280. 
Otherwise, fastboot mode is not working sometimes (stability issue).

Would you be okay with adding this delay after clearing GCTL.CORESOFTRESET?

Regards,

Balaji

>
> -Sumit
>
>> Signed-off-by: Balaji Selvanathan <balaji.selvanathan at oss.qualcomm.com>
>> ---
>> v2:
>> - Gave correct commit id for linux implementation
>> ---
>>   drivers/usb/dwc3/core.c | 2 ++
>>   1 file changed, 2 insertions(+)
>>
>> diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c
>> index 847fa1f82c3..ff0bca0dd8e 100644
>> --- a/drivers/usb/dwc3/core.c
>> +++ b/drivers/usb/dwc3/core.c
>> @@ -94,6 +94,8 @@ static int dwc3_core_soft_reset(struct dwc3 *dwc)
>>   	reg &= ~DWC3_GCTL_CORESOFTRESET;
>>   	dwc3_writel(dwc->regs, DWC3_GCTL, reg);
>>   
>> +	mdelay(100);
>> +
>>   	return 0;
>>   }
>>   
>> -- 
>> 2.34.1
>>


More information about the U-Boot mailing list