|
@@ -29,7 +29,7 @@
|
|
#include <linux/slab.h>
|
|
#include <linux/slab.h>
|
|
#include <linux/of.h>
|
|
#include <linux/of.h>
|
|
#include <linux/of_gpio.h>
|
|
#include <linux/of_gpio.h>
|
|
-
|
|
|
|
|
|
+#include <linux/of_mdio.h>
|
|
#include <asm/io.h>
|
|
#include <asm/io.h>
|
|
|
|
|
|
#include "stmmac.h"
|
|
#include "stmmac.h"
|
|
@@ -200,10 +200,29 @@ int stmmac_mdio_register(struct net_device *ndev)
|
|
struct stmmac_priv *priv = netdev_priv(ndev);
|
|
struct stmmac_priv *priv = netdev_priv(ndev);
|
|
struct stmmac_mdio_bus_data *mdio_bus_data = priv->plat->mdio_bus_data;
|
|
struct stmmac_mdio_bus_data *mdio_bus_data = priv->plat->mdio_bus_data;
|
|
int addr, found;
|
|
int addr, found;
|
|
|
|
+ struct device_node *mdio_node = NULL;
|
|
|
|
+ struct device_node *child_node = NULL;
|
|
|
|
|
|
if (!mdio_bus_data)
|
|
if (!mdio_bus_data)
|
|
return 0;
|
|
return 0;
|
|
|
|
|
|
|
|
+ if (IS_ENABLED(CONFIG_OF)) {
|
|
|
|
+ for_each_child_of_node(priv->device->of_node, child_node) {
|
|
|
|
+ if (of_device_is_compatible(child_node,
|
|
|
|
+ "snps,dwmac-mdio")) {
|
|
|
|
+ mdio_node = child_node;
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (mdio_node) {
|
|
|
|
+ netdev_dbg(ndev, "FOUND MDIO subnode\n");
|
|
|
|
+ } else {
|
|
|
|
+ netdev_err(ndev, "NO MDIO subnode\n");
|
|
|
|
+ return 0;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
new_bus = mdiobus_alloc();
|
|
new_bus = mdiobus_alloc();
|
|
if (new_bus == NULL)
|
|
if (new_bus == NULL)
|
|
return -ENOMEM;
|
|
return -ENOMEM;
|
|
@@ -231,7 +250,8 @@ int stmmac_mdio_register(struct net_device *ndev)
|
|
new_bus->irq = irqlist;
|
|
new_bus->irq = irqlist;
|
|
new_bus->phy_mask = mdio_bus_data->phy_mask;
|
|
new_bus->phy_mask = mdio_bus_data->phy_mask;
|
|
new_bus->parent = priv->device;
|
|
new_bus->parent = priv->device;
|
|
- err = mdiobus_register(new_bus);
|
|
|
|
|
|
+
|
|
|
|
+ err = of_mdiobus_register(new_bus, mdio_node);
|
|
if (err != 0) {
|
|
if (err != 0) {
|
|
pr_err("%s: Cannot register as MDIO bus\n", new_bus->name);
|
|
pr_err("%s: Cannot register as MDIO bus\n", new_bus->name);
|
|
goto bus_register_fail;
|
|
goto bus_register_fail;
|
|
@@ -284,7 +304,7 @@ int stmmac_mdio_register(struct net_device *ndev)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
- if (!found) {
|
|
|
|
|
|
+ if (!found && !mdio_node) {
|
|
pr_warn("%s: No PHY found\n", ndev->name);
|
|
pr_warn("%s: No PHY found\n", ndev->name);
|
|
mdiobus_unregister(new_bus);
|
|
mdiobus_unregister(new_bus);
|
|
mdiobus_free(new_bus);
|
|
mdiobus_free(new_bus);
|