summaryrefslogtreecommitdiff
path: root/board
diff options
context:
space:
mode:
authorHeiko Schocher <hs@denx.de>2016-06-07 08:55:43 +0200
committerTom Rini <trini@konsulko.com>2016-06-09 13:53:12 -0400
commit02b11f11993bc99c0ace4e750ba03f347502ebe9 (patch)
tree0b0f7fcf0a64bb3e48ca1d02973a254c928d19c1 /board
parent3a504d9639a2cef276a6e9e31cee11584c885639 (diff)
downloadu-boot-imx-02b11f11993bc99c0ace4e750ba03f347502ebe9.zip
u-boot-imx-02b11f11993bc99c0ace4e750ba03f347502ebe9.tar.gz
u-boot-imx-02b11f11993bc99c0ace4e750ba03f347502ebe9.tar.bz2
am335x, dxr2: get ECC sType from I2C eeprom
read the ECC Type field from the i2c eeprom, instead configuring it static in the U-Boot binary. see RM: Table 26-17. NAND Geometry Information on I2C EEPROM Signed-off-by: Heiko Schocher <hs@denx.de>
Diffstat (limited to 'board')
-rw-r--r--board/siemens/draco/board.c45
1 files changed, 44 insertions, 1 deletions
diff --git a/board/siemens/draco/board.c b/board/siemens/draco/board.c
index 988c12a..41bdef0 100644
--- a/board/siemens/draco/board.c
+++ b/board/siemens/draco/board.c
@@ -105,6 +105,40 @@ static void print_chip_data(void)
}
#endif /* CONFIG_SPL_BUILD */
+#define AM335X_NAND_ECC_MASK 0x0f
+#define AM335X_NAND_ECC_TYPE_16 0x02
+
+static int ecc_type;
+
+struct am335x_nand_geometry {
+ u32 magic;
+ u8 nand_geo_addr;
+ u8 nand_geo_page;
+ u8 nand_bus;
+};
+
+static int draco_read_nand_geometry(void)
+{
+ struct am335x_nand_geometry geo;
+
+ /* Read NAND geometry */
+ if (i2c_read(CONFIG_SYS_I2C_EEPROM_ADDR, 0x80, 2,
+ (uchar *)&geo, sizeof(struct am335x_nand_geometry))) {
+ printf("Could not read the NAND geomtery; something fundamentally wrong on the I2C bus.\n");
+ return -EIO;
+ }
+ if (geo.magic != 0xa657b310) {
+ printf("%s: bad magic: %x\n", __func__, geo.magic);
+ return -EFAULT;
+ }
+ if ((geo.nand_bus & AM335X_NAND_ECC_MASK) == AM335X_NAND_ECC_TYPE_16)
+ ecc_type = 16;
+ else
+ ecc_type = 8;
+
+ return 0;
+}
+
/*
* Read header information from EEPROM into global structure.
*/
@@ -147,6 +181,8 @@ static int read_eeprom(void)
printf("Warning: No chip data in eeprom\n");
print_ddr3_timings();
+
+ return draco_read_nand_geometry();
#endif
return 0;
}
@@ -207,7 +243,14 @@ static void spl_siemens_board_init(void)
#ifdef CONFIG_BOARD_LATE_INIT
int board_late_init(void)
{
- omap_nand_switch_ecc(1, 8);
+ int ret;
+
+ ret = draco_read_nand_geometry();
+ if (ret != 0)
+ return ret;
+
+ nand_curr_device = 0;
+ omap_nand_switch_ecc(1, ecc_type);
#ifdef CONFIG_FACTORYSET
/* Set ASN in environment*/
if (factory_dat.asn[0] != 0) {