From mboxrd@z Thu Jan 1 00:00:00 1970 From: Sourav Poddar Date: Wed, 31 Jul 2013 12:23:48 +0530 Subject: [U-Boot] [PATCHv2 5/8] drivers: mtd: spi: Modify read/write command for sfl256s flash. In-Reply-To: <51EE91CA.6070709@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> Message-ID: <51F8B47C.6060302@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 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?