[PATCH v2] spi: mux: Fix master controller settings after mux select

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



In some cases SPI child devices behind spi-mux require different
settings like: max_speed_hz, mode and bits_per_word.

Typically the slave device driver puts the settings in place and calls
spi_setup() once during probe and assumes they stay in place for all
following spi transfers.

However spi-mux forwarded spi_setup() -call to SPI master driver only
when slave driver calls spi_setup(). If second slave device was
accessed meanwhile and that driver called spi_setup(), the
settings did not change back to the first spi device.
In case of wrong max_speed_hz this caused spi trasfers to fail.

This commit adds spi_setup() call after mux is changed. This way
the right device specific parameters are set to the master driver.

The fix has been tested by using custom hardware and debugging
spi master driver speed settings.

Co-developed-by: Petri Tauriainen <petri.tauriainen@xxxxxxxxxxx>
Signed-off-by: Petri Tauriainen <petri.tauriainen@xxxxxxxxxxx>
Signed-off-by: Heikki Keranen <heikki.keranen@xxxxxxxxxxx>
---
Changes in v2:
- fixed Co-authored-by -> Co-developed-by
- added Signed-off-by for co-developer
  both suggested by Andy Shevchenko, thanks!

 drivers/spi/spi-mux.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/drivers/spi/spi-mux.c b/drivers/spi/spi-mux.c
index bd988f53753e..5d72e3d59df8 100644
--- a/drivers/spi/spi-mux.c
+++ b/drivers/spi/spi-mux.c
@@ -68,6 +68,8 @@ static int spi_mux_select(struct spi_device *spi)
 
 	priv->current_cs = spi_get_chipselect(spi, 0);
 
+	spi_setup(priv->spi);
+
 	return 0;
 }
 
-- 
2.30.2





[Index of Archives]     [Linux Kernel]     [Linux ARM (vger)]     [Linux ARM MSM]     [Linux Omap]     [Linux Arm]     [Linux Tegra]     [Fedora ARM]     [Linux for Samsung SOC]     [eCos]     [Linux Fastboot]     [Gcc Help]     [Git]     [DCCP]     [IETF Announce]     [Security]     [Linux MIPS]     [Yosemite Campsites]

  Powered by Linux