|
@@ -44,7 +44,7 @@ static int of_get_phy_id(struct device_node *device, u32 *phy_id)
|
|
|
return -EINVAL;
|
|
|
}
|
|
|
|
|
|
-static void of_mdiobus_register_phy(struct mii_bus *mdio,
|
|
|
+static int of_mdiobus_register_phy(struct mii_bus *mdio,
|
|
|
struct device_node *child, u32 addr)
|
|
|
{
|
|
|
struct phy_device *phy;
|
|
@@ -60,9 +60,13 @@ static void of_mdiobus_register_phy(struct mii_bus *mdio,
|
|
|
else
|
|
|
phy = get_phy_device(mdio, addr, is_c45);
|
|
|
if (IS_ERR(phy))
|
|
|
- return;
|
|
|
+ return PTR_ERR(phy);
|
|
|
|
|
|
- rc = irq_of_parse_and_map(child, 0);
|
|
|
+ rc = of_irq_get(child, 0);
|
|
|
+ if (rc == -EPROBE_DEFER) {
|
|
|
+ phy_device_free(phy);
|
|
|
+ return rc;
|
|
|
+ }
|
|
|
if (rc > 0) {
|
|
|
phy->irq = rc;
|
|
|
mdio->irq[addr] = rc;
|
|
@@ -84,22 +88,23 @@ static void of_mdiobus_register_phy(struct mii_bus *mdio,
|
|
|
if (rc) {
|
|
|
phy_device_free(phy);
|
|
|
of_node_put(child);
|
|
|
- return;
|
|
|
+ return rc;
|
|
|
}
|
|
|
|
|
|
dev_dbg(&mdio->dev, "registered phy %s at address %i\n",
|
|
|
child->name, addr);
|
|
|
+ return 0;
|
|
|
}
|
|
|
|
|
|
-static void of_mdiobus_register_device(struct mii_bus *mdio,
|
|
|
- struct device_node *child, u32 addr)
|
|
|
+static int of_mdiobus_register_device(struct mii_bus *mdio,
|
|
|
+ struct device_node *child, u32 addr)
|
|
|
{
|
|
|
struct mdio_device *mdiodev;
|
|
|
int rc;
|
|
|
|
|
|
mdiodev = mdio_device_create(mdio, addr);
|
|
|
if (IS_ERR(mdiodev))
|
|
|
- return;
|
|
|
+ return PTR_ERR(mdiodev);
|
|
|
|
|
|
/* Associate the OF node with the device structure so it
|
|
|
* can be looked up later.
|
|
@@ -112,11 +117,12 @@ static void of_mdiobus_register_device(struct mii_bus *mdio,
|
|
|
if (rc) {
|
|
|
mdio_device_free(mdiodev);
|
|
|
of_node_put(child);
|
|
|
- return;
|
|
|
+ return rc;
|
|
|
}
|
|
|
|
|
|
dev_dbg(&mdio->dev, "registered mdio device %s at address %i\n",
|
|
|
child->name, addr);
|
|
|
+ return 0;
|
|
|
}
|
|
|
|
|
|
/* The following is a list of PHY compatible strings which appear in
|
|
@@ -219,9 +225,11 @@ int of_mdiobus_register(struct mii_bus *mdio, struct device_node *np)
|
|
|
}
|
|
|
|
|
|
if (of_mdiobus_child_is_phy(child))
|
|
|
- of_mdiobus_register_phy(mdio, child, addr);
|
|
|
+ rc = of_mdiobus_register_phy(mdio, child, addr);
|
|
|
else
|
|
|
- of_mdiobus_register_device(mdio, child, addr);
|
|
|
+ rc = of_mdiobus_register_device(mdio, child, addr);
|
|
|
+ if (rc)
|
|
|
+ goto unregister;
|
|
|
}
|
|
|
|
|
|
if (!scanphys)
|
|
@@ -242,12 +250,19 @@ int of_mdiobus_register(struct mii_bus *mdio, struct device_node *np)
|
|
|
dev_info(&mdio->dev, "scan phy %s at address %i\n",
|
|
|
child->name, addr);
|
|
|
|
|
|
- if (of_mdiobus_child_is_phy(child))
|
|
|
- of_mdiobus_register_phy(mdio, child, addr);
|
|
|
+ if (of_mdiobus_child_is_phy(child)) {
|
|
|
+ rc = of_mdiobus_register_phy(mdio, child, addr);
|
|
|
+ if (rc)
|
|
|
+ goto unregister;
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|
|
|
return 0;
|
|
|
+
|
|
|
+unregister:
|
|
|
+ mdiobus_unregister(mdio);
|
|
|
+ return rc;
|
|
|
}
|
|
|
EXPORT_SYMBOL(of_mdiobus_register);
|
|
|
|