1
0
Fork 0
mirror of https://github.com/u-boot/u-boot.git synced 2025-04-27 07:51:38 +00:00

imx8mm-cl-iot-gate: Add support for the Realtek RTL8211E PHY

Newer imx8mm-cl-iot-gate versions are populated with a Realtek RTL8211E
PHY instead of the Atheros AR8033.

Adapted Compulab's patch from:
https://github.com/compulab-yokneam/meta-bsp-imx8mm/blob/iot-gate-imx8_5.10.72/recipes-bsp/u-boot/compulab/imx8mm/0125-imx8mm-net-enable-phy-Realtek-RTL8211E.patch

to support both PHYs in U-Boot.

Signed-off-by: Fabio Estevam <festevam@denx.de>
This commit is contained in:
Fabio Estevam 2024-05-28 16:15:10 -03:00 committed by Fabio Estevam
parent 93bfb458f4
commit fb95661116
2 changed files with 104 additions and 4 deletions
board/compulab/imx8mm-cl-iot-gate
include/configs

View file

@ -8,6 +8,7 @@
#include <efi_loader.h>
#include <env.h>
#include <extension_board.h>
#include <fdt_support.h>
#include <hang.h>
#include <i2c.h>
#include <init.h>
@ -30,6 +31,8 @@
DECLARE_GLOBAL_DATA_PTR;
static int fec_phyaddr = -1;
#if IS_ENABLED(CONFIG_EFI_HAVE_CAPSULE_SUPPORT)
struct efi_fw_image fw_images[] = {
#if defined(CONFIG_TARGET_IMX8MM_CL_IOT_GATE)
@ -109,10 +112,72 @@ static int setup_fec(void)
return 0;
}
#define FDT_PHYADDR "/soc@0/bus@30800000/ethernet@30be0000/mdio/ethernet-phy@0"
#define FLIP_32B(val) (((val >> 24) & 0xff) | ((val << 8) & 0xff0000) | ((val >> 8) & 0xff00) | ((val << 24) & 0xff000000))
static int fdt_set_fec_phy_addr(void *blob)
{
u32 val;
if (fec_phyaddr < 0)
return -EINVAL;
val = FLIP_32B(fec_phyaddr);
return fdt_find_and_setprop(blob, FDT_PHYADDR, "reg", (const void *)&val,
sizeof(val), 0);
}
int ft_board_setup(void *blob, struct bd_info *bd)
{
fdt_set_fec_phy_addr(blob);
return 0;
}
/*
* These are specific ID, purposed to distiguish between PHY vendors.
* These values are not equal to real vendors' OUI (half of MAC address)
*/
#define OUI_PHY_ATHEROS 0x1374
#define OUI_PHY_REALTEK 0x0732
int board_phy_config(struct phy_device *phydev)
{
if (IS_ENABLED(CONFIG_FEC_MXC)) {
unsigned int model, rev, oui;
int phyid1, phyid2;
unsigned int reg;
if (!IS_ENABLED(CONFIG_FEC_MXC))
return 0;
phyid1 = phy_read(phydev, MDIO_DEVAD_NONE, MII_PHYSID1);
if (phyid1 < 0) {
printf("%s: PHYID1 registry read fail %i\n", __func__, phyid1);
return phyid1;
}
phyid2 = phy_read(phydev, MDIO_DEVAD_NONE, MII_PHYSID2);
if (phyid2 < 0) {
printf("%s: PHYID2 registry read fail %i\n", __func__, phyid2);
return phyid2;
}
reg = phyid2 | phyid1 << 16;
if (reg == 0xffff) {
printf("%s: There is no device @%i\n", __func__, phydev->addr);
return -ENODEV;
}
rev = reg & 0xf;
reg >>= 4;
model = reg & 0x3f;
reg >>= 6;
oui = reg;
debug("%s: PHY @0x%x OUI 0x%06x model 0x%x rev 0x%x\n",
__func__, phydev->addr, oui, model, rev);
switch (oui) {
case OUI_PHY_ATHEROS:
/* enable rgmii rxc skew and phy mode select to RGMII copper */
printf("phy: AR803x@%x\t", phydev->addr);
phy_write(phydev, MDIO_DEVAD_NONE, 0x1d, 0x1f);
phy_write(phydev, MDIO_DEVAD_NONE, 0x1e, 0x8);
@ -120,10 +185,45 @@ int board_phy_config(struct phy_device *phydev)
phy_write(phydev, MDIO_DEVAD_NONE, 0x1e, 0x82ee);
phy_write(phydev, MDIO_DEVAD_NONE, 0x1d, 0x05);
phy_write(phydev, MDIO_DEVAD_NONE, 0x1e, 0x100);
break;
case OUI_PHY_REALTEK:
printf("phy: RTL8211E@%x\t", phydev->addr);
/* RTL8211E-VB-CG - add TX and RX delay */
unsigned short val;
if (phydev->drv->config)
phydev->drv->config(phydev);
phy_write(phydev, MDIO_DEVAD_NONE, 0x1f, 0x07);
phy_write(phydev, MDIO_DEVAD_NONE, 0x1e, 0xa4);
val = phy_read(phydev, MDIO_DEVAD_NONE, 0x1c);
val |= (0x1 << 13) | (0x1 << 12) | (0x1 << 11);
phy_write(phydev, MDIO_DEVAD_NONE, 0x1c, val);
/* LEDs: set to extension page */
phy_write(phydev, MDIO_DEVAD_NONE, 0x1f, 0x0007);
/* extension Page44 */
phy_write(phydev, MDIO_DEVAD_NONE, 0x1e, 0x002c);
phy_write(phydev, MDIO_DEVAD_NONE, 0x1c, 0x0430);//LCR
phy_write(phydev, MDIO_DEVAD_NONE, 0x1a, 0x0010);//LACR
/*
* To disable EEE LED mode (blinking .4s/2s)
* Extension Page5
*/
phy_write(phydev, MDIO_DEVAD_NONE, 0x1f, 0x0005);
phy_write(phydev, MDIO_DEVAD_NONE, 0x05, 0x8b82);//magic const
phy_write(phydev, MDIO_DEVAD_NONE, 0x06, 0x052b);//magic const
phy_write(phydev, MDIO_DEVAD_NONE, 0x1f, 0x00);// Back to Page0
break;
default:
printf("%s: ERROR: unknown PHY @0x%x OUI 0x%06x model 0x%x rev 0x%x\n",
__func__, phydev->addr, oui, model, rev);
return -ENOSYS;
}
fec_phyaddr = phydev->addr;
if (phydev->drv->config)
phydev->drv->config(phydev);
return 0;
}

View file

@ -136,7 +136,7 @@
#define CFG_SYS_FSL_USDHC_NUM 2
#define CFG_SYS_FSL_ESDHC_ADDR 0
#define CFG_FEC_MXC_PHYADDR 0
#define CFG_FEC_MXC_PHYADDR -1 /* Auto search of PHY on MII */
/* USB Configs */
#define CFG_MXC_USB_PORTSC (PORT_PTS_UTMI | PORT_PTS_PTW)