public inbox for linux-usb@vger.kernel.org
 help / color / mirror / Atom feed
From: Michael Wu <michael@allwinnertech.com>
To: gregkh@linuxfoundation.org, robh@kernel.org, krzk+dt@kernel.org,
	conor+dt@kernel.org, Thinh.Nguyen@synopsys.com, balbi@kernel.org
Cc: linux-usb@vger.kernel.org, devicetree@vger.kernel.org,
	linux-kernel@vger.kernel.org
Subject: [PATCH 1/2] usb: dwc3: core: add Gen2 polarity detection support
Date: Fri, 27 Sep 2024 15:25:56 +0800	[thread overview]
Message-ID: <20240927072557.74194-1-michael@allwinnertech.com> (raw)

According to the DWC31 Enhanced SuperSpeed USB3.1 Controller Programming
Guide, for Gen2 polarity detection, link uses data block (0011b) sync
header for SYNC OS instead of control block (1100b).

Added 'snps,inv-sync-hdr-quirk' a DT property to set this bit 30 of
LLUCTL if the third-party PHY doesn't correct the sync header of the
SYNC OS in the case of inverse polarity.

Signed-off-by: Michael Wu <michael@allwinnertech.com>
---
 drivers/usb/dwc3/core.c | 24 ++++++++++++++++--------
 drivers/usb/dwc3/core.h |  6 ++++++
 2 files changed, 22 insertions(+), 8 deletions(-)

diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c
index 734de2a8bd212..72fddfcbdd0c3 100644
--- a/drivers/usb/dwc3/core.c
+++ b/drivers/usb/dwc3/core.c
@@ -1434,15 +1434,20 @@ static int dwc3_core_init(struct dwc3 *dwc)
 
 	dwc3_config_threshold(dwc);
 
-	/*
-	 * Modify this for all supported Super Speed ports when
-	 * multiport support is added.
-	 */
-	if (hw_mode != DWC3_GHWPARAMS0_MODE_GADGET &&
-	    (DWC3_IP_IS(DWC31)) &&
-	    dwc->maximum_speed == USB_SPEED_SUPER) {
+	if (DWC3_IP_IS(DWC31)) {
 		reg = dwc3_readl(dwc->regs, DWC3_LLUCTL);
-		reg |= DWC3_LLUCTL_FORCE_GEN1;
+
+		/*
+		 * Modify this for all supported Super Speed ports when
+		 * multiport support is added.
+		 */
+		if (hw_mode != DWC3_GHWPARAMS0_MODE_GADGET &&
+		    dwc->maximum_speed == USB_SPEED_SUPER)
+			reg |= DWC3_LLUCTL_FORCE_GEN1;
+
+		if (dwc->inv_sync_hdr_quirk)
+			reg |= DWC3_LLUCTL_INV_SYNC_HDR;
+
 		dwc3_writel(dwc->regs, DWC3_LLUCTL, reg);
 	}
 
@@ -1774,6 +1779,9 @@ static void dwc3_get_properties(struct dwc3 *dwc)
 	dwc->dis_split_quirk = device_property_read_bool(dev,
 				"snps,dis-split-quirk");
 
+	dwc->inv_sync_hdr_quirk = device_property_read_bool(dev,
+				"snps,inv-sync-hdr-quirk");
+
 	dwc->lpm_nyet_threshold = lpm_nyet_threshold;
 	dwc->tx_de_emphasis = tx_de_emphasis;
 
diff --git a/drivers/usb/dwc3/core.h b/drivers/usb/dwc3/core.h
index 1e561fd8b86e2..5e5971e50bc09 100644
--- a/drivers/usb/dwc3/core.h
+++ b/drivers/usb/dwc3/core.h
@@ -673,6 +673,9 @@
 /* Force Gen1 speed on Gen2 link */
 #define DWC3_LLUCTL_FORCE_GEN1		BIT(10)
 
+/* Link uses data block sync header for Gen2 polarity detection */
+#define DWC3_LLUCTL_INV_SYNC_HDR	BIT(30)
+
 /* Structures */
 
 struct dwc3_trb;
@@ -1146,6 +1149,8 @@ struct dwc3_scratchpad_array {
  *	3	- Reserved
  * @dis_metastability_quirk: set to disable metastability quirk.
  * @dis_split_quirk: set to disable split boundary.
+ * @inv_sync_hdr_quirk: set if the third-party PHY does not correct the sync
+ *			header of the SYNC OS in case of inverse polarity.
  * @sys_wakeup: set if the device may do system wakeup.
  * @wakeup_configured: set if the device is configured for remote wakeup.
  * @suspended: set to track suspend event due to U3/L2.
@@ -1376,6 +1381,7 @@ struct dwc3 {
 	unsigned		dis_metastability_quirk:1;
 
 	unsigned		dis_split_quirk:1;
+	unsigned		inv_sync_hdr_quirk:1;
 	unsigned		async_callbacks:1;
 	unsigned		sys_wakeup:1;
 	unsigned		wakeup_configured:1;
-- 
2.29.0


             reply	other threads:[~2024-09-27  7:26 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-09-27  7:25 Michael Wu [this message]
2024-09-27  7:25 ` [PATCH 2/2] dt-bindings: usb: snps,dwc3: Add 'snps,inv-sync-hdr-quirk' quirk Michael Wu
2024-09-27  9:46   ` Krzysztof Kozlowski
2024-09-27  9:46 ` [PATCH 1/2] usb: dwc3: core: add Gen2 polarity detection support Krzysztof Kozlowski

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20240927072557.74194-1-michael@allwinnertech.com \
    --to=michael@allwinnertech.com \
    --cc=Thinh.Nguyen@synopsys.com \
    --cc=balbi@kernel.org \
    --cc=conor+dt@kernel.org \
    --cc=devicetree@vger.kernel.org \
    --cc=gregkh@linuxfoundation.org \
    --cc=krzk+dt@kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-usb@vger.kernel.org \
    --cc=robh@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox