From mboxrd@z Thu Jan 1 00:00:00 1970 From: Sourav Poddar Date: Wed, 7 Aug 2013 11:27:05 +0530 Subject: [U-Boot] [PATCHv2 5/8] drivers: mtd: spi: Modify read/write command for sfl256s flash. In-Reply-To: <51F8B47C.6060302@ti.com> References: <1374569979-28660-1-git-send-email-sourav.poddar@ti.com> <1374569979-28660-6-git-send-email-sourav.poddar@ti.com> <51EE91CA.6070709@ti.com> <51F8B47C.6060302@ti.com> Message-ID: <5201E1B1.9020206@ti.com> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de Hi Jagan, On Wednesday 31 July 2013 12:23 PM, Sourav Poddar wrote: > Hi Jagan, > On Tuesday 23 July 2013 07:53 PM, Sourav Poddar wrote: >> + jagan, >> >> On Tuesday 23 July 2013 02:29 PM, Sourav Poddar wrote: >>> Reading using the already supported read command is causing regression >>> after 4k bytes, as a result doing a page by page read. Its >>> happening, because >>> ti qpsi controller CS will get de asserted after 4096 bytes. >>> >>> Signed-off-by: Sourav Poddar >>> --- >>> drivers/mtd/spi/spi_flash.c | 32 +++++++++++++++++++++++++++++++- >>> 1 files changed, 31 insertions(+), 1 deletions(-) >>> >>> diff --git a/drivers/mtd/spi/spi_flash.c b/drivers/mtd/spi/spi_flash.c >>> index 6a6fe37..5f8db7b 100644 >>> --- a/drivers/mtd/spi/spi_flash.c >>> +++ b/drivers/mtd/spi/spi_flash.c >>> @@ -303,6 +303,36 @@ int spi_flash_cmd_read_fast(struct spi_flash >>> *flash, u32 offset, >>> else >>> read_len = remain_len; >>> >>> +#ifdef CONFIG_TI_QSPI >>> + unsigned long page_addr, byte_addr, page_size; >>> + size_t chunk_len, actual; >>> + int ret = 0; >>> + >>> + page_size = flash->page_size; >>> + page_addr = offset / page_size; >>> + byte_addr = offset % page_size; >>> + >>> + for (actual = 0; actual< read_len; actual += chunk_len) { >>> + chunk_len = min(read_len - actual, page_size - byte_addr); >>> + >>> + cmd[1] = page_addr>> 8; >>> + cmd[2] = page_addr; >>> + cmd[3] = byte_addr; >>> + >>> + ret = spi_flash_read_common(flash, cmd, sizeof(cmd), >>> + data + actual, chunk_len); >>> + if (ret< 0) { >>> + debug("SF: read failed"); >>> + break; >>> + } >>> + >>> + byte_addr += chunk_len; >>> + if (byte_addr == page_size) { >>> + page_addr++; >>> + byte_addr = 0; >>> + } >>> + } >>> +#else >>> spi_flash_addr(offset, cmd); >>> >>> ret = spi_flash_read_common(flash, cmd, sizeof(cmd), >>> @@ -311,7 +341,7 @@ int spi_flash_cmd_read_fast(struct spi_flash >>> *flash, u32 offset, >>> debug("SF: read failed\n"); >>> break; >>> } >>> - >>> +#endif >>> offset += read_len; >>> len -= read_len; >>> data += read_len; >> Elaborating a bit more on this, >> There is a constrain on our hardware, which goes like this.. >> >> As soon as the words transfered is 4096 bytes, the CS gets deasserted >> automatically. >> As a result of this bottleneck, I am not able to use the current use >> read api in mtd framework. >> This requires me to send the read command every time in range upto >> 4096 bytes only. >> >> To overcome this, I have updated the mtd read based on TI_QSPI config >> as done above. >> >> [Jagan]: >> Do you have any suggestion of dealing this in a better way? >> I don't see a way to get around this apart from updating mtd read >> depending on TI_QSPI config. >> > Any inputs on this? > Any suggestions on the patch?