Skip to content

Commit

Permalink
netdev: bfin_mac: add Blackfin MII bus to platform bus to allow DSA a…
Browse files Browse the repository at this point in the history
…ccess

When we register the MII bus to the platfrom bus, the Distributed Switch
Architecture can hook in transparently.

Signed-off-by: Graf Yang <graf.yang@analog.com>
Signed-off-by: Mike Frysinger <vapier@gentoo.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Graf Yang authored and David S. Miller committed May 29, 2009
1 parent 015dac8 commit 080c825
Showing 1 changed file with 84 additions and 33 deletions.
117 changes: 84 additions & 33 deletions drivers/net/bfin_mac.c
Original file line number Diff line number Diff line change
Expand Up @@ -971,7 +971,8 @@ static int __devinit bfin_mac_probe(struct platform_device *pdev)
{
struct net_device *ndev;
struct bfin_mac_local *lp;
int rc, i;
struct platform_device *pd;
int rc;

ndev = alloc_etherdev(sizeof(struct bfin_mac_local));
if (!ndev) {
Expand All @@ -996,13 +997,6 @@ static int __devinit bfin_mac_probe(struct platform_device *pdev)
goto out_err_probe_mac;
}

/* set the GPIO pins to Ethernet mode */
rc = peripheral_request_list(pin_req, DRV_NAME);
if (rc) {
dev_err(&pdev->dev, "Requesting peripherals failed!\n");
rc = -EFAULT;
goto out_err_setup_pin_mux;
}

/*
* Is it valid? (Did bootloader initialize it?)
Expand All @@ -1018,26 +1012,14 @@ static int __devinit bfin_mac_probe(struct platform_device *pdev)

setup_mac_addr(ndev->dev_addr);

/* MDIO bus initial */
lp->mii_bus = mdiobus_alloc();
if (lp->mii_bus == NULL)
goto out_err_mdiobus_alloc;

lp->mii_bus->priv = ndev;
lp->mii_bus->read = bfin_mdiobus_read;
lp->mii_bus->write = bfin_mdiobus_write;
lp->mii_bus->reset = bfin_mdiobus_reset;
lp->mii_bus->name = "bfin_mac_mdio";
snprintf(lp->mii_bus->id, MII_BUS_ID_SIZE, "0");
lp->mii_bus->irq = kmalloc(sizeof(int)*PHY_MAX_ADDR, GFP_KERNEL);
for (i = 0; i < PHY_MAX_ADDR; ++i)
lp->mii_bus->irq[i] = PHY_POLL;

rc = mdiobus_register(lp->mii_bus);
if (rc) {
dev_err(&pdev->dev, "Cannot register MDIO bus!\n");
goto out_err_mdiobus_register;
if (!pdev->dev.platform_data) {
dev_err(&pdev->dev, "Cannot get platform device bfin_mii_bus!\n");
rc = -ENODEV;
goto out_err_probe_mac;
}
pd = pdev->dev.platform_data;
lp->mii_bus = platform_get_drvdata(pd);
lp->mii_bus->priv = ndev;

rc = mii_probe(ndev);
if (rc) {
Expand Down Expand Up @@ -1079,11 +1061,8 @@ static int __devinit bfin_mac_probe(struct platform_device *pdev)
out_err_request_irq:
out_err_mii_probe:
mdiobus_unregister(lp->mii_bus);
out_err_mdiobus_register:
mdiobus_free(lp->mii_bus);
out_err_mdiobus_alloc:
peripheral_free_list(pin_req);
out_err_setup_pin_mux:
out_err_probe_mac:
platform_set_drvdata(pdev, NULL);
free_netdev(ndev);
Expand All @@ -1098,8 +1077,7 @@ static int __devexit bfin_mac_remove(struct platform_device *pdev)

platform_set_drvdata(pdev, NULL);

mdiobus_unregister(lp->mii_bus);
mdiobus_free(lp->mii_bus);
lp->mii_bus->priv = NULL;

unregister_netdev(ndev);

Expand Down Expand Up @@ -1137,6 +1115,74 @@ static int bfin_mac_resume(struct platform_device *pdev)
#define bfin_mac_resume NULL
#endif /* CONFIG_PM */

static int __devinit bfin_mii_bus_probe(struct platform_device *pdev)
{
struct mii_bus *miibus;
int rc, i;

/*
* We are setting up a network card,
* so set the GPIO pins to Ethernet mode
*/
rc = peripheral_request_list(pin_req, DRV_NAME);
if (rc) {
dev_err(&pdev->dev, "Requesting peripherals failed!\n");
return rc;
}

rc = -ENOMEM;
miibus = mdiobus_alloc();
if (miibus == NULL)
goto out_err_alloc;
miibus->read = bfin_mdiobus_read;
miibus->write = bfin_mdiobus_write;
miibus->reset = bfin_mdiobus_reset;

miibus->parent = &pdev->dev;
miibus->name = "bfin_mii_bus";
snprintf(miibus->id, MII_BUS_ID_SIZE, "0");
miibus->irq = kmalloc(sizeof(int)*PHY_MAX_ADDR, GFP_KERNEL);
if (miibus->irq == NULL)
goto out_err_alloc;
for (i = 0; i < PHY_MAX_ADDR; ++i)
miibus->irq[i] = PHY_POLL;

rc = mdiobus_register(miibus);
if (rc) {
dev_err(&pdev->dev, "Cannot register MDIO bus!\n");
goto out_err_mdiobus_register;
}

platform_set_drvdata(pdev, miibus);
return 0;

out_err_mdiobus_register:
mdiobus_free(miibus);
out_err_alloc:
peripheral_free_list(pin_req);

return rc;
}

static int __devexit bfin_mii_bus_remove(struct platform_device *pdev)
{
struct mii_bus *miibus = platform_get_drvdata(pdev);
platform_set_drvdata(pdev, NULL);
mdiobus_unregister(miibus);
mdiobus_free(miibus);
peripheral_free_list(pin_req);
return 0;
}

static struct platform_driver bfin_mii_bus_driver = {
.probe = bfin_mii_bus_probe,
.remove = __devexit_p(bfin_mii_bus_remove),
.driver = {
.name = "bfin_mii_bus",
.owner = THIS_MODULE,
},
};

static struct platform_driver bfin_mac_driver = {
.probe = bfin_mac_probe,
.remove = __devexit_p(bfin_mac_remove),
Expand All @@ -1150,14 +1196,19 @@ static struct platform_driver bfin_mac_driver = {

static int __init bfin_mac_init(void)
{
return platform_driver_register(&bfin_mac_driver);
int ret;
ret = platform_driver_register(&bfin_mii_bus_driver);
if (!ret)
return platform_driver_register(&bfin_mac_driver);
return -ENODEV;
}

module_init(bfin_mac_init);

static void __exit bfin_mac_cleanup(void)
{
platform_driver_unregister(&bfin_mac_driver);
platform_driver_unregister(&bfin_mii_bus_driver);
}

module_exit(bfin_mac_cleanup);
Expand Down

0 comments on commit 080c825

Please sign in to comment.