diff options
Diffstat (limited to 'drivers/mtd/devices')
-rw-r--r-- | drivers/mtd/devices/st_spi_fsm.c | 23 |
1 files changed, 10 insertions, 13 deletions
diff --git a/drivers/mtd/devices/st_spi_fsm.c b/drivers/mtd/devices/st_spi_fsm.c index d7e38cc8814f..40eb830eea21 100644 --- a/drivers/mtd/devices/st_spi_fsm.c +++ b/drivers/mtd/devices/st_spi_fsm.c | |||
@@ -270,7 +270,6 @@ | |||
270 | */ | 270 | */ |
271 | #define CFG_READ_TOGGLE_32BIT_ADDR 0x00000001 | 271 | #define CFG_READ_TOGGLE_32BIT_ADDR 0x00000001 |
272 | #define CFG_WRITE_TOGGLE_32BIT_ADDR 0x00000002 | 272 | #define CFG_WRITE_TOGGLE_32BIT_ADDR 0x00000002 |
273 | #define CFG_WRITE_EX_32BIT_ADDR_DELAY 0x00000004 | ||
274 | #define CFG_ERASESEC_TOGGLE_32BIT_ADDR 0x00000008 | 273 | #define CFG_ERASESEC_TOGGLE_32BIT_ADDR 0x00000008 |
275 | #define CFG_S25FL_CHECK_ERROR_FLAGS 0x00000010 | 274 | #define CFG_S25FL_CHECK_ERROR_FLAGS 0x00000010 |
276 | 275 | ||
@@ -1152,23 +1151,17 @@ static int stfsm_mx25_config(struct stfsm *fsm) | |||
1152 | stfsm_mx25_en_32bit_addr_seq(&fsm->stfsm_seq_en_32bit_addr); | 1151 | stfsm_mx25_en_32bit_addr_seq(&fsm->stfsm_seq_en_32bit_addr); |
1153 | 1152 | ||
1154 | soc_reset = stfsm_can_handle_soc_reset(fsm); | 1153 | soc_reset = stfsm_can_handle_soc_reset(fsm); |
1155 | if (soc_reset || !fsm->booted_from_spi) { | 1154 | if (soc_reset || !fsm->booted_from_spi) |
1156 | /* If we can handle SoC resets, we enable 32-bit address | 1155 | /* If we can handle SoC resets, we enable 32-bit address |
1157 | * mode pervasively */ | 1156 | * mode pervasively */ |
1158 | stfsm_enter_32bit_addr(fsm, 1); | 1157 | stfsm_enter_32bit_addr(fsm, 1); |
1159 | 1158 | ||
1160 | } else { | 1159 | else |
1161 | /* Else, enable/disable 32-bit addressing before/after | 1160 | /* Else, enable/disable 32-bit addressing before/after |
1162 | * each operation */ | 1161 | * each operation */ |
1163 | fsm->configuration = (CFG_READ_TOGGLE_32BIT_ADDR | | 1162 | fsm->configuration = (CFG_READ_TOGGLE_32BIT_ADDR | |
1164 | CFG_WRITE_TOGGLE_32BIT_ADDR | | 1163 | CFG_WRITE_TOGGLE_32BIT_ADDR | |
1165 | CFG_ERASESEC_TOGGLE_32BIT_ADDR); | 1164 | CFG_ERASESEC_TOGGLE_32BIT_ADDR); |
1166 | /* It seems a small delay is required after exiting | ||
1167 | * 32-bit mode following a write operation. The issue | ||
1168 | * is under investigation. | ||
1169 | */ | ||
1170 | fsm->configuration |= CFG_WRITE_EX_32BIT_ADDR_DELAY; | ||
1171 | } | ||
1172 | } | 1165 | } |
1173 | 1166 | ||
1174 | /* For QUAD mode, set 'QE' STATUS bit */ | 1167 | /* For QUAD mode, set 'QE' STATUS bit */ |
@@ -1631,11 +1624,8 @@ static int stfsm_write(struct stfsm *fsm, const uint8_t *buf, | |||
1631 | stfsm_s25fl_clear_status_reg(fsm); | 1624 | stfsm_s25fl_clear_status_reg(fsm); |
1632 | 1625 | ||
1633 | /* Exit 32-bit address mode, if required */ | 1626 | /* Exit 32-bit address mode, if required */ |
1634 | if (fsm->configuration & CFG_WRITE_TOGGLE_32BIT_ADDR) { | 1627 | if (fsm->configuration & CFG_WRITE_TOGGLE_32BIT_ADDR) |
1635 | stfsm_enter_32bit_addr(fsm, 0); | 1628 | stfsm_enter_32bit_addr(fsm, 0); |
1636 | if (fsm->configuration & CFG_WRITE_EX_32BIT_ADDR_DELAY) | ||
1637 | udelay(1); | ||
1638 | } | ||
1639 | 1629 | ||
1640 | return 0; | 1630 | return 0; |
1641 | } | 1631 | } |
@@ -1938,6 +1928,13 @@ static int stfsm_init(struct stfsm *fsm) | |||
1938 | fsm->base + SPI_CONFIGDATA); | 1928 | fsm->base + SPI_CONFIGDATA); |
1939 | writel(STFSM_DEFAULT_WR_TIME, fsm->base + SPI_STATUS_WR_TIME_REG); | 1929 | writel(STFSM_DEFAULT_WR_TIME, fsm->base + SPI_STATUS_WR_TIME_REG); |
1940 | 1930 | ||
1931 | /* | ||
1932 | * Set the FSM 'WAIT' delay to the minimum workable value. Note, for | ||
1933 | * our purposes, the WAIT instruction is used purely to achieve | ||
1934 | * "sequence validity" rather than actually implement a delay. | ||
1935 | */ | ||
1936 | writel(0x00000001, fsm->base + SPI_PROGRAM_ERASE_TIME); | ||
1937 | |||
1941 | /* Clear FIFO, just in case */ | 1938 | /* Clear FIFO, just in case */ |
1942 | stfsm_clear_fifo(fsm); | 1939 | stfsm_clear_fifo(fsm); |
1943 | 1940 | ||