Skip to content

Commit

Permalink
spi/omap_mcspi: Fix broken last word xfer
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Jarkko Nikula authored and Grant Likely committed Mar 23, 2011
1 parent a7006c9 commit 95c5c3a
Showing 1 changed file with 3 additions and 3 deletions.
6 changes: 3 additions & 3 deletions drivers/spi/omap2_mcspi.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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 */
Expand Down

0 comments on commit 95c5c3a

Please sign in to comment.