Commit 2b468ef0 authored by Elie De Brauwer's avatar Elie De Brauwer Committed by David Woodhouse

mtd: m25p80: Fix 4 byte addressing mode for Micron devices.

According to the datasheet for Micron n25q256a (N25Q256A13ESF40F) 4-byte
addressing mode should be entered as follows:

<quote>
To enter or exit the 4-byte address mode, the WRITE ENABLE command
must be executed to set the write enable latch bit to 1. (Note: The
WRITE ENABLE command must NOT be executed on the N25Q256A83ESF40x and
N25Q256A83E1240x devices.) S# must be driven LOW. The effect of the
command is immediate; after the command has been executed, the write
enable latch bit is cleared to 0.
</quote>

Micron's portable way to perform this for all types of Micron flash
is to first issue a write enable, then switch the addressing mode
followed by a write disable to avoid leaving the flash in a write-
able state.
Signed-off-by: default avatarElie De Brauwer <eliedebrauwer@email.com>
[Brian: reworked a bit]
Signed-off-by: default avatarBrian Norris <computersforpeace@gmail.com>
Signed-off-by: default avatarDavid Woodhouse <David.Woodhouse@intel.com>
parent 5cb13271
...@@ -168,12 +168,25 @@ static inline int write_disable(struct m25p *flash) ...@@ -168,12 +168,25 @@ static inline int write_disable(struct m25p *flash)
*/ */
static inline int set_4byte(struct m25p *flash, u32 jedec_id, int enable) static inline int set_4byte(struct m25p *flash, u32 jedec_id, int enable)
{ {
int status;
bool need_wren = false;
switch (JEDEC_MFR(jedec_id)) { switch (JEDEC_MFR(jedec_id)) {
case CFI_MFR_MACRONIX:
case CFI_MFR_ST: /* Micron, actually */ case CFI_MFR_ST: /* Micron, actually */
/* Some Micron need WREN command; all will accept it */
need_wren = true;
case CFI_MFR_MACRONIX:
case 0xEF /* winbond */: case 0xEF /* winbond */:
if (need_wren)
write_enable(flash);
flash->command[0] = enable ? OPCODE_EN4B : OPCODE_EX4B; flash->command[0] = enable ? OPCODE_EN4B : OPCODE_EX4B;
return spi_write(flash->spi, flash->command, 1); status = spi_write(flash->spi, flash->command, 1);
if (need_wren)
write_disable(flash);
return status;
default: default:
/* Spansion style */ /* Spansion style */
flash->command[0] = OPCODE_BRWR; flash->command[0] = OPCODE_BRWR;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment