[PATCH 7/9] net: dwc_eth_qos: Add board_interface_eth_init() for i.MX8M Plus
Ramon Fried
rfried.dev at gmail.com
Sat Feb 4 01:32:13 CET 2023
On Thu, Jan 19, 2023 at 11:45 PM Marek Vasut <marex at denx.de> wrote:
>
> Implement common board_interface_eth_init() and call it from the DWMAC
> driver to configure IOMUXC GPR[1] register according to the PHY mode
> obtained from DT. This supports all three interface modes supported by
> the i.MX8M Plus DWMAC and supersedes current board-side configuration
> of the same IOMUX GPR[1] duplicated in the board files.
>
> Signed-off-by: Marek Vasut <marex at denx.de>
> ---
> Cc: "Ariel D'Alessandro" <ariel.dalessandro at collabora.com>
> Cc: "NXP i.MX U-Boot Team" <uboot-imx at nxp.com>
> Cc: Andrey Zhizhikin <andrey.zhizhikin at leica-geosystems.com>
> Cc: Fabio Estevam <festevam at gmail.com>
> Cc: Joe Hershberger <joe.hershberger at ni.com>
> Cc: Lukasz Majewski <lukma at denx.de>
> Cc: Marcel Ziswiler <marcel.ziswiler at toradex.com>
> Cc: Marek Vasut <marex at denx.de>
> Cc: Michael Trimarchi <michael at amarulasolutions.com>
> Cc: Peng Fan <peng.fan at nxp.com>
> Cc: Ramon Fried <rfried.dev at gmail.com>
> Cc: Sean Anderson <seanga2 at gmail.com>
> Cc: Stefano Babic <sbabic at denx.de>
> Cc: Tim Harvey <tharvey at gateworks.com>
> Cc: Tommaso Merciai <tommaso.merciai at amarulasolutions.com>
> Cc: u-boot at lists.denx.de
> ---
> arch/arm/include/asm/arch-imx8m/imx-regs.h | 8 ++++-
> arch/arm/mach-imx/imx8m/clock_imx8mm.c | 37 ++++++++++++++++++++++
> drivers/net/dwc_eth_qos_imx.c | 4 +++
> 3 files changed, 48 insertions(+), 1 deletion(-)
>
> diff --git a/arch/arm/include/asm/arch-imx8m/imx-regs.h b/arch/arm/include/asm/arch-imx8m/imx-regs.h
> index 20f4699a12b..88e7f7dc557 100644
> --- a/arch/arm/include/asm/arch-imx8m/imx-regs.h
> +++ b/arch/arm/include/asm/arch-imx8m/imx-regs.h
> @@ -85,7 +85,13 @@
> #define DDRC_IPS_BASE_ADDR(X) (0x3d400000 + ((X) * 0x2000000))
> #define DDR_CSD1_BASE_ADDR 0x40000000
>
> -#define IOMUXC_GPR_GPR1_GPR_ENET_QOS_INTF_SEL_MASK 0x70000
> +#define IOMUXC_GPR_GPR1_GPR_ENET_QOS_RGMII_EN BIT(21)
> +#define IOMUXC_GPR_GPR1_GPR_ENET_QOS_CLK_TX_CLK_SEL BIT(20)
> +#define IOMUXC_GPR_GPR1_GPR_ENET_QOS_CLK_GEN_EN BIT(19)
> +#define IOMUXC_GPR_GPR1_GPR_ENET_QOS_INTF_SEL_MASK GENMASK(18, 16)
> +#define IOMUXC_GPR_GPR1_GPR_ENET_QOS_INTF_SEL_MII (0 << 16)
> +#define IOMUXC_GPR_GPR1_GPR_ENET_QOS_INTF_SEL_RGMII (1 << 16)
> +#define IOMUXC_GPR_GPR1_GPR_ENET_QOS_INTF_SEL_RMII (4 << 16)
> #define FEC_QUIRK_ENET_MAC
>
> #define CAAM_ARB_BASE_ADDR (0x00100000)
> diff --git a/arch/arm/mach-imx/imx8m/clock_imx8mm.c b/arch/arm/mach-imx/imx8m/clock_imx8mm.c
> index 494bfbedc8c..069087c2cfd 100644
> --- a/arch/arm/mach-imx/imx8m/clock_imx8mm.c
> +++ b/arch/arm/mach-imx/imx8m/clock_imx8mm.c
> @@ -15,6 +15,7 @@
> #include <errno.h>
> #include <linux/bitops.h>
> #include <linux/delay.h>
> +#include <phy.h>
>
> DECLARE_GLOBAL_DATA_PTR;
>
> @@ -872,6 +873,42 @@ int set_clk_eqos(enum enet_freq type)
>
> return 0;
> }
> +
> +int board_interface_eth_init(struct udevice *dev, phy_interface_t interface_type)
> +{
> + struct iomuxc_gpr_base_regs *gpr =
> + (struct iomuxc_gpr_base_regs *)IOMUXC_GPR_BASE_ADDR;
> +
> + clrbits_le32(&gpr->gpr[1],
> + IOMUXC_GPR_GPR1_GPR_ENET_QOS_INTF_SEL_MASK |
> + IOMUXC_GPR_GPR1_GPR_ENET_QOS_RGMII_EN |
> + IOMUXC_GPR_GPR1_GPR_ENET_QOS_CLK_TX_CLK_SEL |
> + IOMUXC_GPR_GPR1_GPR_ENET_QOS_CLK_GEN_EN);
> +
> + switch (interface_type) {
> + case PHY_INTERFACE_MODE_MII:
> + setbits_le32(&gpr->gpr[1],
> + IOMUXC_GPR_GPR1_GPR_ENET_QOS_CLK_GEN_EN |
> + IOMUXC_GPR_GPR1_GPR_ENET_QOS_INTF_SEL_MII);
> + break;
> + case PHY_INTERFACE_MODE_RMII:
> + setbits_le32(&gpr->gpr[1],
> + IOMUXC_GPR_GPR1_GPR_ENET_QOS_CLK_TX_CLK_SEL |
> + IOMUXC_GPR_GPR1_GPR_ENET_QOS_CLK_GEN_EN |
> + IOMUXC_GPR_GPR1_GPR_ENET_QOS_INTF_SEL_RMII);
> + break;
> + case PHY_INTERFACE_MODE_RGMII:
> + setbits_le32(&gpr->gpr[1],
> + IOMUXC_GPR_GPR1_GPR_ENET_QOS_RGMII_EN |
> + IOMUXC_GPR_GPR1_GPR_ENET_QOS_CLK_GEN_EN |
> + IOMUXC_GPR_GPR1_GPR_ENET_QOS_INTF_SEL_RGMII);
> + break;
> + default:
> + return -EINVAL;
> + }
> +
> + return 0;
> +}
> #endif
>
> #ifdef CONFIG_FEC_MXC
> diff --git a/drivers/net/dwc_eth_qos_imx.c b/drivers/net/dwc_eth_qos_imx.c
> index 55080257623..f8f4cbc0257 100644
> --- a/drivers/net/dwc_eth_qos_imx.c
> +++ b/drivers/net/dwc_eth_qos_imx.c
> @@ -54,6 +54,10 @@ static int eqos_probe_resources_imx(struct udevice *dev)
> return -EINVAL;
> }
>
> + ret = board_interface_eth_init(dev, interface);
> + if (ret)
> + return -EINVAL;
> +
> eqos->max_speed = dev_read_u32_default(dev, "max-speed", 0);
>
> ret = clk_get_by_name(dev, "stmmaceth", &eqos->clk_master_bus);
> --
> 2.39.0
>
Reviewed-by: Ramon Fried <rfried.dev at gmail.com>
More information about the U-Boot
mailing list