spi: cadence_qspi: Fix OSPI DDR mode alignment issue
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@amd.com> Link: https://lore.kernel.org/r/20250106095120.800753-1-padmarao.begari@amd.com Signed-off-by: Michal Simek <michal.simek@amd.com>
This commit is contained in:

committed by
Michal Simek

parent
a1319b5487
commit
1621851495
@@ -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;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user