From: Fugang Duan <fugang.d...@nxp.com> Implement .set_intf_mode() callback for imx8dxl.
Signed-off-by: Fugang Duan <fugang.d...@nxp.com> Signed-off-by: Joakim Zhang <qiangqing.zh...@nxp.com> --- .../net/ethernet/stmicro/stmmac/dwmac-imx.c | 34 ++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-imx.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-imx.c index 223f69da7e95..1d0a4d73add6 100644 --- a/drivers/net/ethernet/stmicro/stmmac/dwmac-imx.c +++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-imx.c @@ -6,7 +6,9 @@ * */ +#include <dt-bindings/firmware/imx/rsrc.h> #include <linux/clk.h> +#include <linux/firmware/imx/sci.h> #include <linux/gpio/consumer.h> #include <linux/kernel.h> #include <linux/mfd/syscon.h> @@ -86,7 +88,37 @@ imx8dxl_set_intf_mode(struct plat_stmmacenet_data *plat_dat) { int ret = 0; - /* TBD: depends on imx8dxl scu interfaces to be upstreamed */ + struct imx_sc_ipc *ipc_handle; + int val; + + ret = imx_scu_get_handle(&ipc_handle); + if (ret) + return ret; + + switch (plat_dat->interface) { + case PHY_INTERFACE_MODE_MII: + val = GPR_ENET_QOS_INTF_SEL_MII; + break; + case PHY_INTERFACE_MODE_RMII: + val = GPR_ENET_QOS_INTF_SEL_RMII; + break; + case PHY_INTERFACE_MODE_RGMII: + case PHY_INTERFACE_MODE_RGMII_ID: + case PHY_INTERFACE_MODE_RGMII_RXID: + case PHY_INTERFACE_MODE_RGMII_TXID: + val = GPR_ENET_QOS_INTF_SEL_RGMII; + break; + default: + pr_debug("imx dwmac doesn't support %d interface\n", + plat_dat->interface); + return -EINVAL; + } + + ret = imx_sc_misc_set_control(ipc_handle, IMX_SC_R_ENET_1, + IMX_SC_C_INTF_SEL, val >> 16); + ret |= imx_sc_misc_set_control(ipc_handle, IMX_SC_R_ENET_1, + IMX_SC_C_CLK_GEN_EN, 0x1); + return ret; } -- 2.17.1