Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge branch 'stmmac-imx93'

Clark Wang says:

====================
stmmac: Add eqos and fec support for imx93

This patchset add imx93 support for dwmac-imx glue driver.
There are some changes of GPR implement.
And add fec and eqos nodes for imx93 dts.
====================

Signed-off-by: David S. Miller <davem@davemloft.net>

+180 -6
+1
Documentation/devicetree/bindings/net/fsl,fec.yaml
··· 51 51 - fsl,imx8mm-fec 52 52 - fsl,imx8mn-fec 53 53 - fsl,imx8mp-fec 54 + - fsl,imx93-fec 54 55 - const: fsl,imx8mq-fec 55 56 - const: fsl,imx6sx-fec 56 57 - items:
+3 -1
Documentation/devicetree/bindings/net/nxp,dwmac-imx.yaml
··· 4 4 $id: http://devicetree.org/schemas/net/nxp,dwmac-imx.yaml# 5 5 $schema: http://devicetree.org/meta-schemas/core.yaml# 6 6 7 - title: NXP i.MX8 DWMAC glue layer 7 + title: NXP i.MX8/9 DWMAC glue layer 8 8 9 9 maintainers: 10 10 - Clark Wang <xiaoning.wang@nxp.com> ··· 19 19 enum: 20 20 - nxp,imx8mp-dwmac-eqos 21 21 - nxp,imx8dxl-dwmac-eqos 22 + - nxp,imx93-dwmac-eqos 22 23 required: 23 24 - compatible 24 25 ··· 33 32 - enum: 34 33 - nxp,imx8mp-dwmac-eqos 35 34 - nxp,imx8dxl-dwmac-eqos 35 + - nxp,imx93-dwmac-eqos 36 36 - const: snps,dwmac-5.10a 37 37 38 38 clocks:
+78
arch/arm64/boot/dts/freescale/imx93-11x11-evk.dts
··· 35 35 status = "okay"; 36 36 }; 37 37 38 + &eqos { 39 + pinctrl-names = "default"; 40 + pinctrl-0 = <&pinctrl_eqos>; 41 + phy-mode = "rgmii-id"; 42 + phy-handle = <&ethphy1>; 43 + status = "okay"; 44 + 45 + mdio { 46 + compatible = "snps,dwmac-mdio"; 47 + #address-cells = <1>; 48 + #size-cells = <0>; 49 + clock-frequency = <5000000>; 50 + 51 + ethphy1: ethernet-phy@1 { 52 + reg = <1>; 53 + eee-broken-1000t; 54 + }; 55 + }; 56 + }; 57 + 58 + &fec { 59 + pinctrl-names = "default"; 60 + pinctrl-0 = <&pinctrl_fec>; 61 + phy-mode = "rgmii-id"; 62 + phy-handle = <&ethphy2>; 63 + fsl,magic-packet; 64 + status = "okay"; 65 + 66 + mdio { 67 + #address-cells = <1>; 68 + #size-cells = <0>; 69 + clock-frequency = <5000000>; 70 + 71 + ethphy2: ethernet-phy@2 { 72 + reg = <2>; 73 + eee-broken-1000t; 74 + }; 75 + }; 76 + }; 77 + 38 78 &lpuart1 { /* console */ 39 79 pinctrl-names = "default"; 40 80 pinctrl-0 = <&pinctrl_uart1>; ··· 105 65 }; 106 66 107 67 &iomuxc { 68 + pinctrl_eqos: eqosgrp { 69 + fsl,pins = < 70 + MX93_PAD_ENET1_MDC__ENET_QOS_MDC 0x57e 71 + MX93_PAD_ENET1_MDIO__ENET_QOS_MDIO 0x57e 72 + MX93_PAD_ENET1_RD0__ENET_QOS_RGMII_RD0 0x57e 73 + MX93_PAD_ENET1_RD1__ENET_QOS_RGMII_RD1 0x57e 74 + MX93_PAD_ENET1_RD2__ENET_QOS_RGMII_RD2 0x57e 75 + MX93_PAD_ENET1_RD3__ENET_QOS_RGMII_RD3 0x57e 76 + MX93_PAD_ENET1_RXC__CCM_ENET_QOS_CLOCK_GENERATE_RX_CLK 0x5fe 77 + MX93_PAD_ENET1_RX_CTL__ENET_QOS_RGMII_RX_CTL 0x57e 78 + MX93_PAD_ENET1_TD0__ENET_QOS_RGMII_TD0 0x57e 79 + MX93_PAD_ENET1_TD1__ENET_QOS_RGMII_TD1 0x57e 80 + MX93_PAD_ENET1_TD2__ENET_QOS_RGMII_TD2 0x57e 81 + MX93_PAD_ENET1_TD3__ENET_QOS_RGMII_TD3 0x57e 82 + MX93_PAD_ENET1_TXC__CCM_ENET_QOS_CLOCK_GENERATE_TX_CLK 0x5fe 83 + MX93_PAD_ENET1_TX_CTL__ENET_QOS_RGMII_TX_CTL 0x57e 84 + >; 85 + }; 86 + 87 + pinctrl_fec: fecgrp { 88 + fsl,pins = < 89 + MX93_PAD_ENET2_MDC__ENET1_MDC 0x57e 90 + MX93_PAD_ENET2_MDIO__ENET1_MDIO 0x57e 91 + MX93_PAD_ENET2_RD0__ENET1_RGMII_RD0 0x57e 92 + MX93_PAD_ENET2_RD1__ENET1_RGMII_RD1 0x57e 93 + MX93_PAD_ENET2_RD2__ENET1_RGMII_RD2 0x57e 94 + MX93_PAD_ENET2_RD3__ENET1_RGMII_RD3 0x57e 95 + MX93_PAD_ENET2_RXC__ENET1_RGMII_RXC 0x5fe 96 + MX93_PAD_ENET2_RX_CTL__ENET1_RGMII_RX_CTL 0x57e 97 + MX93_PAD_ENET2_TD0__ENET1_RGMII_TD0 0x57e 98 + MX93_PAD_ENET2_TD1__ENET1_RGMII_TD1 0x57e 99 + MX93_PAD_ENET2_TD2__ENET1_RGMII_TD2 0x57e 100 + MX93_PAD_ENET2_TD3__ENET1_RGMII_TD3 0x57e 101 + MX93_PAD_ENET2_TXC__ENET1_RGMII_TXC 0x5fe 102 + MX93_PAD_ENET2_TX_CTL__ENET1_RGMII_TX_CTL 0x57e 103 + >; 104 + }; 105 + 108 106 pinctrl_uart1: uart1grp { 109 107 fsl,pins = < 110 108 MX93_PAD_UART1_RXD__LPUART1_RX 0x31e
+48
arch/arm64/boot/dts/freescale/imx93.dtsi
··· 536 536 status = "disabled"; 537 537 }; 538 538 539 + eqos: ethernet@428a0000 { 540 + compatible = "nxp,imx93-dwmac-eqos", "snps,dwmac-5.10a"; 541 + reg = <0x428a0000 0x10000>; 542 + interrupts = <GIC_SPI 183 IRQ_TYPE_LEVEL_HIGH>, 543 + <GIC_SPI 184 IRQ_TYPE_LEVEL_HIGH>; 544 + interrupt-names = "eth_wake_irq", "macirq"; 545 + clocks = <&clk IMX93_CLK_ENET_QOS_GATE>, 546 + <&clk IMX93_CLK_ENET_QOS_GATE>, 547 + <&clk IMX93_CLK_ENET_TIMER2>, 548 + <&clk IMX93_CLK_ENET>, 549 + <&clk IMX93_CLK_ENET_QOS_GATE>; 550 + clock-names = "stmmaceth", "pclk", "ptp_ref", "tx", "mem"; 551 + assigned-clocks = <&clk IMX93_CLK_ENET_TIMER2>, 552 + <&clk IMX93_CLK_ENET>; 553 + assigned-clock-parents = <&clk IMX93_CLK_SYS_PLL_PFD1_DIV2>, 554 + <&clk IMX93_CLK_SYS_PLL_PFD0_DIV2>; 555 + assigned-clock-rates = <100000000>, <250000000>; 556 + intf_mode = <&wakeupmix_gpr 0x28>; 557 + clk_csr = <0>; 558 + status = "disabled"; 559 + }; 560 + 561 + fec: ethernet@42890000 { 562 + compatible = "fsl,imx93-fec", "fsl,imx8mq-fec", "fsl,imx6sx-fec"; 563 + reg = <0x42890000 0x10000>; 564 + interrupts = <GIC_SPI 179 IRQ_TYPE_LEVEL_HIGH>, 565 + <GIC_SPI 180 IRQ_TYPE_LEVEL_HIGH>, 566 + <GIC_SPI 181 IRQ_TYPE_LEVEL_HIGH>, 567 + <GIC_SPI 182 IRQ_TYPE_LEVEL_HIGH>; 568 + clocks = <&clk IMX93_CLK_ENET1_GATE>, 569 + <&clk IMX93_CLK_ENET1_GATE>, 570 + <&clk IMX93_CLK_ENET_TIMER1>, 571 + <&clk IMX93_CLK_ENET_REF>, 572 + <&clk IMX93_CLK_ENET_REF_PHY>; 573 + clock-names = "ipg", "ahb", "ptp", 574 + "enet_clk_ref", "enet_out"; 575 + assigned-clocks = <&clk IMX93_CLK_ENET_TIMER1>, 576 + <&clk IMX93_CLK_ENET_REF>, 577 + <&clk IMX93_CLK_ENET_REF_PHY>; 578 + assigned-clock-parents = <&clk IMX93_CLK_SYS_PLL_PFD1_DIV2>, 579 + <&clk IMX93_CLK_SYS_PLL_PFD0_DIV2>, 580 + <&clk IMX93_CLK_SYS_PLL_PFD1_DIV2>; 581 + assigned-clock-rates = <100000000>, <250000000>, <50000000>; 582 + fsl,num-tx-queues = <3>; 583 + fsl,num-rx-queues = <3>; 584 + status = "disabled"; 585 + }; 586 + 539 587 usdhc3: mmc@428b0000 { 540 588 compatible = "fsl,imx93-usdhc", "fsl,imx8mm-usdhc"; 541 589 reg = <0x428b0000 0x10000>;
+50 -5
drivers/net/ethernet/stmicro/stmmac/dwmac-imx.c
··· 31 31 #define GPR_ENET_QOS_CLK_TX_CLK_SEL (0x1 << 20) 32 32 #define GPR_ENET_QOS_RGMII_EN (0x1 << 21) 33 33 34 + #define MX93_GPR_ENET_QOS_INTF_MODE_MASK GENMASK(3, 0) 35 + #define MX93_GPR_ENET_QOS_INTF_SEL_MII (0x0 << 1) 36 + #define MX93_GPR_ENET_QOS_INTF_SEL_RMII (0x4 << 1) 37 + #define MX93_GPR_ENET_QOS_INTF_SEL_RGMII (0x1 << 1) 38 + #define MX93_GPR_ENET_QOS_CLK_GEN_EN (0x1 << 0) 39 + 34 40 struct imx_dwmac_ops { 35 41 u32 addr_width; 36 42 bool mac_rgmii_txclk_auto_adj; ··· 95 89 /* TBD: depends on imx8dxl scu interfaces to be upstreamed */ 96 90 return ret; 97 91 } 92 + 93 + static int imx93_set_intf_mode(struct plat_stmmacenet_data *plat_dat) 94 + { 95 + struct imx_priv_data *dwmac = plat_dat->bsp_priv; 96 + int val; 97 + 98 + switch (plat_dat->interface) { 99 + case PHY_INTERFACE_MODE_MII: 100 + val = MX93_GPR_ENET_QOS_INTF_SEL_MII; 101 + break; 102 + case PHY_INTERFACE_MODE_RMII: 103 + val = MX93_GPR_ENET_QOS_INTF_SEL_RMII; 104 + break; 105 + case PHY_INTERFACE_MODE_RGMII: 106 + case PHY_INTERFACE_MODE_RGMII_ID: 107 + case PHY_INTERFACE_MODE_RGMII_RXID: 108 + case PHY_INTERFACE_MODE_RGMII_TXID: 109 + val = MX93_GPR_ENET_QOS_INTF_SEL_RGMII; 110 + break; 111 + default: 112 + dev_dbg(dwmac->dev, "imx dwmac doesn't support %d interface\n", 113 + plat_dat->interface); 114 + return -EINVAL; 115 + } 116 + 117 + val |= MX93_GPR_ENET_QOS_CLK_GEN_EN; 118 + return regmap_update_bits(dwmac->intf_regmap, dwmac->intf_reg_off, 119 + MX93_GPR_ENET_QOS_INTF_MODE_MASK, val); 120 + }; 98 121 99 122 static int imx_dwmac_clks_config(void *priv, bool enabled) 100 123 { ··· 223 188 } 224 189 225 190 dwmac->clk_mem = NULL; 226 - if (of_machine_is_compatible("fsl,imx8dxl")) { 191 + 192 + if (of_machine_is_compatible("fsl,imx8dxl") || 193 + of_machine_is_compatible("fsl,imx93")) { 227 194 dwmac->clk_mem = devm_clk_get(dev, "mem"); 228 195 if (IS_ERR(dwmac->clk_mem)) { 229 196 dev_err(dev, "failed to get mem clock\n"); ··· 233 196 } 234 197 } 235 198 236 - if (of_machine_is_compatible("fsl,imx8mp")) { 237 - /* Binding doc describes the property: 238 - is required by i.MX8MP. 239 - is optional for i.MX8DXL. 199 + if (of_machine_is_compatible("fsl,imx8mp") || 200 + of_machine_is_compatible("fsl,imx93")) { 201 + /* Binding doc describes the propety: 202 + * is required by i.MX8MP, i.MX93. 203 + * is optinoal for i.MX8DXL. 240 204 */ 241 205 dwmac->intf_regmap = syscon_regmap_lookup_by_phandle(np, "intf_mode"); 242 206 if (IS_ERR(dwmac->intf_regmap)) ··· 334 296 .set_intf_mode = imx8dxl_set_intf_mode, 335 297 }; 336 298 299 + static struct imx_dwmac_ops imx93_dwmac_data = { 300 + .addr_width = 32, 301 + .mac_rgmii_txclk_auto_adj = true, 302 + .set_intf_mode = imx93_set_intf_mode, 303 + }; 304 + 337 305 static const struct of_device_id imx_dwmac_match[] = { 338 306 { .compatible = "nxp,imx8mp-dwmac-eqos", .data = &imx8mp_dwmac_data }, 339 307 { .compatible = "nxp,imx8dxl-dwmac-eqos", .data = &imx8dxl_dwmac_data }, 308 + { .compatible = "nxp,imx93-dwmac-eqos", .data = &imx93_dwmac_data }, 340 309 { } 341 310 }; 342 311 MODULE_DEVICE_TABLE(of, imx_dwmac_match);