From mboxrd@z Thu Jan 1 00:00:00 1970 From: Patrick DELAUNAY Date: Wed, 6 Nov 2019 18:27:33 +0000 Subject: [U-Boot] [RESEND PATCH 3/5] usb: host: dwc2: force reset assert In-Reply-To: References: <20191014080025.11245-1-patrick.delaunay@st.com> <20191014080025.11245-4-patrick.delaunay@st.com> Message-ID: <3e13407a0c24443fb5325318de75e357@SFHDAG6NODE3.st.com> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de Hi, > From: Marek Vasut > Sent: mardi 15 octobre 2019 01:30 > > On 10/14/19 10:00 AM, Patrick Delaunay wrote: > > Assert reset before deassert in dwc2_reset; It should be more safe for > > DWC2. > > Can you be more descriptive about this issue ? I have no idea what this patch does > or fixes from the description. Yes I will explain it in V2 commit message. The issue only occurs if the DWC2 OTG device switch between gadget mode and host mode. For example: some registers initialiaze by the command "ums" (device mode is forced for example), cause problem for the next command "usb start" and vice versa. Even the existing software reset in dwc_otg_core_reset is not enough; the added hardware reset solve all the issues. > > Signed-off-by: Patrick Delaunay > > --- > > > > drivers/usb/host/dwc2.c | 2 ++ > > 1 file changed, 2 insertions(+) > > > > diff --git a/drivers/usb/host/dwc2.c b/drivers/usb/host/dwc2.c index > > 51023b0c2c..3086411fc4 100644 > > --- a/drivers/usb/host/dwc2.c > > +++ b/drivers/usb/host/dwc2.c > > @@ -1149,6 +1149,8 @@ static int dwc2_reset(struct udevice *dev) > > return ret; > > } > > > > + reset_assert_bulk(&priv->resets); > > + udelay(2); > > Why is there a 2 uS delay ? I think: no real reason to have 2 us.... It was jus a reasonable time to be sure that the device reset is correctly performed, the reset signal is propagated.... but perhaps that no delay is working... I can test without delay if you prefer... PS: I use the same value than DWC2 gadget driver: Added by my commit c2c74f97afff static int dwc2_udc_otg_reset_init(struct udevice *dev, struct reset_ctl_bulk *resets) { ..... ret = reset_assert_bulk(resets); if (!ret) { udelay(2); ret = reset_deassert_bulk(resets); } .... } > > ret = reset_deassert_bulk(&priv->resets); > > if (ret) { > > reset_release_bulk(&priv->resets); > > > > [...] Regards Patrick