else
                phy = phy_device_create(bus, addr, phy_id, 0, NULL);
        if (IS_ERR(phy)) {
-               unregister_mii_timestamper(mii_ts);
-               return PTR_ERR(phy);
+               rc = PTR_ERR(phy);
+               goto clean_mii_ts;
        }
 
        if (is_acpi_node(child)) {
                /* All data is now stored in the phy struct, so register it */
                rc = phy_device_register(phy);
                if (rc) {
-                       phy_device_free(phy);
                        fwnode_handle_put(phy->mdio.dev.fwnode);
-                       return rc;
+                       goto clean_phy;
                }
        } else if (is_of_node(child)) {
                rc = fwnode_mdiobus_phy_device_register(bus, phy, child, addr);
-               if (rc) {
-                       unregister_mii_timestamper(mii_ts);
-                       phy_device_free(phy);
-                       return rc;
-               }
+               if (rc)
+                       goto clean_phy;
        }
 
        /* phy->mii_ts may already be defined by the PHY driver. A
        if (mii_ts)
                phy->mii_ts = mii_ts;
        return 0;
+
+clean_phy:
+       phy_device_free(phy);
+clean_mii_ts:
+       unregister_mii_timestamper(mii_ts);
+
+       return rc;
 }
 EXPORT_SYMBOL(fwnode_mdiobus_register_phy);