mirror of
https://github.com/smaeul/u-boot.git
synced 2025-10-14 04:46:01 +01:00
ti: AM437x: Use generic EEPROM detection logic
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>
This commit is contained in:
parent
770e68c0a3
commit
5f8bb93b23
@ -381,6 +381,7 @@ config TARGET_AM43XX_EVM
|
|||||||
bool "Support am43xx_evm"
|
bool "Support am43xx_evm"
|
||||||
select CPU_V7
|
select CPU_V7
|
||||||
select SUPPORT_SPL
|
select SUPPORT_SPL
|
||||||
|
select TI_I2C_BOARD_DETECT
|
||||||
|
|
||||||
config TARGET_BAV335X
|
config TARGET_BAV335X
|
||||||
bool "Support bav335x"
|
bool "Support bav335x"
|
||||||
|
@ -12,4 +12,6 @@ config SYS_SOC
|
|||||||
config SYS_CONFIG_NAME
|
config SYS_CONFIG_NAME
|
||||||
default "am43xx_evm"
|
default "am43xx_evm"
|
||||||
|
|
||||||
|
source "board/ti/common/Kconfig"
|
||||||
|
|
||||||
endif
|
endif
|
||||||
|
@ -19,6 +19,7 @@
|
|||||||
#include <asm/arch/ddr_defs.h>
|
#include <asm/arch/ddr_defs.h>
|
||||||
#include <asm/arch/gpio.h>
|
#include <asm/arch/gpio.h>
|
||||||
#include <asm/emif.h>
|
#include <asm/emif.h>
|
||||||
|
#include "../common/board_detect.h"
|
||||||
#include "board.h"
|
#include "board.h"
|
||||||
#include <power/pmic.h>
|
#include <power/pmic.h>
|
||||||
#include <power/tps65218.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.
|
* 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 */
|
return ti_i2c_eeprom_am_get(-1, CONFIG_SYS_I2C_EEPROM_ADDR);
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef CONFIG_SKIP_LOWLEVEL_INIT
|
#ifndef CONFIG_SKIP_LOWLEVEL_INIT
|
||||||
@ -374,6 +336,9 @@ const struct dpll_params *get_dpll_ddr_params(void)
|
|||||||
{
|
{
|
||||||
int ind = get_sys_clk_index();
|
int ind = get_sys_clk_index();
|
||||||
|
|
||||||
|
if (read_eeprom() < 0)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
if (board_is_eposevm())
|
if (board_is_eposevm())
|
||||||
return &epos_evm_dpll_ddr[ind];
|
return &epos_evm_dpll_ddr[ind];
|
||||||
else if (board_is_gpevm() || board_is_sk())
|
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())
|
else if (board_is_idk())
|
||||||
return &idk_dpll_ddr;
|
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;
|
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)
|
void scale_vcores(void)
|
||||||
{
|
{
|
||||||
const struct dpll_params *mpu_params;
|
const struct dpll_params *mpu_params;
|
||||||
struct am43xx_board_id header;
|
|
||||||
|
|
||||||
enable_i2c0_pin_mux();
|
if (read_eeprom() < 0)
|
||||||
i2c_init(CONFIG_SYS_OMAP24_I2C_SPEED, CONFIG_SYS_OMAP24_I2C_SLAVE);
|
|
||||||
if (read_eeprom(&header) < 0)
|
|
||||||
puts("Could not get board ID.\n");
|
puts("Could not get board ID.\n");
|
||||||
|
|
||||||
|
/* Ensure I2C is initialized for PMIC configuration */
|
||||||
|
gpi2c_init();
|
||||||
|
|
||||||
/* Get the frequency */
|
/* Get the frequency */
|
||||||
mpu_params = get_dpll_mpu_params();
|
mpu_params = get_dpll_mpu_params();
|
||||||
|
|
||||||
@ -558,6 +536,8 @@ static void enable_vtt_regulator(void)
|
|||||||
|
|
||||||
void sdram_init(void)
|
void sdram_init(void)
|
||||||
{
|
{
|
||||||
|
if (read_eeprom() < 0)
|
||||||
|
return;
|
||||||
/*
|
/*
|
||||||
* EPOS EVM has 1GB LPDDR2 connected to EMIF.
|
* EPOS EVM has 1GB LPDDR2 connected to EMIF.
|
||||||
* GP EMV has 1GB DDR3 connected to EMIF
|
* GP EMV has 1GB DDR3 connected to EMIF
|
||||||
@ -655,20 +635,7 @@ int board_init(void)
|
|||||||
int board_late_init(void)
|
int board_late_init(void)
|
||||||
{
|
{
|
||||||
#ifdef CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG
|
#ifdef CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG
|
||||||
char safe_string[HDR_NAME_LEN + 1];
|
set_board_info_env(NULL);
|
||||||
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);
|
|
||||||
#endif
|
#endif
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -14,58 +14,37 @@
|
|||||||
|
|
||||||
#include <asm/arch/omap.h>
|
#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_MAX_OFFSET 5
|
||||||
#define DEV_ATTR_MIN_OFFSET 0
|
#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];
|
|
||||||
};
|
|
||||||
|
|
||||||
static inline int board_is_eposevm(void)
|
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)
|
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)
|
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)
|
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)
|
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)
|
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);
|
void enable_uart0_pin_mux(void);
|
||||||
|
@ -9,6 +9,7 @@
|
|||||||
#include <common.h>
|
#include <common.h>
|
||||||
#include <asm/arch/sys_proto.h>
|
#include <asm/arch/sys_proto.h>
|
||||||
#include <asm/arch/mux.h>
|
#include <asm/arch/mux.h>
|
||||||
|
#include "../common/board_detect.h"
|
||||||
#include "board.h"
|
#include "board.h"
|
||||||
|
|
||||||
static struct module_pin_mux rmii1_pin_mux[] = {
|
static struct module_pin_mux rmii1_pin_mux[] = {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user