Commit b65f63ee authored by David S. Miller's avatar David S. Miller

Merge branch 'cadence'

Boris BREZILLON says:

====================
net/cadence/macb: add support for dt phy definition

This patch series adds support for ethernet phy definition using device
tree.

This may help in moving some at91 boards to dt (some of them define an
interrupt pin).

Tested on samad31ek.
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents b4de77ad 8c038e7e
...@@ -81,6 +81,14 @@ &pinctrl_adc0_ad4 ...@@ -81,6 +81,14 @@ &pinctrl_adc0_ad4
macb1: ethernet@f802c000 { macb1: ethernet@f802c000 {
phy-mode = "rmii"; phy-mode = "rmii";
#address-cells = <1>;
#size-cells = <0>;
phy0: ethernet-phy@0 {
interrupt-parent = <&pioE>;
interrupts = <30 IRQ_TYPE_EDGE_FALLING>;
reg = <1>;
};
}; };
pinctrl@fffff200 { pinctrl@fffff200 {
......
...@@ -27,6 +27,7 @@ ...@@ -27,6 +27,7 @@
#include <linux/phy.h> #include <linux/phy.h>
#include <linux/of.h> #include <linux/of.h>
#include <linux/of_device.h> #include <linux/of_device.h>
#include <linux/of_mdio.h>
#include <linux/of_net.h> #include <linux/of_net.h>
#include <linux/pinctrl/consumer.h> #include <linux/pinctrl/consumer.h>
...@@ -314,6 +315,7 @@ static int macb_mii_probe(struct net_device *dev) ...@@ -314,6 +315,7 @@ static int macb_mii_probe(struct net_device *dev)
int macb_mii_init(struct macb *bp) int macb_mii_init(struct macb *bp)
{ {
struct macb_platform_data *pdata; struct macb_platform_data *pdata;
struct device_node *np;
int err = -ENXIO, i; int err = -ENXIO, i;
/* Enable management port */ /* Enable management port */
...@@ -335,21 +337,46 @@ int macb_mii_init(struct macb *bp) ...@@ -335,21 +337,46 @@ int macb_mii_init(struct macb *bp)
bp->mii_bus->parent = &bp->dev->dev; bp->mii_bus->parent = &bp->dev->dev;
pdata = bp->pdev->dev.platform_data; pdata = bp->pdev->dev.platform_data;
if (pdata)
bp->mii_bus->phy_mask = pdata->phy_mask;
bp->mii_bus->irq = kmalloc(sizeof(int)*PHY_MAX_ADDR, GFP_KERNEL); bp->mii_bus->irq = kmalloc(sizeof(int)*PHY_MAX_ADDR, GFP_KERNEL);
if (!bp->mii_bus->irq) { if (!bp->mii_bus->irq) {
err = -ENOMEM; err = -ENOMEM;
goto err_out_free_mdiobus; goto err_out_free_mdiobus;
} }
for (i = 0; i < PHY_MAX_ADDR; i++)
bp->mii_bus->irq[i] = PHY_POLL;
dev_set_drvdata(&bp->dev->dev, bp->mii_bus); dev_set_drvdata(&bp->dev->dev, bp->mii_bus);
if (mdiobus_register(bp->mii_bus)) np = bp->pdev->dev.of_node;
if (np) {
/* try dt phy registration */
err = of_mdiobus_register(bp->mii_bus, np);
/* fallback to standard phy registration if no phy were
found during dt phy registration */
if (!err && !phy_find_first(bp->mii_bus)) {
for (i = 0; i < PHY_MAX_ADDR; i++) {
struct phy_device *phydev;
phydev = mdiobus_scan(bp->mii_bus, i);
if (IS_ERR(phydev)) {
err = PTR_ERR(phydev);
break;
}
}
if (err)
goto err_out_unregister_bus;
}
} else {
for (i = 0; i < PHY_MAX_ADDR; i++)
bp->mii_bus->irq[i] = PHY_POLL;
if (pdata)
bp->mii_bus->phy_mask = pdata->phy_mask;
err = mdiobus_register(bp->mii_bus);
}
if (err)
goto err_out_free_mdio_irq; goto err_out_free_mdio_irq;
if (macb_mii_probe(bp->dev) != 0) { if (macb_mii_probe(bp->dev) != 0) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment