summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnatolij Gustschin <agust@denx.de>2013-03-13 14:57:43 +0100
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2013-04-12 09:38:43 -0700
commita41c384e8308a7d25fa778f0b24656ef50e05766 (patch)
tree9c2267a327f842885bb69aedfebd9da6daaab9be
parentc8c76a4e4615ae959543cc8332339384ccb4f192 (diff)
downloadlinux-3.10-a41c384e8308a7d25fa778f0b24656ef50e05766.tar.gz
linux-3.10-a41c384e8308a7d25fa778f0b24656ef50e05766.tar.bz2
linux-3.10-a41c384e8308a7d25fa778f0b24656ef50e05766.zip
spi/mpc512x-psc: optionally keep PSC SS asserted across xfer segmensts
commit 1ad849aee5f53353ed88d9cd3d68a51b03a7d44f upstream. Some SPI slave devices require asserted chip select signal across multiple transfer segments of an SPI message. Currently the driver always de-asserts the internal SS signal for every single transfer segment of the message and ignores the 'cs_change' flag of the transfer description. Disable the internal chip select (SS) only if this is needed and indicated by the 'cs_change' flag. Without this change, each partial transfer of a surrounding multi-part SPI transaction might erroneously change the SS signal, which might prevent slaves from answering the request that was sent in a previous transfer segment because the transaction could be considered aborted (SS was de-asserted before reading the response). Reported-by: Gerhard Sittig <gerhard.sittig@ifm.com> Signed-off-by: Anatolij Gustschin <agust@denx.de> Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r--drivers/spi/spi-mpc512x-psc.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/drivers/spi/spi-mpc512x-psc.c b/drivers/spi/spi-mpc512x-psc.c
index 4c63f772780..2e2b04fc065 100644
--- a/drivers/spi/spi-mpc512x-psc.c
+++ b/drivers/spi/spi-mpc512x-psc.c
@@ -164,7 +164,7 @@ static int mpc512x_psc_spi_transfer_rxtx(struct spi_device *spi,
for (i = count; i > 0; i--) {
data = tx_buf ? *tx_buf++ : 0;
- if (len == EOFBYTE)
+ if (len == EOFBYTE && t->cs_change)
setbits32(&fifo->txcmd, MPC512x_PSC_FIFO_EOF);
out_8(&fifo->txdata_8, data);
len--;