From 74f9e0d8a0e1fa73af43e93b0b67985db973b1ed Mon Sep 17 00:00:00 2001 From: Graeme Smecher Date: Thu, 29 Jul 2010 09:00:02 -0400 Subject: sf: winbond: add support W25Q64 parts Adds support for Winbond's W25Q64 SPI flash. These devices are used on (among others) Xilinx' SP601 and SP605 Spartan-6 evaluation boards. Tested with "sf" commands. Signed-off-by: Graeme Smecher Signed-off-by: Mike Frysinger diff --git a/drivers/mtd/spi/winbond.c b/drivers/mtd/spi/winbond.c index ff1df25..de3aeb8 100644 --- a/drivers/mtd/spi/winbond.c +++ b/drivers/mtd/spi/winbond.c @@ -27,6 +27,7 @@ #define WINBOND_ID_W25X16 0x3015 #define WINBOND_ID_W25X32 0x3016 #define WINBOND_ID_W25X64 0x3017 +#define WINBOND_ID_W25Q64 0x4017 #define WINBOND_SR_WIP (1 << 0) /* Write-in-Progress */ @@ -77,6 +78,14 @@ static const struct winbond_spi_flash_params winbond_spi_flash_table[] = { .nr_blocks = 128, .name = "W25X64", }, + { + .id = WINBOND_ID_W25Q64, + .l2_page_size = 8, + .pages_per_sector = 16, + .sectors_per_block = 16, + .nr_blocks = 128, + .name = "W25Q64", + }, }; static int winbond_wait_ready(struct spi_flash *flash, unsigned long timeout) -- cgit v0.10.2 From c3cb09207f8765dddc67298b08f1f0796c1b98db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20H=C3=A9bert?= Date: Tue, 10 Aug 2010 09:02:09 -0400 Subject: sf: spansion: fixing erasing when sector size >64KiB The spansion_erase currently only works when the sector size is 64KB. cmd[1] should contain the higher 8 bit of the 24 bit address of the sector to be erased. Currently it is holding the sector index to be erased which happens to be the same thing when the sector size is 64KB. Signed-off-by: Marc-Andre Hebert Signed-off-by: Mike Frysinger diff --git a/drivers/mtd/spi/spansion.c b/drivers/mtd/spi/spansion.c index d6c1a5f..d9d794a 100644 --- a/drivers/mtd/spi/spansion.c +++ b/drivers/mtd/spi/spansion.c @@ -262,7 +262,6 @@ int spansion_erase(struct spi_flash *flash, u32 offset, size_t len) return -1; } - len /= sector_size; cmd[0] = CMD_S25FLXX_SE; cmd[2] = 0x00; cmd[3] = 0x00; @@ -274,8 +273,8 @@ int spansion_erase(struct spi_flash *flash, u32 offset, size_t len) } ret = 0; - for (actual = 0; actual < len; actual++) { - cmd[1] = (offset / sector_size) + actual; + for (actual = 0; actual < len; actual += sector_size) { + cmd[1] = (offset + actual) >> 16; ret = spi_flash_cmd(flash->spi, CMD_S25FLXX_WREN, NULL, 0); if (ret < 0) { @@ -298,7 +297,7 @@ int spansion_erase(struct spi_flash *flash, u32 offset, size_t len) } debug("SF: SPANSION: Successfully erased %u bytes @ 0x%x\n", - len * sector_size, offset); + len, offset); spi_release_bus(flash->spi); return ret; -- cgit v0.10.2 From ff0dc2c43358b059c25f64af740801333d4875f1 Mon Sep 17 00:00:00 2001 From: David Jander Date: Mon, 23 Aug 2010 15:12:16 +0200 Subject: sf: spansion: add support for S25FL032P parts 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 Signed-off-by: Mike Frysinger diff --git a/drivers/mtd/spi/spansion.c b/drivers/mtd/spi/spansion.c index d9d794a..c0900f9 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) -- cgit v0.10.2 From 21032b35a0535528c878c1bfde35570dc4c3ff4b Mon Sep 17 00:00:00 2001 From: Reinhard Meyer Date: Thu, 26 Aug 2010 10:57:27 +0200 Subject: sspi: add options to specify bus and mode and clean up error messages and help, removed pointless debug() call. Signed-off-by: Reinhard Meyer Signed-off-by: Mike Frysinger diff --git a/common/cmd_spi.c b/common/cmd_spi.c index bafa217..8c623c9 100644 --- a/common/cmd_spi.c +++ b/common/cmd_spi.c @@ -47,7 +47,9 @@ /* * Values from last command. */ -static unsigned int device; +static unsigned int bus; +static unsigned int cs; +static unsigned int mode; static int bitlen; static uchar dout[MAX_SPI_BYTES]; static uchar din[MAX_SPI_BYTES]; @@ -78,8 +80,18 @@ int do_spi (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) if ((flag & CMD_FLAG_REPEAT) == 0) { - if (argc >= 2) - device = simple_strtoul(argv[1], NULL, 10); + if (argc >= 2) { + mode = CONFIG_DEFAULT_SPI_MODE; + bus = simple_strtoul(argv[1], &cp, 10); + if (*cp == ':') { + cs = simple_strtoul(cp+1, &cp, 10); + } else { + cs = bus; + bus = CONFIG_DEFAULT_SPI_BUS; + } + if (*cp == '.'); + mode = simple_strtoul(cp+1, NULL, 10); + } if (argc >= 3) bitlen = simple_strtoul(argv[2], NULL, 10); if (argc >= 4) { @@ -91,7 +103,7 @@ int do_spi (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) if(tmp > 15) tmp -= ('a' - 'A'); if(tmp > 15) { - printf("Hex conversion error on %c, giving up.\n", *cp); + printf("Hex conversion error on %c\n", *cp); return 1; } if((j % 2) == 0) @@ -103,24 +115,20 @@ int do_spi (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) } if ((bitlen < 0) || (bitlen > (MAX_SPI_BYTES * 8))) { - printf("Invalid bitlen %d, giving up.\n", bitlen); + printf("Invalid bitlen %d\n", bitlen); return 1; } - /* FIXME: Make these parameters run-time configurable */ - slave = spi_setup_slave(CONFIG_DEFAULT_SPI_BUS, device, 1000000, - CONFIG_DEFAULT_SPI_MODE); + slave = spi_setup_slave(bus, cs, 1000000, mode); if (!slave) { - printf("Invalid device %d, giving up.\n", device); + printf("Invalid device %d:%d\n", bus, cs); return 1; } - debug ("spi chipsel = %08X\n", device); - spi_claim_bus(slave); if(spi_xfer(slave, bitlen, dout, din, SPI_XFER_BEGIN | SPI_XFER_END) != 0) { - printf("Error with the SPI transaction.\n"); + printf("Error during SPI transaction\n"); rcode = 1; } else { for(j = 0; j < ((bitlen + 7) / 8); j++) { @@ -138,9 +146,11 @@ int do_spi (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) U_BOOT_CMD( sspi, 5, 1, do_spi, - "SPI utility commands", - " - Send bits from out the SPI\n" - " - Identifies the chip select of the device\n" + "SPI utility command", + "[:][.] - Send and receive bits\n" + " - Identifies the SPI bus\n" + " - Identifies the chip select\n" + " - Identifies the SPI mode to use\n" " - Number of bits to send (base 10)\n" " - Hexadecimal string that gets sent" ); -- cgit v0.10.2