diff options
Diffstat (limited to 'drivers/mtd/spi/sst.c')
| -rw-r--r-- | drivers/mtd/spi/sst.c | 127 |
1 files changed, 11 insertions, 116 deletions
diff --git a/drivers/mtd/spi/sst.c b/drivers/mtd/spi/sst.c index 25578914c..4dc2db2ba 100644 --- a/drivers/mtd/spi/sst.c +++ b/drivers/mtd/spi/sst.c @@ -71,6 +71,10 @@ static const struct sst_spi_flash_params sst_spi_flash_table[] = { .nr_sectors = 1024, .name = "SST25VF032B", },{ + .idcode1 = 0x4b, + .nr_sectors = 2048, + .name = "SST25VF064C", + },{ .idcode1 = 0x01, .nr_sectors = 16, .name = "SST25WF512", @@ -90,41 +94,6 @@ static const struct sst_spi_flash_params sst_spi_flash_table[] = { }; static int -sst_wait_ready(struct spi_flash *flash, unsigned long timeout) -{ - struct spi_slave *spi = flash->spi; - unsigned long timebase; - int ret; - u8 byte = CMD_SST_RDSR; - - ret = spi_xfer(spi, sizeof(byte) * 8, &byte, NULL, SPI_XFER_BEGIN); - if (ret) { - debug("SF: Failed to send command %02x: %d\n", byte, ret); - return ret; - } - - timebase = get_timer(0); - do { - ret = spi_xfer(spi, sizeof(byte) * 8, NULL, &byte, 0); - if (ret) - break; - - if ((byte & SST_SR_WIP) == 0) - break; - - } while (get_timer(timebase) < timeout); - - spi_xfer(spi, 0, NULL, NULL, SPI_XFER_END); - - if (!ret && (byte & SST_SR_WIP) != 0) - ret = -1; - - if (ret) - debug("SF: sst wait for ready timed out\n"); - return ret; -} - -static int sst_enable_writing(struct spi_flash *flash) { int ret = spi_flash_cmd(flash->spi, CMD_SST_WREN, NULL, 0); @@ -143,19 +112,6 @@ sst_disable_writing(struct spi_flash *flash) } static int -sst_read_fast(struct spi_flash *flash, u32 offset, size_t len, void *buf) -{ - u8 cmd[5] = { - CMD_READ_ARRAY_FAST, - offset >> 16, - offset >> 8, - offset, - 0x00, - }; - return spi_flash_read_common(flash, cmd, sizeof(cmd), buf, len); -} - -static int sst_byte_write(struct spi_flash *flash, u32 offset, const void *buf) { int ret; @@ -177,7 +133,7 @@ sst_byte_write(struct spi_flash *flash, u32 offset, const void *buf) if (ret) return ret; - return sst_wait_ready(flash, SPI_FLASH_PROG_TIMEOUT); + return spi_flash_cmd_wait_ready(flash, SPI_FLASH_PROG_TIMEOUT); } static int @@ -224,7 +180,7 @@ sst_write(struct spi_flash *flash, u32 offset, size_t len, const void *buf) break; } - ret = sst_wait_ready(flash, SPI_FLASH_PROG_TIMEOUT); + ret = spi_flash_cmd_wait_ready(flash, SPI_FLASH_PROG_TIMEOUT); if (ret) break; @@ -247,67 +203,9 @@ sst_write(struct spi_flash *flash, u32 offset, size_t len, const void *buf) return ret; } -int -sst_erase(struct spi_flash *flash, u32 offset, size_t len) +static int sst_erase(struct spi_flash *flash, u32 offset, size_t len) { - unsigned long sector_size; - u32 start, end; - int ret; - u8 cmd[4]; - - /* - * This function currently uses sector erase only. - * Probably speed things up by using bulk erase - * when possible. - */ - - sector_size = SST_SECTOR_SIZE; - - if (offset % sector_size) { - debug("SF: Erase offset not multiple of sector size\n"); - return -1; - } - - ret = spi_claim_bus(flash->spi); - if (ret) { - debug("SF: Unable to claim SPI bus\n"); - return ret; - } - - cmd[0] = CMD_SST_SE; - cmd[3] = 0; - start = offset; - end = start + len; - - ret = 0; - while (offset < end) { - cmd[1] = offset >> 16; - cmd[2] = offset >> 8; - offset += sector_size; - - debug("SF: erase %2x %2x %2x %2x (%x)\n", cmd[0], cmd[1], - cmd[2], cmd[3], offset); - - ret = sst_enable_writing(flash); - if (ret) - break; - - ret = spi_flash_cmd_write(flash->spi, cmd, sizeof(cmd), NULL, 0); - if (ret) { - debug("SF: sst page erase failed\n"); - break; - } - - ret = sst_wait_ready(flash, SPI_FLASH_PAGE_ERASE_TIMEOUT); - if (ret) - break; - } - - debug("SF: sst: Successfully erased %lu bytes @ 0x%x\n", - len * sector_size, start); - - spi_release_bus(flash->spi); - return ret; + return spi_flash_cmd_erase(flash, CMD_SST_SE, offset, len); } static int @@ -361,12 +259,9 @@ spi_flash_probe_sst(struct spi_slave *spi, u8 *idcode) stm->flash.write = sst_write; stm->flash.erase = sst_erase; - stm->flash.read = sst_read_fast; - stm->flash.size = SST_SECTOR_SIZE * params->nr_sectors; - - printf("SF: Detected %s with page size %u, total ", - params->name, SST_SECTOR_SIZE); - print_size(stm->flash.size, "\n"); + stm->flash.read = spi_flash_cmd_read_fast; + stm->flash.sector_size = SST_SECTOR_SIZE; + stm->flash.size = stm->flash.sector_size * params->nr_sectors; /* Flash powers up read-only, so clear BP# bits */ sst_unlock(&stm->flash); |