mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-13 05:54:23 +08:00
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>
This commit is contained in:
parent
b6f56cddb5
commit
9ecc00164d
@ -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 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 */
|
||||
@ -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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user