diff options
author | Sascha Hauer <s.hauer@pengutronix.de> | 2024-01-23 08:42:56 +0100 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2024-01-23 08:42:56 +0100 |
commit | 90396afdda351e8d1aa2ab8bec66406491733649 (patch) | |
tree | ea9def58f3eb30c30cb1ce164e326a8d81cd704e /drivers/net | |
parent | e677644d0fba079cdc7de17e66eb29c12ad68128 (diff) | |
parent | a451d0b62830bf02c7a012ade3f9f4a84ff157b4 (diff) | |
download | barebox-90396afdda351e8d1aa2ab8bec66406491733649.tar.gz barebox-90396afdda351e8d1aa2ab8bec66406491733649.tar.xz |
Merge branch 'for-next/dsa'
Diffstat (limited to 'drivers/net')
-rw-r--r-- | drivers/net/fec_imx.c | 10 | ||||
-rw-r--r-- | drivers/net/phy/mdio_bus.c | 4 | ||||
-rw-r--r-- | drivers/net/realtek-dsa/realtek-mdio.c | 105 | ||||
-rw-r--r-- | drivers/net/realtek-dsa/realtek-smi.c | 2 | ||||
-rw-r--r-- | drivers/net/realtek-dsa/realtek.h | 3 | ||||
-rw-r--r-- | drivers/net/realtek-dsa/rtl8365mb.c | 24 | ||||
-rw-r--r-- | drivers/net/realtek-dsa/rtl8366rb.c | 23 |
7 files changed, 97 insertions, 74 deletions
diff --git a/drivers/net/fec_imx.c b/drivers/net/fec_imx.c index 203a2a8aa1..75a6596282 100644 --- a/drivers/net/fec_imx.c +++ b/drivers/net/fec_imx.c @@ -895,18 +895,18 @@ static int fec_probe(struct device *dev) fec->miibus.priv = fec; fec->miibus.parent = dev; - ret = mdiobus_register(&fec->miibus); + ret = eth_register(edev); if (ret) goto free_receive_packets; - ret = eth_register(edev); + ret = mdiobus_register(&fec->miibus); if (ret) - goto unregister_mdio; + goto unregister_eth; return 0; -unregister_mdio: - mdiobus_unregister(&fec->miibus); +unregister_eth: + eth_unregister(edev); free_receive_packets: fec_free_receive_packets(fec, FEC_RBD_NUM, FEC_MAX_PKT_SIZE); free_xbd: diff --git a/drivers/net/phy/mdio_bus.c b/drivers/net/phy/mdio_bus.c index 332db6c05b..94123ef614 100644 --- a/drivers/net/phy/mdio_bus.c +++ b/drivers/net/phy/mdio_bus.c @@ -119,6 +119,7 @@ static int of_mdiobus_register_phy(struct mii_bus *mdio, struct device_node *chi * Associate the OF node with the device structure so it * can be looked up later */ + child->dev = &phy->dev; phy->dev.of_node = child; /* @@ -145,6 +146,7 @@ static int of_mdiobus_register_device(struct mii_bus *mdio, if (IS_ERR(mdiodev)) return PTR_ERR(mdiodev); + child->dev = &mdiodev->dev; mdiodev->dev.of_node = child; ret = mdio_register_device(mdiodev); @@ -315,6 +317,8 @@ int mdiobus_register(struct mii_bus *bus) pr_info("%s: probed\n", dev_name(&bus->dev)); if (bus->dev.of_node) { + bus->dev.of_node->dev = &bus->dev; + /* Register PHY's as child node to mdio node */ of_mdiobus_register(bus, bus->dev.of_node); } diff --git a/drivers/net/realtek-dsa/realtek-mdio.c b/drivers/net/realtek-dsa/realtek-mdio.c index 4637577111..4fc2295b1b 100644 --- a/drivers/net/realtek-dsa/realtek-mdio.c +++ b/drivers/net/realtek-dsa/realtek-mdio.c @@ -47,22 +47,27 @@ static int realtek_mdio_write(void *ctx, u32 reg, u32 val) struct mii_bus *bus = priv->bus; int ret; - ret = bus->write(bus, priv->mdio_addr, REALTEK_MDIO_CTRL0_REG, REALTEK_MDIO_ADDR_OP); + ret = mdiobus_write(bus, priv->mdio_addr, REALTEK_MDIO_CTRL0_REG, + REALTEK_MDIO_ADDR_OP); if (ret) - goto out_unlock; + return ret; - ret = bus->write(bus, priv->mdio_addr, REALTEK_MDIO_ADDRESS_REG, reg); + ret = mdiobus_write(bus, priv->mdio_addr, REALTEK_MDIO_ADDRESS_REG, + reg); if (ret) - goto out_unlock; + return ret; - ret = bus->write(bus, priv->mdio_addr, REALTEK_MDIO_DATA_WRITE_REG, val); + ret = mdiobus_write(bus, priv->mdio_addr, REALTEK_MDIO_DATA_WRITE_REG, + val); if (ret) - goto out_unlock; + return ret; - ret = bus->write(bus, priv->mdio_addr, REALTEK_MDIO_CTRL1_REG, REALTEK_MDIO_WRITE_OP); + ret = mdiobus_write(bus, priv->mdio_addr, REALTEK_MDIO_CTRL1_REG, + REALTEK_MDIO_WRITE_OP); + if (ret) + return ret; -out_unlock: - return ret; + return 0; } static int realtek_mdio_read(void *ctx, u32 reg, u32 *val) @@ -71,26 +76,43 @@ static int realtek_mdio_read(void *ctx, u32 reg, u32 *val) struct mii_bus *bus = priv->bus; int ret; - ret = bus->write(bus, priv->mdio_addr, REALTEK_MDIO_CTRL0_REG, REALTEK_MDIO_ADDR_OP); + ret = mdiobus_write(bus, priv->mdio_addr, REALTEK_MDIO_CTRL0_REG, + REALTEK_MDIO_ADDR_OP); if (ret) - goto out_unlock; + return ret; - ret = bus->write(bus, priv->mdio_addr, REALTEK_MDIO_ADDRESS_REG, reg); + ret = mdiobus_write(bus, priv->mdio_addr, REALTEK_MDIO_ADDRESS_REG, + reg); if (ret) - goto out_unlock; + return ret; - ret = bus->write(bus, priv->mdio_addr, REALTEK_MDIO_CTRL1_REG, REALTEK_MDIO_READ_OP); + ret = mdiobus_write(bus, priv->mdio_addr, REALTEK_MDIO_CTRL1_REG, + REALTEK_MDIO_READ_OP); if (ret) - goto out_unlock; + return ret; - ret = bus->read(bus, priv->mdio_addr, REALTEK_MDIO_DATA_READ_REG); - if (ret >= 0) { - *val = ret; - ret = 0; - } + ret = mdiobus_read(bus, priv->mdio_addr, REALTEK_MDIO_DATA_READ_REG); + if (ret < 0) + return ret; -out_unlock: - return ret; + *val = ret; + + return 0; +} + +static int realtek_mdio_mdio_write(struct mii_bus *bus, int addr, int regnum, + u16 val) +{ + struct realtek_priv *priv = bus->priv; + + return priv->ops->phy_write(priv, addr, regnum, val); +} + +static int realtek_mdio_mdio_read(struct mii_bus *bus, int addr, int regnum) +{ + struct realtek_priv *priv = bus->priv; + + return priv->ops->phy_read(priv, addr, regnum); } static const struct regmap_config realtek_mdio_regmap_config = { @@ -107,6 +129,42 @@ static const struct regmap_bus realtek_mdio_regmap_bus = { .reg_read = realtek_mdio_read, }; +static int realtek_mdio_setup_mdio(struct dsa_switch *ds) +{ + struct realtek_priv *priv = ds->priv; + struct device_node *np; + int ret; + + np = of_get_child_by_name(priv->dev->of_node, "mdio"); + if (!np) { + dev_err(priv->dev, "missing 'mdio' child node\n"); + return -ENODEV; + } + + priv->slave_mii_bus->priv = priv; + priv->slave_mii_bus->read = realtek_mdio_mdio_read; + priv->slave_mii_bus->write = realtek_mdio_mdio_write; + priv->slave_mii_bus->dev.of_node = np; + priv->slave_mii_bus->parent = priv->dev; + + ret = mdiobus_register(priv->slave_mii_bus); + if (ret) { + dev_err(priv->dev, "unable to register MDIO bus %pOF\n", np); + goto err_put_node; + } + + /* Avoid interleaved MDIO access during PHY status polling */ + slice_depends_on(mdiobus_slice(priv->slave_mii_bus), + mdiobus_slice(priv->bus)); + + return 0; + +err_put_node: + of_node_put(np); + + return ret; +} + static int realtek_mdio_probe(struct phy_device *mdiodev) { struct realtek_priv *priv; @@ -142,6 +200,7 @@ static int realtek_mdio_probe(struct phy_device *mdiodev) priv->cmd_write = var->cmd_write; priv->ops = var->ops; + priv->setup_interface = realtek_mdio_setup_mdio; priv->write_reg_noack = realtek_mdio_write; np = dev->of_node; @@ -177,7 +236,7 @@ static int realtek_mdio_probe(struct phy_device *mdiodev) priv->ds->dev = dev; priv->ds->num_ports = priv->num_ports; priv->ds->priv = priv; - priv->ds->ops = var->ds_ops_mdio; + priv->ds->ops = var->ds_ops; ret = realtek_dsa_init_tagger(priv); if (ret) diff --git a/drivers/net/realtek-dsa/realtek-smi.c b/drivers/net/realtek-dsa/realtek-smi.c index f93024ace5..da150dbc5d 100644 --- a/drivers/net/realtek-dsa/realtek-smi.c +++ b/drivers/net/realtek-dsa/realtek-smi.c @@ -450,7 +450,7 @@ static int realtek_smi_probe(struct device *dev) priv->ds->dev = dev; priv->ds->num_ports = priv->num_ports; priv->ds->priv = priv; - priv->ds->ops = var->ds_ops_smi; + priv->ds->ops = var->ds_ops; ret = realtek_dsa_init_tagger(priv); if (ret) diff --git a/drivers/net/realtek-dsa/realtek.h b/drivers/net/realtek-dsa/realtek.h index ac84b18cdd..dbca949462 100644 --- a/drivers/net/realtek-dsa/realtek.h +++ b/drivers/net/realtek-dsa/realtek.h @@ -69,8 +69,7 @@ struct realtek_ops { }; struct realtek_variant { - const struct dsa_switch_ops *ds_ops_smi; - const struct dsa_switch_ops *ds_ops_mdio; + const struct dsa_switch_ops *ds_ops; const struct realtek_ops *ops; unsigned int clk_delay; u8 cmd_read; diff --git a/drivers/net/realtek-dsa/rtl8365mb.c b/drivers/net/realtek-dsa/rtl8365mb.c index 700773ffa6..5889982358 100644 --- a/drivers/net/realtek-dsa/rtl8365mb.c +++ b/drivers/net/realtek-dsa/rtl8365mb.c @@ -649,17 +649,6 @@ static int rtl8365mb_phy_write(struct realtek_priv *priv, int phy, int regnum, return 0; } -static int rtl8365mb_dsa_phy_read(struct dsa_switch *ds, int phy, int regnum) -{ - return rtl8365mb_phy_read(ds->priv, phy, regnum); -} - -static int rtl8365mb_dsa_phy_write(struct dsa_switch *ds, int phy, int regnum, - u16 val) -{ - return rtl8365mb_phy_write(ds->priv, phy, regnum, val); -} - static const struct rtl8365mb_extint * rtl8365mb_get_port_extint(struct realtek_priv *priv, int port) { @@ -1236,18 +1225,10 @@ static int rtl8365mb_detect(struct realtek_priv *priv) return 0; } -static const struct dsa_switch_ops rtl8365mb_switch_ops_smi = { - .port_pre_enable = rtl8365mb_phylink_mac_config, - .port_disable = rtl8365mb_phylink_mac_link_down, - .port_enable = rtl8365mb_phylink_mac_link_up, -}; - -static const struct dsa_switch_ops rtl8365mb_switch_ops_mdio = { +static const struct dsa_switch_ops rtl8365mb_switch_ops = { .port_pre_enable = rtl8365mb_phylink_mac_config, .port_disable = rtl8365mb_phylink_mac_link_down, .port_enable = rtl8365mb_phylink_mac_link_up, - .phy_read = rtl8365mb_dsa_phy_read, - .phy_write = rtl8365mb_dsa_phy_write, }; static const struct realtek_ops rtl8365mb_ops = { @@ -1260,8 +1241,7 @@ static const struct realtek_ops rtl8365mb_ops = { }; const struct realtek_variant rtl8365mb_variant = { - .ds_ops_smi = &rtl8365mb_switch_ops_smi, - .ds_ops_mdio = &rtl8365mb_switch_ops_mdio, + .ds_ops = &rtl8365mb_switch_ops, .ops = &rtl8365mb_ops, .clk_delay = 10, .cmd_read = 0xb9, diff --git a/drivers/net/realtek-dsa/rtl8366rb.c b/drivers/net/realtek-dsa/rtl8366rb.c index 26f036dfe5..35028d319e 100644 --- a/drivers/net/realtek-dsa/rtl8366rb.c +++ b/drivers/net/realtek-dsa/rtl8366rb.c @@ -1021,17 +1021,6 @@ out: return ret; } -static int rtl8366rb_dsa_phy_read(struct dsa_switch *ds, int phy, int regnum) -{ - return rtl8366rb_phy_read(ds->priv, phy, regnum); -} - -static int rtl8366rb_dsa_phy_write(struct dsa_switch *ds, int phy, int regnum, - u16 val) -{ - return rtl8366rb_phy_write(ds->priv, phy, regnum, val); -} - static int rtl8366rb_reset_chip(struct realtek_priv *priv) { int timeout = 10; @@ -1090,14 +1079,7 @@ static int rtl8366rb_detect(struct realtek_priv *priv) return rtl8366rb_reset_chip(priv); } -static const struct dsa_switch_ops rtl8366rb_switch_ops_smi = { - .port_enable = rtl8366rb_port_enable, - .port_disable = rtl8366rb_port_disable, -}; - -static const struct dsa_switch_ops rtl8366rb_switch_ops_mdio = { - .phy_read = rtl8366rb_dsa_phy_read, - .phy_write = rtl8366rb_dsa_phy_write, +static const struct dsa_switch_ops rtl8366rb_switch_ops = { .port_enable = rtl8366rb_port_enable, .port_disable = rtl8366rb_port_disable, }; @@ -1111,8 +1093,7 @@ static const struct realtek_ops rtl8366rb_ops = { }; const struct realtek_variant rtl8366rb_variant = { - .ds_ops_smi = &rtl8366rb_switch_ops_smi, - .ds_ops_mdio = &rtl8366rb_switch_ops_mdio, + .ds_ops = &rtl8366rb_switch_ops, .ops = &rtl8366rb_ops, .clk_delay = 10, .cmd_read = 0xa9, |