diff options
author | Fugang Duan <fugang.duan@nxp.com> | 2020-05-03 22:41:18 +0800 |
---|---|---|
committer | Stefano Babic <sbabic@denx.de> | 2020-05-10 20:55:20 +0200 |
commit | 0e9d23945ce0b739a6ac13c11b0fdaba09a8dacc (patch) | |
tree | 12a061a51263b84da9b7f73a0b7a3a7849dd635e | |
parent | 3a97da12ee7bfa132d4ffb1ed1b224213cf81056 (diff) |
net: eqos: implement callbaks to get interface and set txclk rate
Implement the callbacks to get phy mode interface and txclk
rate configuration.
Reviewed-by: Ye Li <ye.li@nxp.com>
Signed-off-by: Fugang Duan <fugang.duan@nxp.com>
Signed-off-by: Peng Fan <peng.fan@nxp.com>
-rw-r--r-- | drivers/net/dwc_eth_qos.c | 55 |
1 files changed, 52 insertions, 3 deletions
diff --git a/drivers/net/dwc_eth_qos.c b/drivers/net/dwc_eth_qos.c index 75c70663c9..e4fc76cc06 100644 --- a/drivers/net/dwc_eth_qos.c +++ b/drivers/net/dwc_eth_qos.c @@ -42,6 +42,10 @@ #include <asm/gpio.h> #include <asm/io.h> #include <eth_phy.h> +#ifdef CONFIG_ARCH_IMX8M +#include <asm/arch/clock.h> +#include <asm/mach-imx/sys_proto.h> +#endif /* Core registers */ @@ -867,11 +871,19 @@ static ulong eqos_get_tick_clk_rate_stm32(struct udevice *dev) #endif } -static ulong eqos_get_tick_clk_rate_imx(struct udevice *dev) +__weak u32 imx_get_eqos_csr_clk(void) { - /* TODO: retrieve from CSR clock */ return 100 * 1000000; } +__weak int imx_eqos_txclk_set_rate(unsigned long rate) +{ + return 0; +} + +static ulong eqos_get_tick_clk_rate_imx(struct udevice *dev) +{ + return imx_get_eqos_csr_clk(); +} static int eqos_calibrate_pads_stm32(struct udevice *dev) { @@ -996,6 +1008,33 @@ static int eqos_set_tx_clk_speed_stm32(struct udevice *dev) static int eqos_set_tx_clk_speed_imx(struct udevice *dev) { + struct eqos_priv *eqos = dev_get_priv(dev); + ulong rate; + int ret; + + debug("%s(dev=%p):\n", __func__, dev); + + switch (eqos->phy->speed) { + case SPEED_1000: + rate = 125 * 1000 * 1000; + break; + case SPEED_100: + rate = 25 * 1000 * 1000; + break; + case SPEED_10: + rate = 2.5 * 1000 * 1000; + break; + default: + pr_err("invalid speed %d", eqos->phy->speed); + return -EINVAL; + } + + ret = imx_eqos_txclk_set_rate(rate); + if (ret < 0) { + pr_err("imx (tx_clk, %lu) failed: %d", rate, ret); + return ret; + } + return 0; } @@ -1873,7 +1912,17 @@ static int eqos_probe_resources_imx(struct udevice *dev) static phy_interface_t eqos_get_interface_imx(struct udevice *dev) { - return PHY_INTERFACE_MODE_RGMII; + const char *phy_mode; + phy_interface_t interface = PHY_INTERFACE_MODE_NONE; + + debug("%s(dev=%p):\n", __func__, dev); + + phy_mode = fdt_getprop(gd->fdt_blob, dev_of_offset(dev), "phy-mode", + NULL); + if (phy_mode) + interface = phy_get_interface_by_name(phy_mode); + + return interface; } static int eqos_remove_resources_tegra186(struct udevice *dev) |