Unverified Commit 53f826ff authored by Chin-Ting Kuo's avatar Chin-Ting Kuo Committed by Mark Brown
Browse files

spi: spi-mem: Protect dirmap_create() with spi_mem_access_start/end



spi_mem_dirmap_create() may reconfigure controller-wide settings,
which can interfere with concurrent transfers to other devices
sharing the same SPI controller but using different chip selects.

Wrap the ->dirmap_create() callback with spi_mem_access_start() and
spi_mem_access_end() to serialize access and prevent cross-CS
interference during dirmap creation.

This patch has been verified on a setup where a SPI TPM is connected
to CS0 of a SPI controller, while a SPI NOR flash is connected to CS1
of the same controller. Without this patch, spi_mem_dirmap_create()
for the SPI NOR flash interferes with ongoing SPI TPM data transfers,
resulting in failure to create the TPM device. This was tested on an
ASPEED AST2700 EVB.

Signed-off-by: default avatarChin-Ting Kuo <chin-ting_kuo@aspeedtech.com>
Reviewed-by: default avatarPaul Menzel <pmenzel@molgen.mpg.de>
Link: https://patch.msgid.link/20260120123005.1392071-2-chin-ting_kuo@aspeedtech.com


Signed-off-by: default avatarMark Brown <broonie@kernel.org>
parent 63804fed
Loading
Loading
Loading
Loading
+10 −1
Original line number Diff line number Diff line
@@ -708,9 +708,18 @@ spi_mem_dirmap_create(struct spi_mem *mem,

	desc->mem = mem;
	desc->info = *info;
	if (ctlr->mem_ops && ctlr->mem_ops->dirmap_create)
	if (ctlr->mem_ops && ctlr->mem_ops->dirmap_create) {
		ret = spi_mem_access_start(mem);
		if (ret) {
			kfree(desc);
			return ERR_PTR(ret);
		}

		ret = ctlr->mem_ops->dirmap_create(desc);

		spi_mem_access_end(mem);
	}

	if (ret) {
		desc->nodirmap = true;
		if (!spi_mem_supports_op(desc->mem, &desc->info.op_tmpl))