Don't unpack the mdiodev into its bus and address value. Rather keep it is a core data structure for addressing. This does however mean when the driver is instantiated the old way, we have to create a dummy mdiodev structure.
Signed-off-by: Andrew Lunn <and...@lunn.ch> --- drivers/net/dsa/mv88e6060.c | 27 ++++++++++-------- drivers/net/dsa/mv88e6060.h | 3 +- drivers/net/dsa/mv88e6123.c | 7 +++-- drivers/net/dsa/mv88e6131.c | 7 +++-- drivers/net/dsa/mv88e6171.c | 7 +++-- drivers/net/dsa/mv88e6352.c | 7 +++-- drivers/net/dsa/mv88e6xxx.c | 68 +++++++++++++++++++++++---------------------- drivers/net/dsa/mv88e6xxx.h | 9 ++---- 8 files changed, 74 insertions(+), 61 deletions(-) diff --git a/drivers/net/dsa/mv88e6060.c b/drivers/net/dsa/mv88e6060.c index 723273c8ff32..27834cac422f 100644 --- a/drivers/net/dsa/mv88e6060.c +++ b/drivers/net/dsa/mv88e6060.c @@ -24,7 +24,8 @@ static int reg_read(struct dsa_switch *ds, int addr, int reg) { struct mv88e6060_priv *priv = ds_to_priv(ds); - return mdiobus_read_nested(priv->bus, priv->sw_addr + addr, reg); + return mdiobus_read_nested(priv->mdiodev->bus, + priv->mdiodev->addr + addr, reg); } #define REG_READ(addr, reg) \ @@ -42,7 +43,8 @@ static int reg_write(struct dsa_switch *ds, int addr, int reg, u16 val) { struct mv88e6060_priv *priv = ds_to_priv(ds); - return mdiobus_write_nested(priv->bus, priv->sw_addr + addr, reg, val); + return mdiobus_write_nested(priv->mdiodev->bus, + priv->mdiodev->addr + addr, reg, val); } #define REG_WRITE(addr, reg, val) \ @@ -179,6 +181,7 @@ static int mv88e6060_setup(struct dsa_switch *ds, struct device *dev) { int i; int ret; + struct mdio_device *mdiodev; struct mv88e6060_priv *priv = ds_to_priv(ds); if (!priv) { @@ -187,13 +190,18 @@ static int mv88e6060_setup(struct dsa_switch *ds, struct device *dev) if (!priv) return -ENOMEM; + mdiodev = devm_kzalloc(dev, sizeof(*mdiodev), GFP_KERNEL); + if (!mdiodev) + return -ENOMEM; + ds->priv = priv; - priv->bus = dsa_host_dev_to_mii_bus(ds->master_dev); - if (!priv->bus) + mdiodev->bus = dsa_host_dev_to_mii_bus(ds->master_dev); + if (!mdiodev->bus) return -ENODEV; - priv->sw_addr = ds->pd->sw_addr; + mdiodev->addr = ds->pd->sw_addr; + priv->mdiodev = mdiodev; } ret = mv88e6060_switch_reset(ds); @@ -280,14 +288,11 @@ static int mv88e6060_bind(struct device *dev, priv = (struct mv88e6060_priv *)(ds + 1); ds->priv = priv; - priv->bus = mdiodev->bus; - priv->sw_addr = mdiodev->addr; - - get_device(&priv->bus->dev); + priv->mdiodev = mdiodev; ds->drv = &mv88e6060_switch_driver; - name = mv88e6060_name(priv->bus, priv->sw_addr); + name = mv88e6060_name(priv->mdiodev->bus, priv->mdiodev->addr); if (!name) { dev_err(dev, "Failed to find switch"); return -ENODEV; @@ -303,10 +308,8 @@ static void mv88e6060_unbind(struct device *dev, struct device *master, void *data) { struct dsa_switch *ds = dev_get_drvdata(dev); - struct mv88e6060_priv *priv = ds_to_priv(ds); dsa_switch_unregister(ds); - put_device(&priv->bus->dev); } static const struct component_ops mv88e6060_component_ops = { diff --git a/drivers/net/dsa/mv88e6060.h b/drivers/net/dsa/mv88e6060.h index 10249bd16292..bf0b8d5bde11 100644 --- a/drivers/net/dsa/mv88e6060.h +++ b/drivers/net/dsa/mv88e6060.h @@ -115,8 +115,7 @@ struct mv88e6060_priv { * single address which contains two registers used for * indirect access to more registers. */ - struct mii_bus *bus; - int sw_addr; + struct mdio_device *mdiodev; }; #endif diff --git a/drivers/net/dsa/mv88e6123.c b/drivers/net/dsa/mv88e6123.c index 4c488f9f2a34..76e88e037311 100644 --- a/drivers/net/dsa/mv88e6123.c +++ b/drivers/net/dsa/mv88e6123.c @@ -34,9 +34,12 @@ static const struct mv88e6xxx_switch_id mv88e6123_table[] = { static char *mv88e6123_drv_probe(struct device *host_dev, int sw_addr) { - struct mii_bus *bus = dsa_host_dev_to_mii_bus(host_dev); + struct mdio_device mdiodev; - return mv88e6xxx_lookup_name(bus, sw_addr, mv88e6123_table, + mdiodev.bus = dsa_host_dev_to_mii_bus(host_dev); + mdiodev.addr = sw_addr; + + return mv88e6xxx_lookup_name(&mdiodev, mv88e6123_table, ARRAY_SIZE(mv88e6123_table)); } diff --git a/drivers/net/dsa/mv88e6131.c b/drivers/net/dsa/mv88e6131.c index e5a4e2b11322..6696ce638bbc 100644 --- a/drivers/net/dsa/mv88e6131.c +++ b/drivers/net/dsa/mv88e6131.c @@ -30,9 +30,12 @@ static const struct mv88e6xxx_switch_id mv88e6131_table[] = { static char *mv88e6131_drv_probe(struct device *host_dev, int sw_addr) { - struct mii_bus *bus = dsa_host_dev_to_mii_bus(host_dev); + struct mdio_device mdiodev; - return mv88e6xxx_lookup_name(bus, sw_addr, mv88e6131_table, + mdiodev.bus = dsa_host_dev_to_mii_bus(host_dev); + mdiodev.addr = sw_addr; + + return mv88e6xxx_lookup_name(&mdiodev, mv88e6131_table, ARRAY_SIZE(mv88e6131_table)); } diff --git a/drivers/net/dsa/mv88e6171.c b/drivers/net/dsa/mv88e6171.c index 249c2c075a2d..de0ba67e34b8 100644 --- a/drivers/net/dsa/mv88e6171.c +++ b/drivers/net/dsa/mv88e6171.c @@ -29,9 +29,12 @@ static const struct mv88e6xxx_switch_id mv88e6171_table[] = { static char *mv88e6171_drv_probe(struct device *host_dev, int sw_addr) { - struct mii_bus *bus = dsa_host_dev_to_mii_bus(host_dev); + struct mdio_device mdiodev; - return mv88e6xxx_lookup_name(bus, sw_addr, mv88e6171_table, + mdiodev.bus = dsa_host_dev_to_mii_bus(host_dev); + mdiodev.addr = sw_addr; + + return mv88e6xxx_lookup_name(&mdiodev, mv88e6171_table, ARRAY_SIZE(mv88e6171_table)); } diff --git a/drivers/net/dsa/mv88e6352.c b/drivers/net/dsa/mv88e6352.c index 0d245f76e557..796558614964 100644 --- a/drivers/net/dsa/mv88e6352.c +++ b/drivers/net/dsa/mv88e6352.c @@ -40,9 +40,12 @@ static const struct mv88e6xxx_switch_id mv88e6352_table[] = { static char *mv88e6352_drv_probe(struct device *host_dev, int sw_addr) { - struct mii_bus *bus = dsa_host_dev_to_mii_bus(host_dev); + struct mdio_device mdiodev; - return mv88e6xxx_lookup_name(bus, sw_addr, mv88e6352_table, + mdiodev.bus = dsa_host_dev_to_mii_bus(host_dev); + mdiodev.addr = sw_addr; + + return mv88e6xxx_lookup_name(&mdiodev, mv88e6352_table, ARRAY_SIZE(mv88e6352_table)); } diff --git a/drivers/net/dsa/mv88e6xxx.c b/drivers/net/dsa/mv88e6xxx.c index 3dca92b8d592..4f1da145b814 100644 --- a/drivers/net/dsa/mv88e6xxx.c +++ b/drivers/net/dsa/mv88e6xxx.c @@ -46,13 +46,13 @@ static void assert_smi_lock(struct dsa_switch *ds) * an indirect addressing mechanism needs to be used to access its * registers. */ -static int mv88e6xxx_reg_wait_ready(struct mii_bus *bus, int sw_addr) +static int mv88e6xxx_reg_wait_ready(struct mdio_device *mdiodev) { int ret; int i; for (i = 0; i < 16; i++) { - ret = mdiobus_read_nested(bus, sw_addr, SMI_CMD); + ret = mdiodev_read_nested(mdiodev, SMI_CMD); if (ret < 0) return ret; @@ -63,32 +63,31 @@ static int mv88e6xxx_reg_wait_ready(struct mii_bus *bus, int sw_addr) return -ETIMEDOUT; } -static int __mv88e6xxx_reg_read(struct mii_bus *bus, int sw_addr, int addr, - int reg) +static int __mv88e6xxx_reg_read(struct mdio_device *mdiodev, int addr, int reg) { int ret; - if (sw_addr == 0) - return mdiobus_read_nested(bus, addr, reg); + if (mdiodev->addr == 0) + return mdiobus_read_nested(mdiodev->bus, addr, reg); /* Wait for the bus to become free. */ - ret = mv88e6xxx_reg_wait_ready(bus, sw_addr); + ret = mv88e6xxx_reg_wait_ready(mdiodev); if (ret < 0) return ret; /* Transmit the read command. */ - ret = mdiobus_write_nested(bus, sw_addr, SMI_CMD, + ret = mdiodev_write_nested(mdiodev, SMI_CMD, SMI_CMD_OP_22_READ | (addr << 5) | reg); if (ret < 0) return ret; /* Wait for the read command to complete. */ - ret = mv88e6xxx_reg_wait_ready(bus, sw_addr); + ret = mv88e6xxx_reg_wait_ready(mdiodev); if (ret < 0) return ret; /* Read the data. */ - ret = mdiobus_read_nested(bus, sw_addr, SMI_DATA); + ret = mdiodev_read_nested(mdiodev, SMI_DATA); if (ret < 0) return ret; @@ -102,7 +101,7 @@ static int _mv88e6xxx_reg_read(struct dsa_switch *ds, int addr, int reg) assert_smi_lock(ds); - ret = __mv88e6xxx_reg_read(ps->bus, ps->sw_addr, addr, reg); + ret = __mv88e6xxx_reg_read(ps->mdiodev, addr, reg); if (ret < 0) return ret; @@ -125,32 +124,32 @@ int mv88e6xxx_reg_read(struct dsa_switch *ds, int addr, int reg) } EXPORT_SYMBOL_GPL(mv88e6xxx_reg_read); -static int __mv88e6xxx_reg_write(struct mii_bus *bus, int sw_addr, int addr, +static int __mv88e6xxx_reg_write(struct mdio_device *mdiodev, int addr, int reg, u16 val) { int ret; - if (sw_addr == 0) - return mdiobus_write_nested(bus, addr, reg, val); + if (mdiodev->addr == 0) + return mdiobus_write_nested(mdiodev->bus, addr, reg, val); /* Wait for the bus to become free. */ - ret = mv88e6xxx_reg_wait_ready(bus, sw_addr); + ret = mv88e6xxx_reg_wait_ready(mdiodev); if (ret < 0) return ret; /* Transmit the data to write. */ - ret = mdiobus_write_nested(bus, sw_addr, SMI_DATA, val); + ret = mdiodev_write_nested(mdiodev, SMI_DATA, val); if (ret < 0) return ret; /* Transmit the write command. */ - ret = mdiobus_write_nested(bus, sw_addr, SMI_CMD, + ret = mdiodev_write_nested(mdiodev, SMI_CMD, SMI_CMD_OP_22_WRITE | (addr << 5) | reg); if (ret < 0) return ret; /* Wait for the write command to complete. */ - ret = mv88e6xxx_reg_wait_ready(bus, sw_addr); + ret = mv88e6xxx_reg_wait_ready(mdiodev); if (ret < 0) return ret; @@ -167,7 +166,7 @@ static int _mv88e6xxx_reg_write(struct dsa_switch *ds, int addr, int reg, dev_dbg(ds->master_dev, "-> addr: 0x%.2x reg: 0x%.2x val: 0x%.4x\n", addr, reg, val); - return __mv88e6xxx_reg_write(ps->bus, ps->sw_addr, addr, reg, val); + return __mv88e6xxx_reg_write(ps->mdiodev, addr, reg, val); } int mv88e6xxx_reg_write(struct dsa_switch *ds, int addr, int reg, u16 val) @@ -2230,20 +2229,26 @@ EXPORT_SYMBOL_GPL(mv88e6xxx_setup_ports); int mv88e6xxx_setup_common(struct dsa_switch *ds, struct device *dev) { struct mv88e6xxx_priv_state *ps = ds_to_priv(ds); + struct mdio_device *mdiodev; if (!ps) { + /* Old method when dsa create the switch */ ps = devm_kzalloc(dev, sizeof(*ps), GFP_KERNEL); if (!ps) return -ENOMEM; + mdiodev = devm_kzalloc(dev, sizeof(*mdiodev), GFP_KERNEL); + if (!mdiodev) + return -ENOMEM; + ds->priv = ps; ps->ds = ds; - - ps->bus = dsa_host_dev_to_mii_bus(ds->master_dev); - if (!ps->bus) + mdiodev->bus = dsa_host_dev_to_mii_bus(ds->master_dev); + if (!mdiodev->bus) return -ENODEV; - ps->sw_addr = ds->pd->sw_addr; + mdiodev->addr = ds->pd->sw_addr; + ps->mdiodev = mdiodev; } mutex_init(&ps->smi_mutex); @@ -2671,16 +2676,16 @@ int mv88e6xxx_get_temp_alarm(struct dsa_switch *ds, bool *alarm) EXPORT_SYMBOL_GPL(mv88e6xxx_get_temp_alarm); #endif /* CONFIG_NET_DSA_HWMON */ -char *mv88e6xxx_lookup_name(struct mii_bus *bus, int sw_addr, +char *mv88e6xxx_lookup_name(struct mdio_device *mdiodev, const struct mv88e6xxx_switch_id *table, unsigned int num) { int i, ret; - if (!bus) + if (!mdiodev->bus) return NULL; - ret = __mv88e6xxx_reg_read(bus, sw_addr, REG_PORT(0), PORT_SWITCH_ID); + ret = __mv88e6xxx_reg_read(mdiodev, REG_PORT(0), PORT_SWITCH_ID); if (ret < 0) return NULL; @@ -2692,7 +2697,7 @@ char *mv88e6xxx_lookup_name(struct mii_bus *bus, int sw_addr, /* Look up only the product number */ for (i = 0; i < num; ++i) { if (table[i].id == (ret & PORT_SWITCH_ID_PROD_NUM_MASK)) { - dev_warn(&bus->dev, + dev_warn(&mdiodev->bus->dev, "unknown revision %d, using base switch 0x%x\n", ret & PORT_SWITCH_ID_REV_MASK, ret & PORT_SWITCH_ID_PROD_NUM_MASK); @@ -2723,14 +2728,11 @@ int mv88e6xxx_bind(struct device *dev, ps = (struct mv88e6xxx_priv_state *)(ds + 1); ds->priv = ps; ps->ds = ds; - ps->bus = mdiodev->bus; - ps->sw_addr = mdiodev->addr; - - get_device(&ps->bus->dev); + ps->mdiodev = mdiodev; ds->drv = ops; - name = mv88e6xxx_lookup_name(ps->bus, ps->sw_addr, table, table_size); + name = mv88e6xxx_lookup_name(mdiodev, table, table_size); if (!name) { dev_err(dev, "Failed to find switch"); return -ENODEV; @@ -2751,7 +2753,7 @@ void mv88e6xxx_unbind(struct device *dev, struct device *master, void *data) dsa_switch_unregister(ds); devm_kfree(dev, ds); - put_device(&ps->bus->dev); + put_device(&ps->mdiodev->bus->dev); } EXPORT_SYMBOL_GPL(mv88e6xxx_unbind); diff --git a/drivers/net/dsa/mv88e6xxx.h b/drivers/net/dsa/mv88e6xxx.h index ce05964da85f..27e7faf619e9 100644 --- a/drivers/net/dsa/mv88e6xxx.h +++ b/drivers/net/dsa/mv88e6xxx.h @@ -389,11 +389,8 @@ struct mv88e6xxx_priv_state { */ struct mutex smi_mutex; - /* The MII bus and the address on the bus that is used to - * communication with the switch - */ - struct mii_bus *bus; - int sw_addr; + /* Which mdio device is this switch? */ + struct mdio_device *mdiodev; #ifdef CONFIG_NET_DSA_MV88E6XXX_NEED_PPU /* Handles automatic disabling and re-enabling of the PHY @@ -444,7 +441,7 @@ struct mv88e6xxx_hw_stat { }; int mv88e6xxx_switch_reset(struct dsa_switch *ds, bool ppu_active); -char *mv88e6xxx_lookup_name(struct mii_bus *bus, int sw_addr, +char *mv88e6xxx_lookup_name(struct mdio_device *mdiodev, const struct mv88e6xxx_switch_id *table, unsigned int num); int mv88e6xxx_bind(struct device *dev, struct dsa_switch_tree *dst, -- 2.7.0