static void
 mt7530_free_irq(struct mt7530_priv *priv)
 {
-       mt7530_free_mdio_irq(priv);
+       struct device_node *mnp, *np = priv->dev->of_node;
+
+       mnp = of_get_child_by_name(np, "mdio");
+       if (!mnp)
+               mt7530_free_mdio_irq(priv);
+       of_node_put(mnp);
+
        mt7530_free_irq_common(priv);
 }
 
 static int
 mt7530_setup_mdio(struct mt7530_priv *priv)
 {
+       struct device_node *mnp, *np = priv->dev->of_node;
        struct dsa_switch *ds = priv->ds;
        struct device *dev = priv->dev;
        struct mii_bus *bus;
        static int idx;
-       int ret;
+       int ret = 0;
+
+       mnp = of_get_child_by_name(np, "mdio");
+
+       if (mnp && !of_device_is_available(mnp))
+               goto out;
 
        bus = devm_mdiobus_alloc(dev);
-       if (!bus)
-               return -ENOMEM;
+       if (!bus) {
+               ret = -ENOMEM;
+               goto out;
+       }
+
+       if (!mnp)
+               ds->user_mii_bus = bus;
 
-       ds->user_mii_bus = bus;
        bus->priv = priv;
        bus->name = KBUILD_MODNAME "-mii";
        snprintf(bus->id, MII_BUS_ID_SIZE, KBUILD_MODNAME "-%d", idx++);
        bus->parent = dev;
        bus->phy_mask = ~ds->phys_mii_mask;
 
-       if (priv->irq)
+       if (priv->irq && !mnp)
                mt7530_setup_mdio_irq(priv);
 
-       ret = devm_mdiobus_register(dev, bus);
+       ret = devm_of_mdiobus_register(dev, bus, mnp);
        if (ret) {
                dev_err(dev, "failed to register MDIO bus: %d\n", ret);
-               if (priv->irq)
+               if (priv->irq && !mnp)
                        mt7530_free_mdio_irq(priv);
        }
 
+out:
+       of_node_put(mnp);
        return ret;
 }