diff options
author | Ye Li <ye.li@nxp.com> | 2019-04-09 21:00:51 -0700 |
---|---|---|
committer | Ye Li <ye.li@nxp.com> | 2020-04-23 02:03:53 -0700 |
commit | 6f8fe6a0173eb0d2c70e1595abc4b0f87daa702f (patch) | |
tree | 514a37a00e84ef51ca0a087a0bf055e1465a682f /drivers/net | |
parent | b74c8729284716b465eeca789d92a74a02ca825f (diff) |
MLK-21838 net: fec_mxc: Update driver to use more clks for iMX8
Add support for more clocks used by iMX8 from DTB:
ref_clock, tx_2x_clock, ahb_clock
And update get clock rate interface to support multiple fec ports.
Signed-off-by: Ye Li <ye.li@nxp.com>
Diffstat (limited to 'drivers/net')
-rw-r--r-- | drivers/net/fec_mxc.c | 45 |
1 files changed, 37 insertions, 8 deletions
diff --git a/drivers/net/fec_mxc.c b/drivers/net/fec_mxc.c index 9103ec7d2c..7b6387b806 100644 --- a/drivers/net/fec_mxc.c +++ b/drivers/net/fec_mxc.c @@ -6,7 +6,6 @@ * (C) Copyright 2007 Pengutronix, Sascha Hauer <s.hauer@pengutronix.de> * (C) Copyright 2007 Pengutronix, Juergen Beisert <j.beisert@pengutronix.de> */ - #include <common.h> #include <cpu_func.h> #include <dm.h> @@ -141,7 +140,7 @@ static int fec_get_clk_rate(void *udev, int idx) CONFIG_IS_ENABLED(CLK_CCF)) { dev = udev; if (!dev) { - ret = uclass_get_device(UCLASS_ETH, idx, &dev); + ret = uclass_get_device_by_seq(UCLASS_ETH, idx, &dev); if (ret < 0) { debug("Can't get FEC udev: %d\n", ret); return ret; @@ -158,7 +157,7 @@ static int fec_get_clk_rate(void *udev, int idx) } } -static void fec_mii_setspeed(struct ethernet_regs *eth) +static void fec_mii_setspeed(struct ethernet_regs *eth, int idx) { /* * Set MII_SPEED = (1/(mii_speed * 2)) * System Clock @@ -180,7 +179,7 @@ static void fec_mii_setspeed(struct ethernet_regs *eth) u32 hold; int ret; - ret = fec_get_clk_rate(NULL, 0); + ret = fec_get_clk_rate(NULL, idx); if (ret < 0) { printf("Can't find FEC0 clk rate: %d\n", ret); return; @@ -602,7 +601,7 @@ static int fec_init(struct eth_device *dev, bd_t *bd) fec_reg_setup(fec); if (fec->xcv_type != SEVENWIRE) - fec_mii_setspeed(fec->bus->priv); + fec_mii_setspeed(fec->bus->priv, fec->dev_id); /* Set Opcode/Pause Duration Register */ writel(0x00010020, &fec->eth->op_pause); /* FIXME 0xffff0020; */ @@ -1082,7 +1081,7 @@ struct mii_dev *fec_get_miibus(ulong base_addr, int dev_id) free(bus); return NULL; } - fec_mii_setspeed(eth); + fec_mii_setspeed(eth, dev_id); return bus; } @@ -1155,7 +1154,7 @@ static int fec_probe(bd_t *bd, int dev_id, uint32_t base_addr, fec_set_dev_name(edev->name, dev_id); fec->dev_id = (dev_id == -1) ? 0 : dev_id; fec->bus = bus; - fec_mii_setspeed(bus->priv); + fec_mii_setspeed(bus->priv, fec->dev_id); #ifdef CONFIG_PHYLIB fec->phydev = phydev; phy_connect_dev(phydev, edev); @@ -1338,6 +1337,7 @@ static int fecmxc_probe(struct udevice *dev) int ret; if (IS_ENABLED(CONFIG_IMX8)) { + struct clk clk_2x_txclk; ret = clk_get_by_name(dev, "ipg", &priv->ipg_clk); if (ret < 0) { debug("Can't get FEC ipg clk: %d\n", ret); @@ -1349,6 +1349,35 @@ static int fecmxc_probe(struct udevice *dev) 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 < 0) { + debug("Can't enable FEC ahb clk: %d\n", ret); + return ret; + } + + ret = clk_get_by_name(dev, "enet_clk_ref", &priv->clk_ref); + if (ret >= 0) { + ret = clk_enable(&priv->clk_ref); + if (ret < 0) { + debug("Can't enable FEC ref clk: %d\n", ret); + return ret; + } + } + + ret = clk_get_by_name(dev, "enet_2x_txclk", &clk_2x_txclk); + if (ret >= 0) { + ret = clk_enable(&clk_2x_txclk); + if (ret < 0) { + debug("Can't enable FEC 2x_tx clk: %d\n", ret); + 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); @@ -1423,7 +1452,6 @@ static int fecmxc_probe(struct udevice *dev) } fec_reg_setup(priv); - priv->dev_id = dev->seq; #ifdef CONFIG_FEC_MXC_MDIO_BASE bus = fec_get_miibus((ulong)CONFIG_FEC_MXC_MDIO_BASE, dev->seq); @@ -1548,6 +1576,7 @@ static const struct udevice_id fecmxc_ids[] = { { .compatible = "fsl,imx53-fec" }, { .compatible = "fsl,imx7d-fec" }, { .compatible = "fsl,mvf600-fec" }, + { .compatible = "fsl,imx8qm-fec" }, { } }; |