From a13842f5cfe9688ed108a3b2388b2d95ceeb8984 Mon Sep 17 00:00:00 2001 From: Vandhiadevan Karunamoorthy Date: Fri, 1 Nov 2019 11:03:00 +0530 Subject: [PATCH] ipq5018: spi-nor: Add offset 0x0 erase support for S25FL128S_64K Note : This S25FL128S_64K chip has Hybrid sector's First 64Kb (4Kb * 8 + 32Kb) and rest all 64Kb sectors Change-Id: Ibac9bd9dbd7b5a4eb1c31427b4d315fc5353ec62 Signed-off-by: Vandhiadevan Karunamoorthy --- drivers/mtd/spi/spi_flash.c | 23 +++++++++++++++++++++++ include/configs/ipq5018.h | 2 +- include/spi_flash.h | 2 ++ 3 files changed, 26 insertions(+), 1 deletion(-) diff --git a/drivers/mtd/spi/spi_flash.c b/drivers/mtd/spi/spi_flash.c index 7377b33d32..815dec34f8 100644 --- a/drivers/mtd/spi/spi_flash.c +++ b/drivers/mtd/spi/spi_flash.c @@ -24,6 +24,11 @@ #define CMD_S25FSXX_BE 0x60 #endif +#if defined CONFIG_SPI_FLASH_CYPRESS +#define CYPRESS_JEDEC_ID 0x012018 +#define CYPRESS_EXT_JEDEC_ID 0x4d01 +#endif + DECLARE_GLOBAL_DATA_PTR; static void spi_flash_addr(struct spi_flash *flash, u32 addr, u8 *cmd) @@ -380,6 +385,22 @@ int spi_flash_cmd_erase_ops(struct spi_flash *flash, u32 offset, size_t len) while (len) { erase_addr = offset; +#ifdef CONFIG_SPI_FLASH_CYPRESS + if ((flash->jedec == CYPRESS_JEDEC_ID) && + (flash->ext_jedec == CYPRESS_EXT_JEDEC_ID)){ + if (offset <= (SZ_32K - SZ_4K)){ + cmd[0] = CMD_ERASE_4K; + erase_size = SZ_4K; + }else { + cmd[0] = CMD_ERASE_64K; + if (offset < SZ_64K){ + erase_size = SZ_32K; + }else { + erase_size = SZ_64K; + } + } + } +#endif #ifdef CONFIG_SF_DUAL_FLASH if (flash->dual_flash > SF_SINGLE_FLASH) spi_flash_dual(flash, &erase_addr); @@ -1120,6 +1141,8 @@ try_with_dummy_byte: /* Assign spi data */ flash->name = params->name; + flash->jedec = params->jedec; + flash->ext_jedec = params->ext_jedec; flash->memory_map = spi->memory_map; flash->dual_flash = flash->spi->option; diff --git a/include/configs/ipq5018.h b/include/configs/ipq5018.h index dbf83c85a4..0878a42b60 100644 --- a/include/configs/ipq5018.h +++ b/include/configs/ipq5018.h @@ -19,7 +19,7 @@ #endif #define CONFIG_IPQ5018 -#define IPQ5018_EMULATION +#define CONFIG_SPI_FLASH_CYPRESS #define CONFIG_SYS_NO_FLASH #define CONFIG_SYS_CACHELINE_SIZE 64 #define CONFIG_CMD_CACHE diff --git a/include/spi_flash.h b/include/spi_flash.h index 1e05be230c..adaf189f8d 100644 --- a/include/spi_flash.h +++ b/include/spi_flash.h @@ -73,6 +73,8 @@ struct spi_flash { struct udevice *dev; #endif const char *name; + u32 jedec; + u16 ext_jedec; u8 dual_flash; u8 shift; u8 addr_width;