Now enet clock support available for imx6qdl and imx6ul,
via CLK framework, so add enable, set_rate support in
drivers.

Signed-off-by: Jagan Teki <ja...@amarulasolutions.com>
Acked-by: Joe Hershberger <joe.hershber...@ni.com>
---
 drivers/net/fec_mxc.c | 58 ++++++++++++++++++++++++++++++++++++++++++-
 drivers/net/fec_mxc.h |  5 ++++
 2 files changed, 62 insertions(+), 1 deletion(-)

diff --git a/drivers/net/fec_mxc.c b/drivers/net/fec_mxc.c
index 3640ee3471..53b99f6654 100644
--- a/drivers/net/fec_mxc.c
+++ b/drivers/net/fec_mxc.c
@@ -8,6 +8,7 @@
  */
 
 #include <common.h>
+#include <clk-uclass.h>
 #include <dm.h>
 #include <environment.h>
 #include <malloc.h>
@@ -1297,11 +1298,52 @@ static int fec_mdio_init(struct udevice *dev)
        return mdio_register(bus);
 }
 
+#if CONFIG_IS_ENABLED(CLK)
+static int fec_clk_enable(struct fec_priv *priv)
+{
+       int ret;
+
+       ret = clk_enable(&priv->clk_ahb);
+       if (ret) {
+               printf("failed to enable ahb clk\n");
+               return ret;
+       }
+
+       if (generic_clk_valid(&priv->clk_ptp)) {
+               ret = clk_enable(&priv->clk_ptp);
+               if (ret) {
+                       printf("failed to set 50MHz rate to ptp clk\n");
+                       goto failed_clk_ahb;
+               }
+       }
+
+       if (generic_clk_valid(&priv->clk_enet_out)) {
+               ret = clk_enable(&priv->clk_enet_out);
+               if (ret) {
+                       printf("failed to set 50MHz rate to enet_out clk\n");
+                       goto failed_clk_ahb;
+               }
+       }
+
+       return 0;
+
+failed_clk_ahb:
+       clk_disable(&priv->clk_ahb);
+       return ret;
+}
+#endif
+
 static int fec_enet_init(struct fec_priv *priv)
 {
        uint32_t start;
        int ret;
 
+#if CONFIG_IS_ENABLED(CLK)
+       ret = fec_clk_enable(priv);
+       if (ret)
+               return ret;
+#endif
+
        ret = fec_alloc_descs(priv);
        if (ret)
                return ret;
@@ -1407,7 +1449,21 @@ static int fecmxc_ofdata_to_platdata(struct udevice *dev)
        }
 #endif
 
-       return ret;
+#if CONFIG_IS_ENABLED(CLK)
+       ret = clk_get_by_name(dev, "ahb", &priv->clk_ahb);
+       if (ret)
+               ret = PTR_ERR(&priv->clk_ahb);
+
+       ret = clk_get_by_name(dev, "ptp", &priv->clk_ptp);
+       if (ret)
+               dev_dbg(dev, "Warning: failed to get ptp clk\n");
+
+       ret = clk_get_by_name(dev, "enet_out", &priv->clk_enet_out);
+       if (ret)
+               dev_dbg(dev, "Warning: failed to get enet_out clk\n");
+#endif
+
+       return 0;
 }
 
 static const struct udevice_id fecmxc_ids[] = {
diff --git a/drivers/net/fec_mxc.h b/drivers/net/fec_mxc.h
index 6cf2a8b3cc..76a40053a4 100644
--- a/drivers/net/fec_mxc.h
+++ b/drivers/net/fec_mxc.h
@@ -250,6 +250,11 @@ struct fec_priv {
        struct gpio_desc reset_gpio;
        uint32_t reset_delay;
 # endif
+#if CONFIG_IS_ENABLED(CLK)
+       struct clk clk_ahb;
+       struct clk clk_ptp;
+       struct clk clk_enet_out;
+# endif
 #endif
 };
 
-- 
2.18.0.321.gffc6fa0e3

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

Reply via email to