<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">From 9ef2a9d208fba86dfbc06d4f2f743562bd14c145 Mon Sep 17 00:00:00 2001
From: Sam Shih &lt;sam.shih@mediatek.com&gt;
Date: Fri, 2 Jun 2023 13:06:26 +0800
Subject: [PATCH] 
 [high-speed-io][999-2620-xHCI-change-compliance-mode-de-emphasis-default-as-g.patch]

---
 drivers/usb/host/xhci-mtk.c | 18 +++++++++++++++++-
 drivers/usb/host/xhci-mtk.h |  1 +
 2 files changed, 18 insertions(+), 1 deletion(-)

diff --git a/drivers/usb/host/xhci-mtk.c b/drivers/usb/host/xhci-mtk.c
index 5c0eb35cd..77ddb8c05 100644
--- a/drivers/usb/host/xhci-mtk.c
+++ b/drivers/usb/host/xhci-mtk.c
@@ -22,6 +22,11 @@
 #include "xhci.h"
 #include "xhci-mtk.h"
 
+/* COMPLIANCE_CP5_CP7_TXDEEMPH_10G register */
+#define COMPLIANCE_CP5_CP7_TXDEEMPH_10G  0x2428
+#define CP5_CP7_TXDEEMPH_10G		 GENMASK(17, 0)
+#define CP5_CP7_TXDEEMPH_10G_VAL(val)	((val) &amp; 0x03FFFF)
+
 /* ip_pw_ctrl0 register */
 #define CTRL0_IP_SW_RST	BIT(0)
 
@@ -413,6 +418,7 @@ static int xhci_mtk_setup(struct usb_hcd *hcd)
 {
 	struct xhci_hcd_mtk *mtk = hcd_to_mtk(hcd);
 	int ret;
+	u32 val;
 
 	if (usb_hcd_is_primary_hcd(hcd)) {
 		ret = xhci_mtk_ssusb_config(mtk);
@@ -430,6 +436,15 @@ static int xhci_mtk_setup(struct usb_hcd *hcd)
 			return ret;
 	}
 
+	/* change COMPLIANCE_CP5_CP7_TXDEEMPH_10G  as Gen1 instead Gen2 */
+	if (mtk-&gt;p0_speed_fixup) {
+		val  = readl(mtk-&gt;hcd-&gt;regs + COMPLIANCE_CP5_CP7_TXDEEMPH_10G);
+		val &amp;= ~CP5_CP7_TXDEEMPH_10G;
+		val |= 0x00001;
+		val = CP5_CP7_TXDEEMPH_10G_VAL(val);
+		writel(val, mtk-&gt;hcd-&gt;regs + COMPLIANCE_CP5_CP7_TXDEEMPH_10G);
+	}
+
 	return ret;
 }
 
@@ -475,7 +490,8 @@ static int xhci_mtk_probe(struct platform_device *pdev)
 	/* optional property, ignore the error if it does not exist */
 	of_property_read_u32(node, "mediatek,u3p-dis-msk",
 			     &amp;mtk-&gt;u3p_dis_msk);
-
+	mtk-&gt;p0_speed_fixup = of_property_read_bool(node,
+						    "mediatek,p0_speed_fixup");
 	ret = usb_wakeup_of_property_parse(mtk, node);
 	if (ret) {
 		dev_err(dev, "failed to parse uwk property\n");
diff --git a/drivers/usb/host/xhci-mtk.h b/drivers/usb/host/xhci-mtk.h
index 2f702342d..8a884e7b4 100644
--- a/drivers/usb/host/xhci-mtk.h
+++ b/drivers/usb/host/xhci-mtk.h
@@ -156,6 +156,7 @@ struct xhci_hcd_mtk {
 	struct regmap *uwk;
 	u32 uwk_reg_base;
 	u32 uwk_vers;
+	bool p0_speed_fixup;
 };
 
 static inline struct xhci_hcd_mtk *hcd_to_mtk(struct usb_hcd *hcd)
-- 
2.34.1

</pre></body></html>