On Mon, Mar 17, 2025, Mike Looijmans wrote:
On 14-03-2025 22:14, Thinh Nguyen wrote:It's not obvious to me if this is an error in Xilinx documentation, the
On Fri, Mar 14, 2025, Mike Looijmans wrote:I don't understand your question. What "programming flow" are you referring
Set the gpio to "high" on acquisition, instead of acquiring it in lowHow does this affect the current programming flow beside preventing a
state and then immediately setting it high again. This prevents a
short "spike" on the reset signal.
spike to the reset signal?
to?
driver issue, or whether this is found through experiment. Since I don't
have the info of this platform, it would help to know where the source
of error is so we can document this in the code or change-log.
The reset sequence was just plain wrong, the issue is almost the same as theDo we need a fix tag and add to stable then?
one described in this commit:Then can we remove it?
e0183b974d30 "net: mdiobus: Prevent spike on MDIO bus reset signal"
Note that I see this high-low-high-low double reset toggle in many Xilinx
software drivers, they seem to teach that at the Xilinx academy or so.
Now you mention it, the comment never made any sense anyway.Signed-off-by: Mike Looijmans <mike.looijmans@xxxxxxxx>Does the comment above still apply?
---
drivers/usb/dwc3/dwc3-xilinx.c | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/drivers/usb/dwc3/dwc3-xilinx.c b/drivers/usb/dwc3/dwc3-xilinx.c
index a33a42ba0249..a159a511483b 100644
--- a/drivers/usb/dwc3/dwc3-xilinx.c
+++ b/drivers/usb/dwc3/dwc3-xilinx.c
@@ -207,7 +207,7 @@ static int dwc3_xlnx_init_zynqmp(struct dwc3_xlnx *priv_data)
skip_usb3_phy:
/* ulpi reset via gpio-modepin or gpio-framework driver */
- reset_gpio = devm_gpiod_get_optional(dev, "reset", GPIOD_OUT_LOW);
+ reset_gpio = devm_gpiod_get_optional(dev, "reset", GPIOD_OUT_HIGH);
if (IS_ERR(reset_gpio)) {
return dev_err_probe(dev, PTR_ERR(reset_gpio),
"Failed to request reset GPIO\n");
@@ -215,7 +215,6 @@ static int dwc3_xlnx_init_zynqmp(struct dwc3_xlnx *priv_data)
if (reset_gpio) {
/* Toggle ulpi to reset the phy. */
But why do we need 2 calls to usleep_range? From just looking at thisYes, this is the "reset active" time.- gpiod_set_value_cansleep(reset_gpio, 1);Do we still need this usleep_range here?
usleep_range(5000, 10000);
here, it appears that the first was intended for the removed
gpiod_set_value_cansleep(reset_gpio, 1). If this "reset active" time is
needed irrespective of the existent reset_gpio, then shouldn't it be set
outside of this if statement?
BR,
Thinh
BR,--
Thinh
gpiod_set_value_cansleep(reset_gpio, 0);
usleep_range(5000, 10000);
--
2.43.0
Met vriendelijke groet / kind regards,
Mike Looijmans
Mike Looijmans
System Expert
TOPIC Embedded Products B.V.
Materiaalweg 4, 5681 RJ Best
The Netherlands
T: +31 (0) 499 33 69 69
E: mike.looijmans@xxxxxxxx
W: https://urldefense.com/v3/__http://www.topic.nl__;!!A4F2R9G_pg!e45B0wD5dvB4NV8gz5JjIWaRTQrX9M2uE0ouoBVX4TQC8sKqtYRL8rJY3y2bb061gzSoGL0FOPJv-3-adkP1b3ldzRZnxdY$