mirror of
https://github.com/torvalds/linux.git
synced 2024-12-29 06:12:08 +00:00
spi: cadence-quadspi: fix incorrect supports_op() return value
Since the conversion to spi-mem, the driver advertised support for
various operations that cqspi_set_protocol() was never expected to handle
correctly - in particuar all non-DTR operations with command or address
buswidth > 1. For DTR, all operations except for 8-8-8 would fail, as
cqspi_set_protocol() returns -EINVAL.
In non-DTR mode, this resulted in data corruption for SPI-NOR flashes that
support such operations. As a minimal fix that can be backported to stable
kernels, simply disallow the unsupported operations again to avoid this
issue.
Fixes: a314f63677
("mtd: spi-nor: Convert cadence-quadspi to use spi-mem framework")
Signed-off-by: Matthias Schiffer <matthias.schiffer@ew.tq-group.com>
Link: https://lore.kernel.org/r/20220406132832.199777-1-matthias.schiffer@ew.tq-group.com
Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
parent
299d8b7451
commit
f1d388f216
@ -1415,9 +1415,24 @@ static bool cqspi_supports_mem_op(struct spi_mem *mem,
|
||||
all_false = !op->cmd.dtr && !op->addr.dtr && !op->dummy.dtr &&
|
||||
!op->data.dtr;
|
||||
|
||||
/* Mixed DTR modes not supported. */
|
||||
if (!(all_true || all_false))
|
||||
if (all_true) {
|
||||
/* Right now we only support 8-8-8 DTR mode. */
|
||||
if (op->cmd.nbytes && op->cmd.buswidth != 8)
|
||||
return false;
|
||||
if (op->addr.nbytes && op->addr.buswidth != 8)
|
||||
return false;
|
||||
if (op->data.nbytes && op->data.buswidth != 8)
|
||||
return false;
|
||||
} else if (all_false) {
|
||||
/* Only 1-1-X ops are supported without DTR */
|
||||
if (op->cmd.nbytes && op->cmd.buswidth > 1)
|
||||
return false;
|
||||
if (op->addr.nbytes && op->addr.buswidth > 1)
|
||||
return false;
|
||||
} else {
|
||||
/* Mixed DTR modes are not supported. */
|
||||
return false;
|
||||
}
|
||||
|
||||
return spi_mem_default_supports_op(mem, op);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user