Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=feed9bab7b14b77be8d796bcee95e2343fb82955
Commit:     feed9bab7b14b77be8d796bcee95e2343fb82955
Parent:     dbcc2ec60fe15448e5dfe4153f7347ac82b4da73
Author:     Kalle Valo <[EMAIL PROTECTED]>
AuthorDate: Thu Jan 24 14:00:40 2008 -0800
Committer:  Linus Torvalds <[EMAIL PROTECTED]>
CommitDate: Thu Jan 24 14:06:44 2008 -0800

    spi: omap2_mcspi PIO RX fix
    
    Before transmission of the last word in PIO RX_ONLY mode rx+tx mode
    is enabled:
    
        /* prevent last RX_ONLY read from triggering
         * more word i/o: switch to rx+tx
         */
        if (c == 0 && tx == NULL)
                mcspi_write_cs_reg(spi,
                                OMAP2_MCSPI_CHCONF0, l);
    
    But because c is decremented after the test, c will never be zero and
    rx+tx will not be enabled. This breaks RX_ONLY mode PIO transfers.
    
    Fix it by decrementing c in the beginning of the various I/O loops.
    
    Signed-off-by: Kalle Valo <[EMAIL PROTECTED]>
    Signed-off-by: David Brownell <[EMAIL PROTECTED]>
    Signed-off-by: Andrew Morton <[EMAIL PROTECTED]>
    Signed-off-by: Linus Torvalds <[EMAIL PROTECTED]>
---
 drivers/spi/omap2_mcspi.c |    6 +++---
 1 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/drivers/spi/omap2_mcspi.c b/drivers/spi/omap2_mcspi.c
index 3cdab13..ea61724 100644
--- a/drivers/spi/omap2_mcspi.c
+++ b/drivers/spi/omap2_mcspi.c
@@ -350,6 +350,7 @@ omap2_mcspi_txrx_pio(struct spi_device *spi, struct 
spi_transfer *xfer)
                tx = xfer->tx_buf;
 
                do {
+                       c -= 1;
                        if (tx != NULL) {
                                if (mcspi_wait_for_reg_bit(chstat_reg,
                                                OMAP2_MCSPI_CHSTAT_TXS) < 0) {
@@ -380,7 +381,6 @@ omap2_mcspi_txrx_pio(struct spi_device *spi, struct 
spi_transfer *xfer)
                                                word_len, *(rx - 1));
 #endif
                        }
-                       c -= 1;
                } while (c);
        } else if (word_len <= 16) {
                u16             *rx;
@@ -389,6 +389,7 @@ omap2_mcspi_txrx_pio(struct spi_device *spi, struct 
spi_transfer *xfer)
                rx = xfer->rx_buf;
                tx = xfer->tx_buf;
                do {
+                       c -= 2;
                        if (tx != NULL) {
                                if (mcspi_wait_for_reg_bit(chstat_reg,
                                                OMAP2_MCSPI_CHSTAT_TXS) < 0) {
@@ -419,7 +420,6 @@ omap2_mcspi_txrx_pio(struct spi_device *spi, struct 
spi_transfer *xfer)
                                                word_len, *(rx - 1));
 #endif
                        }
-                       c -= 2;
                } while (c);
        } else if (word_len <= 32) {
                u32             *rx;
@@ -428,6 +428,7 @@ omap2_mcspi_txrx_pio(struct spi_device *spi, struct 
spi_transfer *xfer)
                rx = xfer->rx_buf;
                tx = xfer->tx_buf;
                do {
+                       c -= 4;
                        if (tx != NULL) {
                                if (mcspi_wait_for_reg_bit(chstat_reg,
                                                OMAP2_MCSPI_CHSTAT_TXS) < 0) {
@@ -458,7 +459,6 @@ omap2_mcspi_txrx_pio(struct spi_device *spi, struct 
spi_transfer *xfer)
                                                word_len, *(rx - 1));
 #endif
                        }
-                       c -= 4;
                } while (c);
        }
 
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to