aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/spi
diff options
context:
space:
mode:
authorJarkko Nikula <jhnikula@gmail.com>2011-03-21 10:27:30 -0400
committerGrant Likely <grant.likely@secretlab.ca>2011-03-23 17:04:15 -0400
commit95c5c3ab7db0dcaeebeb771b90152cd47aa27243 (patch)
tree450ce019ebef4829a1526dc1e43393fa6cf7bc63 /drivers/spi
parenta7006c9747ef225ab070d96c054e85682a09a13e (diff)
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 3a5ed06d3d2f..6f86ba0175ac 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)
517 dev_vdbg(&spi->dev, "read-%d %02x\n", 517 dev_vdbg(&spi->dev, "read-%d %02x\n",
518 word_len, *(rx - 1)); 518 word_len, *(rx - 1));
519 } 519 }
520 } while (c > (word_len>>3)); 520 } while (c);
521 } else if (word_len <= 16) { 521 } else if (word_len <= 16) {
522 u16 *rx; 522 u16 *rx;
523 const u16 *tx; 523 const u16 *tx;
@@ -564,7 +564,7 @@ omap2_mcspi_txrx_pio(struct spi_device *spi, struct spi_transfer *xfer)
564 dev_vdbg(&spi->dev, "read-%d %04x\n", 564 dev_vdbg(&spi->dev, "read-%d %04x\n",
565 word_len, *(rx - 1)); 565 word_len, *(rx - 1));
566 } 566 }
567 } while (c > (word_len>>3)); 567 } while (c >= 2);
568 } else if (word_len <= 32) { 568 } else if (word_len <= 32) {
569 u32 *rx; 569 u32 *rx;
570 const u32 *tx; 570 const u32 *tx;
@@ -611,7 +611,7 @@ omap2_mcspi_txrx_pio(struct spi_device *spi, struct spi_transfer *xfer)
611 dev_vdbg(&spi->dev, "read-%d %08x\n", 611 dev_vdbg(&spi->dev, "read-%d %08x\n",
612 word_len, *(rx - 1)); 612 word_len, *(rx - 1));
613 } 613 }
614 } while (c > (word_len>>3)); 614 } while (c >= 4);
615 } 615 }
616 616
617 /* for TX_ONLY mode, be sure all words have shifted out */ 617 /* for TX_ONLY mode, be sure all words have shifted out */