[U-Boot] [PATCH v4 5/7] ti: AM437x: Use generic EEPROM detection logic
Lokesh Vutla
a0131933 at ti.com
Fri Nov 6 04:49:10 CET 2015
On Friday 06 November 2015 06:09 AM, Steve Kipisz wrote:
> From: Nishanth Menon <nm at ti.com>
>
> Now that we have a generic TI eeprom logic which can be reused accross
> platforms, reuse the same.
>
> Signed-off-by: Nishanth Menon <nm at ti.com>
> Signed-off-by: Steven Kipisz <s-kipisz2 at ti.com>
Reviewed-by: Lokesh Vutla <lokeshvutla at ti.com>
Thanks and regards,
Lokesh
> ---
> Changes in v4:
> - New patch
> - depends on https://patchwork.ozlabs.org/patch/540280/
>
> board/ti/am43xx/board.c | 86 ++++++++++++++++---------------------------------
> board/ti/am43xx/board.h | 41 ++++++-----------------
> board/ti/am43xx/mux.c | 1 +
> 3 files changed, 38 insertions(+), 90 deletions(-)
>
> diff --git a/board/ti/am43xx/board.c b/board/ti/am43xx/board.c
> index 770726c3f796..ea64672606e9 100644
> --- a/board/ti/am43xx/board.c
> +++ b/board/ti/am43xx/board.c
> @@ -19,6 +19,7 @@
> #include <asm/arch/ddr_defs.h>
> #include <asm/arch/gpio.h>
> #include <asm/emif.h>
> +#include <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 int __maybe_unused read_eeprom(struct ti_am_eeprom **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;
> -
> - 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, header);
> }
>
> #ifndef CONFIG_SKIP_LOWLEVEL_INIT
> @@ -373,6 +335,10 @@ static u32 get_sys_clk_index(void)
> const struct dpll_params *get_dpll_ddr_params(void)
> {
> int ind = get_sys_clk_index();
> + struct ti_am_eeprom *header;
> +
> + if (read_eeprom(&header) < 0)
> + return NULL;
>
> if (board_is_eposevm())
> return &epos_evm_dpll_ddr[ind];
> @@ -381,7 +347,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", header->name);
> return NULL;
> }
>
> @@ -512,13 +478,17 @@ void scale_vcores_idk(u32 m)
> }
> }
>
> +void gpi2c_init(void)
> +{
> + enable_i2c0_pin_mux();
> + i2c_init(CONFIG_SYS_OMAP24_I2C_SPEED, CONFIG_SYS_OMAP24_I2C_SLAVE);
> +}
> +
> void scale_vcores(void)
> {
> const struct dpll_params *mpu_params;
> - struct am43xx_board_id header;
> + struct ti_am_eeprom *header;
>
> - enable_i2c0_pin_mux();
> - i2c_init(CONFIG_SYS_OMAP24_I2C_SPEED, CONFIG_SYS_OMAP24_I2C_SLAVE);
> if (read_eeprom(&header) < 0)
> puts("Could not get board ID.\n");
>
> @@ -558,6 +528,10 @@ static void enable_vtt_regulator(void)
>
> void sdram_init(void)
> {
> + struct ti_am_eeprom *header;
> +
> + if (read_eeprom(&header) < 0)
> + return;
> /*
> * EPOS EVM has 1GB LPDDR2 connected to EMIF.
> * GP EMV has 1GB DDR3 connected to EMIF
> @@ -565,11 +539,11 @@ void sdram_init(void)
> */
> if (board_is_eposevm()) {
> config_ddr(0, &ioregs_lpddr2, NULL, NULL, &emif_regs_lpddr2, 0);
> - } else if (board_is_evm_14_or_later()) {
> + } else if (board_is_evm_14_or_later(header)) {
> enable_vtt_regulator();
> config_ddr(0, &ioregs_ddr3, NULL, NULL,
> &ddr3_emif_regs_400Mhz_production, 0);
> - } else if (board_is_evm_12_or_later()) {
> + } else if (board_is_evm_12_or_later(header)) {
> enable_vtt_regulator();
> config_ddr(0, &ioregs_ddr3, NULL, NULL,
> &ddr3_emif_regs_400Mhz_beta, 0);
> @@ -655,20 +629,14 @@ 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;
> + struct ti_am_eeprom_printable p;
> + int rc;
>
> - 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);
> + rc = ti_i2c_eeprom_am_get_print(-1, CONFIG_SYS_I2C_EEPROM_ADDR, &p);
>
> - strncpy(safe_string, (char *)header.version, sizeof(header.version));
> - safe_string[sizeof(header.version)] = 0;
> - setenv("board_rev", safe_string);
> + if (rc)
> + puts("Could not get board ID.\n");
> + set_board_info_env(p.name, p.version, p.serial);
> #endif
> return 0;
> }
> diff --git a/board/ti/am43xx/board.h b/board/ti/am43xx/board.h
> index eb9493e191c6..9a6eeac4ac1f 100644
> --- a/board/ti/am43xx/board.h
> +++ b/board/ti/am43xx/board.h
> @@ -14,58 +14,37 @@
>
> #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_am_is("AM43EPOS");
> }
>
> static inline int board_is_gpevm(void)
> {
> - return !strncmp(am43xx_board_name, "AM43__GP", HDR_NAME_LEN);
> + return board_am_is("AM43__GP");
> }
>
> static inline int board_is_sk(void)
> {
> - return !strncmp(am43xx_board_name, "AM43__SK", HDR_NAME_LEN);
> + return board_am_is("AM43__SK");
> }
>
> static inline int board_is_idk(void)
> {
> - return !strncmp(am43xx_board_name, "AM43_IDK", HDR_NAME_LEN);
> + return board_am_is("AM43_IDK");
> }
>
> -static inline int board_is_evm_14_or_later(void)
> +static inline int board_is_evm_14_or_later(struct ti_am_eeprom *header)
> {
> - return (board_is_gpevm() && strncmp("1.4", am43xx_board_rev, 3) <= 0);
> + return (board_is_gpevm() && strncmp("1.4", header->version, 3) <= 0);
> }
>
> -static inline int board_is_evm_12_or_later(void)
> +static inline int board_is_evm_12_or_later(struct ti_am_eeprom *header)
> {
> - return (board_is_gpevm() && strncmp("1.2", am43xx_board_rev, 3) <= 0);
> + return (board_is_gpevm() && strncmp("1.2", header->version, 3) <= 0);
> }
>
> void enable_uart0_pin_mux(void);
> diff --git a/board/ti/am43xx/mux.c b/board/ti/am43xx/mux.c
> index 510477dad9e2..3902f4025028 100644
> --- a/board/ti/am43xx/mux.c
> +++ b/board/ti/am43xx/mux.c
> @@ -9,6 +9,7 @@
> #include <common.h>
> #include <asm/arch/sys_proto.h>
> #include <asm/arch/mux.h>
> +#include <board_detect.h>
> #include "board.h"
>
> static struct module_pin_mux rmii1_pin_mux[] = {
>
More information about the U-Boot
mailing list