From: Ye Li <ye...@nxp.com>

Update eQoS and fec ethernet drivers to support shared MDIO framework

Signed-off-by: Ye Li <ye...@nxp.com>
Signed-off-by: Peng Fan <peng....@nxp.com>
---
 drivers/net/dwc_eth_qos.c | 45 +++++++++++++++++++++++++++++++--------------
 drivers/net/fec_mxc.c     | 16 ++++++++++++++--
 2 files changed, 45 insertions(+), 16 deletions(-)

diff --git a/drivers/net/dwc_eth_qos.c b/drivers/net/dwc_eth_qos.c
index 63f2086dec..dc2299dd69 100644
--- a/drivers/net/dwc_eth_qos.c
+++ b/drivers/net/dwc_eth_qos.c
@@ -41,6 +41,7 @@
 #include <wait_bit.h>
 #include <asm/gpio.h>
 #include <asm/io.h>
+#include <eth_phy.h>
 
 /* Core registers */
 
@@ -1083,7 +1084,14 @@ static int eqos_start(struct udevice *dev)
         * don't need to reconnect/reconfigure again
         */
        if (!eqos->phy) {
-               eqos->phy = phy_connect(eqos->mii, eqos->phyaddr, dev,
+               int addr = -1;
+#ifdef CONFIG_DM_ETH_PHY
+               addr = eth_phy_get_addr(dev);
+#endif
+#ifdef DWC_NET_PHYADDR
+               addr = DWC_NET_PHYADDR;
+#endif
+               eqos->phy = phy_connect(eqos->mii, addr, dev,
                                        eqos->config->interface(dev));
                if (!eqos->phy) {
                        pr_err("phy_connect() failed");
@@ -1810,23 +1818,32 @@ static int eqos_probe(struct udevice *dev)
                goto err_remove_resources_core;
        }
 
-       eqos->mii = mdio_alloc();
+#ifdef CONFIG_DM_ETH_PHY
+       eqos->mii = eth_phy_get_mdio_bus(dev);
+#endif
        if (!eqos->mii) {
-               pr_err("mdio_alloc() failed");
-               ret = -ENOMEM;
-               goto err_remove_resources_tegra;
-       }
-       eqos->mii->read = eqos_mdio_read;
-       eqos->mii->write = eqos_mdio_write;
-       eqos->mii->priv = eqos;
-       strcpy(eqos->mii->name, dev->name);
+               eqos->mii = mdio_alloc();
+               if (!eqos->mii) {
+                       pr_err("mdio_alloc() failed");
+                       ret = -ENOMEM;
+                       goto err_remove_resources_tegra;
+               }
+               eqos->mii->read = eqos_mdio_read;
+               eqos->mii->write = eqos_mdio_write;
+               eqos->mii->priv = eqos;
+               strcpy(eqos->mii->name, dev->name);
 
-       ret = mdio_register(eqos->mii);
-       if (ret < 0) {
-               pr_err("mdio_register() failed: %d", ret);
-               goto err_free_mdio;
+               ret = mdio_register(eqos->mii);
+               if (ret < 0) {
+                       pr_err("mdio_register() failed: %d", ret);
+                       goto err_free_mdio;
+               }
        }
 
+#ifdef CONFIG_DM_ETH_PHY
+       eth_phy_set_mdio_bus(dev, eqos->mii);
+#endif
+
        debug("%s: OK\n", __func__);
        return 0;
 
diff --git a/drivers/net/fec_mxc.c b/drivers/net/fec_mxc.c
index bc5b63d788..2c8f743a58 100644
--- a/drivers/net/fec_mxc.c
+++ b/drivers/net/fec_mxc.c
@@ -28,6 +28,7 @@
 #include <asm-generic/gpio.h>
 
 #include "fec_mxc.h"
+#include <eth_phy.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
@@ -1420,16 +1421,27 @@ static int fecmxc_probe(struct udevice *dev)
        fec_reg_setup(priv);
 
        priv->dev_id = dev->seq;
+
+#ifdef CONFIG_DM_ETH_PHY
+       bus = eth_phy_get_mdio_bus(dev);
+#endif
+
+       if (!bus) {
 #ifdef CONFIG_FEC_MXC_MDIO_BASE
-       bus = fec_get_miibus((ulong)CONFIG_FEC_MXC_MDIO_BASE, dev->seq);
+               bus = fec_get_miibus((ulong)CONFIG_FEC_MXC_MDIO_BASE, dev->seq);
 #else
-       bus = fec_get_miibus((ulong)priv->eth, dev->seq);
+               bus = fec_get_miibus((ulong)priv->eth, dev->seq);
 #endif
+       }
        if (!bus) {
                ret = -ENOMEM;
                goto err_mii;
        }
 
+#ifdef CONFIG_DM_ETH_PHY
+       eth_phy_set_mdio_bus(dev, bus);
+#endif
+
        priv->bus = bus;
        priv->interface = pdata->phy_interface;
        switch (priv->interface) {
-- 
2.16.4

Reply via email to