Hi Chris,

Thank you for the patch and sorry for the review delay.

On Tue, Dec 23, 2025 at 17:13, Chris Morgan <[email protected]> wrote:

> From: Chris Morgan <[email protected]>
>
> According to Synopsys Databook, we shouldn't be
> relying on GCTL.CORESOFTRESET bit as that's only for
> debugging purposes. Instead, let's use DCTL.CSFTRST
> if we're OTG or PERIPHERAL mode.
>
> Host side block will be reset by XHCI driver if
> necessary. Note that this reduces amount of time
> spent on dwc3_probe() by a long margin.
>
> We're still gonna wait for reset to finish for a
> long time (default to 1ms max), but tests show that
> the reset polling loop executed at most 19 times
> (modprobe dwc3 && modprobe -r dwc3 executed 1000
> times in a row).
>
> Note that this patch was submitted to Linux in 2016 [1], however I can
> confirm it is needed to support gadget mode in U-Boot on my device.
>
> [1] 
> https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/patch/drivers/usb/dwc3?id=f59dcab176293b646e1358144c93c58c3cda2813
>
> Suggested-by: Mian Yousaf Kaukab <[email protected]>
> Signed-off-by: Felipe Balbi <[email protected]>
> Signed-off-by: Chris Morgan <[email protected]>
> ---
>  drivers/usb/dwc3/core.c | 31 +++++++++++++++++++++----------
>  1 file changed, 21 insertions(+), 10 deletions(-)
>
> diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c
> index 847fa1f82c3..b4de2e95a0d 100644
> --- a/drivers/usb/dwc3/core.c
> +++ b/drivers/usb/dwc3/core.c
> @@ -59,11 +59,20 @@ static void dwc3_set_mode(struct dwc3 *dwc, u32 mode)
>  static int dwc3_core_soft_reset(struct dwc3 *dwc)
>  {
>       u32             reg;
> +     int             retries = 1000;
>  
> -     /* Before Resetting PHY, put Core in Reset */
> -     reg = dwc3_readl(dwc->regs, DWC3_GCTL);
> -     reg |= DWC3_GCTL_CORESOFTRESET;
> -     dwc3_writel(dwc->regs, DWC3_GCTL, reg);
> +     /*
> +      * We're resetting only the device side because, if we're in host mode,
> +      * XHCI driver will reset the host block. If dwc3 was configured for
> +      * host-only mode, then we can return early.
> +      */
> +     if (dwc->dr_mode == USB_DR_MODE_HOST)
> +             return 0;
> +
> +     reg = dwc3_readl(dwc->regs, DWC3_DCTL);
> +     reg |= DWC3_DCTL_CSFTRST;
> +     reg &= ~DWC3_DCTL_RUN_STOP;
> +     dwc3_gadget_dctl_write_safe(dwc, reg);
>  
>       /* Assert USB3 PHY reset */
>       reg = dwc3_readl(dwc->regs, DWC3_GUSB3PIPECTL(0));

Looking more closely at [1], I can see that /* Assert USB3 PHY reset */
and  /* Assert USB2 PHY reset */  have also been removed in that patch
(in linux)

Can you please explain why it has not been removed in the U-Boot
version?
Please add details of that in the commit message.

> @@ -87,12 +96,14 @@ static int dwc3_core_soft_reset(struct dwc3 *dwc)
>       reg &= ~DWC3_GUSB2PHYCFG_PHYSOFTRST;
>       dwc3_writel(dwc->regs, DWC3_GUSB2PHYCFG(0), reg);
>  
> -     mdelay(100);
> +     do {
> +             reg = dwc3_readl(dwc->regs, DWC3_DCTL);
> +             if (!(reg & DWC3_DCTL_CSFTRST))
> +                     return 0;
> +             udelay(1);
> +     } while (--retries);
>  
> -     /* After PHYs are stable we can take Core out of reset state */
> -     reg = dwc3_readl(dwc->regs, DWC3_GCTL);
> -     reg &= ~DWC3_GCTL_CORESOFTRESET;
> -     dwc3_writel(dwc->regs, DWC3_GCTL, reg);
> +     return -ETIMEDOUT;
>  
>       return 0;
>  }
> @@ -137,7 +148,7 @@ static void dwc3_ref_clk_period(struct dwc3 *dwc)
>  
>       if (dwc->ref_clk) {
>               rate = clk_get_rate(dwc->ref_clk);
> -             if (!rate)
> +             if (!rate || (long)rate < 0)

Is this a spurious change? it does not appear in the linux version of
the patch and also seems unrelated to soft reset.

>                       return;
>               period = NSEC_PER_SEC / rate;
>       } else {
> -- 
> 2.43.0

Reply via email to