spi: mux: repair mux usage

It is not valid to cache/short out selection of the mux.

mux_control_select() only locks the mux until mux_control_deselect()
is called. mux_control_deselect() may put the mux in some low power
state or some other user of the mux might select it for other purposes.
These things are probably not happening in the original setting where
this driver was developed, but it is said to be a generic SPI mux.

Also, the mux framework will short out the actual low level muxing
operation when/if that is possible.

Fixes: e9e40543ad ("spi: Add generic SPI multiplexer")
Signed-off-by: Peter Rosin <peda@axentia.se>
Link: https://lore.kernel.org/r/20200525104352.26807-1-peda@axentia.se
Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
Peter Rosin 2020-05-25 12:43:52 +02:00 committed by Mark Brown
parent b9dd3f6d41
commit a2b02e4623
No known key found for this signature in database
GPG Key ID: 24D68B725D5487D0

View File

@ -51,6 +51,10 @@ static int spi_mux_select(struct spi_device *spi)
struct spi_mux_priv *priv = spi_controller_get_devdata(spi->controller); struct spi_mux_priv *priv = spi_controller_get_devdata(spi->controller);
int ret; int ret;
ret = mux_control_select(priv->mux, spi->chip_select);
if (ret)
return ret;
if (priv->current_cs == spi->chip_select) if (priv->current_cs == spi->chip_select)
return 0; return 0;
@ -62,10 +66,6 @@ static int spi_mux_select(struct spi_device *spi)
priv->spi->mode = spi->mode; priv->spi->mode = spi->mode;
priv->spi->bits_per_word = spi->bits_per_word; priv->spi->bits_per_word = spi->bits_per_word;
ret = mux_control_select(priv->mux, spi->chip_select);
if (ret)
return ret;
priv->current_cs = spi->chip_select; priv->current_cs = spi->chip_select;
return 0; return 0;