static void cpsw_remove_dt(struct platform_device *pdev)
 {
+       struct net_device *ndev = platform_get_drvdata(pdev);
+       struct cpsw_common *cpsw = ndev_to_cpsw(ndev);
+       struct cpsw_platform_data *data = &cpsw->data;
+       struct device_node *node = pdev->dev.of_node;
+       struct device_node *slave_node;
+       int i = 0;
+
+       for_each_available_child_of_node(node, slave_node) {
+               struct cpsw_slave_data *slave_data = &data->slave_data[i];
+
+               if (strcmp(slave_node->name, "slave"))
+                       continue;
+
+               if (of_phy_is_fixed_link(slave_node)) {
+                       struct phy_device *phydev;
+
+                       phydev = of_phy_find_device(slave_node);
+                       if (phydev) {
+                               fixed_phy_unregister(phydev);
+                               /* Put references taken by
+                                * of_phy_find_device() and
+                                * of_phy_register_fixed_link().
+                                */
+                               phy_device_free(phydev);
+                               phy_device_free(phydev);
+                       }
+               }
+
+               of_node_put(slave_data->phy_node);
+
+               i++;
+               if (i == data->slaves)
+                       break;
+       }
+
        of_platform_depopulate(&pdev->dev);
 }