]> git.ipfire.org Git - thirdparty/u-boot.git/commitdiff
Revert "sf: Update the qspi dual parallel flash access logic"
authorJagannadha Sutradharudu Teki <jaganna@xilinx.com>
Fri, 3 May 2013 07:22:52 +0000 (12:52 +0530)
committerJagannadha Sutradharudu Teki <jaganna@xilinx.com>
Fri, 3 May 2013 07:22:52 +0000 (12:52 +0530)
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 <jaganna@xilinx.com>
drivers/mtd/spi/spansion.c
drivers/mtd/spi/spi_flash.c
drivers/mtd/spi/stmicro.c
drivers/mtd/spi/winbond.c
drivers/spi/zynq_qspips.c
include/spi_flash.h

index bb085a6df5c8f152206c69abb3719a95c369f18c..d9516859471196b277c1f53571e1788915c6a403 100644 (file)
@@ -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;
 }
index ea0f092c9e4f95a6bbe80d1949963caae0143d4b..c7dc775a5de51f4b84b2a6567468b8072bbce2ba 100644 (file)
@@ -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)
index 8d16c497bef6a49e332766b137023dbc379a2b5d..50b8fcbf825cbd932753095dec22612c82d6733f 100644 (file)
@@ -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;
 }
index d91025c3376f28310eca27ff4b9267c2c42ee83d..c327612cc293742a60ba0cadf8a11dddeb46a906 100644 (file)
@@ -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;
 }
index ce0172630fb4920c80fd29d6cfaf167f31738559..f17a25fc3b9ad6348e0c8e04f89ee628b5b8e2fe 100644 (file)
@@ -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,
index 88b302a4a6f566bc7f09cc0e6bc05e6d63c4f92d..2475be5de36b4fb026431aeb03290c0e5765d28e 100644 (file)
@@ -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 */