Add more clks for fec_mxc according to Linux Kernel 5.4.0-rc1
drivers/net/ethernet/freescale/fec_main.c.

Since i.MX8MQ not support CLK_CCF, so add a check to restrict
the code only effect when CONFIG_IMX8M and CONFIG_CLK_CCF both defined.

Signed-off-by: Peng Fan <peng....@nxp.com>
---

V2:
 Drop CONFIG_IMX8M and use CONFIG_IS_ENABLED
 Other patches are still kept V1

 drivers/net/fec_mxc.c | 74 ++++++++++++++++++++++++++++++++++++++++-----------
 drivers/net/fec_mxc.h |  4 +++
 2 files changed, 63 insertions(+), 15 deletions(-)

diff --git a/drivers/net/fec_mxc.c b/drivers/net/fec_mxc.c
index 080dbcf7db..abb1923045 100644
--- a/drivers/net/fec_mxc.c
+++ b/drivers/net/fec_mxc.c
@@ -125,28 +125,29 @@ static int fec_mdio_read(struct ethernet_regs *eth, 
uint8_t phyaddr,
 
 static int fec_get_clk_rate(void *udev, int idx)
 {
-#if IS_ENABLED(CONFIG_IMX8)
        struct fec_priv *fec;
        struct udevice *dev;
        int ret;
 
-       dev = udev;
-       if (!dev) {
-               ret = uclass_get_device(UCLASS_ETH, idx, &dev);
-               if (ret < 0) {
-                       debug("Can't get FEC udev: %d\n", ret);
-                       return ret;
+       if (IS_ENABLED(CONFIG_IMX8) ||
+           CONFIG_IS_ENABLED(CLK_CCF)) {
+               dev = udev;
+               if (!dev) {
+                       ret = uclass_get_device(UCLASS_ETH, idx, &dev);
+                       if (ret < 0) {
+                               debug("Can't get FEC udev: %d\n", ret);
+                               return ret;
+                       }
                }
-       }
 
-       fec = dev_get_priv(dev);
-       if (fec)
-               return fec->clk_rate;
+               fec = dev_get_priv(dev);
+               if (fec)
+                       return fec->clk_rate;
 
-       return -EINVAL;
-#else
-       return imx_get_fecclk();
-#endif
+               return -EINVAL;
+       } else {
+               return imx_get_fecclk();
+       }
 }
 
 static void fec_mii_setspeed(struct ethernet_regs *eth)
@@ -1335,6 +1336,49 @@ static int fecmxc_probe(struct udevice *dev)
                        return ret;
                }
 
+               priv->clk_rate = clk_get_rate(&priv->ipg_clk);
+       } else if (CONFIG_IS_ENABLED(CLK_CCF)) {
+               ret = clk_get_by_name(dev, "ipg", &priv->ipg_clk);
+               if (ret < 0) {
+                       debug("Can't get FEC ipg clk: %d\n", ret);
+                       return ret;
+               } else {
+                       ret = clk_enable(&priv->ipg_clk);
+                       if(ret)
+                               return ret;
+               }
+
+               ret = clk_get_by_name(dev, "ipg", &priv->ahb_clk);
+               if (ret < 0) {
+                       debug("Can't get FEC ahb clk: %d\n", ret);
+                       return ret;
+               } else {
+                       ret = clk_enable(&priv->ahb_clk);
+                       if (ret)
+                               return ret;
+               }
+
+               ret = clk_get_by_name(dev, "enet_out", &priv->clk_enet_out);
+               if (!ret) {
+                       ret = clk_enable(&priv->clk_enet_out);
+                       if (ret)
+                               return ret;
+               }
+
+               ret = clk_get_by_name(dev, "enet_clk_ref", &priv->clk_ref);
+               if (!ret) {
+                       ret = clk_enable(&priv->clk_ref);
+                       if (ret)
+                               return ret;
+               }
+
+               ret = clk_get_by_name(dev, "ptp", &priv->clk_ptp);
+               if (!ret) {
+                       ret = clk_enable(&priv->clk_ptp);
+                       if (ret)
+                               return ret;
+               }
+
                priv->clk_rate = clk_get_rate(&priv->ipg_clk);
        }
 
diff --git a/drivers/net/fec_mxc.h b/drivers/net/fec_mxc.h
index e5f2dd75c5..723b06a651 100644
--- a/drivers/net/fec_mxc.h
+++ b/drivers/net/fec_mxc.h
@@ -264,6 +264,10 @@ struct fec_priv {
        u32 interface;
 #endif
        struct clk ipg_clk;
+       struct clk ahb_clk;
+       struct clk clk_enet_out;
+       struct clk clk_ref;
+       struct clk clk_ptp;
        u32 clk_rate;
 };
 
-- 
2.16.4

_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
https://lists.denx.de/listinfo/u-boot

Reply via email to