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

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
......@@ -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;
}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment