[U-Boot] [PATCHv2 5/8] drivers: mtd: spi: Modify read/write command for sfl256s flash.

Sourav Poddar sourav.poddar at ti.com
Wed Jul 31 08:53:48 CEST 2013


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<sourav.poddar at ti.com>
>> ---
>>   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?



More information about the U-Boot mailing list