diff options
author | Sourav Poddar | 2013-06-07 11:32:47 -0500 |
---|---|---|
committer | Tom Rini | 2013-06-07 12:14:09 -0500 |
commit | ab011ac8b3a560988dbc0761f714daeaafd766e7 (patch) | |
tree | 85b90d036b75cf2c53ad28c8077c468bbeb0074a | |
parent | 69ccf4a520f18f22075aad031d82b4b9e32e2d12 (diff) | |
download | u-boot-ab011ac8b3a560988dbc0761f714daeaafd766e7.tar.gz u-boot-ab011ac8b3a560988dbc0761f714daeaafd766e7.tar.xz u-boot-ab011ac8b3a560988dbc0761f714daeaafd766e7.zip |
drivers: mtd: spi: Modify read/write command for sfl256s flash.
Reading using the already supported read command is causing regression
even while reading 4k bytes, as a result doing a page by page read.
At the end of the write sequence, write enable latch should be disabled and
re enabled while doing the next page programming.
Signed-off-by: Sourav Poddar <sourav.poddar@ti.com>
-rw-r--r-- | drivers/mtd/spi/spi_flash.c | 39 |
1 files changed, 34 insertions, 5 deletions
diff --git a/drivers/mtd/spi/spi_flash.c b/drivers/mtd/spi/spi_flash.c index 111185af17..8c3a2cfa5c 100644 --- a/drivers/mtd/spi/spi_flash.c +++ b/drivers/mtd/spi/spi_flash.c | |||
@@ -117,6 +117,12 @@ int spi_flash_cmd_write_multi(struct spi_flash *flash, u32 offset, | |||
117 | if (ret) | 117 | if (ret) |
118 | break; | 118 | break; |
119 | 119 | ||
120 | ret = spi_flash_cmd_write_disable(flash); | ||
121 | if (ret < 0) { | ||
122 | printf("SF: disabling write failed\n"); | ||
123 | break; | ||
124 | } | ||
125 | |||
120 | byte_addr += chunk_len; | 126 | byte_addr += chunk_len; |
121 | if (byte_addr == page_size) { | 127 | if (byte_addr == page_size) { |
122 | page_addr++; | 128 | page_addr++; |
@@ -147,17 +153,40 @@ int spi_flash_read_common(struct spi_flash *flash, const u8 *cmd, | |||
147 | int spi_flash_cmd_read_fast(struct spi_flash *flash, u32 offset, | 153 | int spi_flash_cmd_read_fast(struct spi_flash *flash, u32 offset, |
148 | size_t len, void *data) | 154 | size_t len, void *data) |
149 | { | 155 | { |
150 | u8 cmd[5]; | 156 | unsigned long page_addr, byte_addr, page_size; |
157 | size_t chunk_len, actual; | ||
158 | int ret = 0; | ||
159 | u8 cmd[4]; | ||
151 | 160 | ||
152 | /* Handle memory-mapped SPI */ | 161 | /* Handle memory-mapped SPI */ |
153 | if (flash->memory_map) | 162 | if (flash->memory_map) |
154 | memcpy(data, flash->memory_map + offset, len); | 163 | memcpy(data, flash->memory_map + offset, len); |
164 | page_size = flash->page_size; | ||
165 | page_addr = offset / page_size; | ||
166 | byte_addr = offset % page_size; | ||
167 | |||
168 | cmd[0] = CMD_READ_ARRAY_SLOW; | ||
169 | for (actual = 0; actual < len; actual += chunk_len) { | ||
170 | chunk_len = min(len - actual, page_size - byte_addr); | ||
171 | |||
172 | cmd[1] = page_addr >> 8; | ||
173 | cmd[2] = page_addr; | ||
174 | cmd[3] = byte_addr; | ||
175 | |||
176 | ret = spi_flash_read_common(flash, cmd, sizeof(cmd), data + actual, chunk_len); | ||
177 | if (ret < 0) { | ||
178 | debug("SF: read failed"); | ||
179 | break; | ||
180 | } | ||
155 | 181 | ||
156 | cmd[0] = CMD_READ_ARRAY_FAST; | 182 | byte_addr += chunk_len; |
157 | spi_flash_addr(offset, cmd); | 183 | if (byte_addr == page_size) { |
158 | cmd[4] = 0x00; | 184 | page_addr++; |
185 | byte_addr = 0; | ||
186 | } | ||
187 | } | ||
159 | 188 | ||
160 | return spi_flash_read_common(flash, cmd, sizeof(cmd), data, len); | 189 | return ret; |
161 | } | 190 | } |
162 | 191 | ||
163 | int spi_flash_cmd_poll_bit(struct spi_flash *flash, unsigned long timeout, | 192 | int spi_flash_cmd_poll_bit(struct spi_flash *flash, unsigned long timeout, |