From: Jagannadha Sutradharudu Teki Date: Fri, 3 May 2013 07:22:52 +0000 (+0530) Subject: Revert "sf: Update the qspi dual parallel flash access logic" X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=29819e0c9ffea8f5f2b16406b5ab23d805b2ebd4;p=thirdparty%2Fu-boot.git Revert "sf: Update the qspi dual parallel flash access logic" This reverts commit 126774ac78440069441a08907e53f640180a09e6. This change on dual parallel needs to tune some more extent, as few of the corner test cases this shows an invalid functionality. Revert as of now, update this on next comming patch set. Signed-off-by: Jagannadha Sutradharudu Teki --- diff --git a/drivers/mtd/spi/spansion.c b/drivers/mtd/spi/spansion.c index bb085a6df5c..d9516859471 100644 --- a/drivers/mtd/spi/spansion.c +++ b/drivers/mtd/spi/spansion.c @@ -144,12 +144,14 @@ struct spi_flash *spi_flash_probe_spansion(struct spi_slave *spi, u8 *idcode) flash->page_size = 256; flash->sector_size = 256 * params->pages_per_sector; - /* page_size and nr_sectors are double for dual parallel qspi */ + /* address width is 4 for dual and 3 for single qspi */ if (flash->spi->is_dual == 1) { - flash->page_size *= 2; + flash->addr_width = 4; flash->size = flash->sector_size * (2 * params->nr_sectors); - } else + } else { + flash->addr_width = 3; flash->size = flash->sector_size * params->nr_sectors; + } return flash; } diff --git a/drivers/mtd/spi/spi_flash.c b/drivers/mtd/spi/spi_flash.c index ea0f092c9e4..c7dc775a5de 100644 --- a/drivers/mtd/spi/spi_flash.c +++ b/drivers/mtd/spi/spi_flash.c @@ -22,9 +22,16 @@ static void spi_flash_addr(struct spi_flash *flash, unsigned long page_addr, unsigned long byte_addr, u8 *cmd) { /* cmd[0] is actual command */ - cmd[1] = page_addr >> 8; - cmd[2] = page_addr; - cmd[3] = byte_addr; + if (flash->addr_width == 4) { + cmd[1] = page_addr >> 16; + cmd[2] = page_addr >> 8; + cmd[3] = page_addr; + cmd[4] = byte_addr; + } else { + cmd[1] = page_addr >> 8; + cmd[2] = page_addr; + cmd[3] = byte_addr; + } } static int spi_flash_read_write(struct spi_slave *spi, @@ -75,16 +82,13 @@ int spi_flash_cmd_write_multi(struct spi_flash *flash, u32 offset, unsigned long page_addr, byte_addr, page_size; size_t chunk_len, actual; int ret; - u8 cmd[4]; + u8 cmd[flash->addr_width+1]; u32 start; u8 bank_sel; start = offset; page_size = flash->page_size; - if (flash->spi->is_dual == 1) - offset /= 2; - ret = spi_claim_bus(flash->spi); if (ret) { debug("SF: unable to claim SPI bus\n"); @@ -112,8 +116,9 @@ int spi_flash_cmd_write_multi(struct spi_flash *flash, u32 offset, spi_flash_addr(flash, page_addr, byte_addr, cmd); - debug("PP: 0x%p => cmd = { 0x%02x 0x%02x%02x%02x } chunk_len = %zu\n", - buf + actual, cmd[0], cmd[1], cmd[2], cmd[3], chunk_len); + debug("PP: 0x%p => cmd = { 0x%02x 0x%02x%02x%02x0x%02x } \ + chunk_len = %zu\n", buf + actual, cmd[0], cmd[1], + cmd[2], cmd[3], cmd[4], chunk_len); ret = spi_flash_cmd_write_enable(flash); if (ret < 0) { @@ -159,7 +164,7 @@ int spi_flash_cmd_read_fast(struct spi_flash *flash, u32 offset, size_t len, void *data) { unsigned long page_addr, page_size, byte_addr; - u8 cmd[5]; + u8 cmd[flash->addr_width+2]; u8 bank_sel; u32 remain_len, read_len; int ret = -1; @@ -168,9 +173,6 @@ int spi_flash_cmd_read_fast(struct spi_flash *flash, u32 offset, if (flash->memory_map) memcpy(data, flash->memory_map + offset, len); - if (flash->spi->is_dual == 1) - offset /= 2; - page_size = flash->page_size; cmd[0] = CMD_READ_ARRAY_FAST; cmd[sizeof(cmd)-1] = 0x00; @@ -259,7 +261,7 @@ int spi_flash_cmd_erase(struct spi_flash *flash, u32 offset, size_t len) u32 start, end, erase_size; int ret; unsigned long page_addr; - u8 cmd[4]; + u8 cmd[flash->addr_width+1]; u8 bank_sel; erase_size = flash->sector_size; @@ -268,9 +270,6 @@ int spi_flash_cmd_erase(struct spi_flash *flash, u32 offset, size_t len) return -1; } - if (flash->spi->is_dual == 1) - offset /= 2; - ret = spi_claim_bus(flash->spi); if (ret) { debug("SF: Unable to claim SPI bus\n"); @@ -297,8 +296,8 @@ int spi_flash_cmd_erase(struct spi_flash *flash, u32 offset, size_t len) page_addr = (offset & SPI_FLASH_16MB_MASK) / flash->page_size; spi_flash_addr(flash, page_addr, 0, cmd); - debug("SF: erase %2x %2x %2x %2x (%x)\n", cmd[0], cmd[1], - cmd[2], cmd[3], offset); + debug("SF: erase %2x %2x %2x %2x %2x (%x)\n", cmd[0], cmd[1], + cmd[2], cmd[3], cmd[4], offset); ret = spi_flash_cmd_write_enable(flash); if (ret) diff --git a/drivers/mtd/spi/stmicro.c b/drivers/mtd/spi/stmicro.c index 8d16c497bef..50b8fcbf825 100644 --- a/drivers/mtd/spi/stmicro.c +++ b/drivers/mtd/spi/stmicro.c @@ -209,12 +209,14 @@ struct spi_flash *spi_flash_probe_stmicro(struct spi_slave *spi, u8 * idcode) flash->page_size = 256; flash->sector_size = 256 * params->pages_per_sector; - /* page_size and nr_sectors are double for dual parallel qspi */ + /* address width is 4 for dual and 3 for single qspi */ if (flash->spi->is_dual == 1) { - flash->page_size *= 2; + flash->addr_width = 4; flash->size = flash->sector_size * (2 * params->nr_sectors); - } else + } else { + flash->addr_width = 3; flash->size = flash->sector_size * params->nr_sectors; + } return flash; } diff --git a/drivers/mtd/spi/winbond.c b/drivers/mtd/spi/winbond.c index d91025c3376..c327612cc29 100644 --- a/drivers/mtd/spi/winbond.c +++ b/drivers/mtd/spi/winbond.c @@ -111,12 +111,14 @@ struct spi_flash *spi_flash_probe_winbond(struct spi_slave *spi, u8 *idcode) flash->page_size = 256; flash->sector_size = 4096; - /* page_size and nr_blocks are double for dual parallel qspi */ + /* address width is 4 for dual and 3 for single qspi */ if (flash->spi->is_dual == 1) { - flash->page_size *= 2; + flash->addr_width = 4; flash->size = 4096 * 16 * (2 * params->nr_blocks); - } else + } else { + flash->addr_width = 3; flash->size = 4096 * 16 * params->nr_blocks; + } return flash; } diff --git a/drivers/spi/zynq_qspips.c b/drivers/spi/zynq_qspips.c index ce0172630fb..f17a25fc3b9 100644 --- a/drivers/spi/zynq_qspips.c +++ b/drivers/spi/zynq_qspips.c @@ -656,6 +656,32 @@ static int xqspips_start_transfer(struct spi_device *qspi, xqspi->curr_inst = &flash_inst[index]; xqspi->inst_response = 1; + /* + * In case of dual memories, convert 25 bit address to 24 bit + * address before transmitting to the 2 memories + */ + if ((xqspi->is_dual == MODE_DUAL_PARALLEL) && + ((instruction == XQSPIPS_FLASH_OPCODE_PP) || + (instruction == XQSPIPS_FLASH_OPCODE_SE) || + (instruction == XQSPIPS_FLASH_OPCODE_BE_32K) || + (instruction == XQSPIPS_FLASH_OPCODE_BE_4K) || + (instruction == XQSPIPS_FLASH_OPCODE_BE) || + (instruction == XQSPIPS_FLASH_OPCODE_NORM_READ) || + (instruction == XQSPIPS_FLASH_OPCODE_FAST_READ) || + (instruction == XQSPIPS_FLASH_OPCODE_DUAL_READ) || + (instruction == XQSPIPS_FLASH_OPCODE_QUAD_READ))) { + + u8 *ptr = (u8 *) (xqspi->txbuf); + data = ((u32) ptr[1] << 24) | ((u32) ptr[2] << 16) | + ((u32) ptr[3] << 8) | ((u32) ptr[4]); + data = data/2; + ptr[1] = (u8) (data >> 16); + ptr[2] = (u8) (data >> 8); + ptr[3] = (u8) (data); + xqspi->bytes_to_transfer -= 1; + xqspi->bytes_to_receive -= 1; + } + /* Get the instruction */ data = 0; xqspips_copy_write_data(xqspi, &data, diff --git a/include/spi_flash.h b/include/spi_flash.h index 88b302a4a6f..2475be5de36 100644 --- a/include/spi_flash.h +++ b/include/spi_flash.h @@ -38,6 +38,8 @@ struct spi_flash { u32 page_size; /* Erase (sector) size */ u32 sector_size; + /* To find whether single/dual spi device */ + u8 addr_width; /* ID code0 */ u8 idcode0; /* Current bank */