net: dsa: mt7530: refactor SGMII PCS creation
authorDaniel Golle <daniel@makrotopia.org>
Mon, 3 Apr 2023 01:17:30 +0000 (02:17 +0100)
committerDavid S. Miller <davem@davemloft.net>
Mon, 3 Apr 2023 09:13:00 +0000 (10:13 +0100)
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

index 18d4aa6..5685c71 100644 (file)
@@ -2927,26 +2927,56 @@ static const struct regmap_bus mt7531_regmap_bus = {
        .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 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)),
-};
+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;
+       }
+
+       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 */
@@ -2968,15 +2998,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;
 }