|
|
@@ -0,0 +1,72 @@
|
|
|
+From 930203b9bb94dc4ea9342f1ce176851918758ed7 Mon Sep 17 00:00:00 2001
|
|
|
+From: Mantas Pucka <[email protected]>
|
|
|
+Date: Mon, 2 Jun 2025 17:18:13 +0300
|
|
|
+Subject: [PATCH] net: pcs: ipq-uniphy: control MISC2 register for 2.5G
|
|
|
+ support
|
|
|
+
|
|
|
+When 2500base-x mode is enabled MISC2 regsister needs to have different
|
|
|
+value than for other 1G modes.
|
|
|
+
|
|
|
+Signed-off-by: Mantas Pucka <[email protected]>
|
|
|
+---
|
|
|
+ drivers/net/pcs/pcs-qcom-ipq9574.c | 17 ++++++++++++++++-
|
|
|
+ 1 file changed, 16 insertions(+), 1 deletion(-)
|
|
|
+
|
|
|
+--- a/drivers/net/pcs/pcs-qcom-ipq9574.c
|
|
|
++++ b/drivers/net/pcs/pcs-qcom-ipq9574.c
|
|
|
+@@ -24,6 +24,11 @@
|
|
|
+ #define PCS_CALIBRATION 0x1e0
|
|
|
+ #define PCS_CALIBRATION_DONE BIT(7)
|
|
|
+
|
|
|
++#define PCS_MISC2 0x218
|
|
|
++#define PCS_MISC2_MODE_MASK GENMASK(6, 5)
|
|
|
++#define PCS_MISC2_MODE_SGMII FIELD_PREP(PCS_MISC2_MODE_MASK, 0x1)
|
|
|
++#define PCS_MISC2_MODE_SGMII_PLUS FIELD_PREP(PCS_MISC2_MODE_MASK, 0x2)
|
|
|
++
|
|
|
+ #define PCS_MODE_CTRL 0x46c
|
|
|
+ #define PCS_MODE_SEL_MASK GENMASK(12, 8)
|
|
|
+ #define PCS_MODE_SGMII FIELD_PREP(PCS_MODE_SEL_MASK, 0x4)
|
|
|
+@@ -311,7 +316,7 @@ static int ipq_pcs_config_mode(struct ip
|
|
|
+ phy_interface_t interface)
|
|
|
+ {
|
|
|
+ unsigned long rate = 125000000;
|
|
|
+- unsigned int val, mask = PCS_MODE_SEL_MASK;
|
|
|
++ unsigned int val, misc2 = 0, mask = PCS_MODE_SEL_MASK;
|
|
|
+ int ret;
|
|
|
+
|
|
|
+ /* Assert XPCS reset */
|
|
|
+@@ -321,6 +326,7 @@ static int ipq_pcs_config_mode(struct ip
|
|
|
+ switch (interface) {
|
|
|
+ case PHY_INTERFACE_MODE_SGMII:
|
|
|
+ val = PCS_MODE_SGMII;
|
|
|
++ misc2 = PCS_MISC2_MODE_SGMII;
|
|
|
+ break;
|
|
|
+ case PHY_INTERFACE_MODE_QSGMII:
|
|
|
+ val = PCS_MODE_QSGMII;
|
|
|
+@@ -328,10 +334,12 @@ static int ipq_pcs_config_mode(struct ip
|
|
|
+ case PHY_INTERFACE_MODE_1000BASEX:
|
|
|
+ mask |= PCS_MODE_SGMII_CTRL_MASK;
|
|
|
+ val = PCS_MODE_SGMII | PCS_MODE_SGMII_CTRL_1000BASEX;
|
|
|
++ misc2 = PCS_MISC2_MODE_SGMII;
|
|
|
+ break;
|
|
|
+ case PHY_INTERFACE_MODE_2500BASEX:
|
|
|
+ val = PCS_MODE_SGMII_PLUS;
|
|
|
+ rate = 312500000;
|
|
|
++ misc2 = PCS_MISC2_MODE_SGMII_PLUS;
|
|
|
+ break;
|
|
|
+ case PHY_INTERFACE_MODE_PSGMII:
|
|
|
+ val = PCS_MODE_PSGMII;
|
|
|
+@@ -360,6 +368,13 @@ static int ipq_pcs_config_mode(struct ip
|
|
|
+ if (ret)
|
|
|
+ return ret;
|
|
|
+
|
|
|
++ if (misc2) {
|
|
|
++ ret = regmap_update_bits(qpcs->regmap, PCS_MISC2,
|
|
|
++ PCS_MISC2_MODE_MASK, misc2);
|
|
|
++ if (ret)
|
|
|
++ return ret;
|
|
|
++ }
|
|
|
++
|
|
|
+ /* PCS PLL reset */
|
|
|
+ ret = regmap_clear_bits(qpcs->regmap, PCS_PLL_RESET, PCS_ANA_SW_RESET);
|
|
|
+ if (ret)
|