imx8mm-somdevices: Read MAC from EEPROM and save it in ethaddr environment variable.
authorJosep Orga <jorga@somdevices.com>
Mon, 6 Sep 2021 13:43:14 +0000 (15:43 +0200)
committerJosep Orga <jorga@somdevices.com>
Mon, 6 Sep 2021 13:43:14 +0000 (15:43 +0200)
Signed-off-by: Josep Orga <jorga@somdevices.com>
arch/arm/dts/imx8mm-somdevices.dts
board/somdevices/imx8mm_somdevices/imx8mm_somdevices.c

index 7033ae3..fb196e1 100644 (file)
        pinctrl-1 = <&pinctrl_i2c1_gpio>;
        scl-gpios = <&gpio5 14 GPIO_ACTIVE_HIGH>;
        sda-gpios = <&gpio5 15 GPIO_ACTIVE_HIGH>;
+       status = "okay";
+
+       eeprom@50 {
+               compatible = "microchip,24c02";
+               reg = <0x50>;
+       };
 
        pmic: pca9450@25 {
                reg = <0x25>;
index 0b6120e..e6ba301 100644 (file)
@@ -27,6 +27,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[] = {
        IMX8MM_PAD_SAI3_TXFS_UART2_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;
@@ -331,6 +370,7 @@ int board_late_init(void)
        env_set("board_name", "SOMDEVICES");
        env_set("board_rev", "iMX8MM");
 #endif
+       set_mac_eeprom();
        return 0;
 }