imx8mn-somdevices: Read MAC from EEPROM and save it in ethaddr environment variable.
authorJosep Orga <jorga@somdevices.com>
Thu, 7 Oct 2021 17:31:01 +0000 (19:31 +0200)
committerJosep Orga <jorga@somdevices.com>
Thu, 7 Oct 2021 17:31:01 +0000 (19:31 +0200)
Signed-off-by: Josep Orga <jorga@somdevices.com>
arch/arm/dts/imx8mn-somdevices.dts
board/somdevices/imx8mn_somdevices/imx8mn_somdevices.c

index 3c62d90..a3d6278 100644 (file)
        sda-gpios = <&gpio5 15 GPIO_ACTIVE_HIGH>;
        status = "okay";
 
+       eeprom@50 {
+               compatible = "microchip,24c02";
+               reg = <0x50>;
+       };
+
        pmic: pca9450@25 {
                compatible = "nxp,pca9450b";
                reg = <0x25>;
index 8f20e73..2eb3f94 100644 (file)
@@ -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;
 }