ti: AM437x: Use generic EEPROM detection logic
authorNishanth Menon <nm@ti.com>
Wed, 24 Feb 2016 18:30:56 +0000 (12:30 -0600)
committerTom Rini <trini@konsulko.com>
Mon, 14 Mar 2016 23:18:34 +0000 (19:18 -0400)
Now that we have a generic TI eeprom logic which can be reused across
platforms, reuse the same.

This revision also includes fixes identified by Dave Gerlach
<d-gerlach@ti.com>

Cc: Dave Gerlach <d-gerlach@ti.com>
Signed-off-by: Nishanth Menon <nm@ti.com>
Signed-off-by: Steven Kipisz <s-kipisz2@ti.com>
Signed-off-by: Lokesh Vutla <lokeshvutla@ti.com>
Reviewed-by: Tom Rini <trini@konsulko.com>
arch/arm/Kconfig
board/ti/am43xx/Kconfig
board/ti/am43xx/board.c
board/ti/am43xx/board.h
board/ti/am43xx/mux.c

index 3d2928d..653ecc8 100644 (file)
@@ -381,6 +381,7 @@ config TARGET_AM43XX_EVM
        bool "Support am43xx_evm"
        select CPU_V7
        select SUPPORT_SPL
+       select TI_I2C_BOARD_DETECT
 
 config TARGET_BAV335X
        bool "Support bav335x"
index 8d1c168..9cb80cc 100644 (file)
@@ -12,4 +12,6 @@ config SYS_SOC
 config SYS_CONFIG_NAME
        default "am43xx_evm"
 
+source "board/ti/common/Kconfig"
+
 endif
index 770726c..d208d2f 100644 (file)
@@ -19,6 +19,7 @@
 #include <asm/arch/ddr_defs.h>
 #include <asm/arch/gpio.h>
 #include <asm/emif.h>
+#include "../common/board_detect.h"
 #include "board.h"
 #include <power/pmic.h>
 #include <power/tps65218.h>
@@ -37,48 +38,9 @@ static struct ctrl_dev *cdev = (struct ctrl_dev *)CTRL_DEVICE_BASE;
 /*
  * Read header information from EEPROM into global structure.
  */
-static int read_eeprom(struct am43xx_board_id *header)
+static inline int __maybe_unused read_eeprom(void)
 {
-       /* 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;
-
-       strncpy(am43xx_board_rev, (char *)header->version, sizeof(header->version));
-       am43xx_board_rev[sizeof(header->version)] = 0;
-
-       return 0;
+       return ti_i2c_eeprom_am_get(-1, CONFIG_SYS_I2C_EEPROM_ADDR);
 }
 
 #ifndef CONFIG_SKIP_LOWLEVEL_INIT
@@ -374,6 +336,9 @@ const struct dpll_params *get_dpll_ddr_params(void)
 {
        int ind = get_sys_clk_index();
 
+       if (read_eeprom() < 0)
+               return NULL;
+
        if (board_is_eposevm())
                return &epos_evm_dpll_ddr[ind];
        else if (board_is_gpevm() || board_is_sk())
@@ -381,7 +346,7 @@ const struct dpll_params *get_dpll_ddr_params(void)
        else if (board_is_idk())
                return &idk_dpll_ddr;
 
-       printf(" Board '%s' not supported\n", am43xx_board_name);
+       printf(" Board '%s' not supported\n", board_ti_get_name());
        return NULL;
 }
 
@@ -512,16 +477,29 @@ void scale_vcores_idk(u32 m)
        }
 }
 
+void gpi2c_init(void)
+{
+       /* When needed to be invoked prior to BSS initialization */
+       static bool first_time = true;
+
+       if (first_time) {
+               enable_i2c0_pin_mux();
+               i2c_init(CONFIG_SYS_OMAP24_I2C_SPEED,
+                        CONFIG_SYS_OMAP24_I2C_SLAVE);
+               first_time = false;
+       }
+}
+
 void scale_vcores(void)
 {
        const struct dpll_params *mpu_params;
-       struct am43xx_board_id header;
 
-       enable_i2c0_pin_mux();
-       i2c_init(CONFIG_SYS_OMAP24_I2C_SPEED, CONFIG_SYS_OMAP24_I2C_SLAVE);
-       if (read_eeprom(&header) < 0)
+       if (read_eeprom() < 0)
                puts("Could not get board ID.\n");
 
+       /* Ensure I2C is initialized for PMIC configuration */
+       gpi2c_init();
+
        /* Get the frequency */
        mpu_params = get_dpll_mpu_params();
 
@@ -558,6 +536,8 @@ static void enable_vtt_regulator(void)
 
 void sdram_init(void)
 {
+       if (read_eeprom() < 0)
+               return;
        /*
         * EPOS EVM has 1GB LPDDR2 connected to EMIF.
         * GP EMV has 1GB DDR3 connected to EMIF
@@ -655,20 +635,7 @@ int board_init(void)
 int board_late_init(void)
 {
 #ifdef CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG
-       char safe_string[HDR_NAME_LEN + 1];
-       struct am43xx_board_id header;
-
-       if (read_eeprom(&header) < 0)
-               puts("Could not get board ID.\n");
-
-       /* Now set variables based on the header. */
-       strncpy(safe_string, (char *)header.name, sizeof(header.name));
-       safe_string[sizeof(header.name)] = 0;
-       setenv("board_name", safe_string);
-
-       strncpy(safe_string, (char *)header.version, sizeof(header.version));
-       safe_string[sizeof(header.version)] = 0;
-       setenv("board_rev", safe_string);
+       set_board_info_env(NULL);
 #endif
        return 0;
 }
index eb9493e..2cf7a77 100644 (file)
 
 #include <asm/arch/omap.h>
 
-static char *const am43xx_board_name = (char *)AM4372_BOARD_NAME_START;
-static char *const am43xx_board_rev = (char *)AM4372_BOARD_VERSION_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
-
-#define DEV_ATTR_MAX_OFFSET    5
-#define DEV_ATTR_MIN_OFFSET    0
-
-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];
-};
+#define DEV_ATTR_MAX_OFFSET    5
+#define DEV_ATTR_MIN_OFFSET    0
 
 static inline int board_is_eposevm(void)
 {
-       return !strncmp(am43xx_board_name, "AM43EPOS", HDR_NAME_LEN);
+       return board_ti_is("AM43EPOS");
 }
 
 static inline int board_is_gpevm(void)
 {
-       return !strncmp(am43xx_board_name, "AM43__GP", HDR_NAME_LEN);
+       return board_ti_is("AM43__GP");
 }
 
 static inline int board_is_sk(void)
 {
-       return !strncmp(am43xx_board_name, "AM43__SK", HDR_NAME_LEN);
+       return board_ti_is("AM43__SK");
 }
 
 static inline int board_is_idk(void)
 {
-       return !strncmp(am43xx_board_name, "AM43_IDK", HDR_NAME_LEN);
+       return board_ti_is("AM43_IDK");
 }
 
 static inline int board_is_evm_14_or_later(void)
 {
-       return (board_is_gpevm() && strncmp("1.4", am43xx_board_rev, 3) <= 0);
+       return (board_is_gpevm() && strncmp("1.4", board_ti_get_rev(), 3) <= 0);
 }
 
 static inline int board_is_evm_12_or_later(void)
 {
-       return (board_is_gpevm() && strncmp("1.2", am43xx_board_rev, 3) <= 0);
+       return (board_is_gpevm() && strncmp("1.2", board_ti_get_rev(), 3) <= 0);
 }
 
 void enable_uart0_pin_mux(void);
index 510477d..e03b1bc 100644 (file)
@@ -9,6 +9,7 @@
 #include <common.h>
 #include <asm/arch/sys_proto.h>
 #include <asm/arch/mux.h>
+#include "../common/board_detect.h"
 #include "board.h"
 
 static struct module_pin_mux rmii1_pin_mux[] = {