123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111 |
- From 8f83ad87e2df26ddf9b8afd4d2873644a872d929 Mon Sep 17 00:00:00 2001
- From: Daniel Golle <[email protected]>
- 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 <[email protected]>
- Reviewed-by: Andrew Lunn <[email protected]>
- Signed-off-by: David S. Miller <[email protected]>
- ---
- 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;
- }
|