From c0945d1c4b23ad7b21a65dc94990c9454d8bd451 Mon Sep 17 00:00:00 2001 From: Josep Orga Date: Thu, 7 Oct 2021 19:31:01 +0200 Subject: [PATCH] imx8mn-somdevices: Read MAC from EEPROM and save it in ethaddr environment variable. Signed-off-by: Josep Orga --- arch/arm/dts/imx8mn-somdevices.dts | 5 +++ .../imx8mn_somdevices/imx8mn_somdevices.c | 40 +++++++++++++++++++ 2 files changed, 45 insertions(+) diff --git a/arch/arm/dts/imx8mn-somdevices.dts b/arch/arm/dts/imx8mn-somdevices.dts index 3c62d903e1..a3d6278abc 100644 --- a/arch/arm/dts/imx8mn-somdevices.dts +++ b/arch/arm/dts/imx8mn-somdevices.dts @@ -94,6 +94,11 @@ sda-gpios = <&gpio5 15 GPIO_ACTIVE_HIGH>; status = "okay"; + eeprom@50 { + compatible = "microchip,24c02"; + reg = <0x50>; + }; + pmic: pca9450@25 { compatible = "nxp,pca9450b"; reg = <0x25>; diff --git a/board/somdevices/imx8mn_somdevices/imx8mn_somdevices.c b/board/somdevices/imx8mn_somdevices/imx8mn_somdevices.c index 8f20e73269..2eb3f94108 100644 --- a/board/somdevices/imx8mn_somdevices/imx8mn_somdevices.c +++ b/board/somdevices/imx8mn_somdevices/imx8mn_somdevices.c @@ -28,6 +28,10 @@ DECLARE_GLOBAL_DATA_PTR; #define UART_PAD_CTRL (PAD_CTL_DSE6 | PAD_CTL_FSEL1) #define WDOG_PAD_CTRL (PAD_CTL_DSE6 | PAD_CTL_ODE | PAD_CTL_PUE | PAD_CTL_PE) +#define EEPROM_BUS_NUM 0 +#define EEPROM_ADDR 0x50 +#define EEPROM_ADDR_LEN 1 +#define EEPROM_OFFSET 0xFA static iomux_v3_cfg_t const uart_pads[] = { IMX8MN_PAD_SAI3_TXFS__UART2_DCE_RX | MUX_PAD_CTRL(UART_PAD_CTRL), @@ -71,6 +75,41 @@ static void setup_gpmi_nand(void) } #endif +int set_mac_eeprom(void) +{ + struct udevice *dev; + u8 buf[6]; + int ret; + + if (!env_get("ethaddr")) { + /* If ethaddr variable is not set in environment */ + char ethaddr[18]; + printf("Setting MAC from EEPROM\n"); + /* Configure EEPROM: 7bit address 0x50 */ + ret = i2c_get_chip_for_busnum(EEPROM_BUS_NUM, EEPROM_ADDR, EEPROM_ADDR_LEN, &dev); + if (ret) { + printf("Cannot find EEPROM for MAC: %d\n", ret); + return 0; + } + /* Reading from EEPROM */ + if (dm_i2c_read(dev, EEPROM_OFFSET, (u8 *)&buf, sizeof(buf)) < 0) { + printf("i2c EEPROM for MAC read failed\n"); + return 0; + } + sprintf(ethaddr, "%02X:%02X:%02X:%02X:%02X:%02X", + buf[0], + buf[1], + buf[2], + buf[3], + buf[4], + buf[5]); + /* Set ethaddr variable for ethernet */ + env_set("ethaddr", ethaddr); + env_save(); + } + return 0; +} + int board_early_init_f(void) { struct wdog_regs *wdog = (struct wdog_regs *)WDOG1_BASE_ADDR; @@ -330,6 +369,7 @@ int board_late_init(void) env_set("board_name", "SOMDEVICES"); env_set("board_rev", "iMX8MN"); #endif + set_mac_eeprom(); return 0; } -- 2.17.1