On 25/11/22 11:29, Dhruva Gole wrote:
> Fix the issue where some flash chips like cypress S25HS256T return the
> value of the same register over and over in DAC mode.
>
> For example in the TI K3-AM62x Processors refer [0] Technical Reference
> Manual there is a layer of digital logic in front of the QSPI/OSPI
> Drive when used in DAC mode. This is part of the Flash Subsystem (FSS)
> which provides access to external Flash devices. This operates by
> default in a 32 bit mode causing it to always align all data to 4 bytes
> from a 4byte aligned address. In some flash chips like cypress for
> example if we try to read some regs in DAC mode then it keeps sending the
> value of the first register that was requested and inorder to read the
> next reg, we have to stop and re-initiate a new transaction.
>
> This causes wrong registers values to be read than what is desired when
> registers are read in DAC mode. Hence if the data.nbytes is very less
> then prefer STIG mode for such small reads.
>
> [0] https://www.ti.com/lit/ug/spruiv7a/spruiv7a.pdf
>
> Signed-off-by: Dhruva Gole <d-g...@ti.com>
> ---
> drivers/spi/cadence_qspi.c | 8 +++++++-
> 1 file changed, 7 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/spi/cadence_qspi.c b/drivers/spi/cadence_qspi.c
> index ab0a681c8376..5506f63ef078 100644
> --- a/drivers/spi/cadence_qspi.c
> +++ b/drivers/spi/cadence_qspi.c
> @@ -307,7 +307,13 @@ static int cadence_spi_mem_exec_op(struct spi_slave *spi,
> priv->is_decoded_cs);
>
> if (op->data.dir == SPI_MEM_DATA_IN && op->data.buf.in) {
> - if (!op->addr.nbytes)
> + /*
> + * Performing reads in DAC mode forces to read minimum 4 bytes
> + * which is unsupported on some flash devices during register
> + * reads, prefer STIG mode for such small reads.
> + */
> + if (!op->addr.nbytes ||
> + op->data.nbytes < CQSPI_STIG_DATA_LEN_MAX)
> mode = CQSPI_STIG_READ;
For the series,
Tested-by: Vaishnav Achath <vaishna...@ti.com>
Erase-Write-Read back tested on s28hs512t, mt35xu512aba, mt25qu512a on J7200 and
J721E platforms.
> else
> mode = CQSPI_READ;
--
Regards,
Vaishnav