net: Update eQos driver and FEC driver to use eth phy interfaces
authorYe Li <ye.li@nxp.com>
Sun, 3 May 2020 14:41:15 +0000 (22:41 +0800)
committerStefano Babic <sbabic@denx.de>
Sun, 10 May 2020 11:24:54 +0000 (13:24 +0200)
Update eQoS and fec ethernet drivers to support shared MDIO framework

Signed-off-by: Ye Li <ye.li@nxp.com>
Signed-off-by: Peng Fan <peng.fan@nxp.com>
drivers/net/dwc_eth_qos.c
drivers/net/fec_mxc.c

index 60dfd17a74d31d55c9f4a4bd3d1f687d970ed3f9..bdddbdef7f0caa4e2fbf8c83c8234769ba3663ed 100644 (file)
@@ -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");
@@ -1820,23 +1828,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;
 
index 3046305cfb65b827f306223af81f20392e699c14..910c961a60e7a9277eabe26c4363b15c245f6bce 100644 (file)
@@ -28,6 +28,7 @@
 #include <asm-generic/gpio.h>
 
 #include "fec_mxc.h"
+#include <eth_phy.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
@@ -1444,16 +1445,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) {