From 9ea956db779f485c243c91f127d569ba93f18dd3 Mon Sep 17 00:00:00 2001 From: Jean-Christophe PLAGNIOL-VILLARD Date: Sun, 18 Nov 2012 13:49:40 +0100 Subject: [PATCH] phylib: fix generic phy driver probe the generic phy driver is used if no driver are found Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD Signed-off-by: Sascha Hauer --- drivers/net/phy/Kconfig | 8 ++------ drivers/net/phy/Makefile | 1 - drivers/net/phy/generic.c | 36 ------------------------------------ drivers/net/phy/phy.c | 34 ++++++++++++++++++++++++++++++++-- 4 files changed, 34 insertions(+), 45 deletions(-) delete mode 100644 drivers/net/phy/generic.c diff --git a/drivers/net/phy/Kconfig b/drivers/net/phy/Kconfig index 616b53988..3f7c150a8 100644 --- a/drivers/net/phy/Kconfig +++ b/drivers/net/phy/Kconfig @@ -8,15 +8,11 @@ if PHYLIB comment "MII PHY device drivers" -config GENERIC_PHY - bool "Drivers for the Generic PHYs" - default y - -endif - config SMSC_PHY bool "Drivers for SMSC PHYs" ---help--- Currently supports the LAN83C185, LAN8187 and LAN8700 PHYs +endif + endmenu diff --git a/drivers/net/phy/Makefile b/drivers/net/phy/Makefile index 0caeb7058..dfc709a82 100644 --- a/drivers/net/phy/Makefile +++ b/drivers/net/phy/Makefile @@ -1,3 +1,2 @@ obj-y += phy.o mdio_bus.o -obj-$(CONFIG_GENERIC_PHY) += generic.o obj-$(CONFIG_SMSC_PHY) += smsc.o diff --git a/drivers/net/phy/generic.c b/drivers/net/phy/generic.c deleted file mode 100644 index 3f5f12706..000000000 --- a/drivers/net/phy/generic.c +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright (c) 2009 Jean-Christophe PLAGNIOL-VILLARD - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of - * the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, - * MA 02111-1307 USA - * - */ - -#include -#include -#include - -static struct phy_driver generic_phy = { - .drv.name = "Generic PHY", - .phy_id = PHY_ANY_UID, - .phy_id_mask = PHY_ANY_UID, - .features = 0, -}; - -static int generic_phy_register(void) -{ - return phy_driver_register(&generic_phy); -} -device_initcall(generic_phy_register); diff --git a/drivers/net/phy/phy.c b/drivers/net/phy/phy.c index 4478d9f5d..2fd0440a0 100644 --- a/drivers/net/phy/phy.c +++ b/drivers/net/phy/phy.c @@ -19,6 +19,7 @@ #include #include +#include #include #include #include @@ -27,6 +28,7 @@ #define PHY_AN_TIMEOUT 10 +static struct phy_driver genphy_driver; static int genphy_config_init(struct phy_device *phydev); int phy_update_status(struct phy_device *dev) @@ -142,6 +144,21 @@ struct phy_device *get_phy_device(struct mii_bus *bus, int addr) return dev; } +static int phy_register_device(struct phy_device* dev) +{ + int ret; + + ret = register_device(&dev->dev); + if (ret) + return ret; + + if (dev->dev.driver) + return 0; + + dev->dev.driver = &genphy_driver.drv; + return device_probe(&dev->dev); +} + /* Automatically gets and returns the PHY device */ int phy_device_connect(struct eth_device *edev, struct mii_bus *bus, int addr, void (*adjust_link) (struct eth_device *edev), @@ -164,7 +181,7 @@ int phy_device_connect(struct eth_device *edev, struct mii_bus *bus, int addr, dev->interface = interface; dev->dev_flags = flags; - ret = register_device(&dev->dev); + ret = phy_register_device(dev); if (ret) goto fail; } else { @@ -181,7 +198,7 @@ int phy_device_connect(struct eth_device *edev, struct mii_bus *bus, int addr, dev->interface = interface; dev->dev_flags = flags; - ret = register_device(&dev->dev); + ret = phy_register_device(dev); if (ret) goto fail; @@ -597,3 +614,16 @@ int phy_drivers_register(struct phy_driver *new_driver, int n) } return ret; } + +static struct phy_driver genphy_driver = { + .drv.name = "Generic PHY", + .phy_id = PHY_ANY_UID, + .phy_id_mask = PHY_ANY_UID, + .features = 0, +}; + +static int generic_phy_register(void) +{ + return phy_driver_register(&genphy_driver); +} +device_initcall(generic_phy_register);