diff options
author | Sascha Hauer <s.hauer@pengutronix.de> | 2013-12-11 10:58:00 +0100 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2013-12-11 10:58:02 +0100 |
commit | 33790253da63facab20f5ae664debba0627344df (patch) | |
tree | 5b1a255841bd950865c6bffd83aa832165f81426 /drivers/net | |
parent | d023d690fc6fd051faa77666777d9664e0e5e7e3 (diff) | |
download | barebox-33790253da63facab20f5ae664debba0627344df.tar.gz barebox-33790253da63facab20f5ae664debba0627344df.tar.xz |
net: phy: track registered state of a phy device
With this phy_device_connect only registers a phy device if it wasn't
registered already. This allows us to register phy devices outside
of ethernet drivers. phy_device_connect will now pick up an already
registered phy given that it's not attached to another ethernet device.
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'drivers/net')
-rw-r--r-- | drivers/net/phy/phy.c | 21 |
1 files changed, 17 insertions, 4 deletions
diff --git a/drivers/net/phy/phy.c b/drivers/net/phy/phy.c index 37f6647025..74ef3d9625 100644 --- a/drivers/net/phy/phy.c +++ b/drivers/net/phy/phy.c @@ -236,17 +236,28 @@ static int phy_register_device(struct phy_device* dev) { int ret; + if (dev->registered) + return -EBUSY; + dev->dev.parent = &dev->bus->dev; ret = register_device(&dev->dev); if (ret) return ret; + dev->registered = 1; + if (dev->dev.driver) return 0; dev->dev.driver = &genphy_driver.drv; - return device_probe(&dev->dev); + ret = device_probe(&dev->dev); + if (ret) { + unregister_device(&dev->dev); + dev->registered = 0; + } + + return ret; } /* Automatically gets and returns the PHY device */ @@ -287,9 +298,11 @@ int phy_device_connect(struct eth_device *edev, struct mii_bus *bus, int addr, dev->interface = interface; dev->dev_flags = flags; - ret = phy_register_device(dev); - if (ret) - goto fail; + if (!dev->registered) { + ret = phy_register_device(dev); + if (ret) + goto fail; + } edev->phydev = dev; dev->attached_dev = edev; |