[PATCH] spi: cadence_qspi: Fix OSPI DDR mode alignment issue

Michal Simek michal.simek at amd.com
Wed Jan 22 15:17:48 CET 2025



On 1/6/25 10:51, Padmarao Begari wrote:
> If the least significant bit of the address is set to one when
> using the DDR protocol for data transfer then the results are
> indeterminate for few flash devices. To fix this the least
> significant bit of the address is set to zero.
> 
> Signed-off-by: Padmarao Begari <padmarao.begari at amd.com>
> ---
>   drivers/spi/cadence_ospi_versal.c | 12 ++++++++++++
>   1 file changed, 12 insertions(+)
> 
> diff --git a/drivers/spi/cadence_ospi_versal.c b/drivers/spi/cadence_ospi_versal.c
> index 222f828f54..8827a24ee6 100644
> --- a/drivers/spi/cadence_ospi_versal.c
> +++ b/drivers/spi/cadence_ospi_versal.c
> @@ -24,6 +24,13 @@ int cadence_qspi_apb_dma_read(struct cadence_spi_priv *priv,
>   	u8 opcode, addr_bytes, *rxbuf, dummy_cycles;
>   
>   	n_rx = op->data.nbytes;
> +
> +	if (op->addr.dtr && (op->addr.val % 2)) {
> +		n_rx += 1;
> +		writel(op->addr.val & ~0x1,
> +		       priv->regbase + CQSPI_REG_INDIRECTRDSTARTADDR);
> +	}
> +
>   	rxbuf = op->data.buf.in;
>   	rx_rem = n_rx % 4;
>   	bytes_to_dma = n_rx - rx_rem;
> @@ -104,6 +111,11 @@ int cadence_qspi_apb_dma_read(struct cadence_spi_priv *priv,
>   		memcpy(rxbuf, &data, rx_rem);
>   	}
>   
> +	if (op->addr.dtr && (op->addr.val % 2)) {
> +		rxbuf -= bytes_to_dma;
> +		memcpy(rxbuf, rxbuf + 1, n_rx - 1);
> +	}
> +
>   	return 0;
>   }
>   

Applied.
M


More information about the U-Boot mailing list