generic: 6.1: sync mt7530 DSA driver with upstream
[openwrt/openwrt.git] / target / linux / generic / backport-6.1 / 790-32-v6.9-net-dsa-mt7530-simplify-mt7530_pad_clk_setup.patch
diff --git a/target/linux/generic/backport-6.1/790-32-v6.9-net-dsa-mt7530-simplify-mt7530_pad_clk_setup.patch b/target/linux/generic/backport-6.1/790-32-v6.9-net-dsa-mt7530-simplify-mt7530_pad_clk_setup.patch
new file mode 100644 (file)
index 0000000..90f8e09
--- /dev/null
@@ -0,0 +1,146 @@
+From 7199c736aa8cd9c69ae681a9c733408372c2ce76 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Ar=C4=B1n=C3=A7=20=C3=9CNAL?= <arinc.unal@arinc9.com>
+Date: Tue, 6 Feb 2024 01:08:04 +0300
+Subject: [PATCH 32/48] net: dsa: mt7530: simplify mt7530_pad_clk_setup()
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+This code is from before this driver was converted to phylink API. Phylink
+deals with the unsupported interface cases before mt7530_pad_clk_setup() is
+run. Therefore, the default case would never run. However, it must be
+defined nonetheless to handle all the remaining enumeration values, the
+phy-modes.
+
+Switch to if statement for RGMII and return which simplifies the code and
+saves an indent.
+
+Set P6_INTF_MODE, which is the three least significant bits of the
+MT7530_P6ECR register, to 0 for RGMII even though it will already be 0
+after reset. This is to keep supporting dynamic reconfiguration of the port
+in the case the interface changes from TRGMII to RGMII.
+
+Disable the TRGMII clocks for all cases. They will be enabled if TRGMII is
+being used.
+
+Read XTAL after checking for RGMII as it's only needed for the TRGMII
+interface mode.
+
+Reviewed-by: Daniel Golle <daniel@makrotopia.org>
+Reviewed-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
+Signed-off-by: Arınç ÜNAL <arinc.unal@arinc9.com>
+Reviewed-by: Vladimir Oltean <olteanv@gmail.com>
+Link: https://lore.kernel.org/r/20240206-for-netnext-mt7530-improvements-2-v5-3-d7d92a185cb1@arinc9.com
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+---
+ drivers/net/dsa/mt7530.c | 91 ++++++++++++++++++----------------------
+ 1 file changed, 40 insertions(+), 51 deletions(-)
+
+--- a/drivers/net/dsa/mt7530.c
++++ b/drivers/net/dsa/mt7530.c
+@@ -404,65 +404,54 @@ static int
+ mt7530_pad_clk_setup(struct dsa_switch *ds, phy_interface_t interface)
+ {
+       struct mt7530_priv *priv = ds->priv;
+-      u32 ncpo1, ssc_delta, trgint, xtal;
++      u32 ncpo1, ssc_delta, xtal;
+-      xtal = mt7530_read(priv, MT7530_MHWTRAP) & HWTRAP_XTAL_MASK;
++      /* Disable the MT7530 TRGMII clocks */
++      core_clear(priv, CORE_TRGMII_GSW_CLK_CG, REG_TRGMIICK_EN);
+-      switch (interface) {
+-      case PHY_INTERFACE_MODE_RGMII:
+-              trgint = 0;
+-              break;
+-      case PHY_INTERFACE_MODE_TRGMII:
+-              trgint = 1;
+-              if (xtal == HWTRAP_XTAL_25MHZ)
+-                      ssc_delta = 0x57;
+-              else
+-                      ssc_delta = 0x87;
+-              if (priv->id == ID_MT7621) {
+-                      /* PLL frequency: 125MHz: 1.0GBit */
+-                      if (xtal == HWTRAP_XTAL_40MHZ)
+-                              ncpo1 = 0x0640;
+-                      if (xtal == HWTRAP_XTAL_25MHZ)
+-                              ncpo1 = 0x0a00;
+-              } else { /* PLL frequency: 250MHz: 2.0Gbit */
+-                      if (xtal == HWTRAP_XTAL_40MHZ)
+-                              ncpo1 = 0x0c80;
+-                      if (xtal == HWTRAP_XTAL_25MHZ)
+-                              ncpo1 = 0x1400;
+-              }
+-              break;
+-      default:
+-              dev_err(priv->dev, "xMII interface %d not supported\n",
+-                      interface);
+-              return -EINVAL;
++      if (interface == PHY_INTERFACE_MODE_RGMII) {
++              mt7530_rmw(priv, MT7530_P6ECR, P6_INTF_MODE_MASK,
++                         P6_INTF_MODE(0));
++              return 0;
+       }
+-      mt7530_rmw(priv, MT7530_P6ECR, P6_INTF_MODE_MASK,
+-                 P6_INTF_MODE(trgint));
++      mt7530_rmw(priv, MT7530_P6ECR, P6_INTF_MODE_MASK, P6_INTF_MODE(1));
+-      if (trgint) {
+-              /* Disable the MT7530 TRGMII clocks */
+-              core_clear(priv, CORE_TRGMII_GSW_CLK_CG, REG_TRGMIICK_EN);
+-
+-              /* Setup the MT7530 TRGMII Tx Clock */
+-              core_write(priv, CORE_PLL_GROUP5, RG_LCDDS_PCW_NCPO1(ncpo1));
+-              core_write(priv, CORE_PLL_GROUP6, RG_LCDDS_PCW_NCPO0(0));
+-              core_write(priv, CORE_PLL_GROUP10, RG_LCDDS_SSC_DELTA(ssc_delta));
+-              core_write(priv, CORE_PLL_GROUP11, RG_LCDDS_SSC_DELTA1(ssc_delta));
+-              core_write(priv, CORE_PLL_GROUP4,
+-                         RG_SYSPLL_DDSFBK_EN | RG_SYSPLL_BIAS_EN |
+-                         RG_SYSPLL_BIAS_LPF_EN);
+-              core_write(priv, CORE_PLL_GROUP2,
+-                         RG_SYSPLL_EN_NORMAL | RG_SYSPLL_VODEN |
+-                         RG_SYSPLL_POSDIV(1));
+-              core_write(priv, CORE_PLL_GROUP7,
+-                         RG_LCDDS_PCW_NCPO_CHG | RG_LCCDS_C(3) |
+-                         RG_LCDDS_PWDB | RG_LCDDS_ISO_EN);
++      xtal = mt7530_read(priv, MT7530_MHWTRAP) & HWTRAP_XTAL_MASK;
+-              /* Enable the MT7530 TRGMII clocks */
+-              core_set(priv, CORE_TRGMII_GSW_CLK_CG, REG_TRGMIICK_EN);
++      if (xtal == HWTRAP_XTAL_25MHZ)
++              ssc_delta = 0x57;
++      else
++              ssc_delta = 0x87;
++
++      if (priv->id == ID_MT7621) {
++              /* PLL frequency: 125MHz: 1.0GBit */
++              if (xtal == HWTRAP_XTAL_40MHZ)
++                      ncpo1 = 0x0640;
++              if (xtal == HWTRAP_XTAL_25MHZ)
++                      ncpo1 = 0x0a00;
++      } else { /* PLL frequency: 250MHz: 2.0Gbit */
++              if (xtal == HWTRAP_XTAL_40MHZ)
++                      ncpo1 = 0x0c80;
++              if (xtal == HWTRAP_XTAL_25MHZ)
++                      ncpo1 = 0x1400;
+       }
++      /* Setup the MT7530 TRGMII Tx Clock */
++      core_write(priv, CORE_PLL_GROUP5, RG_LCDDS_PCW_NCPO1(ncpo1));
++      core_write(priv, CORE_PLL_GROUP6, RG_LCDDS_PCW_NCPO0(0));
++      core_write(priv, CORE_PLL_GROUP10, RG_LCDDS_SSC_DELTA(ssc_delta));
++      core_write(priv, CORE_PLL_GROUP11, RG_LCDDS_SSC_DELTA1(ssc_delta));
++      core_write(priv, CORE_PLL_GROUP4, RG_SYSPLL_DDSFBK_EN |
++                 RG_SYSPLL_BIAS_EN | RG_SYSPLL_BIAS_LPF_EN);
++      core_write(priv, CORE_PLL_GROUP2, RG_SYSPLL_EN_NORMAL |
++                 RG_SYSPLL_VODEN | RG_SYSPLL_POSDIV(1));
++      core_write(priv, CORE_PLL_GROUP7, RG_LCDDS_PCW_NCPO_CHG |
++                 RG_LCCDS_C(3) | RG_LCDDS_PWDB | RG_LCDDS_ISO_EN);
++
++      /* Enable the MT7530 TRGMII clocks */
++      core_set(priv, CORE_TRGMII_GSW_CLK_CG, REG_TRGMIICK_EN);
++
+       return 0;
+ }