From 18867965f79a4dc13db50cdc529c102373da64a8 Mon Sep 17 00:00:00 2001 From: Gabor Juhos Date: Tue, 8 Dec 2009 10:29:27 +0000 Subject: ar71xx: add support for external mii_bus SVN-Revision: 18692 --- .../ar71xx/files/drivers/net/ag71xx/ag71xx_phy.c | 42 ++++++++++++++++++++++ 1 file changed, 42 insertions(+) (limited to 'target/linux/ar71xx/files/drivers/net/ag71xx/ag71xx_phy.c') diff --git a/target/linux/ar71xx/files/drivers/net/ag71xx/ag71xx_phy.c b/target/linux/ar71xx/files/drivers/net/ag71xx/ag71xx_phy.c index 176eddaaff..0db0a4bf78 100644 --- a/target/linux/ar71xx/files/drivers/net/ag71xx/ag71xx_phy.c +++ b/target/linux/ar71xx/files/drivers/net/ag71xx/ag71xx_phy.c @@ -262,10 +262,52 @@ static int ag71xx_phy_connect_multi(struct ag71xx *ag) return ret; } +static int dev_is_class(struct device *dev, void *class) +{ + if (dev->class != NULL && !strcmp(dev->class->name, class)) + return 1; + + return 0; +} + +static struct device *dev_find_class(struct device *parent, char *class) +{ + if (dev_is_class(parent, class)) { + get_device(parent); + return parent; + } + + return device_find_child(parent, class, dev_is_class); +} + +static struct mii_bus *dev_to_mii_bus(struct device *dev) +{ + struct device *d; + + d = dev_find_class(dev, "mdio_bus"); + if (d != NULL) { + struct mii_bus *bus; + + bus = to_mii_bus(d); + put_device(d); + + return bus; + } + + return NULL; +} + int ag71xx_phy_connect(struct ag71xx *ag) { struct ag71xx_platform_data *pdata = ag71xx_get_pdata(ag); + ag->mii_bus = dev_to_mii_bus(pdata->mii_bus_dev); + if (ag->mii_bus == NULL) { + printk(KERN_ERR "%s: unable to find MII bus on device '%s'\n", + ag->dev->name, dev_name(pdata->mii_bus_dev)); + return -ENODEV; + } + if (pdata->phy_mask) return ag71xx_phy_connect_multi(ag); -- cgit v1.2.3