[U-Boot] [PATCH] MTD: Add support for S25FL032P spi nor-flash

This patch introduces an extra mask-field in spansion_spi_flash_params to support flash chips with 1-byte extended ID (like the S25FL032P).
Signed-off-by: David Jander david@protonic.nl --- drivers/mtd/spi/spansion.c | 19 ++++++++++++++++++- 1 files changed, 18 insertions(+), 1 deletions(-)
diff --git a/drivers/mtd/spi/spansion.c b/drivers/mtd/spi/spansion.c index d6c1a5f..14cd6d3 100644 --- a/drivers/mtd/spi/spansion.c +++ b/drivers/mtd/spi/spansion.c @@ -52,12 +52,14 @@ #define SPSN_ID_S25FL128P 0x2018 #define SPSN_EXT_ID_S25FL128P_256KB 0x0300 #define SPSN_EXT_ID_S25FL128P_64KB 0x0301 +#define SPSN_EXT_ID_S25FL032P 0x4d00
#define SPANSION_SR_WIP (1 << 0) /* Write-in-Progress */
struct spansion_spi_flash_params { u16 idcode1; u16 idcode2; + u16 idmask2; u16 page_size; u16 pages_per_sector; u16 nr_sectors; @@ -79,6 +81,7 @@ static const struct spansion_spi_flash_params spansion_spi_flash_table[] = { { .idcode1 = SPSN_ID_S25FL008A, .idcode2 = 0, + .idmask2 = 0xffff, .page_size = 256, .pages_per_sector = 256, .nr_sectors = 16, @@ -87,6 +90,7 @@ static const struct spansion_spi_flash_params spansion_spi_flash_table[] = { { .idcode1 = SPSN_ID_S25FL016A, .idcode2 = 0, + .idmask2 = 0xffff, .page_size = 256, .pages_per_sector = 256, .nr_sectors = 32, @@ -95,6 +99,7 @@ static const struct spansion_spi_flash_params spansion_spi_flash_table[] = { { .idcode1 = SPSN_ID_S25FL032A, .idcode2 = 0, + .idmask2 = 0xffff, .page_size = 256, .pages_per_sector = 256, .nr_sectors = 64, @@ -103,6 +108,7 @@ static const struct spansion_spi_flash_params spansion_spi_flash_table[] = { { .idcode1 = SPSN_ID_S25FL064A, .idcode2 = 0, + .idmask2 = 0xffff, .page_size = 256, .pages_per_sector = 256, .nr_sectors = 128, @@ -111,6 +117,7 @@ static const struct spansion_spi_flash_params spansion_spi_flash_table[] = { { .idcode1 = SPSN_ID_S25FL128P, .idcode2 = SPSN_EXT_ID_S25FL128P_64KB, + .idmask2 = 0xffff, .page_size = 256, .pages_per_sector = 256, .nr_sectors = 256, @@ -119,11 +126,21 @@ static const struct spansion_spi_flash_params spansion_spi_flash_table[] = { { .idcode1 = SPSN_ID_S25FL128P, .idcode2 = SPSN_EXT_ID_S25FL128P_256KB, + .idmask2 = 0xffff, .page_size = 256, .pages_per_sector = 1024, .nr_sectors = 64, .name = "S25FL128P_256K", }, + { + .idcode1 = SPSN_ID_S25FL032A, + .idcode2 = SPSN_EXT_ID_S25FL032P, + .idmask2 = 0xff00, + .page_size = 256, + .pages_per_sector = 256, + .nr_sectors = 64, + .name = "S25FL032P", + }, };
static int spansion_wait_ready(struct spi_flash *flash, unsigned long timeout) @@ -317,7 +334,7 @@ struct spi_flash *spi_flash_probe_spansion(struct spi_slave *spi, u8 *idcode) for (i = 0; i < ARRAY_SIZE(spansion_spi_flash_table); i++) { params = &spansion_spi_flash_table[i]; if (params->idcode1 == jedec) { - if (params->idcode2 == ext_jedec) + if (params->idcode2 == (ext_jedec & params->idmask2)) break; } }

On Monday 23 August 2010 06:31:26 pm Mike Frysinger wrote:
On Monday, August 23, 2010 09:12:16 David Jander wrote:
- {
.idcode1 = SPSN_ID_S25FL032A,
.idcode2 = SPSN_EXT_ID_S25FL032P,
.idmask2 = 0xff00,
what does the idcode2 look like such that you need a mask ? -mike
According to the datasheet the RDID command (0x9f) returns the following bytes:
byte 0: Manufacturer ID = 0x01 byte 1,2: Device ID = 0x02, 0x15 (same as S25FL032A) byte 3: Extended ID = 0x4d byte 4,5,6: Spansion reserved (do not use).
byte 4 is read as 0x00 on my part, but due to the above explaination, I cannot say for sure it is always the same, so I had to implement a mask to check for it.
Best regards,

On Tuesday, August 24, 2010 02:39:16 David Jander wrote:
On Monday 23 August 2010 06:31:26 pm Mike Frysinger wrote:
On Monday, August 23, 2010 09:12:16 David Jander wrote:
- {
.idcode1 = SPSN_ID_S25FL032A,
.idcode2 = SPSN_EXT_ID_S25FL032P,
.idmask2 = 0xff00,
what does the idcode2 look like such that you need a mask ?
According to the datasheet the RDID command (0x9f) returns the following bytes:
byte 0: Manufacturer ID = 0x01 byte 1,2: Device ID = 0x02, 0x15 (same as S25FL032A) byte 3: Extended ID = 0x4d byte 4,5,6: Spansion reserved (do not use).
byte 4 is read as 0x00 on my part, but due to the above explaination, I cannot say for sure it is always the same, so I had to implement a mask to check for it.
i'd rather we delay adding code to support something that may never change. so drop the whole idmask2 stuff and wait for it to become an actual problem -mike

On Tuesday 24 August 2010 06:06:26 pm Mike Frysinger wrote:
On Tuesday, August 24, 2010 02:39:16 David Jander wrote:
On Monday 23 August 2010 06:31:26 pm Mike Frysinger wrote:
On Monday, August 23, 2010 09:12:16 David Jander wrote:
- {
.idcode1 = SPSN_ID_S25FL032A,
.idcode2 = SPSN_EXT_ID_S25FL032P,
.idmask2 = 0xff00,
what does the idcode2 look like such that you need a mask ?
According to the datasheet the RDID command (0x9f) returns the following bytes:
byte 0: Manufacturer ID = 0x01 byte 1,2: Device ID = 0x02, 0x15 (same as S25FL032A) byte 3: Extended ID = 0x4d byte 4,5,6: Spansion reserved (do not use).
byte 4 is read as 0x00 on my part, but due to the above explaination, I cannot say for sure it is always the same, so I had to implement a mask to check for it.
i'd rather we delay adding code to support something that may never change. so drop the whole idmask2 stuff and wait for it to become an actual problem -mike
I agree that chances this ever breaks might seem rather tiny, but if it ever does break, waiting for it to happen could trigger a much bigger problem than it is to add these few lines; in the worst case, in some distant future, some boards will just not work for no apparent reason (if spansion decided to do something with byte 4 without notifying), and nobody will remember this discussion anymore...
OTOH, you decide. It's ok with me if you want to leave it out. Given the fact that you had already accepted this patch, should I send a new version (without the mask)?
Best regards,

On Tuesday, August 24, 2010 14:36:43 David Jander wrote:
On Tuesday 24 August 2010 06:06:26 pm Mike Frysinger wrote:
On Tuesday, August 24, 2010 02:39:16 David Jander wrote:
On Monday 23 August 2010 06:31:26 pm Mike Frysinger wrote:
On Monday, August 23, 2010 09:12:16 David Jander wrote:
- {
.idcode1 = SPSN_ID_S25FL032A,
.idcode2 = SPSN_EXT_ID_S25FL032P,
.idmask2 = 0xff00,
what does the idcode2 look like such that you need a mask ?
According to the datasheet the RDID command (0x9f) returns the following bytes:
byte 0: Manufacturer ID = 0x01 byte 1,2: Device ID = 0x02, 0x15 (same as S25FL032A) byte 3: Extended ID = 0x4d byte 4,5,6: Spansion reserved (do not use).
byte 4 is read as 0x00 on my part, but due to the above explaination, I cannot say for sure it is always the same, so I had to implement a mask to check for it.
i'd rather we delay adding code to support something that may never change. so drop the whole idmask2 stuff and wait for it to become an actual problem
I agree that chances this ever breaks might seem rather tiny, but if it ever does break, waiting for it to happen could trigger a much bigger problem than it is to add these few lines; in the worst case, in some distant future, some boards will just not work for no apparent reason (if spansion decided to do something with byte 4 without notifying), and nobody will remember this discussion anymore...
considering the problem is rather minute and easily detected, i dont think it'll be that big of a deal
OTOH, you decide. It's ok with me if you want to leave it out. Given the fact that you had already accepted this patch, should I send a new version (without the mask)?
it's in a branch of mine that i can throw away, so just send a new patch based on current mainline and i'll integrate it. thanks ! -mike

Signed-off-by: David Jander david@protonic.nl --- drivers/mtd/spi/spansion.c | 9 +++++++++ 1 files changed, 9 insertions(+), 0 deletions(-)
diff --git a/drivers/mtd/spi/spansion.c b/drivers/mtd/spi/spansion.c index d6c1a5f..42cebf6 100644 --- a/drivers/mtd/spi/spansion.c +++ b/drivers/mtd/spi/spansion.c @@ -52,6 +52,7 @@ #define SPSN_ID_S25FL128P 0x2018 #define SPSN_EXT_ID_S25FL128P_256KB 0x0300 #define SPSN_EXT_ID_S25FL128P_64KB 0x0301 +#define SPSN_EXT_ID_S25FL032P 0x4d00
#define SPANSION_SR_WIP (1 << 0) /* Write-in-Progress */
@@ -124,6 +125,14 @@ static const struct spansion_spi_flash_params spansion_spi_flash_table[] = { .nr_sectors = 64, .name = "S25FL128P_256K", }, + { + .idcode1 = SPSN_ID_S25FL032A, + .idcode2 = SPSN_EXT_ID_S25FL032P, + .page_size = 256, + .pages_per_sector = 256, + .nr_sectors = 64, + .name = "S25FL032P", + }, };
static int spansion_wait_ready(struct spi_flash *flash, unsigned long timeout)

On Monday, August 23, 2010 09:12:16 David Jander wrote:
@@ -79,6 +81,7 @@ static const struct spansion_spi_flash_params spansion_spi_flash_table[] = {
also, your e-mailer appears to have mangled this patch. please use `git send- email` so that it doesnt screw things up. -mike

On Monday, August 23, 2010 17:35:03 Mike Frysinger wrote:
On Monday, August 23, 2010 09:12:16 David Jander wrote:
@@ -79,6 +81,7 @@ static const struct spansion_spi_flash_params spansion_spi_flash_table[] = {
also, your e-mailer appears to have mangled this patch. please use `git send- email` so that it doesnt screw things up.
although i fixed up the commit and merged it manually. but you only get one pass, so next time i'll wait for a proper resend :P.
this is in my sf branch so it wont get lost -mike

This patch introduces an extra mask-field in spansion_spi_flash_params to support flash chips with 1-byte extended ID (like the S25FL032P).
Signed-off-by: David Jander david@protonic.nl --- drivers/mtd/spi/spansion.c | 19 ++++++++++++++++++- 1 files changed, 18 insertions(+), 1 deletions(-)
diff --git a/drivers/mtd/spi/spansion.c b/drivers/mtd/spi/spansion.c index d6c1a5f..14cd6d3 100644 --- a/drivers/mtd/spi/spansion.c +++ b/drivers/mtd/spi/spansion.c @@ -52,12 +52,14 @@ #define SPSN_ID_S25FL128P 0x2018 #define SPSN_EXT_ID_S25FL128P_256KB 0x0300 #define SPSN_EXT_ID_S25FL128P_64KB 0x0301 +#define SPSN_EXT_ID_S25FL032P 0x4d00
#define SPANSION_SR_WIP (1 << 0) /* Write-in-Progress */
struct spansion_spi_flash_params { u16 idcode1; u16 idcode2; + u16 idmask2; u16 page_size; u16 pages_per_sector; u16 nr_sectors; @@ -79,6 +81,7 @@ static const struct spansion_spi_flash_params spansion_spi_flash_table[] = { { .idcode1 = SPSN_ID_S25FL008A, .idcode2 = 0, + .idmask2 = 0xffff, .page_size = 256, .pages_per_sector = 256, .nr_sectors = 16, @@ -87,6 +90,7 @@ static const struct spansion_spi_flash_params spansion_spi_flash_table[] = { { .idcode1 = SPSN_ID_S25FL016A, .idcode2 = 0, + .idmask2 = 0xffff, .page_size = 256, .pages_per_sector = 256, .nr_sectors = 32, @@ -95,6 +99,7 @@ static const struct spansion_spi_flash_params spansion_spi_flash_table[] = { { .idcode1 = SPSN_ID_S25FL032A, .idcode2 = 0, + .idmask2 = 0xffff, .page_size = 256, .pages_per_sector = 256, .nr_sectors = 64, @@ -103,6 +108,7 @@ static const struct spansion_spi_flash_params spansion_spi_flash_table[] = { { .idcode1 = SPSN_ID_S25FL064A, .idcode2 = 0, + .idmask2 = 0xffff, .page_size = 256, .pages_per_sector = 256, .nr_sectors = 128, @@ -111,6 +117,7 @@ static const struct spansion_spi_flash_params spansion_spi_flash_table[] = { { .idcode1 = SPSN_ID_S25FL128P, .idcode2 = SPSN_EXT_ID_S25FL128P_64KB, + .idmask2 = 0xffff, .page_size = 256, .pages_per_sector = 256, .nr_sectors = 256, @@ -119,11 +126,21 @@ static const struct spansion_spi_flash_params spansion_spi_flash_table[] = { { .idcode1 = SPSN_ID_S25FL128P, .idcode2 = SPSN_EXT_ID_S25FL128P_256KB, + .idmask2 = 0xffff, .page_size = 256, .pages_per_sector = 1024, .nr_sectors = 64, .name = "S25FL128P_256K", }, + { + .idcode1 = SPSN_ID_S25FL032A, + .idcode2 = SPSN_EXT_ID_S25FL032P, + .idmask2 = 0xff00, + .page_size = 256, + .pages_per_sector = 256, + .nr_sectors = 64, + .name = "S25FL032P", + }, };
static int spansion_wait_ready(struct spi_flash *flash, unsigned long timeout) @@ -317,7 +334,7 @@ struct spi_flash *spi_flash_probe_spansion(struct spi_slave *spi, u8 *idcode) for (i = 0; i < ARRAY_SIZE(spansion_spi_flash_table); i++) { params = &spansion_spi_flash_table[i]; if (params->idcode1 == jedec) { - if (params->idcode2 == ext_jedec) + if (params->idcode2 == (ext_jedec & params->idmask2)) break; } }
participants (3)
-
David Jander
-
David Jander
-
Mike Frysinger