diff mbox

[U-Boot,v6,08/12] sf: Discover read dummy_cycles

Message ID 4c399e81-548a-4121-a938-6df85186f5b4@DB9EHSMHS029.ehs.local
State Superseded
Delegated to: Jagannadha Sutradharudu Teki
Headers show

Commit Message

Jagannadha Sutradharudu Teki Jan. 4, 2014, 3:04 p.m. UTC
Discovered the read dummy_cycles based on the configured
read command.

Signed-off-by: Jagannadha Sutradharudu Teki <jaganna@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(-)

Comments

Poddar, Sourav Jan. 6, 2014, 7:04 a.m. UTC | #1
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@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. ?
>   	/* Poll cmd seclection */
>   	flash->poll_cmd = CMD_READ_STATUS;
>   #ifdef CONFIG_SPI_FLASH_STMICRO
> diff --git a/include/spi_flash.h b/include/spi_flash.h
> index d24e40a..bdd4141 100644
> --- a/include/spi_flash.h
> +++ b/include/spi_flash.h
> @@ -72,6 +72,7 @@ extern const struct spi_flash_params spi_flash_params_table[];
>    * @erase_cmd:		Erase cmd 4K, 32K, 64K
>    * @read_cmd:		Read cmd - Array Fast, Extn read and quad read.
>    * @write_cmd:		Write cmd - page and quad program.
> + * @dummy_cycles:	Dummy cycles for read operation.
>    * @memory_map:		Address of read-only SPI flash access
>    * @read:		Flash read ops: Read len bytes at offset into buf
>    *			Supported cmds: Fast Array Read
> @@ -98,6 +99,7 @@ struct spi_flash {
>   	u8 erase_cmd;
>   	u8 read_cmd;
>   	u8 write_cmd;
> +	u8 dummy_cycles;
>
>   	void *memory_map;
>   	int (*read)(struct spi_flash *flash, u32 offset, size_t len, void *buf);
Jagan Teki Jan. 6, 2014, 10:18 a.m. UTC | #2
Hi Sourav,

On Mon, Jan 6, 2014 at 12:34 PM, Sourav Poddar <sourav.poddar@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@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

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.
Poddar, Sourav Jan. 6, 2014, 10:21 a.m. UTC | #3
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@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@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?
> 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.
>
Jagan Teki Jan. 6, 2014, 10:30 a.m. UTC | #4
On Mon, Jan 6, 2014 at 3:51 PM, Sourav Poddar <sourav.poddar@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@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@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.

>
>> 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.
>>
>
Poddar, Sourav Jan. 6, 2014, 10:35 a.m. UTC | #5
On Monday 06 January 2014 04:00 PM, Jagan Teki wrote:
> On Mon, Jan 6, 2014 at 3:51 PM, Sourav Poddar<sourav.poddar@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@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@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.
>>> 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.
>>>
Jagan Teki Jan. 6, 2014, 10:37 a.m. UTC | #6
On Mon, Jan 6, 2014 at 4:05 PM, Sourav Poddar <sourav.poddar@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@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@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@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.
>>>>
>
diff mbox

Patch

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;
+	}
+
 	/* Poll cmd seclection */
 	flash->poll_cmd = CMD_READ_STATUS;
 #ifdef CONFIG_SPI_FLASH_STMICRO
diff --git a/include/spi_flash.h b/include/spi_flash.h
index d24e40a..bdd4141 100644
--- a/include/spi_flash.h
+++ b/include/spi_flash.h
@@ -72,6 +72,7 @@  extern const struct spi_flash_params spi_flash_params_table[];
  * @erase_cmd:		Erase cmd 4K, 32K, 64K
  * @read_cmd:		Read cmd - Array Fast, Extn read and quad read.
  * @write_cmd:		Write cmd - page and quad program.
+ * @dummy_cycles:	Dummy cycles for read operation.
  * @memory_map:		Address of read-only SPI flash access
  * @read:		Flash read ops: Read len bytes at offset into buf
  *			Supported cmds: Fast Array Read
@@ -98,6 +99,7 @@  struct spi_flash {
 	u8 erase_cmd;
 	u8 read_cmd;
 	u8 write_cmd;
+	u8 dummy_cycles;
 
 	void *memory_map;
 	int (*read)(struct spi_flash *flash, u32 offset, size_t len, void *buf);