Commit 9ecc0016 authored by Daniel Golle's avatar Daniel Golle Committed by David S. Miller
Browse files

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: default avatarDaniel Golle <daniel@makrotopia.org>
Reviewed-by: default avatarAndrew Lunn <andrew@lunn.ch>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent b6f56cdd
Loading
Loading
Loading
Loading
+50 −24
Original line number Diff line number Diff line
@@ -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,14 +2998,10 @@ 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;