public inbox for linux-arm-kernel@lists.infradead.org
 help / color / mirror / Atom feed
* [PATCH] usb: dwc3: Always deassert xilinx resets
@ 2026-01-06 17:10 Sean Anderson
  2026-01-09  0:49 ` Thinh Nguyen
  0 siblings, 1 reply; 9+ messages in thread
From: Sean Anderson @ 2026-01-06 17:10 UTC (permalink / raw)
  To: Thinh Nguyen, open list:DESIGNWARE USB3 DRD IP DRIVER
  Cc: Neal Frager, Michal Simek, open list,
	moderated list:ARM/ZYNQ ARCHITECTURE, Philipp Zabel,
	Radhey Shyam Pandey, Greg Kroah-Hartman, Sean Anderson

If we don't have a usb3 phy we don't need to assert the core resets.
Deassert them even if we didn't assert them to support booting when the
bootloader never released the core from reset.

Signed-off-by: Sean Anderson <sean.anderson@linux.dev>
---

 drivers/usb/dwc3/dwc3-xilinx.c | 67 ++++++++++++++++------------------
 1 file changed, 32 insertions(+), 35 deletions(-)

diff --git a/drivers/usb/dwc3/dwc3-xilinx.c b/drivers/usb/dwc3/dwc3-xilinx.c
index 0a8c47876ff9..f41b0da5e89d 100644
--- a/drivers/usb/dwc3/dwc3-xilinx.c
+++ b/drivers/usb/dwc3/dwc3-xilinx.c
@@ -132,21 +132,6 @@ static int dwc3_xlnx_init_zynqmp(struct dwc3_xlnx *priv_data)
 		goto err;
 	}
 
-	/*
-	 * The following core resets are not required unless a USB3 PHY
-	 * is used, and the subsequent register settings are not required
-	 * unless a core reset is performed (they should be set properly
-	 * by the first-stage boot loader, but may be reverted by a core
-	 * reset). They may also break the configuration if USB3 is actually
-	 * in use but the usb3-phy entry is missing from the device tree.
-	 * Therefore, skip these operations in this case.
-	 */
-	if (!priv_data->usb3_phy) {
-		/* Deselect the PIPE Clock Select bit in FPD PIPE Clock register */
-		writel(PIPE_CLK_DESELECT, priv_data->regs + XLNX_USB_FPD_PIPE_CLK);
-		goto skip_usb3_phy;
-	}
-
 	crst = devm_reset_control_get_exclusive(dev, "usb_crst");
 	if (IS_ERR(crst)) {
 		ret = PTR_ERR(crst);
@@ -171,22 +156,31 @@ static int dwc3_xlnx_init_zynqmp(struct dwc3_xlnx *priv_data)
 		goto err;
 	}
 
-	ret = reset_control_assert(crst);
-	if (ret < 0) {
-		dev_err(dev, "Failed to assert core reset\n");
-		goto err;
-	}
+	/*
+	 * Asserting the core resets is not required unless a USB3 PHY is used.
+	 * They may also break the configuration if USB3 is actually in use but
+	 * the usb3-phy entry is missing from the device tree. Therefore, skip
+	 * a full reset cycle and just deassert the resets if the phy is
+	 * absent.
+	 */
+	if (priv_data->usb3_phy) {
+		ret = reset_control_assert(crst);
+		if (ret < 0) {
+			dev_err(dev, "Failed to assert core reset\n");
+			goto err;
+		}
 
-	ret = reset_control_assert(hibrst);
-	if (ret < 0) {
-		dev_err(dev, "Failed to assert hibernation reset\n");
-		goto err;
-	}
+		ret = reset_control_assert(hibrst);
+		if (ret < 0) {
+			dev_err(dev, "Failed to assert hibernation reset\n");
+			goto err;
+		}
 
-	ret = reset_control_assert(apbrst);
-	if (ret < 0) {
-		dev_err(dev, "Failed to assert APB reset\n");
-		goto err;
+		ret = reset_control_assert(apbrst);
+		if (ret < 0) {
+			dev_err(dev, "Failed to assert APB reset\n");
+			goto err;
+		}
 	}
 
 	ret = phy_init(priv_data->usb3_phy);
@@ -201,11 +195,15 @@ static int dwc3_xlnx_init_zynqmp(struct dwc3_xlnx *priv_data)
 		goto err;
 	}
 
-	/* Set PIPE Power Present signal in FPD Power Present Register*/
-	writel(FPD_POWER_PRSNT_OPTION, priv_data->regs + XLNX_USB_FPD_POWER_PRSNT);
-
-	/* Set the PIPE Clock Select bit in FPD PIPE Clock register */
-	writel(PIPE_CLK_SELECT, priv_data->regs + XLNX_USB_FPD_PIPE_CLK);
+	if (priv_data->usb3_phy) {
+		/* Set PIPE Power Present signal in FPD Power Present Register*/
+		writel(FPD_POWER_PRSNT_OPTION, priv_data->regs + XLNX_USB_FPD_POWER_PRSNT);
+		/* Set the PIPE Clock Select bit in FPD PIPE Clock register */
+		writel(PIPE_CLK_SELECT, priv_data->regs + XLNX_USB_FPD_PIPE_CLK);
+	} else {
+		/* Deselect the PIPE Clock Select bit in FPD PIPE Clock register */
+		writel(PIPE_CLK_DESELECT, priv_data->regs + XLNX_USB_FPD_PIPE_CLK);
+	}
 
 	ret = reset_control_deassert(crst);
 	if (ret < 0) {
@@ -225,7 +223,6 @@ static int dwc3_xlnx_init_zynqmp(struct dwc3_xlnx *priv_data)
 		goto err;
 	}
 
-skip_usb3_phy:
 	/* ulpi reset via gpio-modepin or gpio-framework driver */
 	reset_gpio = devm_gpiod_get_optional(dev, "reset", GPIOD_OUT_HIGH);
 	if (IS_ERR(reset_gpio)) {
-- 
2.35.1.1320.gc452695387.dirty



^ permalink raw reply related	[flat|nested] 9+ messages in thread

* Re: [PATCH] usb: dwc3: Always deassert xilinx resets
  2026-01-06 17:10 [PATCH] usb: dwc3: Always deassert xilinx resets Sean Anderson
@ 2026-01-09  0:49 ` Thinh Nguyen
  2026-01-09  6:01   ` Pandey, Radhey Shyam
  2026-01-09 15:52   ` Sean Anderson
  0 siblings, 2 replies; 9+ messages in thread
From: Thinh Nguyen @ 2026-01-09  0:49 UTC (permalink / raw)
  To: Sean Anderson
  Cc: Thinh Nguyen, open list:DESIGNWARE USB3 DRD IP  DRIVER,
	Neal Frager, Michal Simek, open list,
	moderated list:ARM/ZYNQ ARCHITECTURE, Philipp Zabel,
	Radhey Shyam Pandey, Greg Kroah-Hartman

On Tue, Jan 06, 2026, Sean Anderson wrote:
> If we don't have a usb3 phy we don't need to assert the core resets.
> Deassert them even if we didn't assert them to support booting when the
> bootloader never released the core from reset.
> 

> Signed-off-by: Sean Anderson <sean.anderson@linux.dev>
> ---
> 
>  drivers/usb/dwc3/dwc3-xilinx.c | 67 ++++++++++++++++------------------
>  1 file changed, 32 insertions(+), 35 deletions(-)
> 

This sounds like a fix. Does it need to be Cc Stable and backported?

Regardless,

Acked-by: Thinh Nguyen <Thinh.Nguyen@synopsys.com>

Thanks,
Thinh

> diff --git a/drivers/usb/dwc3/dwc3-xilinx.c b/drivers/usb/dwc3/dwc3-xilinx.c
> index 0a8c47876ff9..f41b0da5e89d 100644
> --- a/drivers/usb/dwc3/dwc3-xilinx.c
> +++ b/drivers/usb/dwc3/dwc3-xilinx.c
> @@ -132,21 +132,6 @@ static int dwc3_xlnx_init_zynqmp(struct dwc3_xlnx *priv_data)
>  		goto err;
>  	}
>  
> -	/*
> -	 * The following core resets are not required unless a USB3 PHY
> -	 * is used, and the subsequent register settings are not required
> -	 * unless a core reset is performed (they should be set properly
> -	 * by the first-stage boot loader, but may be reverted by a core
> -	 * reset). They may also break the configuration if USB3 is actually
> -	 * in use but the usb3-phy entry is missing from the device tree.
> -	 * Therefore, skip these operations in this case.
> -	 */
> -	if (!priv_data->usb3_phy) {
> -		/* Deselect the PIPE Clock Select bit in FPD PIPE Clock register */
> -		writel(PIPE_CLK_DESELECT, priv_data->regs + XLNX_USB_FPD_PIPE_CLK);
> -		goto skip_usb3_phy;
> -	}
> -
>  	crst = devm_reset_control_get_exclusive(dev, "usb_crst");
>  	if (IS_ERR(crst)) {
>  		ret = PTR_ERR(crst);
> @@ -171,22 +156,31 @@ static int dwc3_xlnx_init_zynqmp(struct dwc3_xlnx *priv_data)
>  		goto err;
>  	}
>  
> -	ret = reset_control_assert(crst);
> -	if (ret < 0) {
> -		dev_err(dev, "Failed to assert core reset\n");
> -		goto err;
> -	}
> +	/*
> +	 * Asserting the core resets is not required unless a USB3 PHY is used.
> +	 * They may also break the configuration if USB3 is actually in use but
> +	 * the usb3-phy entry is missing from the device tree. Therefore, skip
> +	 * a full reset cycle and just deassert the resets if the phy is
> +	 * absent.
> +	 */
> +	if (priv_data->usb3_phy) {
> +		ret = reset_control_assert(crst);
> +		if (ret < 0) {
> +			dev_err(dev, "Failed to assert core reset\n");
> +			goto err;
> +		}
>  
> -	ret = reset_control_assert(hibrst);
> -	if (ret < 0) {
> -		dev_err(dev, "Failed to assert hibernation reset\n");
> -		goto err;
> -	}
> +		ret = reset_control_assert(hibrst);
> +		if (ret < 0) {
> +			dev_err(dev, "Failed to assert hibernation reset\n");
> +			goto err;
> +		}
>  
> -	ret = reset_control_assert(apbrst);
> -	if (ret < 0) {
> -		dev_err(dev, "Failed to assert APB reset\n");
> -		goto err;
> +		ret = reset_control_assert(apbrst);
> +		if (ret < 0) {
> +			dev_err(dev, "Failed to assert APB reset\n");
> +			goto err;
> +		}
>  	}
>  
>  	ret = phy_init(priv_data->usb3_phy);
> @@ -201,11 +195,15 @@ static int dwc3_xlnx_init_zynqmp(struct dwc3_xlnx *priv_data)
>  		goto err;
>  	}
>  
> -	/* Set PIPE Power Present signal in FPD Power Present Register*/
> -	writel(FPD_POWER_PRSNT_OPTION, priv_data->regs + XLNX_USB_FPD_POWER_PRSNT);
> -
> -	/* Set the PIPE Clock Select bit in FPD PIPE Clock register */
> -	writel(PIPE_CLK_SELECT, priv_data->regs + XLNX_USB_FPD_PIPE_CLK);
> +	if (priv_data->usb3_phy) {
> +		/* Set PIPE Power Present signal in FPD Power Present Register*/
> +		writel(FPD_POWER_PRSNT_OPTION, priv_data->regs + XLNX_USB_FPD_POWER_PRSNT);
> +		/* Set the PIPE Clock Select bit in FPD PIPE Clock register */
> +		writel(PIPE_CLK_SELECT, priv_data->regs + XLNX_USB_FPD_PIPE_CLK);
> +	} else {
> +		/* Deselect the PIPE Clock Select bit in FPD PIPE Clock register */
> +		writel(PIPE_CLK_DESELECT, priv_data->regs + XLNX_USB_FPD_PIPE_CLK);
> +	}
>  
>  	ret = reset_control_deassert(crst);
>  	if (ret < 0) {
> @@ -225,7 +223,6 @@ static int dwc3_xlnx_init_zynqmp(struct dwc3_xlnx *priv_data)
>  		goto err;
>  	}
>  
> -skip_usb3_phy:
>  	/* ulpi reset via gpio-modepin or gpio-framework driver */
>  	reset_gpio = devm_gpiod_get_optional(dev, "reset", GPIOD_OUT_HIGH);
>  	if (IS_ERR(reset_gpio)) {
> -- 
> 2.35.1.1320.gc452695387.dirty
> 

^ permalink raw reply	[flat|nested] 9+ messages in thread

* RE: [PATCH] usb: dwc3: Always deassert xilinx resets
  2026-01-09  0:49 ` Thinh Nguyen
@ 2026-01-09  6:01   ` Pandey, Radhey Shyam
  2026-01-09 15:51     ` Sean Anderson
  2026-01-13  0:43     ` Thinh Nguyen
  2026-01-09 15:52   ` Sean Anderson
  1 sibling, 2 replies; 9+ messages in thread
From: Pandey, Radhey Shyam @ 2026-01-09  6:01 UTC (permalink / raw)
  To: Thinh Nguyen, Sean Anderson
  Cc: open list:DESIGNWARE USB3 DRD IP  DRIVER, Frager, Neal,
	Simek, Michal, open list, moderated list:ARM/ZYNQ ARCHITECTURE,
	Philipp Zabel, Greg Kroah-Hartman

[AMD Official Use Only - AMD Internal Distribution Only]

> -----Original Message-----
> From: Thinh Nguyen <Thinh.Nguyen@synopsys.com>
> Sent: Friday, January 9, 2026 6:19 AM
> To: Sean Anderson <sean.anderson@linux.dev>
> Cc: Thinh Nguyen <Thinh.Nguyen@synopsys.com>; open list:DESIGNWARE
> USB3 DRD IP DRIVER <linux-usb@vger.kernel.org>; Frager, Neal
> <neal.frager@amd.com>; Simek, Michal <michal.simek@amd.com>; open list
> <linux-kernel@vger.kernel.org>; moderated list:ARM/ZYNQ ARCHITECTURE
> <linux-arm-kernel@lists.infradead.org>; Philipp Zabel <p.zabel@pengutronix.de>;
> Pandey, Radhey Shyam <radhey.shyam.pandey@amd.com>; Greg Kroah-Hartman
> <gregkh@linuxfoundation.org>
> Subject: Re: [PATCH] usb: dwc3: Always deassert xilinx resets
>
> On Tue, Jan 06, 2026, Sean Anderson wrote:
> > If we don't have a usb3 phy we don't need to assert the core resets.
> > Deassert them even if we didn't assert them to support booting when
> > the bootloader never released the core from reset.
Is it a customized bootloader ? i.e it assert reset but don't deassert.

I think ideally core /APB reset should be done independent on
MAC 2.0/3.0 configuration. Not sure where the recommendation is
coming from to only do it for 3.0 MAC. Let me check the IP spec.
Thinh: Please chime in with your thoughts.


> >
>
> > Signed-off-by: Sean Anderson <sean.anderson@linux.dev>
> > ---
> >
> >  drivers/usb/dwc3/dwc3-xilinx.c | 67
> > ++++++++++++++++------------------
> >  1 file changed, 32 insertions(+), 35 deletions(-)
> >
>
> This sounds like a fix. Does it need to be Cc Stable and backported?
>
> Regardless,
>
> Acked-by: Thinh Nguyen <Thinh.Nguyen@synopsys.com>
>
> Thanks,
> Thinh
>
> > diff --git a/drivers/usb/dwc3/dwc3-xilinx.c
> > b/drivers/usb/dwc3/dwc3-xilinx.c index 0a8c47876ff9..f41b0da5e89d
> > 100644
> > --- a/drivers/usb/dwc3/dwc3-xilinx.c
> > +++ b/drivers/usb/dwc3/dwc3-xilinx.c
> > @@ -132,21 +132,6 @@ static int dwc3_xlnx_init_zynqmp(struct dwc3_xlnx
> *priv_data)
> >             goto err;
> >     }
> >
> > -   /*
> > -    * The following core resets are not required unless a USB3 PHY
> > -    * is used, and the subsequent register settings are not required
> > -    * unless a core reset is performed (they should be set properly
> > -    * by the first-stage boot loader, but may be reverted by a core
> > -    * reset). They may also break the configuration if USB3 is actually
> > -    * in use but the usb3-phy entry is missing from the device tree.
> > -    * Therefore, skip these operations in this case.
> > -    */
> > -   if (!priv_data->usb3_phy) {
> > -           /* Deselect the PIPE Clock Select bit in FPD PIPE Clock register */
> > -           writel(PIPE_CLK_DESELECT, priv_data->regs +
> XLNX_USB_FPD_PIPE_CLK);
> > -           goto skip_usb3_phy;
> > -   }
> > -
> >     crst = devm_reset_control_get_exclusive(dev, "usb_crst");
> >     if (IS_ERR(crst)) {
> >             ret = PTR_ERR(crst);
> > @@ -171,22 +156,31 @@ static int dwc3_xlnx_init_zynqmp(struct dwc3_xlnx
> *priv_data)
> >             goto err;
> >     }
> >
> > -   ret = reset_control_assert(crst);
> > -   if (ret < 0) {
> > -           dev_err(dev, "Failed to assert core reset\n");
> > -           goto err;
> > -   }
> > +   /*
> > +    * Asserting the core resets is not required unless a USB3 PHY is used.
> > +    * They may also break the configuration if USB3 is actually in use but
> > +    * the usb3-phy entry is missing from the device tree. Therefore, skip
> > +    * a full reset cycle and just deassert the resets if the phy is
> > +    * absent.
> > +    */
> > +   if (priv_data->usb3_phy) {
> > +           ret = reset_control_assert(crst);
> > +           if (ret < 0) {
> > +                   dev_err(dev, "Failed to assert core reset\n");
> > +                   goto err;
> > +           }
> >
> > -   ret = reset_control_assert(hibrst);
> > -   if (ret < 0) {
> > -           dev_err(dev, "Failed to assert hibernation reset\n");
> > -           goto err;
> > -   }
> > +           ret = reset_control_assert(hibrst);
> > +           if (ret < 0) {
> > +                   dev_err(dev, "Failed to assert hibernation reset\n");
> > +                   goto err;
> > +           }
> >
> > -   ret = reset_control_assert(apbrst);
> > -   if (ret < 0) {
> > -           dev_err(dev, "Failed to assert APB reset\n");
> > -           goto err;
> > +           ret = reset_control_assert(apbrst);
> > +           if (ret < 0) {
> > +                   dev_err(dev, "Failed to assert APB reset\n");
> > +                   goto err;
> > +           }
> >     }
> >
> >     ret = phy_init(priv_data->usb3_phy); @@ -201,11 +195,15 @@ static
> > int dwc3_xlnx_init_zynqmp(struct dwc3_xlnx *priv_data)
> >             goto err;
> >     }
> >
> > -   /* Set PIPE Power Present signal in FPD Power Present Register*/
> > -   writel(FPD_POWER_PRSNT_OPTION, priv_data->regs +
> XLNX_USB_FPD_POWER_PRSNT);
> > -
> > -   /* Set the PIPE Clock Select bit in FPD PIPE Clock register */
> > -   writel(PIPE_CLK_SELECT, priv_data->regs +
> XLNX_USB_FPD_PIPE_CLK);
> > +   if (priv_data->usb3_phy) {
> > +           /* Set PIPE Power Present signal in FPD Power Present Register*/
> > +           writel(FPD_POWER_PRSNT_OPTION, priv_data->regs +
> XLNX_USB_FPD_POWER_PRSNT);
> > +           /* Set the PIPE Clock Select bit in FPD PIPE Clock register */
> > +           writel(PIPE_CLK_SELECT, priv_data->regs +
> XLNX_USB_FPD_PIPE_CLK);
> > +   } else {
> > +           /* Deselect the PIPE Clock Select bit in FPD PIPE Clock register */
> > +           writel(PIPE_CLK_DESELECT, priv_data->regs +
> XLNX_USB_FPD_PIPE_CLK);
> > +   }
> >
> >     ret = reset_control_deassert(crst);
> >     if (ret < 0) {
> > @@ -225,7 +223,6 @@ static int dwc3_xlnx_init_zynqmp(struct dwc3_xlnx
> *priv_data)
> >             goto err;
> >     }
> >
> > -skip_usb3_phy:
> >     /* ulpi reset via gpio-modepin or gpio-framework driver */
> >     reset_gpio = devm_gpiod_get_optional(dev, "reset", GPIOD_OUT_HIGH);
> >     if (IS_ERR(reset_gpio)) {
> > --
> > 2.35.1.1320.gc452695387.dirty
> >

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH] usb: dwc3: Always deassert xilinx resets
  2026-01-09  6:01   ` Pandey, Radhey Shyam
@ 2026-01-09 15:51     ` Sean Anderson
  2026-01-13  0:49       ` Thinh Nguyen
  2026-01-13  0:43     ` Thinh Nguyen
  1 sibling, 1 reply; 9+ messages in thread
From: Sean Anderson @ 2026-01-09 15:51 UTC (permalink / raw)
  To: Pandey, Radhey Shyam, Thinh Nguyen
  Cc: open list:DESIGNWARE USB3 DRD IP DRIVER, Frager, Neal,
	Simek, Michal, open list, moderated list:ARM/ZYNQ ARCHITECTURE,
	Philipp Zabel, Greg Kroah-Hartman

On 1/9/26 01:01, Pandey, Radhey Shyam wrote:
> [AMD Official Use Only - AMD Internal Distribution Only]
> 
>> -----Original Message-----
>> From: Thinh Nguyen <Thinh.Nguyen@synopsys.com>
>> Sent: Friday, January 9, 2026 6:19 AM
>> To: Sean Anderson <sean.anderson@linux.dev>
>> Cc: Thinh Nguyen <Thinh.Nguyen@synopsys.com>; open list:DESIGNWARE
>> USB3 DRD IP DRIVER <linux-usb@vger.kernel.org>; Frager, Neal
>> <neal.frager@amd.com>; Simek, Michal <michal.simek@amd.com>; open list
>> <linux-kernel@vger.kernel.org>; moderated list:ARM/ZYNQ ARCHITECTURE
>> <linux-arm-kernel@lists.infradead.org>; Philipp Zabel <p.zabel@pengutronix.de>;
>> Pandey, Radhey Shyam <radhey.shyam.pandey@amd.com>; Greg Kroah-Hartman
>> <gregkh@linuxfoundation.org>
>> Subject: Re: [PATCH] usb: dwc3: Always deassert xilinx resets
>>
>> On Tue, Jan 06, 2026, Sean Anderson wrote:
>> > If we don't have a usb3 phy we don't need to assert the core resets.
>> > Deassert them even if we didn't assert them to support booting when
>> > the bootloader never released the core from reset.
> Is it a customized bootloader ? i.e it assert reset but don't deassert.

No. Most peripheral resets are asserted on PoR. So if the bootloader
doesn't deassert them then Linux has to.

My goal is to make init_serdes() in psu_init_gpl.c optional and do all
serdes initialization in the phy driver (and in the consumer drivers). I
have this working for DP/PCIe. I'm working on SATA, and I don't think
USB/SGMII need much special. This gives the following advantages:

- On some boards (mine) the reference clocks may not be configured in
  SPL/FSBL. So ILL calibration will fail (and take a long time to do so)
  unless we defer initialization to U-Boot/Linux where the phy driver
  can request the clocks.
- If PCIe/SATA are not used in U-Boot, ILL calibration can be deferred
  until Linux when it can be done it parallel with other initialization.
- We will have flexibility to switch between different serdes
  configurations at runtime. For example, this could allow the
  bootloader to fixup the devicetree to support PCIe and SATA M.2
  drives, depending on what the user has plugged in.

> I think ideally core /APB reset should be done independent on
> MAC 2.0/3.0 configuration.

I agree, but I think the existing code does this optimization to reduce
boot time when the bootloader has already initialized USB. I have
preserved that in this patch.

--Sean

> Not sure where the recommendation is
> coming from to only do it for 3.0 MAC. Let me check the IP spec.
> Thinh: Please chime in with your thoughts.
> 
>> >
>>
>> > Signed-off-by: Sean Anderson <sean.anderson@linux.dev>
>> > ---
>> >
>> >  drivers/usb/dwc3/dwc3-xilinx.c | 67
>> > ++++++++++++++++------------------
>> >  1 file changed, 32 insertions(+), 35 deletions(-)
>> >
>>
>> This sounds like a fix. Does it need to be Cc Stable and backported?
>>
>> Regardless,
>>
>> Acked-by: Thinh Nguyen <Thinh.Nguyen@synopsys.com>
>>
>> Thanks,
>> Thinh
>>
>> > diff --git a/drivers/usb/dwc3/dwc3-xilinx.c
>> > b/drivers/usb/dwc3/dwc3-xilinx.c index 0a8c47876ff9..f41b0da5e89d
>> > 100644
>> > --- a/drivers/usb/dwc3/dwc3-xilinx.c
>> > +++ b/drivers/usb/dwc3/dwc3-xilinx.c
>> > @@ -132,21 +132,6 @@ static int dwc3_xlnx_init_zynqmp(struct dwc3_xlnx
>> *priv_data)
>> >             goto err;
>> >     }
>> >
>> > -   /*
>> > -    * The following core resets are not required unless a USB3 PHY
>> > -    * is used, and the subsequent register settings are not required
>> > -    * unless a core reset is performed (they should be set properly
>> > -    * by the first-stage boot loader, but may be reverted by a core
>> > -    * reset). They may also break the configuration if USB3 is actually
>> > -    * in use but the usb3-phy entry is missing from the device tree.
>> > -    * Therefore, skip these operations in this case.
>> > -    */
>> > -   if (!priv_data->usb3_phy) {
>> > -           /* Deselect the PIPE Clock Select bit in FPD PIPE Clock register */
>> > -           writel(PIPE_CLK_DESELECT, priv_data->regs +
>> XLNX_USB_FPD_PIPE_CLK);
>> > -           goto skip_usb3_phy;
>> > -   }
>> > -
>> >     crst = devm_reset_control_get_exclusive(dev, "usb_crst");
>> >     if (IS_ERR(crst)) {
>> >             ret = PTR_ERR(crst);
>> > @@ -171,22 +156,31 @@ static int dwc3_xlnx_init_zynqmp(struct dwc3_xlnx
>> *priv_data)
>> >             goto err;
>> >     }
>> >
>> > -   ret = reset_control_assert(crst);
>> > -   if (ret < 0) {
>> > -           dev_err(dev, "Failed to assert core reset\n");
>> > -           goto err;
>> > -   }
>> > +   /*
>> > +    * Asserting the core resets is not required unless a USB3 PHY is used.
>> > +    * They may also break the configuration if USB3 is actually in use but
>> > +    * the usb3-phy entry is missing from the device tree. Therefore, skip
>> > +    * a full reset cycle and just deassert the resets if the phy is
>> > +    * absent.
>> > +    */
>> > +   if (priv_data->usb3_phy) {
>> > +           ret = reset_control_assert(crst);
>> > +           if (ret < 0) {
>> > +                   dev_err(dev, "Failed to assert core reset\n");
>> > +                   goto err;
>> > +           }
>> >
>> > -   ret = reset_control_assert(hibrst);
>> > -   if (ret < 0) {
>> > -           dev_err(dev, "Failed to assert hibernation reset\n");
>> > -           goto err;
>> > -   }
>> > +           ret = reset_control_assert(hibrst);
>> > +           if (ret < 0) {
>> > +                   dev_err(dev, "Failed to assert hibernation reset\n");
>> > +                   goto err;
>> > +           }
>> >
>> > -   ret = reset_control_assert(apbrst);
>> > -   if (ret < 0) {
>> > -           dev_err(dev, "Failed to assert APB reset\n");
>> > -           goto err;
>> > +           ret = reset_control_assert(apbrst);
>> > +           if (ret < 0) {
>> > +                   dev_err(dev, "Failed to assert APB reset\n");
>> > +                   goto err;
>> > +           }
>> >     }
>> >
>> >     ret = phy_init(priv_data->usb3_phy); @@ -201,11 +195,15 @@ static
>> > int dwc3_xlnx_init_zynqmp(struct dwc3_xlnx *priv_data)
>> >             goto err;
>> >     }
>> >
>> > -   /* Set PIPE Power Present signal in FPD Power Present Register*/
>> > -   writel(FPD_POWER_PRSNT_OPTION, priv_data->regs +
>> XLNX_USB_FPD_POWER_PRSNT);
>> > -
>> > -   /* Set the PIPE Clock Select bit in FPD PIPE Clock register */
>> > -   writel(PIPE_CLK_SELECT, priv_data->regs +
>> XLNX_USB_FPD_PIPE_CLK);
>> > +   if (priv_data->usb3_phy) {
>> > +           /* Set PIPE Power Present signal in FPD Power Present Register*/
>> > +           writel(FPD_POWER_PRSNT_OPTION, priv_data->regs +
>> XLNX_USB_FPD_POWER_PRSNT);
>> > +           /* Set the PIPE Clock Select bit in FPD PIPE Clock register */
>> > +           writel(PIPE_CLK_SELECT, priv_data->regs +
>> XLNX_USB_FPD_PIPE_CLK);
>> > +   } else {
>> > +           /* Deselect the PIPE Clock Select bit in FPD PIPE Clock register */
>> > +           writel(PIPE_CLK_DESELECT, priv_data->regs +
>> XLNX_USB_FPD_PIPE_CLK);
>> > +   }
>> >
>> >     ret = reset_control_deassert(crst);
>> >     if (ret < 0) {
>> > @@ -225,7 +223,6 @@ static int dwc3_xlnx_init_zynqmp(struct dwc3_xlnx
>> *priv_data)
>> >             goto err;
>> >     }
>> >
>> > -skip_usb3_phy:
>> >     /* ulpi reset via gpio-modepin or gpio-framework driver */
>> >     reset_gpio = devm_gpiod_get_optional(dev, "reset", GPIOD_OUT_HIGH);
>> >     if (IS_ERR(reset_gpio)) {
>> > --
>> > 2.35.1.1320.gc452695387.dirty
>> >


^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH] usb: dwc3: Always deassert xilinx resets
  2026-01-09  0:49 ` Thinh Nguyen
  2026-01-09  6:01   ` Pandey, Radhey Shyam
@ 2026-01-09 15:52   ` Sean Anderson
  1 sibling, 0 replies; 9+ messages in thread
From: Sean Anderson @ 2026-01-09 15:52 UTC (permalink / raw)
  To: Thinh Nguyen
  Cc: open list:DESIGNWARE USB3 DRD IP DRIVER, Neal Frager,
	Michal Simek, open list, moderated list:ARM/ZYNQ ARCHITECTURE,
	Philipp Zabel, Radhey Shyam Pandey, Greg Kroah-Hartman

On 1/8/26 19:49, Thinh Nguyen wrote:
> On Tue, Jan 06, 2026, Sean Anderson wrote:
>> If we don't have a usb3 phy we don't need to assert the core resets.
>> Deassert them even if we didn't assert them to support booting when the
>> bootloader never released the core from reset.
>> 
> 
>> Signed-off-by: Sean Anderson <sean.anderson@linux.dev>
>> ---
>> 
>>  drivers/usb/dwc3/dwc3-xilinx.c | 67 ++++++++++++++++------------------
>>  1 file changed, 32 insertions(+), 35 deletions(-)
>> 
> 
> This sounds like a fix. Does it need to be Cc Stable and backported?

No, it's not a fix since the bootloaders currently in use on this
platform always initialize the serdes. But I want to add support for
skipping this initialization and this patch is necessary for that.

--Sean

> Regardless,
> 
> Acked-by: Thinh Nguyen <Thinh.Nguyen@synopsys.com>
> 
> Thanks,
> Thinh
> 
>> diff --git a/drivers/usb/dwc3/dwc3-xilinx.c b/drivers/usb/dwc3/dwc3-xilinx.c
>> index 0a8c47876ff9..f41b0da5e89d 100644
>> --- a/drivers/usb/dwc3/dwc3-xilinx.c
>> +++ b/drivers/usb/dwc3/dwc3-xilinx.c
>> @@ -132,21 +132,6 @@ static int dwc3_xlnx_init_zynqmp(struct dwc3_xlnx *priv_data)
>>  		goto err;
>>  	}
>>  
>> -	/*
>> -	 * The following core resets are not required unless a USB3 PHY
>> -	 * is used, and the subsequent register settings are not required
>> -	 * unless a core reset is performed (they should be set properly
>> -	 * by the first-stage boot loader, but may be reverted by a core
>> -	 * reset). They may also break the configuration if USB3 is actually
>> -	 * in use but the usb3-phy entry is missing from the device tree.
>> -	 * Therefore, skip these operations in this case.
>> -	 */
>> -	if (!priv_data->usb3_phy) {
>> -		/* Deselect the PIPE Clock Select bit in FPD PIPE Clock register */
>> -		writel(PIPE_CLK_DESELECT, priv_data->regs + XLNX_USB_FPD_PIPE_CLK);
>> -		goto skip_usb3_phy;
>> -	}
>> -
>>  	crst = devm_reset_control_get_exclusive(dev, "usb_crst");
>>  	if (IS_ERR(crst)) {
>>  		ret = PTR_ERR(crst);
>> @@ -171,22 +156,31 @@ static int dwc3_xlnx_init_zynqmp(struct dwc3_xlnx *priv_data)
>>  		goto err;
>>  	}
>>  
>> -	ret = reset_control_assert(crst);
>> -	if (ret < 0) {
>> -		dev_err(dev, "Failed to assert core reset\n");
>> -		goto err;
>> -	}
>> +	/*
>> +	 * Asserting the core resets is not required unless a USB3 PHY is used.
>> +	 * They may also break the configuration if USB3 is actually in use but
>> +	 * the usb3-phy entry is missing from the device tree. Therefore, skip
>> +	 * a full reset cycle and just deassert the resets if the phy is
>> +	 * absent.
>> +	 */
>> +	if (priv_data->usb3_phy) {
>> +		ret = reset_control_assert(crst);
>> +		if (ret < 0) {
>> +			dev_err(dev, "Failed to assert core reset\n");
>> +			goto err;
>> +		}
>>  
>> -	ret = reset_control_assert(hibrst);
>> -	if (ret < 0) {
>> -		dev_err(dev, "Failed to assert hibernation reset\n");
>> -		goto err;
>> -	}
>> +		ret = reset_control_assert(hibrst);
>> +		if (ret < 0) {
>> +			dev_err(dev, "Failed to assert hibernation reset\n");
>> +			goto err;
>> +		}
>>  
>> -	ret = reset_control_assert(apbrst);
>> -	if (ret < 0) {
>> -		dev_err(dev, "Failed to assert APB reset\n");
>> -		goto err;
>> +		ret = reset_control_assert(apbrst);
>> +		if (ret < 0) {
>> +			dev_err(dev, "Failed to assert APB reset\n");
>> +			goto err;
>> +		}
>>  	}
>>  
>>  	ret = phy_init(priv_data->usb3_phy);
>> @@ -201,11 +195,15 @@ static int dwc3_xlnx_init_zynqmp(struct dwc3_xlnx *priv_data)
>>  		goto err;
>>  	}
>>  
>> -	/* Set PIPE Power Present signal in FPD Power Present Register*/
>> -	writel(FPD_POWER_PRSNT_OPTION, priv_data->regs + XLNX_USB_FPD_POWER_PRSNT);
>> -
>> -	/* Set the PIPE Clock Select bit in FPD PIPE Clock register */
>> -	writel(PIPE_CLK_SELECT, priv_data->regs + XLNX_USB_FPD_PIPE_CLK);
>> +	if (priv_data->usb3_phy) {
>> +		/* Set PIPE Power Present signal in FPD Power Present Register*/
>> +		writel(FPD_POWER_PRSNT_OPTION, priv_data->regs + XLNX_USB_FPD_POWER_PRSNT);
>> +		/* Set the PIPE Clock Select bit in FPD PIPE Clock register */
>> +		writel(PIPE_CLK_SELECT, priv_data->regs + XLNX_USB_FPD_PIPE_CLK);
>> +	} else {
>> +		/* Deselect the PIPE Clock Select bit in FPD PIPE Clock register */
>> +		writel(PIPE_CLK_DESELECT, priv_data->regs + XLNX_USB_FPD_PIPE_CLK);
>> +	}
>>  
>>  	ret = reset_control_deassert(crst);
>>  	if (ret < 0) {
>> @@ -225,7 +223,6 @@ static int dwc3_xlnx_init_zynqmp(struct dwc3_xlnx *priv_data)
>>  		goto err;
>>  	}
>>  
>> -skip_usb3_phy:
>>  	/* ulpi reset via gpio-modepin or gpio-framework driver */
>>  	reset_gpio = devm_gpiod_get_optional(dev, "reset", GPIOD_OUT_HIGH);
>>  	if (IS_ERR(reset_gpio)) {
>> -- 
>> 2.35.1.1320.gc452695387.dirty
>> 


^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH] usb: dwc3: Always deassert xilinx resets
  2026-01-09  6:01   ` Pandey, Radhey Shyam
  2026-01-09 15:51     ` Sean Anderson
@ 2026-01-13  0:43     ` Thinh Nguyen
  1 sibling, 0 replies; 9+ messages in thread
From: Thinh Nguyen @ 2026-01-13  0:43 UTC (permalink / raw)
  To: Pandey, Radhey Shyam
  Cc: Thinh Nguyen, Sean Anderson,
	open list:DESIGNWARE USB3 DRD IP  DRIVER, Frager, Neal,
	Simek,  Michal, open list, moderated list:ARM/ZYNQ ARCHITECTURE,
	Philipp Zabel, Greg Kroah-Hartman

On Fri, Jan 09, 2026, Pandey, Radhey Shyam wrote:
> [AMD Official Use Only - AMD Internal Distribution Only]
> 
> > -----Original Message-----
> > From: Thinh Nguyen <Thinh.Nguyen@synopsys.com>
> > Sent: Friday, January 9, 2026 6:19 AM
> > To: Sean Anderson <sean.anderson@linux.dev>
> > Cc: Thinh Nguyen <Thinh.Nguyen@synopsys.com>; open list:DESIGNWARE
> > USB3 DRD IP DRIVER <linux-usb@vger.kernel.org>; Frager, Neal
> > <neal.frager@amd.com>; Simek, Michal <michal.simek@amd.com>; open list
> > <linux-kernel@vger.kernel.org>; moderated list:ARM/ZYNQ ARCHITECTURE
> > <linux-arm-kernel@lists.infradead.org>; Philipp Zabel <p.zabel@pengutronix.de>;
> > Pandey, Radhey Shyam <radhey.shyam.pandey@amd.com>; Greg Kroah-Hartman
> > <gregkh@linuxfoundation.org>
> > Subject: Re: [PATCH] usb: dwc3: Always deassert xilinx resets
> >
> > On Tue, Jan 06, 2026, Sean Anderson wrote:
> > > If we don't have a usb3 phy we don't need to assert the core resets.
> > > Deassert them even if we didn't assert them to support booting when
> > > the bootloader never released the core from reset.
> Is it a customized bootloader ? i.e it assert reset but don't deassert.
> 
> I think ideally core /APB reset should be done independent on
> MAC 2.0/3.0 configuration. Not sure where the recommendation is
> coming from to only do it for 3.0 MAC. Let me check the IP spec.
> Thinh: Please chime in with your thoughts.
> 

The dwc3 programming flow initiating the soft reset has not changed. How
each platform handles SoC specific resets at initialization varies
between implementation. I reviewed the change base on what's available
in the current code and the commit messages, and it sounded reasonable
to me. You may know more about this platform to provide better feedback
to Sean.

BR,
Thinh

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH] usb: dwc3: Always deassert xilinx resets
  2026-01-09 15:51     ` Sean Anderson
@ 2026-01-13  0:49       ` Thinh Nguyen
  2026-01-13 15:45         ` Sean Anderson
  0 siblings, 1 reply; 9+ messages in thread
From: Thinh Nguyen @ 2026-01-13  0:49 UTC (permalink / raw)
  To: Sean Anderson
  Cc: Pandey, Radhey Shyam, Thinh Nguyen,
	open list:DESIGNWARE USB3 DRD IP DRIVER, Frager, Neal,
	Simek,  Michal, open list, moderated list:ARM/ZYNQ ARCHITECTURE,
	Philipp Zabel, Greg Kroah-Hartman

On Fri, Jan 09, 2026, Sean Anderson wrote:
> On 1/9/26 01:01, Pandey, Radhey Shyam wrote:
> > [AMD Official Use Only - AMD Internal Distribution Only]
> > 
> >> -----Original Message-----
> >> From: Thinh Nguyen <Thinh.Nguyen@synopsys.com>
> >> Sent: Friday, January 9, 2026 6:19 AM
> >> To: Sean Anderson <sean.anderson@linux.dev>
> >> Cc: Thinh Nguyen <Thinh.Nguyen@synopsys.com>; open list:DESIGNWARE
> >> USB3 DRD IP DRIVER <linux-usb@vger.kernel.org>; Frager, Neal
> >> <neal.frager@amd.com>; Simek, Michal <michal.simek@amd.com>; open list
> >> <linux-kernel@vger.kernel.org>; moderated list:ARM/ZYNQ ARCHITECTURE
> >> <linux-arm-kernel@lists.infradead.org>; Philipp Zabel <p.zabel@pengutronix.de>;
> >> Pandey, Radhey Shyam <radhey.shyam.pandey@amd.com>; Greg Kroah-Hartman
> >> <gregkh@linuxfoundation.org>
> >> Subject: Re: [PATCH] usb: dwc3: Always deassert xilinx resets
> >>
> >> On Tue, Jan 06, 2026, Sean Anderson wrote:
> >> > If we don't have a usb3 phy we don't need to assert the core resets.
> >> > Deassert them even if we didn't assert them to support booting when
> >> > the bootloader never released the core from reset.
> > Is it a customized bootloader ? i.e it assert reset but don't deassert.
> 
> No. Most peripheral resets are asserted on PoR. So if the bootloader
> doesn't deassert them then Linux has to.
> 
> My goal is to make init_serdes() in psu_init_gpl.c optional and do all
> serdes initialization in the phy driver (and in the consumer drivers). I
> have this working for DP/PCIe. I'm working on SATA, and I don't think
> USB/SGMII need much special. This gives the following advantages:
> 
> - On some boards (mine) the reference clocks may not be configured in
>   SPL/FSBL. So ILL calibration will fail (and take a long time to do so)
>   unless we defer initialization to U-Boot/Linux where the phy driver
>   can request the clocks.
> - If PCIe/SATA are not used in U-Boot, ILL calibration can be deferred
>   until Linux when it can be done it parallel with other initialization.
> - We will have flexibility to switch between different serdes
>   configurations at runtime. For example, this could allow the
>   bootloader to fixup the devicetree to support PCIe and SATA M.2
>   drives, depending on what the user has plugged in.
> 
> > I think ideally core /APB reset should be done independent on
> > MAC 2.0/3.0 configuration.
> 
> I agree, but I think the existing code does this optimization to reduce
> boot time when the bootloader has already initialized USB. I have
> preserved that in this patch.
> 

I think all this info is useful. Can we include it in the change log?

Thanks,
Thinh

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH] usb: dwc3: Always deassert xilinx resets
  2026-01-13  0:49       ` Thinh Nguyen
@ 2026-01-13 15:45         ` Sean Anderson
  2026-01-13 23:53           ` Thinh Nguyen
  0 siblings, 1 reply; 9+ messages in thread
From: Sean Anderson @ 2026-01-13 15:45 UTC (permalink / raw)
  To: Thinh Nguyen
  Cc: Pandey, Radhey Shyam, open list:DESIGNWARE USB3 DRD IP DRIVER,
	Frager, Neal, Simek, Michal, open list,
	moderated list:ARM/ZYNQ ARCHITECTURE, Philipp Zabel,
	Greg Kroah-Hartman

On 1/12/26 19:49, Thinh Nguyen wrote:
> On Fri, Jan 09, 2026, Sean Anderson wrote:
>> On 1/9/26 01:01, Pandey, Radhey Shyam wrote:
>> > [AMD Official Use Only - AMD Internal Distribution Only]
>> > 
>> >> -----Original Message-----
>> >> From: Thinh Nguyen <Thinh.Nguyen@synopsys.com>
>> >> Sent: Friday, January 9, 2026 6:19 AM
>> >> To: Sean Anderson <sean.anderson@linux.dev>
>> >> Cc: Thinh Nguyen <Thinh.Nguyen@synopsys.com>; open list:DESIGNWARE
>> >> USB3 DRD IP DRIVER <linux-usb@vger.kernel.org>; Frager, Neal
>> >> <neal.frager@amd.com>; Simek, Michal <michal.simek@amd.com>; open list
>> >> <linux-kernel@vger.kernel.org>; moderated list:ARM/ZYNQ ARCHITECTURE
>> >> <linux-arm-kernel@lists.infradead.org>; Philipp Zabel <p.zabel@pengutronix.de>;
>> >> Pandey, Radhey Shyam <radhey.shyam.pandey@amd.com>; Greg Kroah-Hartman
>> >> <gregkh@linuxfoundation.org>
>> >> Subject: Re: [PATCH] usb: dwc3: Always deassert xilinx resets
>> >>
>> >> On Tue, Jan 06, 2026, Sean Anderson wrote:
>> >> > If we don't have a usb3 phy we don't need to assert the core resets.
>> >> > Deassert them even if we didn't assert them to support booting when
>> >> > the bootloader never released the core from reset.
>> > Is it a customized bootloader ? i.e it assert reset but don't deassert.
>> 
>> No. Most peripheral resets are asserted on PoR. So if the bootloader
>> doesn't deassert them then Linux has to.
>> 
>> My goal is to make init_serdes() in psu_init_gpl.c optional and do all
>> serdes initialization in the phy driver (and in the consumer drivers). I
>> have this working for DP/PCIe. I'm working on SATA, and I don't think
>> USB/SGMII need much special. This gives the following advantages:
>> 
>> - On some boards (mine) the reference clocks may not be configured in
>>   SPL/FSBL. So ILL calibration will fail (and take a long time to do so)
>>   unless we defer initialization to U-Boot/Linux where the phy driver
>>   can request the clocks.
>> - If PCIe/SATA are not used in U-Boot, ILL calibration can be deferred
>>   until Linux when it can be done it parallel with other initialization.
>> - We will have flexibility to switch between different serdes
>>   configurations at runtime. For example, this could allow the
>>   bootloader to fixup the devicetree to support PCIe and SATA M.2
>>   drives, depending on what the user has plugged in.
>> 
>> > I think ideally core /APB reset should be done independent on
>> > MAC 2.0/3.0 configuration.
>> 
>> I agree, but I think the existing code does this optimization to reduce
>> boot time when the bootloader has already initialized USB. I have
>> preserved that in this patch.
>> 
> 
> I think all this info is useful. Can we include it in the change log?

OK, how about:

I am working on moving serdes initialization to the phy (and consumer)
drivers to improve flexibility and boot times (depending on
configuration). Currently, core resets are released in the bootloader by
init_serdes() in psu_init_gpl.c. In order to remove init_serdes, we
need to handle the case where the bootloader never released the core
resets. If we don't have a usb3 phy we don't need to assert the core
resets, but deassert them anyway to handle this case.

We could assert all resets every boot, but I believe the existing
procedure is an optimization to reduce boot time when the bootloader has
already initialized USB. So this patch preserves the separate code
paths.


^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH] usb: dwc3: Always deassert xilinx resets
  2026-01-13 15:45         ` Sean Anderson
@ 2026-01-13 23:53           ` Thinh Nguyen
  0 siblings, 0 replies; 9+ messages in thread
From: Thinh Nguyen @ 2026-01-13 23:53 UTC (permalink / raw)
  To: Sean Anderson
  Cc: Thinh Nguyen, Pandey, Radhey Shyam,
	open list:DESIGNWARE USB3 DRD IP DRIVER, Frager, Neal,
	Simek,  Michal, open list, moderated list:ARM/ZYNQ ARCHITECTURE,
	Philipp Zabel, Greg Kroah-Hartman

On Tue, Jan 13, 2026, Sean Anderson wrote:
> On 1/12/26 19:49, Thinh Nguyen wrote:
> > On Fri, Jan 09, 2026, Sean Anderson wrote:
> >> On 1/9/26 01:01, Pandey, Radhey Shyam wrote:
> >> > [AMD Official Use Only - AMD Internal Distribution Only]
> >> > 
> >> >> -----Original Message-----
> >> >> From: Thinh Nguyen <Thinh.Nguyen@synopsys.com>
> >> >> Sent: Friday, January 9, 2026 6:19 AM
> >> >> To: Sean Anderson <sean.anderson@linux.dev>
> >> >> Cc: Thinh Nguyen <Thinh.Nguyen@synopsys.com>; open list:DESIGNWARE
> >> >> USB3 DRD IP DRIVER <linux-usb@vger.kernel.org>; Frager, Neal
> >> >> <neal.frager@amd.com>; Simek, Michal <michal.simek@amd.com>; open list
> >> >> <linux-kernel@vger.kernel.org>; moderated list:ARM/ZYNQ ARCHITECTURE
> >> >> <linux-arm-kernel@lists.infradead.org>; Philipp Zabel <p.zabel@pengutronix.de>;
> >> >> Pandey, Radhey Shyam <radhey.shyam.pandey@amd.com>; Greg Kroah-Hartman
> >> >> <gregkh@linuxfoundation.org>
> >> >> Subject: Re: [PATCH] usb: dwc3: Always deassert xilinx resets
> >> >>
> >> >> On Tue, Jan 06, 2026, Sean Anderson wrote:
> >> >> > If we don't have a usb3 phy we don't need to assert the core resets.
> >> >> > Deassert them even if we didn't assert them to support booting when
> >> >> > the bootloader never released the core from reset.
> >> > Is it a customized bootloader ? i.e it assert reset but don't deassert.
> >> 
> >> No. Most peripheral resets are asserted on PoR. So if the bootloader
> >> doesn't deassert them then Linux has to.
> >> 
> >> My goal is to make init_serdes() in psu_init_gpl.c optional and do all
> >> serdes initialization in the phy driver (and in the consumer drivers). I
> >> have this working for DP/PCIe. I'm working on SATA, and I don't think
> >> USB/SGMII need much special. This gives the following advantages:
> >> 
> >> - On some boards (mine) the reference clocks may not be configured in
> >>   SPL/FSBL. So ILL calibration will fail (and take a long time to do so)
> >>   unless we defer initialization to U-Boot/Linux where the phy driver
> >>   can request the clocks.
> >> - If PCIe/SATA are not used in U-Boot, ILL calibration can be deferred
> >>   until Linux when it can be done it parallel with other initialization.
> >> - We will have flexibility to switch between different serdes
> >>   configurations at runtime. For example, this could allow the
> >>   bootloader to fixup the devicetree to support PCIe and SATA M.2
> >>   drives, depending on what the user has plugged in.
> >> 
> >> > I think ideally core /APB reset should be done independent on
> >> > MAC 2.0/3.0 configuration.
> >> 
> >> I agree, but I think the existing code does this optimization to reduce
> >> boot time when the bootloader has already initialized USB. I have
> >> preserved that in this patch.
> >> 
> > 
> > I think all this info is useful. Can we include it in the change log?
> 
> OK, how about:
> 
> I am working on moving serdes initialization to the phy (and consumer)
> drivers to improve flexibility and boot times (depending on
> configuration). Currently, core resets are released in the bootloader by
> init_serdes() in psu_init_gpl.c. In order to remove init_serdes, we
> need to handle the case where the bootloader never released the core
> resets. If we don't have a usb3 phy we don't need to assert the core
> resets, but deassert them anyway to handle this case.
> 
> We could assert all resets every boot, but I believe the existing
> procedure is an optimization to reduce boot time when the bootloader has
> already initialized USB. So this patch preserves the separate code
> paths.

Sounds good to me! Typically we write it in imperative mood, but it's
just minor nit. I care more about the motivation behind these changes.

Radhey can comment if there's doubt.

Otherwise, you can add this in v2:

Acked-by: Thinh Nguyen <Thinh.Nguyen@synopsys.com>

Thanks,
Thinh

^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2026-01-13 23:54 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-01-06 17:10 [PATCH] usb: dwc3: Always deassert xilinx resets Sean Anderson
2026-01-09  0:49 ` Thinh Nguyen
2026-01-09  6:01   ` Pandey, Radhey Shyam
2026-01-09 15:51     ` Sean Anderson
2026-01-13  0:49       ` Thinh Nguyen
2026-01-13 15:45         ` Sean Anderson
2026-01-13 23:53           ` Thinh Nguyen
2026-01-13  0:43     ` Thinh Nguyen
2026-01-09 15:52   ` Sean Anderson

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox