if (!phydev)
                return -EIO;
 
-       return et131x_phy_mii_read(adapter, phydev->addr, reg, value);
+       return et131x_phy_mii_read(adapter, phydev->mdio.addr, reg, value);
 }
 
 static int et131x_mii_write(struct et131x_adapter *adapter, u8 addr, u8 reg,
        data &= ~BMCR_PDOWN;
        if (down)
                data |= BMCR_PDOWN;
-       et131x_mii_write(adapter, phydev->addr, MII_BMCR, data);
+       et131x_mii_write(adapter, phydev->mdio.addr, MII_BMCR, data);
 }
 
 /* et131x_xcvr_init - Init the phy if we are setting it into force mode */
                else
                        lcr2 |= (LED_VAL_LINKON << LED_TXRX_SHIFT);
 
-               et131x_mii_write(adapter, phydev->addr, PHY_LED_2, lcr2);
+               et131x_mii_write(adapter, phydev->mdio.addr, PHY_LED_2, lcr2);
        }
 }
 
 
                        et131x_mii_read(adapter, PHY_MPHY_CONTROL_REG,
                                        ®ister18);
-                       et131x_mii_write(adapter, phydev->addr,
+                       et131x_mii_write(adapter, phydev->mdio.addr,
                                         PHY_MPHY_CONTROL_REG,
                                         register18 | 0x4);
-                       et131x_mii_write(adapter, phydev->addr, PHY_INDEX_REG,
-                                        register18 | 0x8402);
-                       et131x_mii_write(adapter, phydev->addr, PHY_DATA_REG,
-                                        register18 | 511);
-                       et131x_mii_write(adapter, phydev->addr,
+                       et131x_mii_write(adapter, phydev->mdio.addr,
+                                        PHY_INDEX_REG, register18 | 0x8402);
+                       et131x_mii_write(adapter, phydev->mdio.addr,
+                                        PHY_DATA_REG, register18 | 511);
+                       et131x_mii_write(adapter, phydev->mdio.addr,
                                         PHY_MPHY_CONTROL_REG, register18);
                }
 
                        et131x_mii_read(adapter, PHY_CONFIG, ®);
                        reg &= ~ET_PHY_CONFIG_TX_FIFO_DEPTH;
                        reg |= ET_PHY_CONFIG_FIFO_DEPTH_32;
-                       et131x_mii_write(adapter, phydev->addr, PHY_CONFIG,
-                                        reg);
+                       et131x_mii_write(adapter, phydev->mdio.addr,
+                                        PHY_CONFIG, reg);
                }
 
                et131x_set_rx_dma_timer(adapter);
 
                        et131x_mii_read(adapter, PHY_MPHY_CONTROL_REG,
                                        ®ister18);
-                       et131x_mii_write(adapter, phydev->addr,
+                       et131x_mii_write(adapter, phydev->mdio.addr,
                                         PHY_MPHY_CONTROL_REG,
                                         register18 | 0x4);
-                       et131x_mii_write(adapter, phydev->addr,
+                       et131x_mii_write(adapter, phydev->mdio.addr,
                                         PHY_INDEX_REG, register18 | 0x8402);
-                       et131x_mii_write(adapter, phydev->addr,
+                       et131x_mii_write(adapter, phydev->mdio.addr,
                                         PHY_DATA_REG, register18 | 511);
-                       et131x_mii_write(adapter, phydev->addr,
+                       et131x_mii_write(adapter, phydev->mdio.addr,
                                         PHY_MPHY_CONTROL_REG, register18);
                }
 
 
        }
 
        netdev_dbg(dev, "attached to PHY %d UID 0x%08x Link = %d\n",
-                  phydev->addr, phydev->phy_id, phydev->link);
+                  phydev->mdio.addr, phydev->phy_id, phydev->link);
 
        priv->phydev = phydev;
        return 0;
 
 
        bp->phydev = phydev;
        bp->old_link = 0;
-       bp->phy_addr = phydev->addr;
+       bp->phy_addr = phydev->mdio.addr;
 
        phy_attached_info(phydev);
 
 
         * Ethernet MAC ISRs
         */
        if (priv->internal_phy)
-               priv->mii_bus->irq[phydev->addr] = PHY_IGNORE_INTERRUPT;
+               priv->mii_bus->irq[phydev->mdio.addr] = PHY_IGNORE_INTERRUPT;
 
        return 0;
 }
 
                return -ENXIO;
        }
 
-       phy_dev = phy_connect(dev, dev_name(&phy_dev->dev), &sbmac_mii_poll,
-                             PHY_INTERFACE_MODE_GMII);
+       phy_dev = phy_connect(dev, dev_name(&phy_dev->mdio.dev),
+                             &sbmac_mii_poll, PHY_INTERFACE_MODE_GMII);
        if (IS_ERR(phy_dev)) {
                printk(KERN_ERR "%s: could not attach to PHY\n", dev->name);
                return PTR_ERR(phy_dev);
 
 
        err = init(dtsec->regs, dtsec_drv_param, dtsec->phy_if,
                   dtsec->max_speed, (u8 *)eth_addr, dtsec->exceptions,
-                  dtsec->tbiphy->addr);
+                  dtsec->tbiphy->mdio.addr);
        if (err) {
                free_init_resources(dtsec);
                pr_err("DTSEC version doesn't support this i/f mode\n");
        dtsec->tbiphy = of_phy_find_device(params->internal_phy_node);
        if (!dtsec->tbiphy) {
                pr_err("of_phy_find_device (TBI PHY) failed\n");
-               put_device(&dtsec->tbiphy->dev);
+               put_device(&dtsec->tbiphy->mdio.dev);
                goto err_dtsec_drv_param;
        }
 
-       put_device(&dtsec->tbiphy->dev);
+       put_device(&dtsec->tbiphy->mdio.dev);
 
        /* Save FMan revision */
        fman_get_revision(dtsec->fm, &dtsec->fm_rev_info);
 
                         * register address space and access each one of 4
                         * ports inside QSGMII.
                         */
-                       phy_addr = memac->pcsphy->addr;
+                       phy_addr = memac->pcsphy->mdio.addr;
                        qsmgii_phy_addr = (u8)((phy_addr << 2) | i);
-                       memac->pcsphy->addr = qsmgii_phy_addr;
+                       memac->pcsphy->mdio.addr = qsmgii_phy_addr;
                        if (memac->basex_if)
                                setup_sgmii_internal_phy_base_x(memac);
                        else
                                setup_sgmii_internal_phy(memac, fixed_link);
 
-                       memac->pcsphy->addr = phy_addr;
+                       memac->pcsphy->mdio.addr = phy_addr;
                }
        }
 
 
        int r;
        u32 addrhi, addrlo;
 
-       struct mii_bus* mii = fep->phydev->bus;
+       struct mii_bus *mii = fep->phydev->mdio.bus;
        struct fec_info* fec_inf = mii->priv;
 
        r = whack_reset(fep->fec.fecp);
 
         * several seconds for it to come back.
         */
        if (phy_read(tbiphy, MII_BMSR) & BMSR_LSTATUS) {
-               put_device(&tbiphy->dev);
+               put_device(&tbiphy->mdio.dev);
                return;
        }
 
                  BMCR_ANENABLE | BMCR_ANRESTART | BMCR_FULLDPLX |
                  BMCR_SPEED1000);
 
-       put_device(&tbiphy->dev);
+       put_device(&tbiphy->mdio.dev);
 }
 
 static int __gfar_is_rx_idle(struct gfar_private *priv)
 
                value &= ~0x1000;       /* Turn off autonegotiation */
                phy_write(tbiphy, ENET_TBI_MII_CR, value);
 
-               put_device(&tbiphy->dev);
+               put_device(&tbiphy->mdio.dev);
        }
 
        init_check_frame_length_mode(ug_info->lengthCheckRx, &ug_regs->maccfg2);
         * several seconds for it to come back.
         */
        if (phy_read(tbiphy, ENET_TBI_MII_SR) & TBISR_LSTATUS) {
-               put_device(&tbiphy->dev);
+               put_device(&tbiphy->mdio.dev);
                return;
        }
 
 
        struct hns_nic_priv *priv = netdev_priv(net_dev);
        struct phy_device *phy_dev = priv->phy;
 
-       if (!phy_dev || !phy_dev->bus) {
+       if (!phy_dev || !phy_dev->mdio.bus) {
                cmd->eth_tp_mdix_ctrl = ETH_TP_MDI_INVALID;
                cmd->eth_tp_mdix = ETH_TP_MDI_INVALID;
                return;
 
                if (!mp->phy)
                        err = -ENODEV;
                else
-                       phy_addr_set(mp, mp->phy->addr);
+                       phy_addr_set(mp, mp->phy->mdio.addr);
        } else if (pd->phy_addr != MV643XX_ETH_PHY_NONE) {
                mp->phy = phy_scan(mp, pd->phy_addr);
 
 
 
                mvneta_fixed_link_update(pp, phy);
 
-               put_device(&phy->dev);
+               put_device(&phy->mdio.dev);
        }
 
        return 0;
 
 
        for (i = 0; i < 10; i++) {
                /* Set PHY to 10/FD, no ANEG, and loopback mode */
-               smsc911x_mii_write(phy_dev->bus, phy_dev->addr, MII_BMCR,
-                       BMCR_LOOPBACK | BMCR_FULLDPLX);
+               smsc911x_mii_write(phy_dev->mdio.bus, phy_dev->mdio.addr,
+                                  MII_BMCR, BMCR_LOOPBACK | BMCR_FULLDPLX);
 
                /* Enable MAC tx/rx, FD */
                spin_lock_irqsave(&pdata->mac_lock, flags);
        spin_unlock_irqrestore(&pdata->mac_lock, flags);
 
        /* Cancel PHY loopback mode */
-       smsc911x_mii_write(phy_dev->bus, phy_dev->addr, MII_BMCR, 0);
+       smsc911x_mii_write(phy_dev->mdio.bus, phy_dev->mdio.addr, MII_BMCR, 0);
 
        smsc911x_reg_write(pdata, TX_CFG, 0);
        smsc911x_reg_write(pdata, RX_CFG, 0);
        }
 
        SMSC_TRACE(pdata, probe, "PHY: addr %d, phy_id 0x%08X",
-                  phydev->addr, phydev->phy_id);
+                  phydev->mdio.addr, phydev->phy_id);
 
        ret = phy_connect_direct(dev, phydev, &smsc911x_phy_adjust_link,
                                 pdata->config.phy_interface);
        }
 
        for (i = 0; i <= 31; i++)
-               data[j++] = smsc911x_mii_read(phy_dev->bus, phy_dev->addr, i);
+               data[j++] = smsc911x_mii_read(phy_dev->mdio.bus,
+                                             phy_dev->mdio.addr, i);
 }
 
 static void smsc911x_eeprom_enable_access(struct smsc911x_data *pdata)
 
                return;
 
        for (i = 0; i <= 31; i++)
-               data[j++] = smsc9420_mii_read(phy_dev->bus, phy_dev->addr, i);
+               data[j++] = smsc9420_mii_read(phy_dev->mdio.bus,
+                                             phy_dev->mdio.addr, i);
 }
 
 static void smsc9420_eeprom_enable_access(struct smsc9420_pdata *pd)
 
                        if (!phy_dev)
                                return -ENODEV;
                        snprintf(slave_data->phy_id, sizeof(slave_data->phy_id),
-                                PHY_ID_FMT, phy_dev->bus->id, phy_dev->addr);
+                                PHY_ID_FMT, phy_dev->mdio.bus->id,
+                                phy_dev->mdio.addr);
                } else if (parp) {
                        u32 phyid;
                        struct device_node *mdio_node;
 
                phy = data->bus->phy_map[addr];
                if (phy) {
                        dev_info(dev, "phy[%d]: device %s, driver %s\n",
-                                phy->addr, phydev_name(phy),
+                                phy->mdio.addr, phydev_name(phy),
                                 phy->drv ? phy->drv->name : "unknown");
                }
        }
 
                        dev_info(dev,
                                 "MDIO of the phy is not registered yet\n");
                else
-                       put_device(&phydev->dev);
+                       put_device(&phydev->mdio.dev);
                return 0;
        }
 
 
 
 static int at803x_probe(struct phy_device *phydev)
 {
-       struct device *dev = &phydev->dev;
+       struct device *dev = &phydev->mdio.dev;
        struct at803x_priv *priv;
        struct gpio_desc *gpiod_reset;
 
 
        const __be32 *paddr_end;
        int len, ret;
 
-       if (!phydev->dev.of_node)
+       if (!phydev->mdio.dev.of_node)
                return 0;
 
-       paddr = of_get_property(phydev->dev.of_node,
+       paddr = of_get_property(phydev->mdio.dev.of_node,
                                "broadcom,c45-reg-init", &len);
        if (!paddr)
                return 0;
 
 
 #define BROADCAST_ADDR 31
 
-static inline int broadcast_write(struct mii_bus *bus, u32 regnum, u16 val)
+static inline int broadcast_write(struct phy_device *phydev, u32 regnum,
+                                 u16 val)
 {
-       return mdiobus_write(bus, BROADCAST_ADDR, regnum, val);
+       return mdiobus_write(phydev->mdio.bus, BROADCAST_ADDR, regnum, val);
 }
 
 /* Caller must hold extreg_lock. */
        int val;
 
        if (dp83640->clock->page != page) {
-               broadcast_write(phydev->bus, PAGESEL, page);
+               broadcast_write(phydev, PAGESEL, page);
                dp83640->clock->page = page;
        }
        val = phy_read(phydev, regnum);
        struct dp83640_private *dp83640 = phydev->priv;
 
        if (dp83640->clock->page != page) {
-               broadcast_write(phydev->bus, PAGESEL, page);
+               broadcast_write(phydev, PAGESEL, page);
                dp83640->clock->page = page;
        }
        if (broadcast)
-               broadcast_write(phydev->bus, regnum, val);
+               broadcast_write(phydev, regnum, val);
        else
                phy_write(phydev, regnum, val);
 }
        if (chosen_phy == -1 && !clock->chosen)
                return 1;
 
-       if (chosen_phy == phydev->addr)
+       if (chosen_phy == phydev->mdio.addr)
                return 1;
 
        return 0;
        struct dp83640_private *dp83640;
        int err = -ENOMEM, i;
 
-       if (phydev->addr == BROADCAST_ADDR)
+       if (phydev->mdio.addr == BROADCAST_ADDR)
                return 0;
 
-       clock = dp83640_clock_get_bus(phydev->bus);
+       clock = dp83640_clock_get_bus(phydev->mdio.bus);
        if (!clock)
                goto no_clock;
 
 
        if (choose_this_phy(clock, phydev)) {
                clock->chosen = dp83640;
-               clock->ptp_clock = ptp_clock_register(&clock->caps, &phydev->dev);
+               clock->ptp_clock = ptp_clock_register(&clock->caps,
+                                                     &phydev->mdio.dev);
                if (IS_ERR(clock->ptp_clock)) {
                        err = PTR_ERR(clock->ptp_clock);
                        goto no_register;
        struct list_head *this, *next;
        struct dp83640_private *tmp, *dp83640 = phydev->priv;
 
-       if (phydev->addr == BROADCAST_ADDR)
+       if (phydev->mdio.addr == BROADCAST_ADDR)
                return;
 
        enable_status_frames(phydev, false);
 
 static int dp83867_of_init(struct phy_device *phydev)
 {
        struct dp83867_private *dp83867 = phydev->priv;
-       struct device *dev = &phydev->dev;
+       struct device *dev = &phydev->mdio.dev;
        struct device_node *of_node = dev->of_node;
        int ret;
 
        u16 val, delay;
 
        if (!phydev->priv) {
-               dp83867 = devm_kzalloc(&phydev->dev, sizeof(*dp83867),
+               dp83867 = devm_kzalloc(&phydev->mdio.dev, sizeof(*dp83867),
                                       GFP_KERNEL);
                if (!dp83867)
                        return -ENOMEM;
 
        struct fixed_mdio_bus *fmb = &platform_fmb;
        struct fixed_phy *fp;
 
-       if (!phydev || !phydev->bus)
+       if (!phydev || !phydev->mdio.bus)
                return -EINVAL;
 
        list_for_each_entry(fp, &fmb->phys, node) {
-               if (fp->addr == phydev->addr) {
+               if (fp->addr == phydev->mdio.addr) {
                        fp->link_update = link_update;
                        fp->phydev = phydev;
                        return 0;
        struct fixed_mdio_bus *fmb = &platform_fmb;
        struct fixed_phy *fp;
 
-       if (!phydev || phydev->bus != fmb->mii_bus)
+       if (!phydev || phydev->mdio.bus != fmb->mii_bus)
                return -EINVAL;
 
        list_for_each_entry(fp, &fmb->phys, node) {
-               if (fp->addr == phydev->addr) {
+               if (fp->addr == phydev->mdio.addr) {
 #define _UPD(x) if (changed->x) \
        fp->status.x = status->x
                        _UPD(link);
        }
 
        of_node_get(np);
-       phy->dev.of_node = np;
+       phy->mdio.dev.of_node = np;
        phy->is_pseudo_fixed_link = true;
 
        switch (status->speed) {
 
        if (full_reset_performed == 0) {
 
                /* master reset */
-               err = mdiobus_write(phydev->bus, 30, 0, 0x175c);
+               err = mdiobus_write(phydev->mdio.bus, 30, 0, 0x175c);
                if (err < 0)
                        return err;
 
                /* ensure no bus delays overlap reset period */
-               err = mdiobus_read(phydev->bus, 30, 0);
+               err = mdiobus_read(phydev->mdio.bus, 30, 0);
 
                /* data sheet specifies reset period is 2 msec */
                mdelay(2);
 
                /* enable IP175C mode */
-               err = mdiobus_write(phydev->bus, 29, 31, 0x175c);
+               err = mdiobus_write(phydev->mdio.bus, 29, 31, 0x175c);
                if (err < 0)
                        return err;
 
                /* Set MII0 speed and duplex (in PHY mode) */
-               err = mdiobus_write(phydev->bus, 29, 22, 0x420);
+               err = mdiobus_write(phydev->mdio.bus, 29, 22, 0x420);
                if (err < 0)
                        return err;
 
                /* reset switch ports */
                for (i = 0; i < 5; i++) {
-                       err = mdiobus_write(phydev->bus, i,
+                       err = mdiobus_write(phydev->mdio.bus, i,
                                            MII_BMCR, BMCR_RESET);
                        if (err < 0)
                                return err;
                }
 
                for (i = 0; i < 5; i++)
-                       err = mdiobus_read(phydev->bus, i, MII_BMCR);
+                       err = mdiobus_read(phydev->mdio.bus, i, MII_BMCR);
 
                mdelay(2);
 
                full_reset_performed = 1;
        }
 
-       if (phydev->addr != 4) {
+       if (phydev->mdio.addr != 4) {
                phydev->state = PHY_RUNNING;
                phydev->speed = SPEED_100;
                phydev->duplex = DUPLEX_FULL;
 
 static int ip175c_read_status(struct phy_device *phydev)
 {
-       if (phydev->addr == 4) /* WAN port */
+       if (phydev->mdio.addr == 4) /* WAN port */
                genphy_read_status(phydev);
        else
                /* Don't need to read status for switch ports */
 
 static int ip175c_config_aneg(struct phy_device *phydev)
 {
-       if (phydev->addr == 4) /* WAN port */
+       if (phydev->mdio.addr == 4) /* WAN port */
                genphy_config_aneg(phydev);
 
        return 0;
 
        const __be32 *paddr;
        int len, i, saved_page, current_page, page_changed, ret;
 
-       if (!phydev->dev.of_node)
+       if (!phydev->mdio.dev.of_node)
                return 0;
 
-       paddr = of_get_property(phydev->dev.of_node, "marvell,reg-init", &len);
+       paddr = of_get_property(phydev->mdio.dev.of_node,
+                               "marvell,reg-init", &len);
        if (!paddr || len < (4 * sizeof(*paddr)))
                return 0;
 
 {
        struct marvell_priv *priv;
 
-       priv = devm_kzalloc(&phydev->dev, sizeof(*priv), GFP_KERNEL);
+       priv = devm_kzalloc(&phydev->mdio.dev, sizeof(*priv), GFP_KERNEL);
        if (!priv)
                return -ENOMEM;
 
 
  * the phy. This allows auto-probed pyh devices to be supplied with information
  * passed in via DT.
  */
-static void of_mdiobus_link_phydev(struct mii_bus *mdio,
+static void of_mdiobus_link_phydev(struct mii_bus *bus,
                                   struct phy_device *phydev)
 {
-       struct device *dev = &phydev->dev;
+       struct device *dev = &phydev->mdio.dev;
        struct device_node *child;
 
-       if (dev->of_node || !mdio->dev.of_node)
+       if (dev->of_node || !bus->dev.of_node)
                return;
 
-       for_each_available_child_of_node(mdio->dev.of_node, child) {
+       for_each_available_child_of_node(bus->dev.of_node, child) {
                int addr;
                int ret;
 
                        continue;
                }
 
-               if (addr == phydev->addr) {
+               if (addr == phydev->mdio.addr) {
                        dev->of_node = child;
                        return;
                }
 
 static bool mdio_bus_phy_may_suspend(struct phy_device *phydev)
 {
-       struct device_driver *drv = phydev->dev.driver;
+       struct device_driver *drv = phydev->mdio.dev.driver;
        struct phy_driver *phydrv = to_phy_driver(drv);
        struct net_device *netdev = phydev->attached_dev;
 
 
 
 static int ksz9021_config_init(struct phy_device *phydev)
 {
-       const struct device *dev = &phydev->dev;
+       const struct device *dev = &phydev->mdio.dev;
        const struct device_node *of_node = dev->of_node;
        const struct device *dev_walker;
 
         * properties in the MAC node. Walk up the tree of devices to
         * find a device with an OF node.
         */
-       dev_walker = &phydev->dev;
+       dev_walker = &phydev->mdio.dev;
        do {
                of_node = dev_walker->of_node;
                dev_walker = dev_walker->parent;
 
 static int ksz9031_config_init(struct phy_device *phydev)
 {
-       const struct device *dev = &phydev->dev;
+       const struct device *dev = &phydev->mdio.dev;
        const struct device_node *of_node = dev->of_node;
        static const char *clk_skews[2] = {"rxc-skew-ps", "txc-skew-ps"};
        static const char *rx_data_skews[4] = {
 static int kszphy_probe(struct phy_device *phydev)
 {
        const struct kszphy_type *type = phydev->drv->driver_data;
-       const struct device_node *np = phydev->dev.of_node;
+       const struct device_node *np = phydev->mdio.dev.of_node;
        struct kszphy_priv *priv;
        struct clk *clk;
        int ret;
 
-       priv = devm_kzalloc(&phydev->dev, sizeof(*priv), GFP_KERNEL);
+       priv = devm_kzalloc(&phydev->mdio.dev, sizeof(*priv), GFP_KERNEL);
        if (!priv)
                return -ENOMEM;
 
                priv->led_mode = -1;
        }
 
-       clk = devm_clk_get(&phydev->dev, "rmii-ref");
+       clk = devm_clk_get(&phydev->mdio.dev, "rmii-ref");
        /* NOTE: clk may be NULL if building without CONFIG_HAVE_CLK */
        if (!IS_ERR_OR_NULL(clk)) {
                unsigned long rate = clk_get_rate(clk);
 
 
 static int lan88xx_probe(struct phy_device *phydev)
 {
-       struct device *dev = &phydev->dev;
+       struct device *dev = &phydev->mdio.dev;
        struct lan88xx_priv *priv;
 
        priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
 
 static void lan88xx_remove(struct phy_device *phydev)
 {
-       struct device *dev = &phydev->dev;
+       struct device *dev = &phydev->mdio.dev;
        struct lan88xx_priv *priv = phydev->priv;
 
        if (priv)
 
 {
        u32 speed = ethtool_cmd_speed(cmd);
 
-       if (cmd->phy_address != phydev->addr)
+       if (cmd->phy_address != phydev->mdio.addr)
                return -EINVAL;
 
        /* We make sure that we don't pass unsupported values in to the PHY */
                cmd->port = PORT_BNC;
        else
                cmd->port = PORT_MII;
-       cmd->phy_address = phydev->addr;
+       cmd->phy_address = phydev->mdio.addr;
        cmd->transceiver = phy_is_internal(phydev) ?
                XCVR_INTERNAL : XCVR_EXTERNAL;
        cmd->autoneg = phydev->autoneg;
 
        switch (cmd) {
        case SIOCGMIIPHY:
-               mii_data->phy_id = phydev->addr;
+               mii_data->phy_id = phydev->mdio.addr;
                /* fall through */
 
        case SIOCGMIIREG:
-               mii_data->val_out = mdiobus_read(phydev->bus, mii_data->phy_id,
+               mii_data->val_out = mdiobus_read(phydev->mdio.bus,
+                                                mii_data->phy_id,
                                                 mii_data->reg_num);
                return 0;
 
        case SIOCSMIIREG:
-               if (mii_data->phy_id == phydev->addr) {
+               if (mii_data->phy_id == phydev->mdio.addr) {
                        switch (mii_data->reg_num) {
                        case MII_BMCR:
                                if ((val & (BMCR_RESET | BMCR_ANENABLE)) == 0) {
                        }
                }
 
-               mdiobus_write(phydev->bus, mii_data->phy_id,
+               mdiobus_write(phydev->mdio.bus, mii_data->phy_id,
                              mii_data->reg_num, val);
 
-               if (mii_data->phy_id == phydev->addr &&
+               if (mii_data->phy_id == phydev->mdio.addr &&
                    mii_data->reg_num == MII_BMCR &&
                    val & BMCR_RESET)
                        return phy_init_hw(phydev);
        if (request_irq(phydev->irq, phy_interrupt, 0, "phy_interrupt",
                        phydev) < 0) {
                pr_warn("%s: Can't get IRQ %d (PHY)\n",
-                       phydev->bus->name, phydev->irq);
+                       phydev->mdio.bus->name, phydev->irq);
                phydev->irq = PHY_POLL;
                return 0;
        }
 int phy_read_mmd_indirect(struct phy_device *phydev, int prtad, int devad)
 {
        struct phy_driver *phydrv = phydev->drv;
-       int addr = phydev->addr;
+       int addr = phydev->mdio.addr;
        int value = -1;
 
        if (!phydrv->read_mmd_indirect) {
-               struct mii_bus *bus = phydev->bus;
+               struct mii_bus *bus = phydev->mdio.bus;
 
                mutex_lock(&bus->mdio_lock);
                mmd_phy_indirect(bus, prtad, devad, addr);
                                   int devad, u32 data)
 {
        struct phy_driver *phydrv = phydev->drv;
-       int addr = phydev->addr;
+       int addr = phydev->mdio.addr;
 
        if (!phydrv->write_mmd_indirect) {
-               struct mii_bus *bus = phydev->bus;
+               struct mii_bus *bus = phydev->mdio.bus;
 
                mutex_lock(&bus->mdio_lock);
                mmd_phy_indirect(bus, prtad, devad, addr);
 
 
 void phy_device_free(struct phy_device *phydev)
 {
-       put_device(&phydev->dev);
+       put_device(&phydev->mdio.dev);
 }
 EXPORT_SYMBOL(phy_device_free);
 
 
 /**
  * phy_register_fixup - creates a new phy_fixup and adds it to the list
- * @bus_id: A string which matches phydev->dev.bus_id (or PHY_ANY_ID)
+ * @bus_id: A string which matches phydev->mdio.dev.bus_id (or PHY_ANY_ID)
  * @phy_uid: Used to match against phydev->phy_id (the UID of the PHY)
  *     It can also be PHY_ANY_UID
  * @phy_uid_mask: Applied to phydev->phy_id and fixup->phy_uid before
                                     struct phy_c45_device_ids *c45_ids)
 {
        struct phy_device *dev;
+       struct mdio_device *mdiodev;
 
        /* We allocate the device, and initialize the default values */
        dev = kzalloc(sizeof(*dev), GFP_KERNEL);
        if (!dev)
                return ERR_PTR(-ENOMEM);
 
-       dev->dev.release = phy_device_release;
+       mdiodev = &dev->mdio;
+       mdiodev->dev.release = phy_device_release;
+       mdiodev->dev.parent = &bus->dev;
+       mdiodev->dev.bus = &mdio_bus_type;
+       mdiodev->bus = bus;
+       mdiodev->addr = addr;
 
        dev->speed = 0;
        dev->duplex = -1;
        dev->autoneg = AUTONEG_ENABLE;
 
        dev->is_c45 = is_c45;
-       dev->addr = addr;
        dev->phy_id = phy_id;
        if (c45_ids)
                dev->c45_ids = *c45_ids;
-       dev->bus = bus;
-       dev->dev.parent = &bus->dev;
-       dev->dev.bus = &mdio_bus_type;
        dev->irq = bus->irq ? bus->irq[addr] : PHY_POLL;
-       dev_set_name(&dev->dev, PHY_ID_FMT, bus->id, addr);
+       dev_set_name(&mdiodev->dev, PHY_ID_FMT, bus->id, addr);
 
        dev->state = PHY_DOWN;
 
         */
        request_module(MDIO_MODULE_PREFIX MDIO_ID_FMT, MDIO_ID_ARGS(phy_id));
 
-       device_initialize(&dev->dev);
+       device_initialize(&mdiodev->dev);
 
        return dev;
 }
        int err;
 
        /* Don't register a phy if one is already registered at this address */
-       if (phydev->bus->phy_map[phydev->addr])
+       if (phydev->mdio.bus->phy_map[phydev->mdio.addr])
                return -EINVAL;
-       phydev->bus->phy_map[phydev->addr] = phydev;
+       phydev->mdio.bus->phy_map[phydev->mdio.addr] = phydev;
 
        /* Run all of the fixups for this PHY */
        err = phy_scan_fixups(phydev);
        if (err) {
-               pr_err("PHY %d failed to initialize\n", phydev->addr);
+               pr_err("PHY %d failed to initialize\n", phydev->mdio.addr);
                goto out;
        }
 
-       err = device_add(&phydev->dev);
+       err = device_add(&phydev->mdio.dev);
        if (err) {
-               pr_err("PHY %d failed to add\n", phydev->addr);
+               pr_err("PHY %d failed to add\n", phydev->mdio.addr);
                goto out;
        }
 
        return 0;
 
  out:
-       phydev->bus->phy_map[phydev->addr] = NULL;
+       phydev->mdio.bus->phy_map[phydev->mdio.addr] = NULL;
        return err;
 }
 EXPORT_SYMBOL(phy_device_register);
  */
 void phy_device_remove(struct phy_device *phydev)
 {
-       struct mii_bus *bus = phydev->bus;
-       int addr = phydev->addr;
+       struct mii_bus *bus = phydev->mdio.bus;
+       int addr = phydev->mdio.addr;
 
-       device_del(&phydev->dev);
+       device_del(&phydev->mdio.dev);
        bus->phy_map[addr] = NULL;
 }
 EXPORT_SYMBOL(phy_device_remove);
 void phy_attached_print(struct phy_device *phydev, const char *fmt, ...)
 {
        if (!fmt) {
-               dev_info(&phydev->dev, ATTACHED_FMT "\n",
+               dev_info(&phydev->mdio.dev, ATTACHED_FMT "\n",
                         phydev->drv->name, phydev_name(phydev),
                         phydev->irq);
        } else {
                va_list ap;
 
-               dev_info(&phydev->dev, ATTACHED_FMT,
+               dev_info(&phydev->mdio.dev, ATTACHED_FMT,
                         phydev->drv->name, phydev_name(phydev),
                         phydev->irq);
 
 int phy_attach_direct(struct net_device *dev, struct phy_device *phydev,
                      u32 flags, phy_interface_t interface)
 {
-       struct mii_bus *bus = phydev->bus;
-       struct device *d = &phydev->dev;
+       struct mii_bus *bus = phydev->mdio.bus;
+       struct device *d = &phydev->mdio.dev;
        int err;
 
        if (!try_module_get(bus->owner)) {
         * real driver could be loaded
         */
        for (i = 0; i < ARRAY_SIZE(genphy_driver); i++) {
-               if (phydev->dev.driver == &genphy_driver[i].driver) {
-                       device_release_driver(&phydev->dev);
+               if (phydev->mdio.dev.driver == &genphy_driver[i].driver) {
+                       device_release_driver(&phydev->mdio.dev);
                        break;
                }
        }
         * The phydev might go away on the put_device() below, so avoid
         * a use-after-free bug by reading the underlying bus first.
         */
-       bus = phydev->bus;
+       bus = phydev->mdio.bus;
 
-       put_device(&phydev->dev);
+       put_device(&phydev->mdio.dev);
        module_put(bus->owner);
 }
 EXPORT_SYMBOL(phy_detach);
 
 int phy_suspend(struct phy_device *phydev)
 {
-       struct phy_driver *phydrv = to_phy_driver(phydev->dev.driver);
+       struct phy_driver *phydrv = to_phy_driver(phydev->mdio.dev.driver);
        struct ethtool_wolinfo wol = { .cmd = ETHTOOL_GWOL };
        int ret = 0;
 
 
 int phy_resume(struct phy_device *phydev)
 {
-       struct phy_driver *phydrv = to_phy_driver(phydev->dev.driver);
+       struct phy_driver *phydrv = to_phy_driver(phydev->mdio.dev.driver);
        int ret = 0;
 
        if (phydrv->resume)
 
 static void of_set_phy_supported(struct phy_device *phydev)
 {
-       struct device_node *node = phydev->dev.of_node;
+       struct device_node *node = phydev->mdio.dev.of_node;
        u32 max_speed;
 
        if (!IS_ENABLED(CONFIG_OF_MDIO))
 static int phy_probe(struct device *dev)
 {
        struct phy_device *phydev = to_phy_device(dev);
-       struct device_driver *drv = phydev->dev.driver;
+       struct device_driver *drv = phydev->mdio.dev.driver;
        struct phy_driver *phydrv = to_phy_driver(drv);
        int err = 0;
 
 
 static int smsc_phy_config_init(struct phy_device *phydev)
 {
        int __maybe_unused len;
-       struct device *dev __maybe_unused = &phydev->dev;
+       struct device *dev __maybe_unused = &phydev->mdio.dev;
        struct device_node *of_node __maybe_unused = dev->of_node;
        int rc = phy_read(phydev, MII_LAN83C185_CTRL_STATUS);
        int enable_energy = 1;
 
        /* Associate the OF node with the device structure so it
         * can be looked up later */
        of_node_get(child);
-       phy->dev.of_node = child;
+       phy->mdio.dev.of_node = child;
 
        /* All data is now stored in the phy struct;
         * register it */
        ret = phy_connect_direct(dev, phy, hndlr, iface);
 
        /* refcount is held by phy_connect_direct() on success */
-       put_device(&phy->dev);
+       put_device(&phy->mdio.dev);
 
        return ret ? NULL : phy;
 }
        ret = phy_attach_direct(dev, phy, flags, iface);
 
        /* refcount is held by phy_attach_direct() on success */
-       put_device(&phy->dev);
+       put_device(&phy->mdio.dev);
 
        return ret ? NULL : phy;
 }
 
 
 struct mii_bus;
 
+struct mdio_device {
+       struct device dev;
+
+       struct mii_bus *bus;
+       /* Bus address of the MDIO device (0-31) */
+       int addr;
+};
+#define to_mdio_device(d) container_of(d, struct mdio_device, dev)
+
 static inline bool mdio_phy_id_is_c45(int phy_id)
 {
        return (phy_id & MDIO_PHY_ID_C45) && !(phy_id & ~MDIO_PHY_ID_C45_MASK);
 
  * handling, as well as handling shifts in PHY hardware state
  */
 struct phy_device {
+       struct mdio_device mdio;
+
        /* Information about the PHY type */
        /* And management functions */
        struct phy_driver *drv;
 
-       struct mii_bus *bus;
-
-       struct device dev;
-
        u32 phy_id;
 
        struct phy_c45_device_ids c45_ids;
 
        phy_interface_t interface;
 
-       /* Bus address of the PHY (0-31) */
-       int addr;
-
        /*
         * forced speed & duplex (no autoneg)
         * partner speed & duplex & pause (autoneg)
 
        void (*adjust_link)(struct net_device *dev);
 };
-#define to_phy_device(d) container_of(d, struct phy_device, dev)
+#define to_phy_device(d) container_of(to_mdio_device(d), \
+                                     struct phy_device, mdio)
 
 /* struct phy_driver: Driver structure for a particular PHY type
  *
        if (!phydev->is_c45)
                return -EOPNOTSUPP;
 
-       return mdiobus_read(phydev->bus, phydev->addr,
+       return mdiobus_read(phydev->mdio.bus, phydev->mdio.addr,
                            MII_ADDR_C45 | (devad << 16) | (regnum & 0xffff));
 }
 
  */
 static inline int phy_read(struct phy_device *phydev, u32 regnum)
 {
-       return mdiobus_read(phydev->bus, phydev->addr, regnum);
+       return mdiobus_read(phydev->mdio.bus, phydev->mdio.addr, regnum);
 }
 
 /**
  */
 static inline int phy_write(struct phy_device *phydev, u32 regnum, u16 val)
 {
-       return mdiobus_write(phydev->bus, phydev->addr, regnum, val);
+       return mdiobus_write(phydev->mdio.bus, phydev->mdio.addr, regnum, val);
 }
 
 /**
 
        regnum = MII_ADDR_C45 | ((devad & 0x1f) << 16) | (regnum & 0xffff);
 
-       return mdiobus_write(phydev->bus, phydev->addr, regnum, val);
+       return mdiobus_write(phydev->mdio.bus, phydev->mdio.addr, regnum, val);
 }
 
 /**
 }
 
 #define phydev_err(_phydev, format, args...)   \
-       dev_err(&_phydev->dev, format, ##args)
+       dev_err(&_phydev->mdio.dev, format, ##args)
 
 #define phydev_dbg(_phydev, format, args...)   \
-       dev_dbg(&_phydev->dev, format, ##args)
+       dev_dbg(&_phydev->mdio.dev, format, ##args);
 
 static inline const char *phydev_name(const struct phy_device *phydev)
 {
-       return dev_name(&phydev->dev);
+       return dev_name(&phydev->mdio.dev);
 }
 
 void phy_attached_print(struct phy_device *phydev, const char *fmt, ...)
 
                if (of_phy_is_fixed_link(port_dn)) {
                        phydev = of_phy_find_device(port_dn);
                        if (phydev) {
-                               int addr = phydev->addr;
+                               int addr = phydev->mdio.addr;
 
                                phy_device_free(phydev);
                                of_node_put(port_dn);