ARM: AM43XX: board: add support for reading onboard EEPROM
authorSekhar Nori <nsekhar@ti.com>
Tue, 10 Dec 2013 09:32:15 +0000 (15:02 +0530)
committerTom Rini <trini@ti.com>
Thu, 19 Dec 2013 02:14:00 +0000 (21:14 -0500)
Add support for reading onboard EEPROM to enable
board detection.

Signed-off-by: Sekhar Nori <nsekhar@ti.com>
Signed-off-by: Lokesh Vutla <lokeshvutla@ti.com>
arch/arm/include/asm/arch-am33xx/omap.h
board/ti/am43xx/board.c
board/ti/am43xx/board.h
include/configs/am43xx_evm.h

index cf5f8b2dd0eff5446f26fbeec3ebdf6bb43e894a..7a7d91b7142a06135a30634f129279cc05fb0373 100644 (file)
@@ -27,5 +27,7 @@
 #define NON_SECURE_SRAM_START  0x402F0400
 #define NON_SECURE_SRAM_END    0x40340000
 #define SRAM_SCRATCH_SPACE_ADDR        0x40337C00
+#define AM4372_BOARD_NAME_START        SRAM_SCRATCH_SPACE_ADDR
+#define AM4372_BOARD_NAME_END  SRAM_SCRATCH_SPACE_ADDR + 0xC
 #endif
 #endif
index dcd8cbbe2bed2646d9837119e7ae1fbfd22a4b0b..4fc1a40c048822f27fcb29943475f984de48b11c 100644 (file)
@@ -9,6 +9,8 @@
  */
 
 #include <common.h>
+#include <i2c.h>
+#include <asm/errno.h>
 #include <spl.h>
 #include <asm/arch/clock.h>
 #include <asm/arch/sys_proto.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
+/*
+ * Read header information from EEPROM into global structure.
+ */
+static int read_eeprom(struct am43xx_board_id *header)
+{
+       /* Check if baseboard eeprom is available */
+       if (i2c_probe(CONFIG_SYS_I2C_EEPROM_ADDR)) {
+               printf("Could not probe the EEPROM at 0x%x\n",
+                      CONFIG_SYS_I2C_EEPROM_ADDR);
+               return -ENODEV;
+       }
+
+       /* read the eeprom using i2c */
+       if (i2c_read(CONFIG_SYS_I2C_EEPROM_ADDR, 0, 2, (uchar *)header,
+                    sizeof(struct am43xx_board_id))) {
+               printf("Could not read the EEPROM\n");
+               return -EIO;
+       }
+
+       if (header->magic != 0xEE3355AA) {
+               /*
+                * read the eeprom using i2c again,
+                * but use only a 1 byte address
+                */
+               if (i2c_read(CONFIG_SYS_I2C_EEPROM_ADDR, 0, 1, (uchar *)header,
+                            sizeof(struct am43xx_board_id))) {
+                       printf("Could not read the EEPROM at 0x%x\n",
+                              CONFIG_SYS_I2C_EEPROM_ADDR);
+                       return -EIO;
+               }
+
+               if (header->magic != 0xEE3355AA) {
+                       printf("Incorrect magic number (0x%x) in EEPROM\n",
+                              header->magic);
+                       return -EINVAL;
+               }
+       }
+
+       strncpy(am43xx_board_name, (char *)header->name, sizeof(header->name));
+       am43xx_board_name[sizeof(header->name)] = 0;
+
+       return 0;
+}
+
 #ifdef CONFIG_SPL_BUILD
 
 const struct dpll_params dpll_ddr = {
index 8ca098b82a96b8cc56faea0fff6d96da2ec049fe..9268895659376517623eb9c9397bb61fc2d10570 100644 (file)
 #ifndef _BOARD_H_
 #define _BOARD_H_
 
+#include <asm/arch/omap.h>
+
+static char *const am43xx_board_name = (char *)AM4372_BOARD_NAME_START;
+
+/*
+ * TI AM437x EVMs define a system EEPROM that defines certain sub-fields.
+ * We use these fields to in turn see what board we are on, and what
+ * that might require us to set or not set.
+ */
+#define HDR_NO_OF_MAC_ADDR     3
+#define HDR_ETH_ALEN           6
+#define HDR_NAME_LEN           8
+
+struct am43xx_board_id {
+       unsigned int  magic;
+       char name[HDR_NAME_LEN];
+       char version[4];
+       char serial[12];
+       char config[32];
+       char mac_addr[HDR_NO_OF_MAC_ADDR][HDR_ETH_ALEN];
+};
+
+static inline int board_is_eposevm(void)
+{
+       return !strncmp(am43xx_board_name, "AM43EPOS", HDR_NAME_LEN);
+}
+
+static inline int board_is_gpevm(void)
+{
+       return !strncmp(am43xx_board_name, "AM43__GP", HDR_NAME_LEN);
+}
+
 void enable_uart0_pin_mux(void);
 void enable_board_pin_mux(void);
 #endif
index 0f340780cdc93d7755d8d88da558eb6e58df8ebf..4de495a15a253463a119b4fcdfec1033850c2f4e 100644 (file)
 #define CONFIG_SYS_NS16550_REG_SIZE    (-4)
 #define CONFIG_SYS_NS16550_CLK         48000000
 
+/* I2C Configuration */
+#define CONFIG_CMD_EEPROM
+#define CONFIG_ENV_EEPROM_IS_ON_I2C
+#define CONFIG_SYS_I2C_EEPROM_ADDR     0x50    /* Main EEPROM */
+#define CONFIG_SYS_I2C_EEPROM_ADDR_LEN 2
+#define CONFIG_SYS_I2C_MULTI_EEPROMS
+
 /* SPL defines. */
 #define CONFIG_SPL_TEXT_BASE           0x40300350
 #define CONFIG_SPL_MAX_SIZE            (0x40337C00 - CONFIG_SPL_TEXT_BASE)