summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFugang Duan <fugang.duan@nxp.com>2020-05-03 22:41:18 +0800
committerStefano Babic <sbabic@denx.de>2020-05-10 20:55:20 +0200
commit0e9d23945ce0b739a6ac13c11b0fdaba09a8dacc (patch)
tree12a061a51263b84da9b7f73a0b7a3a7849dd635e
parent3a97da12ee7bfa132d4ffb1ed1b224213cf81056 (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.c55
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)