ti: AM335x: Use generic EEPROM detection logic
authorNishanth Menon <nm@ti.com>
Wed, 24 Feb 2016 18:30:55 +0000 (12:30 -0600)
committerTom Rini <trini@konsulko.com>
Mon, 14 Mar 2016 23:18:33 +0000 (19:18 -0400)
Use the generic EEPROM detection logic instead of duplicating the AM
eeprom logic.

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/am335x/Kconfig
board/ti/am335x/board.c
board/ti/am335x/board.h
board/ti/am335x/mux.c

index 6e5544f..3d2928d 100644 (file)
@@ -368,6 +368,7 @@ config TARGET_AM335X_EVM
        select DM
        select DM_SERIAL
        select DM_GPIO
        select DM
        select DM_SERIAL
        select DM_GPIO
+       select TI_I2C_BOARD_DETECT
 
 config TARGET_AM335X_SL50
        bool "Support am335x_sl50"
 
 config TARGET_AM335X_SL50
        bool "Support am335x_sl50"
index 49b73ab..11ef3ca 100644 (file)
@@ -38,4 +38,6 @@ config NOR_BOOT
          as the ROM only partially sets up pinmux.  We also default to using
          NOR for environment.
 
          as the ROM only partially sets up pinmux.  We also default to using
          NOR for environment.
 
+source "board/ti/common/Kconfig"
+
 endif
 endif
index f56d17e..4330be6 100644 (file)
@@ -31,6 +31,7 @@
 #include <environment.h>
 #include <watchdog.h>
 #include <environment.h>
 #include <environment.h>
 #include <watchdog.h>
 #include <environment.h>
+#include "../common/board_detect.h"
 #include "board.h"
 
 DECLARE_GLOBAL_DATA_PTR;
 #include "board.h"
 
 DECLARE_GLOBAL_DATA_PTR;
@@ -46,43 +47,9 @@ static struct ctrl_dev *cdev = (struct ctrl_dev *)CTRL_DEVICE_BASE;
 /*
  * Read header information from EEPROM into global structure.
  */
 /*
  * Read header information from EEPROM into global structure.
  */
-static int read_eeprom(struct am335x_baseboard_id *header)
+static inline int __maybe_unused read_eeprom(void)
 {
 {
-       /* Check if baseboard eeprom is available */
-       if (i2c_probe(CONFIG_SYS_I2C_EEPROM_ADDR)) {
-               puts("Could not probe the EEPROM; something fundamentally "
-                       "wrong on the I2C bus.\n");
-               return -ENODEV;
-       }
-
-       /* read the eeprom using i2c */
-       if (i2c_read(CONFIG_SYS_I2C_EEPROM_ADDR, 0, 2, (uchar *)header,
-                    sizeof(struct am335x_baseboard_id))) {
-               puts("Could not read the EEPROM; something fundamentally"
-                       " wrong on the I2C bus.\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 am335x_baseboard_id))) {
-                       puts("Could not read the EEPROM; something "
-                               "fundamentally wrong on the I2C bus.\n");
-                       return -EIO;
-               }
-
-               if (header->magic != 0xEE3355AA) {
-                       printf("Incorrect magic number (0x%x) in EEPROM\n",
-                                       header->magic);
-                       return -EINVAL;
-               }
-       }
-
-       return 0;
+       return ti_i2c_eeprom_am_get(-1, CONFIG_SYS_I2C_EEPROM_ADDR);
 }
 
 #ifndef CONFIG_SKIP_LOWLEVEL_INIT
 }
 
 #ifndef CONFIG_SKIP_LOWLEVEL_INIT
@@ -223,16 +190,15 @@ const struct dpll_params dpll_ddr_bone_black = {
 
 void am33xx_spl_board_init(void)
 {
 
 void am33xx_spl_board_init(void)
 {
-       struct am335x_baseboard_id header;
        int mpu_vdd;
 
        int mpu_vdd;
 
-       if (read_eeprom(&header) < 0)
+       if (read_eeprom() < 0)
                puts("Could not get board ID.\n");
 
        /* Get the frequency */
        dpll_mpu_opp100.m = am335x_get_efuse_mpu_max_freq(cdev);
 
                puts("Could not get board ID.\n");
 
        /* Get the frequency */
        dpll_mpu_opp100.m = am335x_get_efuse_mpu_max_freq(cdev);
 
-       if (board_is_bone(&header) || board_is_bone_lt(&header)) {
+       if (board_is_bone() || board_is_bone_lt()) {
                /* BeagleBone PMIC Code */
                int usb_cur_lim;
 
                /* BeagleBone PMIC Code */
                int usb_cur_lim;
 
@@ -240,8 +206,7 @@ void am33xx_spl_board_init(void)
                 * Only perform PMIC configurations if board rev > A1
                 * on Beaglebone White
                 */
                 * Only perform PMIC configurations if board rev > A1
                 * on Beaglebone White
                 */
-               if (board_is_bone(&header) && !strncmp(header.version,
-                                                      "00A1", 4))
+               if (board_is_bone() && !strncmp(board_ti_get_rev(), "00A1", 4))
                        return;
 
                if (i2c_probe(TPS65217_CHIP_PM))
                        return;
 
                if (i2c_probe(TPS65217_CHIP_PM))
@@ -251,7 +216,7 @@ void am33xx_spl_board_init(void)
                 * On Beaglebone White we need to ensure we have AC power
                 * before increasing the frequency.
                 */
                 * On Beaglebone White we need to ensure we have AC power
                 * before increasing the frequency.
                 */
-               if (board_is_bone(&header)) {
+               if (board_is_bone()) {
                        uchar pmic_status_reg;
                        if (tps65217_reg_read(TPS65217_STATUS,
                                              &pmic_status_reg))
                        uchar pmic_status_reg;
                        if (tps65217_reg_read(TPS65217_STATUS,
                                              &pmic_status_reg))
@@ -266,7 +231,7 @@ void am33xx_spl_board_init(void)
                 * Override what we have detected since we know if we have
                 * a Beaglebone Black it supports 1GHz.
                 */
                 * Override what we have detected since we know if we have
                 * a Beaglebone Black it supports 1GHz.
                 */
-               if (board_is_bone_lt(&header))
+               if (board_is_bone_lt())
                        dpll_mpu_opp100.m = MPUPLL_M_1000;
 
                /*
                        dpll_mpu_opp100.m = MPUPLL_M_1000;
 
                /*
@@ -307,7 +272,7 @@ void am33xx_spl_board_init(void)
                 * Set LDO3, LDO4 output voltage to 3.3V for Beaglebone.
                 * Set LDO3 to 1.8V and LDO4 to 3.3V for Beaglebone Black.
                 */
                 * Set LDO3, LDO4 output voltage to 3.3V for Beaglebone.
                 * Set LDO3 to 1.8V and LDO4 to 3.3V for Beaglebone Black.
                 */
-               if (board_is_bone(&header)) {
+               if (board_is_bone()) {
                        if (tps65217_reg_write(TPS65217_PROT_LEVEL_2,
                                               TPS65217_DEFLS1,
                                               TPS65217_LDO_VOLTAGE_OUT_3_3,
                        if (tps65217_reg_write(TPS65217_PROT_LEVEL_2,
                                               TPS65217_DEFLS1,
                                               TPS65217_LDO_VOLTAGE_OUT_3_3,
@@ -367,18 +332,16 @@ void am33xx_spl_board_init(void)
 
 const struct dpll_params *get_dpll_ddr_params(void)
 {
 
 const struct dpll_params *get_dpll_ddr_params(void)
 {
-       struct am335x_baseboard_id header;
-
        enable_i2c0_pin_mux();
        i2c_init(CONFIG_SYS_OMAP24_I2C_SPEED, CONFIG_SYS_OMAP24_I2C_SLAVE);
        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");
 
                puts("Could not get board ID.\n");
 
-       if (board_is_evm_sk(&header))
+       if (board_is_evm_sk())
                return &dpll_ddr_evm_sk;
                return &dpll_ddr_evm_sk;
-       else if (board_is_bone_lt(&header))
+       else if (board_is_bone_lt())
                return &dpll_ddr_bone_black;
                return &dpll_ddr_bone_black;
-       else if (board_is_evm_15_or_later(&header))
+       else if (board_is_evm_15_or_later())
                return &dpll_ddr_evm_sk;
        else
                return &dpll_ddr;
                return &dpll_ddr_evm_sk;
        else
                return &dpll_ddr;
@@ -403,12 +366,10 @@ void set_uart_mux_conf(void)
 
 void set_mux_conf_regs(void)
 {
 
 void set_mux_conf_regs(void)
 {
-       __maybe_unused struct am335x_baseboard_id header;
-
-       if (read_eeprom(&header) < 0)
+       if (read_eeprom() < 0)
                puts("Could not get board ID.\n");
 
                puts("Could not get board ID.\n");
 
-       enable_board_pin_mux(&header);
+       enable_board_pin_mux();
 }
 
 const struct ctrl_ioregs ioregs_evmsk = {
 }
 
 const struct ctrl_ioregs ioregs_evmsk = {
@@ -445,12 +406,10 @@ const struct ctrl_ioregs ioregs = {
 
 void sdram_init(void)
 {
 
 void sdram_init(void)
 {
-       __maybe_unused struct am335x_baseboard_id header;
-
-       if (read_eeprom(&header) < 0)
+       if (read_eeprom() < 0)
                puts("Could not get board ID.\n");
 
                puts("Could not get board ID.\n");
 
-       if (board_is_evm_sk(&header)) {
+       if (board_is_evm_sk()) {
                /*
                 * EVM SK 1.2A and later use gpio0_7 to enable DDR3.
                 * This is safe enough to do on older revs.
                /*
                 * EVM SK 1.2A and later use gpio0_7 to enable DDR3.
                 * This is safe enough to do on older revs.
@@ -459,15 +418,15 @@ void sdram_init(void)
                gpio_direction_output(GPIO_DDR_VTT_EN, 1);
        }
 
                gpio_direction_output(GPIO_DDR_VTT_EN, 1);
        }
 
-       if (board_is_evm_sk(&header))
+       if (board_is_evm_sk())
                config_ddr(303, &ioregs_evmsk, &ddr3_data,
                           &ddr3_cmd_ctrl_data, &ddr3_emif_reg_data, 0);
                config_ddr(303, &ioregs_evmsk, &ddr3_data,
                           &ddr3_cmd_ctrl_data, &ddr3_emif_reg_data, 0);
-       else if (board_is_bone_lt(&header))
+       else if (board_is_bone_lt())
                config_ddr(400, &ioregs_bonelt,
                           &ddr3_beagleblack_data,
                           &ddr3_beagleblack_cmd_ctrl_data,
                           &ddr3_beagleblack_emif_reg_data, 0);
                config_ddr(400, &ioregs_bonelt,
                           &ddr3_beagleblack_data,
                           &ddr3_beagleblack_cmd_ctrl_data,
                           &ddr3_beagleblack_emif_reg_data, 0);
-       else if (board_is_evm_15_or_later(&header))
+       else if (board_is_evm_15_or_later())
                config_ddr(303, &ioregs_evm15, &ddr3_evm_data,
                           &ddr3_evm_cmd_ctrl_data, &ddr3_evm_emif_reg_data, 0);
        else
                config_ddr(303, &ioregs_evm15, &ddr3_evm_data,
                           &ddr3_evm_cmd_ctrl_data, &ddr3_evm_emif_reg_data, 0);
        else
@@ -496,26 +455,16 @@ int board_init(void)
 int board_late_init(void)
 {
 #ifdef CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG
 int board_late_init(void)
 {
 #ifdef CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG
-       char safe_string[HDR_NAME_LEN + 1];
-       struct am335x_baseboard_id header;
+       int rc;
+       char *name = NULL;
 
 
-       if (read_eeprom(&header) < 0)
+       rc = read_eeprom();
+       if (rc)
                puts("Could not get board ID.\n");
 
                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);
-
-       /* BeagleBone Green eeprom, board_rev: 0x1a 0x00 0x00 0x00 */
-       if ( (header.version[0] == 0x1a) && (header.version[1] == 0x00) &&
-            (header.version[2] == 0x00) && (header.version[3] == 0x00) ) {
-               setenv("board_rev", "BBG1");
-       } else {
-               strncpy(safe_string, (char *)header.version, sizeof(header.version));
-               safe_string[sizeof(header.version)] = 0;
-               setenv("board_rev", safe_string);
-       }
+       if (board_is_bbg1())
+               name = "BBG1";
+       set_board_info_env(name);
 #endif
 
        return 0;
 #endif
 
        return 0;
@@ -587,7 +536,7 @@ int board_eth_init(bd_t *bis)
        int rv, n = 0;
        uint8_t mac_addr[6];
        uint32_t mac_hi, mac_lo;
        int rv, n = 0;
        uint8_t mac_addr[6];
        uint32_t mac_hi, mac_lo;
-       __maybe_unused struct am335x_baseboard_id header;
+       __maybe_unused struct ti_am_eeprom *header;
 
        /* try reading mac address from efuse */
        mac_lo = readl(&cdev->macid0l);
 
        /* try reading mac address from efuse */
        mac_lo = readl(&cdev->macid0l);
@@ -624,11 +573,11 @@ int board_eth_init(bd_t *bis)
                        eth_setenv_enetaddr("eth1addr", mac_addr);
        }
 
                        eth_setenv_enetaddr("eth1addr", mac_addr);
        }
 
-       if (read_eeprom(&header) < 0)
+       if (read_eeprom() < 0)
                puts("Could not get board ID.\n");
 
                puts("Could not get board ID.\n");
 
-       if (board_is_bone(&header) || board_is_bone_lt(&header) ||
-           board_is_idk(&header)) {
+       if (board_is_bone() || board_is_bone_lt() ||
+           board_is_idk()) {
                writel(MII_MODE_ENABLE, &cdev->miisel);
                cpsw_slaves[0].phy_if = cpsw_slaves[1].phy_if =
                                PHY_INTERFACE_MODE_MII;
                writel(MII_MODE_ENABLE, &cdev->miisel);
                cpsw_slaves[0].phy_if = cpsw_slaves[1].phy_if =
                                PHY_INTERFACE_MODE_MII;
@@ -657,7 +606,7 @@ int board_eth_init(bd_t *bis)
 #define AR8051_DEBUG_RGMII_CLK_DLY_REG 0x5
 #define AR8051_RGMII_TX_CLK_DLY                0x100
 
 #define AR8051_DEBUG_RGMII_CLK_DLY_REG 0x5
 #define AR8051_RGMII_TX_CLK_DLY                0x100
 
-       if (board_is_evm_sk(&header) || board_is_gp_evm(&header)) {
+       if (board_is_evm_sk() || board_is_gp_evm()) {
                const char *devname;
                devname = miiphy_get_current_dev();
 
                const char *devname;
                devname = miiphy_get_current_dev();
 
index bc700d5..062c345 100644 (file)
 #ifndef _BOARD_H_
 #define _BOARD_H_
 
 #ifndef _BOARD_H_
 #define _BOARD_H_
 
-/*
- * TI AM335x parts 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 am335x_baseboard_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_bone(void)
+{
+       return board_ti_is("A335BONE");
+}
 
 
-static inline int board_is_bone(struct am335x_baseboard_id *header)
+static inline int board_is_bone_lt(void)
 {
 {
-       return !strncmp(header->name, "A335BONE", HDR_NAME_LEN);
+       return board_ti_is("A335BNLT");
 }
 
 }
 
-static inline int board_is_bone_lt(struct am335x_baseboard_id *header)
+static inline int board_is_bbg1(void)
 {
 {
-       return !strncmp(header->name, "A335BNLT", HDR_NAME_LEN);
+       return board_is_bone_lt() && !strncmp(board_ti_get_rev(), "BBG1", 4);
 }
 
 }
 
-static inline int board_is_evm_sk(struct am335x_baseboard_id *header)
+static inline int board_is_evm_sk(void)
 {
 {
-       return !strncmp("A335X_SK", header->name, HDR_NAME_LEN);
+       return board_ti_is("A335X_SK");
 }
 
 }
 
-static inline int board_is_idk(struct am335x_baseboard_id *header)
+static inline int board_is_idk(void)
 {
 {
-       return !strncmp(header->config, "SKU#02", 6);
+       return !strncmp(board_ti_get_config(), "SKU#02", 6);
 }
 
 }
 
-static inline int board_is_gp_evm(struct am335x_baseboard_id *header)
+static inline int board_is_gp_evm(void)
 {
 {
-       return !strncmp("A33515BB", header->name, HDR_NAME_LEN);
+       return board_ti_is("A33515BB");
 }
 
 }
 
-static inline int board_is_evm_15_or_later(struct am335x_baseboard_id *header)
+static inline int board_is_evm_15_or_later(void)
 {
 {
-       return (board_is_gp_evm(header) &&
-               strncmp("1.5", header->version, 3) <= 0);
+       return (board_is_gp_evm() &&
+               strncmp("1.5", board_ti_get_rev(), 3) <= 0);
 }
 
 /*
 }
 
 /*
@@ -73,5 +60,5 @@ void enable_uart3_pin_mux(void);
 void enable_uart4_pin_mux(void);
 void enable_uart5_pin_mux(void);
 void enable_i2c0_pin_mux(void);
 void enable_uart4_pin_mux(void);
 void enable_uart5_pin_mux(void);
 void enable_i2c0_pin_mux(void);
-void enable_board_pin_mux(struct am335x_baseboard_id *header);
+void enable_board_pin_mux(void);
 #endif
 #endif
index 79ed02f..fdf827f 100644 (file)
@@ -19,6 +19,7 @@
 #include <asm/arch/mux.h>
 #include <asm/io.h>
 #include <i2c.h>
 #include <asm/arch/mux.h>
 #include <asm/io.h>
 #include <i2c.h>
+#include "../common/board_detect.h"
 #include "board.h"
 
 static struct module_pin_mux uart0_pin_mux[] = {
 #include "board.h"
 
 static struct module_pin_mux uart0_pin_mux[] = {
@@ -312,10 +313,10 @@ static unsigned short detect_daughter_board_profile(void)
        return (1 << (val & PROFILE_MASK));
 }
 
        return (1 << (val & PROFILE_MASK));
 }
 
-void enable_board_pin_mux(struct am335x_baseboard_id *header)
+void enable_board_pin_mux(void)
 {
        /* Do board-specific muxes. */
 {
        /* Do board-specific muxes. */
-       if (board_is_bone(header)) {
+       if (board_is_bone()) {
                /* Beaglebone pinmux */
                configure_module_pin_mux(mii1_pin_mux);
                configure_module_pin_mux(mmc0_pin_mux);
                /* Beaglebone pinmux */
                configure_module_pin_mux(mii1_pin_mux);
                configure_module_pin_mux(mmc0_pin_mux);
@@ -326,7 +327,7 @@ void enable_board_pin_mux(struct am335x_baseboard_id *header)
 #else
                configure_module_pin_mux(mmc1_pin_mux);
 #endif
 #else
                configure_module_pin_mux(mmc1_pin_mux);
 #endif
-       } else if (board_is_gp_evm(header)) {
+       } else if (board_is_gp_evm()) {
                /* General Purpose EVM */
                unsigned short profile = detect_daughter_board_profile();
                configure_module_pin_mux(rgmii1_pin_mux);
                /* General Purpose EVM */
                unsigned short profile = detect_daughter_board_profile();
                configure_module_pin_mux(rgmii1_pin_mux);
@@ -343,17 +344,17 @@ void enable_board_pin_mux(struct am335x_baseboard_id *header)
                        configure_module_pin_mux(mmc1_pin_mux);
                        configure_module_pin_mux(spi0_pin_mux);
                }
                        configure_module_pin_mux(mmc1_pin_mux);
                        configure_module_pin_mux(spi0_pin_mux);
                }
-       } else if (board_is_idk(header)) {
+       } else if (board_is_idk()) {
                /* Industrial Motor Control (IDK) */
                configure_module_pin_mux(mii1_pin_mux);
                configure_module_pin_mux(mmc0_no_cd_pin_mux);
                /* Industrial Motor Control (IDK) */
                configure_module_pin_mux(mii1_pin_mux);
                configure_module_pin_mux(mmc0_no_cd_pin_mux);
-       } else if (board_is_evm_sk(header)) {
+       } else if (board_is_evm_sk()) {
                /* Starter Kit EVM */
                configure_module_pin_mux(i2c1_pin_mux);
                configure_module_pin_mux(gpio0_7_pin_mux);
                configure_module_pin_mux(rgmii1_pin_mux);
                configure_module_pin_mux(mmc0_pin_mux_sk_evm);
                /* Starter Kit EVM */
                configure_module_pin_mux(i2c1_pin_mux);
                configure_module_pin_mux(gpio0_7_pin_mux);
                configure_module_pin_mux(rgmii1_pin_mux);
                configure_module_pin_mux(mmc0_pin_mux_sk_evm);
-       } else if (board_is_bone_lt(header)) {
+       } else if (board_is_bone_lt()) {
                /* Beaglebone LT pinmux */
                configure_module_pin_mux(mii1_pin_mux);
                configure_module_pin_mux(mmc0_pin_mux);
                /* Beaglebone LT pinmux */
                configure_module_pin_mux(mii1_pin_mux);
                configure_module_pin_mux(mmc0_pin_mux);