|
@@ -284,6 +284,20 @@ static inline int set_4byte(struct spi_nor *nor, const struct flash_info *info,
|
|
|
if (need_wren)
|
|
|
write_disable(nor);
|
|
|
|
|
|
+ if (!status && !enable &&
|
|
|
+ JEDEC_MFR(info) == SNOR_MFR_WINBOND) {
|
|
|
+ /*
|
|
|
+ * On Winbond W25Q256FV, leaving 4byte mode causes
|
|
|
+ * the Extended Address Register to be set to 1, so all
|
|
|
+ * 3-byte-address reads come from the second 16M.
|
|
|
+ * We must clear the register to enable normal behavior.
|
|
|
+ */
|
|
|
+ write_enable(nor);
|
|
|
+ nor->cmd_buf[0] = 0;
|
|
|
+ nor->write_reg(nor, SPINOR_OP_WREAR, nor->cmd_buf, 1);
|
|
|
+ write_disable(nor);
|
|
|
+ }
|
|
|
+
|
|
|
return status;
|
|
|
default:
|
|
|
/* Spansion style */
|
|
@@ -980,6 +994,7 @@ static const struct flash_info spi_nor_ids[] = {
|
|
|
{ "en25q32b", INFO(0x1c3016, 0, 64 * 1024, 64, 0) },
|
|
|
{ "en25p64", INFO(0x1c2017, 0, 64 * 1024, 128, 0) },
|
|
|
{ "en25q64", INFO(0x1c3017, 0, 64 * 1024, 128, SECT_4K) },
|
|
|
+ { "en25qh32", INFO(0x1c7016, 0, 64 * 1024, 64, 0) },
|
|
|
{ "en25qh128", INFO(0x1c7018, 0, 64 * 1024, 256, 0) },
|
|
|
{ "en25qh256", INFO(0x1c7019, 0, 64 * 1024, 512, 0) },
|
|
|
{ "en25s64", INFO(0x1c3817, 0, 64 * 1024, 128, SECT_4K) },
|
|
@@ -1049,6 +1064,14 @@ static const struct flash_info spi_nor_ids[] = {
|
|
|
SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) },
|
|
|
{ "is25lp128", INFO(0x9d6018, 0, 64 * 1024, 256,
|
|
|
SECT_4K | SPI_NOR_DUAL_READ) },
|
|
|
+ { "is25lp256", INFO(0x9d6019, 0, 64 * 1024, 512,
|
|
|
+ SECT_4K | SPI_NOR_DUAL_READ) },
|
|
|
+ { "is25wp032", INFO(0x9d7016, 0, 64 * 1024, 64,
|
|
|
+ SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) },
|
|
|
+ { "is25wp064", INFO(0x9d7017, 0, 64 * 1024, 128,
|
|
|
+ SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) },
|
|
|
+ { "is25wp128", INFO(0x9d7018, 0, 64 * 1024, 256,
|
|
|
+ SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) },
|
|
|
|
|
|
/* Macronix */
|
|
|
{ "mx25l512e", INFO(0xc22010, 0, 64 * 1024, 1, SECT_4K) },
|
|
@@ -1087,6 +1110,7 @@ static const struct flash_info spi_nor_ids[] = {
|
|
|
{ "n25q512ax3", INFO(0x20ba20, 0, 64 * 1024, 1024, SECT_4K | USE_FSR | SPI_NOR_QUAD_READ) },
|
|
|
{ "n25q00", INFO(0x20ba21, 0, 64 * 1024, 2048, SECT_4K | USE_FSR | SPI_NOR_QUAD_READ | NO_CHIP_ERASE) },
|
|
|
{ "n25q00a", INFO(0x20bb21, 0, 64 * 1024, 2048, SECT_4K | USE_FSR | SPI_NOR_QUAD_READ | NO_CHIP_ERASE) },
|
|
|
+ { "mt25qu02g", INFO(0x20bb22, 0, 64 * 1024, 4096, SECT_4K | USE_FSR | SPI_NOR_QUAD_READ | NO_CHIP_ERASE) },
|
|
|
|
|
|
/* PMC */
|
|
|
{ "pm25lv512", INFO(0, 0, 32 * 1024, 2, SECT_4K_PMC) },
|
|
@@ -1198,6 +1222,11 @@ static const struct flash_info spi_nor_ids[] = {
|
|
|
SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ |
|
|
|
SPI_NOR_HAS_LOCK | SPI_NOR_HAS_TB)
|
|
|
},
|
|
|
+ {
|
|
|
+ "w25q32jv", INFO(0xef7016, 0, 64 * 1024, 64,
|
|
|
+ SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ |
|
|
|
+ SPI_NOR_HAS_LOCK | SPI_NOR_HAS_TB)
|
|
|
+ },
|
|
|
{ "w25x64", INFO(0xef3017, 0, 64 * 1024, 128, SECT_4K) },
|
|
|
{ "w25q64", INFO(0xef4017, 0, 64 * 1024, 128, SECT_4K) },
|
|
|
{
|
|
@@ -1230,6 +1259,10 @@ static const struct flash_info spi_nor_ids[] = {
|
|
|
{ "3S400AN", S3AN_INFO(0x1f2400, 256, 264) },
|
|
|
{ "3S700AN", S3AN_INFO(0x1f2500, 512, 264) },
|
|
|
{ "3S1400AN", S3AN_INFO(0x1f2600, 512, 528) },
|
|
|
+
|
|
|
+ /* XMC (Wuhan Xinxin Semiconductor Manufacturing Corp.) */
|
|
|
+ { "XM25QH64A", INFO(0x207017, 0, 64 * 1024, 128, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) },
|
|
|
+ { "XM25QH128A", INFO(0x207018, 0, 64 * 1024, 256, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) },
|
|
|
{ },
|
|
|
};
|
|
|
|