bus->write = mv88e6xxx_mdio_write;
        bus->parent = chip->dev;
 
+       if (!external) {
+               err = mv88e6xxx_g2_irq_mdio_setup(chip, bus);
+               if (err)
+                       return err;
+       }
+
        if (np)
                err = of_mdiobus_register(bus, np);
        else
                err = mdiobus_register(bus);
        if (err) {
                dev_err(chip->dev, "Cannot register MDIO bus (%d)\n", err);
+               mv88e6xxx_g2_irq_mdio_free(chip, bus);
                return err;
        }
 
        list_for_each_entry(mdio_bus, &chip->mdios, list) {
                bus = mdio_bus->bus;
 
+               if (!mdio_bus->external)
+                       mv88e6xxx_g2_irq_mdio_free(chip, bus);
+
                mdiobus_unregister(bus);
        }
 }
 
        return err;
 }
 
+int mv88e6xxx_g2_irq_mdio_setup(struct mv88e6xxx_chip *chip,
+                               struct mii_bus *bus)
+{
+       int phy, irq, err, err_phy;
+
+       for (phy = 0; phy < chip->info->num_internal_phys; phy++) {
+               irq = irq_find_mapping(chip->g2_irq.domain, phy);
+               if (irq < 0) {
+                       err = irq;
+                       goto out;
+               }
+               bus->irq[chip->info->port_base_addr + phy] = irq;
+       }
+       return 0;
+out:
+       err_phy = phy;
+
+       for (phy = 0; phy < err_phy; phy++)
+               irq_dispose_mapping(bus->irq[phy]);
+
+       return err;
+}
+
+void mv88e6xxx_g2_irq_mdio_free(struct mv88e6xxx_chip *chip,
+                               struct mii_bus *bus)
+{
+       int phy;
+
+       for (phy = 0; phy < chip->info->num_internal_phys; phy++)
+               irq_dispose_mapping(bus->irq[phy]);
+}
+
 int mv88e6xxx_g2_setup(struct mv88e6xxx_chip *chip)
 {
        u16 reg;
 
 int mv88e6xxx_g2_irq_setup(struct mv88e6xxx_chip *chip);
 void mv88e6xxx_g2_irq_free(struct mv88e6xxx_chip *chip);
 
+int mv88e6xxx_g2_irq_mdio_setup(struct mv88e6xxx_chip *chip,
+                               struct mii_bus *bus);
+void mv88e6xxx_g2_irq_mdio_free(struct mv88e6xxx_chip *chip,
+                               struct mii_bus *bus);
+
 int mv88e6185_g2_mgmt_rsvd2cpu(struct mv88e6xxx_chip *chip);
 int mv88e6352_g2_mgmt_rsvd2cpu(struct mv88e6xxx_chip *chip);
 
 {
 }
 
+static inline int mv88e6xxx_g2_irq_mdio_setup(struct mv88e6xxx_chip *chip,
+                                             struct mii_bus *bus)
+{
+       return 0;
+}
+
+static inline void mv88e6xxx_g2_irq_mdio_free(struct mv88e6xxx_chip *chip,
+                                             struct mii_bus *bus)
+{
+}
+
 static inline int mv88e6185_g2_mgmt_rsvd2cpu(struct mv88e6xxx_chip *chip)
 {
        return -EOPNOTSUPP;