[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <20210108015115.27920-2-john.stultz@linaro.org>
Date: Fri, 8 Jan 2021 01:51:15 +0000
From: John Stultz <john.stultz@...aro.org>
To: lkml <linux-kernel@...r.kernel.org>
Cc: John Stultz <john.stultz@...aro.org>,
Felipe Balbi <balbi@...nel.org>,
Tejas Joglekar <tejas.joglekar@...opsys.com>,
Yang Fei <fei.yang@...el.com>,
YongQin Liu <yongqin.liu@...aro.org>,
Andrzej Pietrasiewicz <andrzej.p@...labora.com>,
Thinh Nguyen <thinhn@...opsys.com>,
Jun Li <lijun.kernel@...il.com>,
Mauro Carvalho Chehab <mchehab+huawei@...nel.org>,
Greg Kroah-Hartman <gregkh@...uxfoundation.org>,
linux-usb@...r.kernel.org
Subject: [PATCH v3 2/2] usb: dwc3: Fix DRD mode change sequence following programming guide
In reviewing the previous patch, Thinh Nguyen pointed out that
the DRD mode change sequence should be like the following when
switching from host -> device according to the programming guide
(for all DRD IPs):
1. Reset controller with GCTL.CoreSoftReset
2. Set GCTL.PrtCapDir(device)
3. Soft reset with DCTL.CSftRst
4. Then follow up with the initializing registers sequence
The current code does:
a. Soft reset with DCTL.CSftRst on driver probe
b. Reset controller with GCTL.CoreSoftReset (added in previous
patch)
c. Set GCTL.PrtCapDir(device)
d. < missing DCTL.CSftRst >
e. Then follow up with initializing registers sequence
So this patch adds the DCTL.CSftRst soft reset that was currently
missing from the dwc3 mode switching.
Cc: Felipe Balbi <balbi@...nel.org>
Cc: Tejas Joglekar <tejas.joglekar@...opsys.com>
Cc: Yang Fei <fei.yang@...el.com>
Cc: YongQin Liu <yongqin.liu@...aro.org>
Cc: Andrzej Pietrasiewicz <andrzej.p@...labora.com>
Cc: Thinh Nguyen <thinhn@...opsys.com>
Cc: Jun Li <lijun.kernel@...il.com>
Cc: Mauro Carvalho Chehab <mchehab+huawei@...nel.org>
Cc: Greg Kroah-Hartman <gregkh@...uxfoundation.org>
Cc: linux-usb@...r.kernel.org
Signed-off-by: John Stultz <john.stultz@...aro.org>
---
Feedback would be appreciated. I'm a little worried I should be
conditionalizing the DCTL.CSftRst on DRD mode controllers, but
I'm really not sure what the right thing to do is for non-DRD
mode controllers.
---
drivers/usb/dwc3/core.c | 3 +++
1 file changed, 3 insertions(+)
diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c
index b6a6b90eb2d5..71f8b07ecb99 100644
--- a/drivers/usb/dwc3/core.c
+++ b/drivers/usb/dwc3/core.c
@@ -40,6 +40,8 @@
#define DWC3_DEFAULT_AUTOSUSPEND_DELAY 5000 /* ms */
+static int dwc3_core_soft_reset(struct dwc3 *dwc);
+
/**
* dwc3_get_dr_mode - Validates and sets dr_mode
* @dwc: pointer to our context structure
@@ -177,6 +179,7 @@ static void __dwc3_set_mode(struct work_struct *work)
dwc3_set_prtcap(dwc, dwc->desired_dr_role);
+ dwc3_core_soft_reset(dwc);
spin_unlock_irqrestore(&dwc->lock, flags);
switch (dwc->desired_dr_role) {
--
2.17.1
Powered by blists - more mailing lists