summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLars Povlsen <lars.povlsen@microchip.com>2020-11-20 22:34:14 +0100
committerMark Brown <broonie@kernel.org>2020-11-25 12:54:05 +0000
commit0abdb0fba07322ce960d32a92a64847b3009b2e2 (patch)
tree47f3d5af55c6df93a0b24334c1bcf929095935b1
parent7cd71202961090d8f2d2b863ec66b25ae43e1d39 (diff)
downloadlinux-stable-0abdb0fba07322ce960d32a92a64847b3009b2e2.tar.gz
linux-stable-0abdb0fba07322ce960d32a92a64847b3009b2e2.tar.bz2
linux-stable-0abdb0fba07322ce960d32a92a64847b3009b2e2.zip
spi: dw: Fix spi registration for controllers overriding CS
When SPI DW memory ops support was introduced, there was a check for excluding controllers which supplied their own CS function. Even so, the mem_ops pointer is *always* presented to the SPI core. This causes the SPI core sanity check in spi_controller_check_ops() to refuse registration, since a mem_ops pointer is being supplied without an exec_op member function. The end result is failure of the SPI DW driver on sparx5 and similar platforms. The fix in the core SPI DW driver is to avoid presenting the mem_ops pointer if the exec_op function is not set. Fixes: 6423207e57ea (spi: dw: Add memory operations support) Signed-off-by: Lars Povlsen <lars.povlsen@microchip.com> Acked-by: Serge Semin <fancer.lancer@gmail.com> Link: https://lore.kernel.org/r/20201120213414.339701-1-lars.povlsen@microchip.com Signed-off-by: Mark Brown <broonie@kernel.org>
-rw-r--r--drivers/spi/spi-dw-core.c3
1 files changed, 2 insertions, 1 deletions
diff --git a/drivers/spi/spi-dw-core.c b/drivers/spi/spi-dw-core.c
index 0b2236ade412..c33866f747db 100644
--- a/drivers/spi/spi-dw-core.c
+++ b/drivers/spi/spi-dw-core.c
@@ -875,7 +875,8 @@ int dw_spi_add_host(struct device *dev, struct dw_spi *dws)
master->set_cs = dw_spi_set_cs;
master->transfer_one = dw_spi_transfer_one;
master->handle_err = dw_spi_handle_err;
- master->mem_ops = &dws->mem_ops;
+ if (dws->mem_ops.exec_op)
+ master->mem_ops = &dws->mem_ops;
master->max_speed_hz = dws->max_freq;
master->dev.of_node = dev->of_node;
master->dev.fwnode = dev->fwnode;