[U-Boot] [PATCH v6 08/12] sf: Discover read dummy_cycles
Jagan Teki
jagannadh.teki at gmail.com
Mon Jan 6 11:37:49 CET 2014
On Mon, Jan 6, 2014 at 4:05 PM, Sourav Poddar <sourav.poddar at ti.com> wrote:
> On Monday 06 January 2014 04:00 PM, Jagan Teki wrote:
>>
>> On Mon, Jan 6, 2014 at 3:51 PM, Sourav Poddar<sourav.poddar at ti.com>
>> wrote:
>>>
>>> On Monday 06 January 2014 03:48 PM, Jagan Teki wrote:
>>>>
>>>> Hi Sourav,
>>>>
>>>> On Mon, Jan 6, 2014 at 12:34 PM, Sourav Poddar<sourav.poddar at ti.com>
>>>> wrote:
>>>>>
>>>>> On Saturday 04 January 2014 08:34 PM, Jagannadha Sutradharudu Teki
>>>>> wrote:
>>>>>>
>>>>>> Discovered the read dummy_cycles based on the configured
>>>>>> read command.
>>>>>>
>>>>>> Signed-off-by: Jagannadha Sutradharudu Teki<jaganna at xilinx.com>
>>>>>> ---
>>>>>> drivers/mtd/spi/sf_internal.h | 2 ++
>>>>>> drivers/mtd/spi/sf_ops.c | 10 ++++++----
>>>>>> drivers/mtd/spi/sf_probe.c | 12 ++++++++++++
>>>>>> include/spi_flash.h | 2 ++
>>>>>> 4 files changed, 22 insertions(+), 4 deletions(-)
>>>>>>
>>>>>> diff --git a/drivers/mtd/spi/sf_internal.h
>>>>>> b/drivers/mtd/spi/sf_internal.h
>>>>>> index 7be0292..a9f5a81 100644
>>>>>> --- a/drivers/mtd/spi/sf_internal.h
>>>>>> +++ b/drivers/mtd/spi/sf_internal.h
>>>>>> @@ -10,6 +10,8 @@
>>>>>> #ifndef _SF_INTERNAL_H_
>>>>>> #define _SF_INTERNAL_H_
>>>>>>
>>>>>> +#define SPI_FLASH_3B_ADDR_LEN 3
>>>>>> +#define SPI_FLASH_CMD_LEN (1 + SPI_FLASH_3B_ADDR_LEN)
>>>>>> #define SPI_FLASH_16MB_BOUN 0x1000000
>>>>>>
>>>>>> /* CFI Manufacture ID's */
>>>>>> diff --git a/drivers/mtd/spi/sf_ops.c b/drivers/mtd/spi/sf_ops.c
>>>>>> index 827f719..dda75b1 100644
>>>>>> --- a/drivers/mtd/spi/sf_ops.c
>>>>>> +++ b/drivers/mtd/spi/sf_ops.c
>>>>>> @@ -9,6 +9,7 @@
>>>>>> */
>>>>>>
>>>>>> #include<common.h>
>>>>>> +#include<malloc.h>
>>>>>> #include<spi.h>
>>>>>> #include<spi_flash.h>
>>>>>> #include<watchdog.h>
>>>>>> @@ -216,7 +217,7 @@ int spi_flash_write_common(struct spi_flash
>>>>>> *flash,
>>>>>> const u8 *cmd,
>>>>>> int spi_flash_cmd_erase_ops(struct spi_flash *flash, u32 offset,
>>>>>> size_t
>>>>>> len)
>>>>>> {
>>>>>> u32 erase_size;
>>>>>> - u8 cmd[4];
>>>>>> + u8 cmd[SPI_FLASH_CMD_LEN];
>>>>>> int ret = -1;
>>>>>>
>>>>>> erase_size = flash->erase_size;
>>>>>> @@ -255,7 +256,7 @@ int spi_flash_cmd_write_ops(struct spi_flash
>>>>>> *flash,
>>>>>> u32 offset,
>>>>>> {
>>>>>> unsigned long byte_addr, page_size;
>>>>>> size_t chunk_len, actual;
>>>>>> - u8 cmd[4];
>>>>>> + u8 cmd[SPI_FLASH_CMD_LEN];
>>>>>> int ret = -1;
>>>>>>
>>>>>> page_size = flash->page_size;
>>>>>> @@ -317,7 +318,7 @@ int spi_flash_read_common(struct spi_flash *flash,
>>>>>> const u8 *cmd,
>>>>>> int spi_flash_cmd_read_ops(struct spi_flash *flash, u32 offset,
>>>>>> size_t len, void *data)
>>>>>> {
>>>>>> - u8 cmd[5], bank_sel = 0;
>>>>>> + u8 *cmd, bank_sel = 0;
>>>>>> u32 remain_len, read_len;
>>>>>> int ret = -1;
>>>>>>
>>>>>> @@ -335,8 +336,9 @@ int spi_flash_cmd_read_ops(struct spi_flash
>>>>>> *flash,
>>>>>> u32 offset,
>>>>>> return 0;
>>>>>> }
>>>>>>
>>>>>> + cmd = malloc(SPI_FLASH_CMD_LEN + flash->dummy_cycles);
>>>>>> + memset(cmd, 0, SPI_FLASH_CMD_LEN + flash->dummy_cycles);
>>>>>> cmd[0] = flash->read_cmd;
>>>>>> - cmd[4] = 0x00;
>>>>>>
>>>>>> while (len) {
>>>>>> #ifdef CONFIG_SPI_FLASH_BAR
>>>>>> diff --git a/drivers/mtd/spi/sf_probe.c b/drivers/mtd/spi/sf_probe.c
>>>>>> index a049e72..b070adc 100644
>>>>>> --- a/drivers/mtd/spi/sf_probe.c
>>>>>> +++ b/drivers/mtd/spi/sf_probe.c
>>>>>> @@ -140,6 +140,18 @@ static struct spi_flash
>>>>>> *spi_flash_validate_params(struct spi_slave *spi,
>>>>>> }
>>>>>> }
>>>>>>
>>>>>> + /* Read dummy cycles */
>>>>>> + switch (flash->read_cmd) {
>>>>>> + case CMD_READ_QUAD_IO_FAST:
>>>>>> + flash->dummy_cycles = 2;
>>>>>> + break;
>>>>>> + case CMD_READ_ARRAY_SLOW:
>>>>>> + flash->dummy_cycles = 0;
>>>>>> + break;
>>>>>> + default:
>>>>>> + flash->dummy_cycles = 1;
>>>>>> + }
>>>>>> +
>>>>>
>>>>> what about dummy cycles for dual i/o(0xbb), it has 4 clock bit dummy
>>>>> cycles(macronix), so
>>>>> by your code you keep it to 1(8 bit) dummy cycle. ?
>>>>
>>>> Yes- Actually i miss used the names here.
>>>> These are dummy_byte_count
>>>>
>>>> Ex: Except fast reads (array, dual and quad fast)
>>>> dummy_byte_count = dummy_cycles * no.of lines
>>>> dual i/o (4 dummy_cycles) - 4 * 2 = 1 dummy_byte
>>>> quad i/o (4 dummy_cycles) - 4 * 4 = 2 dummy_byte
>>>>
>>> is this calculation documented in any of the flash sheet?
>>
>> I haven't see the exact calculation but ie. how the I/O operation usually
>> works.
>> quad read - cmd, 3byte_inst, 1 dummy_byte(8 dummy_cycles) goes on
>> single line and data goes in 4 lines
>> quad i/o - except cmd(1 lines) remaining goes in 4 lines.
>>
> Ok, got the point.
Anyway I can add the comments on to of this code.
Thanks for notice.
>
>>>> fast, dual and quad fast have 8 dummy_cycles means 1 byte dummy the
>>>> reason why I am not including
>>>> no.of lines here is irrespective of fast(1 line), dual(2 lines) and
>>>> quad(4 lines) only data can travel among the difference lines
>>>> but the cmd,inst, dummy can travel only on single line. this can be
>>>> opposite in i/o commands.
>>>>
>>>> Hope you understand - I just said based on my knowledge.
>>>> I will change the dummy_cycles into dummy_bytes - nevertheless
>>>> everything
>>>> same.
>>>>
>
--
Thanks,
Jagan.
More information about the U-Boot
mailing list