[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