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

Jagan Teki jagannadh.teki at gmail.com
Wed Aug 7 13:51:12 CEST 2013


Hi,

On Wed, Aug 7, 2013 at 11:27 AM, Sourav Poddar <sourav.poddar at ti.com> wrote:
> 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<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?
>>
>
> Any suggestions on the patch?
>
> _______________________________________________
> U-Boot mailing list
> U-Boot at lists.denx.de
> http://lists.denx.de/mailman/listinfo/u-boot

Yes, this part is pretty much working as with other s25fl.
Can you point me the respective controller driver for this.

Does linux support this ti_qspi, please point the defconfig if you have.

--
Thanks,
Jagan.


More information about the U-Boot mailing list