Hi,

I've made two changes while I was working on STMidro's SPI Flash N25Q512A
- add the device entry for STMidro's SPI Flash N25Q512A
- add Flag status check during 
        Without this flag checking "sf write" will fail and SPI flash is locked 
up

Please see the patch and let me know your feedback.
-------------------------------------


>From 97572b32c49d06ca6f8548ed88e6e381fb719a08 Mon Sep 17 00:00:00 2001
From: Insop Song <insop.s...@cohere.net>
Date: Sun, 2 Jun 2013 13:33:37 -0700
Subject: [PATCH] Add SPI Flash STMicro's N25Q512A & add flag status check
 during SPI Flash write

Signed-off-by: Insop Song <insop.s...@cohere.net>
---
 drivers/mtd/spi/spi_flash.c          |   25 +++++++++++++++++++++++++
 drivers/mtd/spi/spi_flash_internal.h |    1 +
 drivers/mtd/spi/stmicro.c            |    6 ++++++
 3 files changed, 32 insertions(+)

diff --git a/drivers/mtd/spi/spi_flash.c b/drivers/mtd/spi/spi_flash.c
index 00aece9..f53756d 100644
--- a/drivers/mtd/spi/spi_flash.c
+++ b/drivers/mtd/spi/spi_flash.c
@@ -72,6 +72,7 @@ int spi_flash_cmd_write_multi(struct spi_flash *flash, u32 
offset,
        size_t chunk_len, actual;
        int ret;
        u8 cmd[4];
+       u8 flag_status;
 
        page_size = flash->page_size;
        page_addr = offset / page_size;
@@ -83,6 +84,18 @@ int spi_flash_cmd_write_multi(struct spi_flash *flash, u32 
offset,
                return ret;
        }
 
+wait_flag:
+       ret = spi_flash_cmd(flash->spi, CMD_READ_FLAG_STATUS, &flag_status, 
sizeof(flag_status));
+       if (ret < 0) {
+               printf("SF: reading flag failed\n");
+               return ret;
+       }
+       debug("flag_status %d\n", flag_status);
+       if ((flag_status & 0x80) == 0) {
+                       udelay(10);
+                       goto wait_flag;
+       }
+
        cmd[0] = CMD_PAGE_PROGRAM;
        for (actual = 0; actual < len; actual += chunk_len) {
                chunk_len = min(len - actual, page_size - byte_addr);
@@ -106,6 +119,18 @@ int spi_flash_cmd_write_multi(struct spi_flash *flash, u32 
offset,
                        debug("SF: write failed\n");
                        break;
                }
+               /* check status */
+flag_check:
+               ret = spi_flash_cmd(flash->spi, CMD_READ_FLAG_STATUS, 
&flag_status, sizeof(flag_status));
+               if (ret < 0) {
+                       printf("SF: reading flag failed\n");
+                       break;
+               }
+               debug("flag_status %d\n", flag_status);
+               if (!(flag_status & 0x80)) {
+                       udelay(100);
+                       goto flag_check;
+               }
 
                ret = spi_flash_cmd_wait_ready(flash, SPI_FLASH_PROG_TIMEOUT);
                if (ret)
diff --git a/drivers/mtd/spi/spi_flash_internal.h 
b/drivers/mtd/spi/spi_flash_internal.h
index 141cfa8..90b6993 100644
--- a/drivers/mtd/spi/spi_flash_internal.h
+++ b/drivers/mtd/spi/spi_flash_internal.h
@@ -22,6 +22,7 @@
 #define CMD_PAGE_PROGRAM               0x02
 #define CMD_WRITE_DISABLE              0x04
 #define CMD_READ_STATUS                        0x05
+#define CMD_READ_FLAG_STATUS   0x70
 #define CMD_WRITE_ENABLE               0x06
 #define CMD_ERASE_4K                   0x20
 #define CMD_ERASE_32K                  0x52
diff --git a/drivers/mtd/spi/stmicro.c b/drivers/mtd/spi/stmicro.c
index 30b626a..ad94ad2 100644
--- a/drivers/mtd/spi/stmicro.c
+++ b/drivers/mtd/spi/stmicro.c
@@ -110,6 +110,12 @@ static const struct stmicro_spi_flash_params 
stmicro_spi_flash_table[] = {
                .nr_sectors = 512,
                .name = "N25Q256",
        },
+       {
+               .id = 0xba20,
+               .pages_per_sector = 256,
+               .nr_sectors = 1024,
+               .name = "N25Q512A",
+       },
 };
 
 struct spi_flash *spi_flash_probe_stmicro(struct spi_slave *spi, u8 * idcode)
-- 
1.7.9.5

Attachment: 0001-Add-SPI-Flash-STMicro-s-N25Q512A-add-flag-status-che.patch
Description: 0001-Add-SPI-Flash-STMicro-s-N25Q512A-add-flag-status-che.patch

_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to