}
 EXPORT_SYMBOL_GPL(fixed_phy_add);
 
-void fixed_phy_del(int phy_addr)
+static void fixed_phy_del(int phy_addr)
 {
        struct fixed_mdio_bus *fmb = &platform_fmb;
        struct fixed_phy *fp, *tmp;
                }
        }
 }
-EXPORT_SYMBOL_GPL(fixed_phy_del);
 
 static int phy_fixed_addr;
 static DEFINE_SPINLOCK(phy_fixed_addr_lock);
 }
 EXPORT_SYMBOL_GPL(fixed_phy_register);
 
+void fixed_phy_unregister(struct phy_device *phy)
+{
+       phy_device_remove(phy);
+
+       fixed_phy_del(phy->mdio.addr);
+}
+EXPORT_SYMBOL_GPL(fixed_phy_unregister);
+
 static int __init fixed_mdio_bus_init(void)
 {
        struct fixed_mdio_bus *fmb = &platform_fmb;
 
                                             struct fixed_phy_status *status,
                                             int link_gpio,
                                             struct device_node *np);
-extern void fixed_phy_del(int phy_addr);
+extern void fixed_phy_unregister(struct phy_device *phydev);
 extern int fixed_phy_set_link_update(struct phy_device *phydev,
                        int (*link_update)(struct net_device *,
                                           struct fixed_phy_status *));
 {
        return ERR_PTR(-ENODEV);
 }
-static inline int fixed_phy_del(int phy_addr)
+static inline void fixed_phy_unregister(struct phy_device *phydev)
 {
-       return -ENODEV;
 }
 static inline int fixed_phy_set_link_update(struct phy_device *phydev,
                        int (*link_update)(struct net_device *,
 
                if (of_phy_is_fixed_link(port_dn)) {
                        phydev = of_phy_find_device(port_dn);
                        if (phydev) {
-                               int addr = phydev->mdio.addr;
-
                                phy_device_free(phydev);
                                of_node_put(port_dn);
-                               fixed_phy_del(addr);
+                               fixed_phy_unregister(phydev);
                        }
                }
        }