generic: 6.1: sync mt7530 DSA driver with upstream
[openwrt/openwrt.git] / target / linux / generic / backport-6.1 / 790-04-v6.4-net-dsa-mt7530-refactor-SGMII-PCS-creation.patch
diff --git a/target/linux/generic/backport-6.1/790-04-v6.4-net-dsa-mt7530-refactor-SGMII-PCS-creation.patch b/target/linux/generic/backport-6.1/790-04-v6.4-net-dsa-mt7530-refactor-SGMII-PCS-creation.patch
new file mode 100644 (file)
index 0000000..ed24c45
--- /dev/null
@@ -0,0 +1,111 @@
+From 8f83ad87e2df26ddf9b8afd4d2873644a872d929 Mon Sep 17 00:00:00 2001
+From: Daniel Golle <daniel@makrotopia.org>
+Date: Mon, 3 Apr 2023 02:17:30 +0100
+Subject: [PATCH 04/48] net: dsa: mt7530: refactor SGMII PCS creation
+
+Instead of macro templates use a dedidated function and allocated
+regmap_config when creating the regmaps for the pcs-mtk-lynxi
+instances.
+This is in preparation to switching to use unlocked regmap accessors
+and have regmap's locking API handle locking for us.
+
+Signed-off-by: Daniel Golle <daniel@makrotopia.org>
+Reviewed-by: Andrew Lunn <andrew@lunn.ch>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+---
+ drivers/net/dsa/mt7530.c | 74 +++++++++++++++++++++++++++-------------
+ 1 file changed, 50 insertions(+), 24 deletions(-)
+
+--- a/drivers/net/dsa/mt7530.c
++++ b/drivers/net/dsa/mt7530.c
+@@ -3001,26 +3001,56 @@ static const struct regmap_bus mt7531_re
+       .reg_update_bits = mt7530_regmap_update_bits,
+ };
+-#define MT7531_PCS_REGMAP_CONFIG(_name, _reg_base) \
+-      {                               \
+-              .name = _name,          \
+-              .reg_bits = 16,         \
+-              .val_bits = 32,         \
+-              .reg_stride = 4,        \
+-              .reg_base = _reg_base,  \
+-              .max_register = 0x17c,  \
++static int
++mt7531_create_sgmii(struct mt7530_priv *priv)
++{
++      struct regmap_config *mt7531_pcs_config[2];
++      struct phylink_pcs *pcs;
++      struct regmap *regmap;
++      int i, ret = 0;
++
++      for (i = 0; i < 2; i++) {
++              mt7531_pcs_config[i] = devm_kzalloc(priv->dev,
++                                                  sizeof(struct regmap_config),
++                                                  GFP_KERNEL);
++              if (!mt7531_pcs_config[i]) {
++                      ret = -ENOMEM;
++                      break;
++              }
++
++              mt7531_pcs_config[i]->name = i ? "port6" : "port5";
++              mt7531_pcs_config[i]->reg_bits = 16;
++              mt7531_pcs_config[i]->val_bits = 32;
++              mt7531_pcs_config[i]->reg_stride = 4;
++              mt7531_pcs_config[i]->reg_base = MT7531_SGMII_REG_BASE(5 + i);
++              mt7531_pcs_config[i]->max_register = 0x17c;
++
++              regmap = devm_regmap_init(priv->dev,
++                                        &mt7531_regmap_bus, priv,
++                                        mt7531_pcs_config[i]);
++              if (IS_ERR(regmap)) {
++                      ret = PTR_ERR(regmap);
++                      break;
++              }
++              pcs = mtk_pcs_lynxi_create(priv->dev, regmap,
++                                         MT7531_PHYA_CTRL_SIGNAL3, 0);
++              if (!pcs) {
++                      ret = -ENXIO;
++                      break;
++              }
++              priv->ports[5 + i].sgmii_pcs = pcs;
+       }
+-static const struct regmap_config mt7531_pcs_config[] = {
+-      MT7531_PCS_REGMAP_CONFIG("port5", MT7531_SGMII_REG_BASE(5)),
+-      MT7531_PCS_REGMAP_CONFIG("port6", MT7531_SGMII_REG_BASE(6)),
+-};
++      if (ret && i)
++              mtk_pcs_lynxi_destroy(priv->ports[5].sgmii_pcs);
++
++      return ret;
++}
+ static int
+ mt753x_setup(struct dsa_switch *ds)
+ {
+       struct mt7530_priv *priv = ds->priv;
+-      struct regmap *regmap;
+       int i, ret;
+       /* Initialise the PCS devices */
+@@ -3042,15 +3072,11 @@ mt753x_setup(struct dsa_switch *ds)
+       if (ret && priv->irq)
+               mt7530_free_irq_common(priv);
+-      if (priv->id == ID_MT7531)
+-              for (i = 0; i < 2; i++) {
+-                      regmap = devm_regmap_init(ds->dev,
+-                                                &mt7531_regmap_bus, priv,
+-                                                &mt7531_pcs_config[i]);
+-                      priv->ports[5 + i].sgmii_pcs =
+-                              mtk_pcs_lynxi_create(ds->dev, regmap,
+-                                                   MT7531_PHYA_CTRL_SIGNAL3, 0);
+-              }
++      if (priv->id == ID_MT7531) {
++              ret = mt7531_create_sgmii(priv);
++              if (ret && priv->irq)
++                      mt7530_free_irq_common(priv);
++      }
+       return ret;
+ }