[U-Boot] [PATCH] Add SPI Flash STMicro's N25Q512A & add flag status check during SPI Flash write
Jagan Teki
jagannadh.teki at gmail.com
Mon Jun 3 21:13:32 CEST 2013
Hi,
Thanks for your new changes.
I don't know may be you sent these changes intentionally.
I personally not encouraging these as you sent all changes in one
patch, attached a patch series to mail and
did n't follow commit message header.
http://www.denx.de/wiki/view/U-Boot/Patches#Commit_message_conventions
On Mon, Jun 3, 2013 at 10:16 PM, Insop Song <Insop.Song at cohere.net> wrote:
> 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.song at 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.song at 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;
> + }
Instead doing this poll on actaual write, may be do it on
spi_flash_cmd_wait_ready()
for code compatibility.
Did you tested these changes, i think the same Flag_status must
require on erase as well.
>
> 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,
This is wrong, 0xba20 is for N25Q512, 0xbb20 is for N25Q512A., agree?
Please see there is a patch available in spi bucket
http://patchwork.ozlabs.org/patch/247953/
The main agenda about this patch is trying to use same wait_poll func
which is used for
read_status register, to make code reliable and modular.
Please test the above patch http://patchwork.ozlabs.org/patch/247953/
Let me know if you have any concerns/issues.
--
Thanks,
Jagan.
More information about the U-Boot
mailing list