From: Magnus Damm <d...@opensource.se> Extend the sh_eth driver to also support RZ/A2. While at it fix the RZ/A1 handling to also take the Ethernet controller base address from the DT node.
Tested on: - RZ/A1H Genmai (MII) with U2 uPD60610 by Renesas - RZ/A2M GR-Mango (ch0 MII) with U13 LAN8710 by Mikrochip - RZ/A2M RZA2MBTC + emoEdgeExpanderV2 (ch1 RMII) with IC1 RTL8201 by Realtek Signed-off-by: Magnus Damm <d...@opensource.se> --- Changes since v2: - new patch drivers/net/sh_eth.c | 16 ++++++++++++---- drivers/net/sh_eth.h | 31 ++++++++++++++++--------------- 2 files changed, 28 insertions(+), 19 deletions(-) --- 0013/drivers/net/sh_eth.c +++ work/drivers/net/sh_eth.c 2025-07-05 17:45:07.333754799 +0900 @@ -144,10 +144,10 @@ static int sh_eth_reset(struct sh_eth_in { #if defined(SH_ETH_TYPE_GETHER) || defined(SH_ETH_TYPE_RZ) int ret = 0, i; - +#if !defined(CONFIG_RZA2) /* Start e-dmac transmitter and receiver */ sh_eth_write(port_info, EDSR_ENALL, EDSR); - +#endif /* Perform a software reset and wait for it to complete */ sh_eth_write(port_info, EDMR_SRST, EDMR); for (i = 0; i < TIMEOUT_CNT; i++) { @@ -215,9 +215,11 @@ static int sh_eth_tx_desc_init(struct sh sh_eth_write(port_info, ADDR_TO_PHY(port_info->tx_desc_base), TDLAR); #if defined(SH_ETH_TYPE_GETHER) || defined(SH_ETH_TYPE_RZ) sh_eth_write(port_info, ADDR_TO_PHY(port_info->tx_desc_base), TDFAR); +#if !defined(CONFIG_RZA2) sh_eth_write(port_info, ADDR_TO_PHY(cur_tx_desc), TDFXR); sh_eth_write(port_info, 0x01, TDFFR);/* Last discriptor bit */ #endif +#endif err: return ret; @@ -282,9 +284,11 @@ static int sh_eth_rx_desc_init(struct sh sh_eth_write(port_info, ADDR_TO_PHY(port_info->rx_desc_base), RDLAR); #if defined(SH_ETH_TYPE_GETHER) || defined(SH_ETH_TYPE_RZ) sh_eth_write(port_info, ADDR_TO_PHY(port_info->rx_desc_base), RDFAR); +#if !defined(CONFIG_RZA2) sh_eth_write(port_info, ADDR_TO_PHY(cur_rx_desc), RDFXR); sh_eth_write(port_info, RDFFR_RDLF, RDFFR); #endif +#endif return ret; @@ -408,7 +412,7 @@ static int sh_eth_phy_regs_config(struct sh_eth_write(port_info, GECMR_100B, GECMR); #elif defined(CONFIG_CPU_SH7757) || defined(CONFIG_CPU_SH7752) sh_eth_write(port_info, 1, RTRATE); -#elif defined(CONFIG_RCAR_GEN2) || defined(CONFIG_R8A77980) +#elif defined(CONFIG_RCAR_GEN2) || defined(CONFIG_R8A77980) || defined(CONFIG_RZA2) val = ECMR_RTM; #endif } else if (phy->speed == 10) { @@ -722,8 +726,11 @@ static int sh_ether_probe(struct udevice goto err_mdio_register; priv->bus = mdiodev; - +#ifdef BASE_IO_ADDR port_info->iobase = (void __iomem *)(uintptr_t)BASE_IO_ADDR; +#else + port_info->iobase = (void __iomem *)pdata->iobase; +#endif #if CONFIG_IS_ENABLED(CLK) ret = clk_enable(&priv->clk); @@ -797,6 +804,7 @@ int sh_ether_of_to_plat(struct udevice * static const struct udevice_id sh_ether_ids[] = { { .compatible = "renesas,ether-r7s72100" }, + { .compatible = "renesas,ether-r7s9210" }, { .compatible = "renesas,ether-r8a7790" }, { .compatible = "renesas,ether-r8a7791" }, { .compatible = "renesas,ether-r8a7793" }, --- 0013/drivers/net/sh_eth.h +++ work/drivers/net/sh_eth.h 2025-07-05 17:42:00.409687244 +0900 @@ -339,9 +339,10 @@ static const u16 sh_eth_offset_fast_sh4[ #elif defined(CONFIG_RCAR_GEN2) #define SH_ETH_TYPE_ETHER #define BASE_IO_ADDR 0xEE700200 -#elif defined(CONFIG_R7S72100) +#elif defined(CONFIG_RZA1) +#define SH_ETH_TYPE_RZ +#elif defined(CONFIG_RZA2) #define SH_ETH_TYPE_RZ -#define BASE_IO_ADDR 0xE8203000 #elif defined(CONFIG_R8A77980) #define SH_ETH_TYPE_GETHER #define BASE_IO_ADDR 0xE7400000 @@ -351,7 +352,7 @@ static const u16 sh_eth_offset_fast_sh4[ * Register's bits * Copy from Linux driver source code */ -#if defined(SH_ETH_TYPE_GETHER) || defined(SH_ETH_TYPE_RZ) +#if defined(SH_ETH_TYPE_GETHER) || defined(CONFIG_RZA1) /* EDSR */ enum EDSR_BIT { EDSR_ENT = 0x01, EDSR_ENR = 0x02, @@ -363,11 +364,11 @@ enum EDSR_BIT { enum DMAC_M_BIT { EDMR_NBST = 0x80, /* DMA transfer burst mode */ EDMR_DL1 = 0x20, EDMR_DL0 = 0x10, -#if defined(SH_ETH_TYPE_GETHER) || defined(SH_ETH_TYPE_RZ) +#if defined(SH_ETH_TYPE_GETHER) || defined(CONFIG_RZA1) EDMR_SRST = 0x03, /* Receive/Send reset */ EMDR_DESC_R = 0x30, /* Descriptor reserve size */ EDMR_EL = 0x40, /* Litte endian */ -#elif defined(SH_ETH_TYPE_ETHER) +#elif defined(SH_ETH_TYPE_ETHER) || defined(CONFIG_RZA2) EDMR_SRST = 0x01, EMDR_DESC_R = 0x30, /* Descriptor reserve size */ EDMR_EL = 0x40, /* Litte endian */ @@ -389,7 +390,7 @@ enum DMAC_M_BIT { /* EDTRR */ enum DMAC_T_BIT { -#if defined(SH_ETH_TYPE_GETHER) || defined(SH_ETH_TYPE_RZ) +#if defined(SH_ETH_TYPE_GETHER) || defined(CONFIG_RZA1) EDTRR_TRNS = 0x03, #else EDTRR_TRNS = 0x01, @@ -434,7 +435,7 @@ enum PHY_STATUS_BIT { PHY_ST_LINK = 0x01 /* EESR */ enum EESR_BIT { -#if defined(SH_ETH_TYPE_ETHER) +#if defined(SH_ETH_TYPE_ETHER) || defined(CONFIG_RZA1) EESR_TWB = 0x40000000, #else EESR_TWB = 0xC0000000, @@ -451,7 +452,7 @@ enum EESR_BIT { EESR_FTC = 0x00200000, EESR_TDE = 0x00100000, EESR_TFE = 0x00080000, EESR_FRC = 0x00040000, EESR_RDE = 0x00020000, EESR_RFE = 0x00010000, -#if defined(SH_ETH_TYPE_ETHER) +#if defined(SH_ETH_TYPE_ETHER) || defined(CONFIG_RZA1) EESR_CND = 0x00000800, #endif EESR_DLC = 0x00000400, @@ -539,7 +540,7 @@ enum TD_STS_BIT { enum RECV_RST_BIT { RMCR_RST = 0x01, }; /* ECMR */ enum FELIC_MODE_BIT { -#if defined(SH_ETH_TYPE_GETHER) || defined(SH_ETH_TYPE_RZ) +#if defined(SH_ETH_TYPE_GETHER) || defined(CONFIG_RZA1) ECMR_TRCCM = 0x04000000, ECMR_RCSC = 0x00800000, ECMR_DPAD = 0x00200000, ECMR_RZPF = 0x00100000, #endif @@ -550,16 +551,16 @@ enum FELIC_MODE_BIT { ECMR_PRM = 0x00000001, #ifdef CONFIG_CPU_SH7724 ECMR_RTM = 0x00000010, -#elif defined(CONFIG_RCAR_GEN2) || defined (CONFIG_R8A77980) +#elif defined(CONFIG_RCAR_GEN2) || defined (CONFIG_R8A77980) || defined(CONFIG_RZA2) ECMR_RTM = 0x00000004, #endif }; -#if defined(SH_ETH_TYPE_GETHER) || defined(SH_ETH_TYPE_RZ) +#if defined(SH_ETH_TYPE_GETHER) || defined(CONFIG_RZA1) #define ECMR_CHG_DM (ECMR_TRCCM | ECMR_RZPF | ECMR_ZPF | ECMR_PFR | \ ECMR_RXF | ECMR_TXF | ECMR_MCT) -#elif defined(SH_ETH_TYPE_ETHER) +#elif defined(SH_ETH_TYPE_ETHER) || defined(CONFIG_RZA2) #define ECMR_CHG_DM (ECMR_ZPF | ECMR_PFR | ECMR_RXF | ECMR_TXF) #else #define ECMR_CHG_DM (ECMR_ZPF | ECMR_PFR | ECMR_RXF | ECMR_TXF | ECMR_MCT) @@ -640,11 +641,11 @@ enum FIFO_SIZE_BIT { static inline unsigned long sh_eth_reg_addr(struct sh_eth_info *port, int enum_index) { -#if defined(SH_ETH_TYPE_GETHER) || defined(SH_ETH_TYPE_RZ) +#if defined(SH_ETH_TYPE_GETHER) const u16 *reg_offset = sh_eth_offset_gigabit; -#elif defined(SH_ETH_TYPE_ETHER) +#elif defined(SH_ETH_TYPE_ETHER) || defined(CONFIG_RZA2) const u16 *reg_offset = sh_eth_offset_fast_sh4; -#elif defined(SH_ETH_TYPE_RZ) +#elif defined(CONFIG_RZA1) const u16 *reg_offset = sh_eth_offset_rz; #else #error