Hi,

> In the current implementation, the dummy buswidth is set equal to the
> address buswidth. In case of quad SPI (mode 1-1-4), where the address
> width is 1, the dummy buswidth is also set to 1. Due to this, the
> controller driver introduces 8 dummy cycles on the data line (D0) only
> during a read operation.

Doesn't the controller driver introduce 8 dummy 'clock' cycles that
makes all data lines (D3..D0) idle (typically High-Z) before reading?

> 
> Since 4 data lines are used in quad SPI mode, the dummy buswidth should
> be set to 4. The controller driver computes the number of dummy clock
> cycles as:
> 
>   dummy_cycles = op->dummy.nbytes * 8 / op->dummy.buswidth;
> 
> With dummy.buswidth corrected to 4, the controller produces 2 clock
> cycles of dummy spread across all 4 data lines (D0-D3), which is
> equivalent to 8 dummy bit-times, the same as before. This fix applies
> to all bus width configurations (single, dual, quad and octal).

MTD driver converts dummy cycles to dummy bytes by:

    op.dummy.nbytes = (nor->read_dummy * op.dummy.buswidth) / 8;

So, if you change the dummy.buswidth, the controller driver will get
same number of dummy_cycles.

> 
> Signed-off-by: Padmarao Begari <[email protected]>
> ---
>  drivers/mtd/spi/spi-nor-core.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/drivers/mtd/spi/spi-nor-core.c b/drivers/mtd/spi/spi-nor-core.c
> index 937d79af64e..19446265cd5 100644
> --- a/drivers/mtd/spi/spi-nor-core.c
> +++ b/drivers/mtd/spi/spi-nor-core.c
> @@ -264,7 +264,7 @@ void spi_nor_setup_op(const struct spi_nor *nor,
>                 op->addr.buswidth = spi_nor_get_protocol_addr_nbits(proto);
> 
>         if (op->dummy.nbytes)
> -               op->dummy.buswidth = spi_nor_get_protocol_addr_nbits(proto);
> +               op->dummy.buswidth = spi_nor_get_protocol_data_nbits(proto);
> 
>         if (op->data.nbytes)
>                 op->data.buswidth = spi_nor_get_protocol_data_nbits(proto);
> --
> 2.34.1

Thanks,
Takahiro

Reply via email to