diff options
Diffstat (limited to 'drivers/mtd/devices/m25p80.c')
| -rw-r--r-- | drivers/mtd/devices/m25p80.c | 17 |
1 files changed, 15 insertions, 2 deletions
diff --git a/drivers/mtd/devices/m25p80.c b/drivers/mtd/devices/m25p80.c index 26b14f9fcac6..6bc9618af094 100644 --- a/drivers/mtd/devices/m25p80.c +++ b/drivers/mtd/devices/m25p80.c | |||
| @@ -168,12 +168,25 @@ static inline int write_disable(struct m25p *flash) | |||
| 168 | */ | 168 | */ |
| 169 | static inline int set_4byte(struct m25p *flash, u32 jedec_id, int enable) | 169 | static inline int set_4byte(struct m25p *flash, u32 jedec_id, int enable) |
| 170 | { | 170 | { |
| 171 | int status; | ||
| 172 | bool need_wren = false; | ||
| 173 | |||
| 171 | switch (JEDEC_MFR(jedec_id)) { | 174 | switch (JEDEC_MFR(jedec_id)) { |
| 172 | case CFI_MFR_MACRONIX: | ||
| 173 | case CFI_MFR_ST: /* Micron, actually */ | 175 | case CFI_MFR_ST: /* Micron, actually */ |
| 176 | /* Some Micron need WREN command; all will accept it */ | ||
| 177 | need_wren = true; | ||
| 178 | case CFI_MFR_MACRONIX: | ||
| 174 | case 0xEF /* winbond */: | 179 | case 0xEF /* winbond */: |
| 180 | if (need_wren) | ||
| 181 | write_enable(flash); | ||
| 182 | |||
| 175 | flash->command[0] = enable ? OPCODE_EN4B : OPCODE_EX4B; | 183 | flash->command[0] = enable ? OPCODE_EN4B : OPCODE_EX4B; |
| 176 | return spi_write(flash->spi, flash->command, 1); | 184 | status = spi_write(flash->spi, flash->command, 1); |
| 185 | |||
| 186 | if (need_wren) | ||
| 187 | write_disable(flash); | ||
| 188 | |||
| 189 | return status; | ||
| 177 | default: | 190 | default: |
| 178 | /* Spansion style */ | 191 | /* Spansion style */ |
| 179 | flash->command[0] = OPCODE_BRWR; | 192 | flash->command[0] = OPCODE_BRWR; |
