diff --git a/patches/barebox/v2014.04/0014-Read-EDI-bytes-in-JEDEC-to-support-AT45DB641E.patch b/patches/barebox/v2014.04/0014-Read-EDI-bytes-in-JEDEC-to-support-AT45DB641E.patch new file mode 100644 index 0000000000000000000000000000000000000000..771bcb1b263c8fc9d7bc8f809bd1a88a28fc3e9f --- /dev/null +++ b/patches/barebox/v2014.04/0014-Read-EDI-bytes-in-JEDEC-to-support-AT45DB641E.patch @@ -0,0 +1,140 @@ +From bf68eec871054ac32ad25ac917916e83d2c33a5f Mon Sep 17 00:00:00 2001 +From: Benoit Rat <benoit@sevensols.com> +Date: Fri, 3 Oct 2014 09:49:06 +0200 +Subject: [PATCH] Read EDI bytes in JEDEC to support AT45DB641E + +Standard JEDEC ID is only 24bits to identify a DF chip. + +It also has an optional Extended Device Info (EDI) on bytes 4 and/or 5 +that need to be read in order differentiate some DF chips. (i.e, the +difference between AT45DB641E and AT45DB642D is made by byte 4). + +We have had two new fields in the struct flash_info: +- edi_nbytes: number of optional bytes to read (1 or 2) +- edi_jedec: EDI value for a given chip +--- + drivers/mtd/devices/mtd_dataflash.c | 56 +++++++++++++++++++++++++------------ + 1 file changed, 38 insertions(+), 18 deletions(-) + +diff --git a/drivers/mtd/devices/mtd_dataflash.c b/drivers/mtd/devices/mtd_dataflash.c +index cdc0120..3de8ac0 100644 +--- a/drivers/mtd/devices/mtd_dataflash.c ++++ b/drivers/mtd/devices/mtd_dataflash.c +@@ -675,6 +675,11 @@ struct flash_info { + uint16_t pageoffset; + + uint16_t flags; ++ /* JEDEC has an optional Extended Device Info (EDI) on bytes ++ * 4 and/or 5 that need to be read to differentiate some DF chips ++ */ ++ uint8_t edi_nbytes; ++ uint16_t edi_jedec; + #define SUP_POW2PS 0x0002 /* supports 2^N byte pages */ + #define IS_POW2PS 0x0001 /* uses 2^N byte pages */ + }; +@@ -690,36 +695,40 @@ static struct flash_info dataflash_data [] = { + * These newer chips also support 128-byte security registers (with + * 64 bytes one-time-programmable) and software write-protection. + */ +- { "AT45DB011B", 0x1f2200, 512, 264, 9, SUP_POW2PS}, +- { "at45db011d", 0x1f2200, 512, 256, 8, SUP_POW2PS | IS_POW2PS}, ++ { "AT45DB011B", 0x1f2200, 512, 264, 9, SUP_POW2PS, 0, 0x0}, ++ { "at45db011d", 0x1f2200, 512, 256, 8, SUP_POW2PS | IS_POW2PS, 0, 0x0}, + +- { "AT45DB021B", 0x1f2300, 1024, 264, 9, SUP_POW2PS}, +- { "at45db021d", 0x1f2300, 1024, 256, 8, SUP_POW2PS | IS_POW2PS}, ++ { "AT45DB021B", 0x1f2300, 1024, 264, 9, SUP_POW2PS, 0, 0x0}, ++ { "at45db021d", 0x1f2300, 1024, 256, 8, SUP_POW2PS | IS_POW2PS, 0, 0x0}, + +- { "AT45DB041x", 0x1f2400, 2048, 264, 9, SUP_POW2PS}, +- { "at45db041d", 0x1f2400, 2048, 256, 8, SUP_POW2PS | IS_POW2PS}, ++ { "AT45DB041x", 0x1f2400, 2048, 264, 9, SUP_POW2PS, 0, 0x0}, ++ { "at45db041d", 0x1f2400, 2048, 256, 8, SUP_POW2PS | IS_POW2PS, 0, 0x0}, + +- { "AT45DB081B", 0x1f2500, 4096, 264, 9, SUP_POW2PS}, +- { "at45db081d", 0x1f2500, 4096, 256, 8, SUP_POW2PS | IS_POW2PS}, ++ { "AT45DB081B", 0x1f2500, 4096, 264, 9, SUP_POW2PS, 0, 0x0}, ++ { "at45db081d", 0x1f2500, 4096, 256, 8, SUP_POW2PS | IS_POW2PS, 0, 0x0}, + +- { "AT45DB161x", 0x1f2600, 4096, 528, 10, SUP_POW2PS}, +- { "at45db161d", 0x1f2600, 4096, 512, 9, SUP_POW2PS | IS_POW2PS}, ++ { "AT45DB161x", 0x1f2600, 4096, 528, 10, SUP_POW2PS, 0, 0x0}, ++ { "at45db161d", 0x1f2600, 4096, 512, 9, SUP_POW2PS | IS_POW2PS, 0, 0x0}, + +- { "AT45DB321x", 0x1f2700, 8192, 528, 10, 0}, /* rev C */ ++ { "AT45DB321x", 0x1f2700, 8192, 528, 10, 0, 0, 0x0}, /* rev C */ + +- { "AT45DB321x", 0x1f2701, 8192, 528, 10, SUP_POW2PS}, +- { "at45db321d", 0x1f2701, 8192, 512, 9, SUP_POW2PS | IS_POW2PS}, ++ { "AT45DB321x", 0x1f2701, 8192, 528, 10, SUP_POW2PS, 0, 0x0}, ++ { "at45db321d", 0x1f2701, 8192, 512, 9, SUP_POW2PS | IS_POW2PS, 0, 0x0}, + +- { "AT45DB642x", 0x1f2800, 8192, 1056, 11, SUP_POW2PS}, +- { "at45db642d", 0x1f2800, 8192, 1024, 10, SUP_POW2PS | IS_POW2PS}, ++ { "AT45DB642x", 0x1f2800, 8192, 1056, 11, SUP_POW2PS,1, 0x0}, ++ { "at45db642d", 0x1f2800, 8192, 1024, 10, SUP_POW2PS | IS_POW2PS,1, 0x0}, ++ ++ { "AT45DB641E", 0x1f2800, 32768, 264, 9, SUP_POW2PS,1, 0x1}, ++ { "at45db641e", 0x1f2800, 32768, 256, 8, SUP_POW2PS | IS_POW2PS,1, 0x1}, + }; + + static struct flash_info * jedec_probe(struct spi_device *spi) + { + int tmp; + uint8_t code = OP_READ_ID; +- uint8_t id[3]; ++ uint8_t id[5]; + uint32_t jedec; ++ uint16_t jedec_edi; + struct flash_info *info; + int status; + +@@ -731,7 +740,7 @@ static struct flash_info * jedec_probe(struct spi_device *spi) + * That's not an error; only rev C and newer chips handle it, and + * only Atmel sells these chips. + */ +- tmp = spi_write_then_read(spi, &code, 1, id, 3); ++ tmp = spi_write_then_read(spi, &code, 1, id, 5); + if (tmp < 0) { + pr_debug("%s: error %d reading JEDEC ID\n", + dev_name(&spi->dev), tmp); +@@ -745,11 +754,17 @@ static struct flash_info * jedec_probe(struct spi_device *spi) + jedec |= id[1]; + jedec = jedec << 8; + jedec |= id[2]; ++ ++ //EDI bytes to support newest chips ++ jedec_edi = id[3]; ++ jedec_edi = jedec_edi << 8; ++ jedec_edi |= id[4]; + + for (tmp = 0, info = dataflash_data; + tmp < ARRAY_SIZE(dataflash_data); + tmp++, info++) { +- if (info->jedec_id == jedec) { ++ if (info->jedec_id == jedec) ++ if (info->edi_jedec == (jedec_edi >> (16-8*info->edi_nbytes))) { + pr_debug("%s: OTP, sector protect%s\n", + dev_name(&spi->dev), + (info->flags & SUP_POW2PS) +@@ -796,6 +811,7 @@ static struct flash_info * jedec_probe(struct spi_device *spi) + * AT45DB0321B 32Mbit (4M) xx1101xx (0x34) 8192 528 10 + * AT45DB0642 64Mbit (8M) xx111xxx (0x3c) 8192 1056 11 + * AT45DB1282 128Mbit (16M) xx0100xx (0x10) 16384 1056 11 ++ * AT45DB0641E 64Mbit (8M) xx111xxx (0x3c) 32768 264 9 + */ + static int dataflash_probe(struct device_d *dev) + { +@@ -811,6 +827,10 @@ static int dataflash_probe(struct device_d *dev) + * write procedures. + */ + info = jedec_probe(spi); ++ ++ pr_debug("MTD: %s 0x%08x %d %d %d %x\n", ++ info->name,info->jedec_id, ++ info->nr_pages,info->pagesize,info->pageoffset,info->flags); + if (IS_ERR(info)) + return PTR_ERR(info); + if (info != NULL) +-- +1.9.1