aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/spi
diff options
context:
space:
mode:
authorJarkko Nikula <jhnikula@gmail.com>2011-03-21 16:27:30 +0200
committerGrant Likely <grant.likely@secretlab.ca>2011-03-23 15:04:15 -0600
commit95c5c3ab7db0dcaeebeb771b90152cd47aa27243 (patch)
tree450ce019ebef4829a1526dc1e43393fa6cf7bc63 /drivers/spi
parenta7006c9747ef225ab070d96c054e85682a09a13e (diff)
downloadkernel_samsung_smdk4412-95c5c3ab7db0dcaeebeb771b90152cd47aa27243.zip
kernel_samsung_smdk4412-95c5c3ab7db0dcaeebeb771b90152cd47aa27243.tar.gz
kernel_samsung_smdk4412-95c5c3ab7db0dcaeebeb771b90152cd47aa27243.tar.bz2
spi/omap_mcspi: Fix broken last word xfer
Commit adef658 "spi/omap_mcspi: catch xfers of non-multiple SPI word size" broke the transmission of last word in cases where access is multiple of word size and word size is 16 or 32 bits. Fix this by replacing the test "c > (word_len>>3)" in do-while loops with "c >= 'pointer increment size'". This ensures that the last word is transmitted in above case and still allow to break the loop and prevent variable c underflow in cases where word size != 'pointer increment size'. Signed-off-by: Jarkko Nikula <jhnikula@gmail.com> Tested-by: Sourav Poddar<sourav.poddar@ti.com> Acked-by: Michael Jones <michael.jones@matrix-vision.de> Signed-off-by: Grant Likely <grant.likely@secretlab.ca>
Diffstat (limited to 'drivers/spi')
-rw-r--r--drivers/spi/omap2_mcspi.c6
1 files changed, 3 insertions, 3 deletions
diff --git a/drivers/spi/omap2_mcspi.c b/drivers/spi/omap2_mcspi.c
index 3a5ed06..6f86ba0 100644
--- a/drivers/spi/omap2_mcspi.c
+++ b/drivers/spi/omap2_mcspi.c
@@ -517,7 +517,7 @@ omap2_mcspi_txrx_pio(struct spi_device *spi, struct spi_transfer *xfer)
dev_vdbg(&spi->dev, "read-%d %02x\n",
word_len, *(rx - 1));
}
- } while (c > (word_len>>3));
+ } while (c);
} else if (word_len <= 16) {
u16 *rx;
const u16 *tx;
@@ -564,7 +564,7 @@ omap2_mcspi_txrx_pio(struct spi_device *spi, struct spi_transfer *xfer)
dev_vdbg(&spi->dev, "read-%d %04x\n",
word_len, *(rx - 1));
}
- } while (c > (word_len>>3));
+ } while (c >= 2);
} else if (word_len <= 32) {
u32 *rx;
const u32 *tx;
@@ -611,7 +611,7 @@ omap2_mcspi_txrx_pio(struct spi_device *spi, struct spi_transfer *xfer)
dev_vdbg(&spi->dev, "read-%d %08x\n",
word_len, *(rx - 1));
}
- } while (c > (word_len>>3));
+ } while (c >= 4);
}
/* for TX_ONLY mode, be sure all words have shifted out */