[U-Boot] [PATCH V4 5/6] net: fec_mxc: support i.MX8M with CLK_CCF
Peng Fan
peng.fan at nxp.com
Fri Oct 25 09:48:02 UTC 2019
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.
Reviewed-by: Frieder Schrempf <frieder.schrempf at kontron.de>
Signed-off-by: Peng Fan <peng.fan at nxp.com>
---
V4:
Fix build warning
Add R-b
V3:
Drop unneeded else
correct ipg->ahb
Other patches keep V1
V2:
Use CONFIG_IS_ENABLED
drivers/net/fec_mxc.c | 79 +++++++++++++++++++++++++++++++++++++++++----------
drivers/net/fec_mxc.h | 4 +++
2 files changed, 68 insertions(+), 15 deletions(-)
diff --git a/drivers/net/fec_mxc.c b/drivers/net/fec_mxc.c
index 080dbcf7db..131d1998a7 100644
--- a/drivers/net/fec_mxc.c
+++ b/drivers/net/fec_mxc.c
@@ -123,30 +123,38 @@ static int fec_mdio_read(struct ethernet_regs *eth, uint8_t phyaddr,
return val;
}
+#ifndef imx_get_fecclk
+u32 __weak imx_get_fecclk(void)
+{
+ return 0;
+}
+#endif
+
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 +1343,47 @@ 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;
+ }
+ ret = clk_enable(&priv->ipg_clk);
+ if(ret)
+ return ret;
+
+ ret = clk_get_by_name(dev, "ahb", &priv->ahb_clk);
+ if (ret < 0) {
+ debug("Can't get FEC ahb clk: %d\n", ret);
+ return ret;
+ }
+ 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
More information about the U-Boot
mailing list