diff options
author | Michael Jones <michael.jones@matrix-vision.de> | 2011-02-25 10:55:11 -0500 |
---|---|---|
committer | Grant Likely <grant.likely@secretlab.ca> | 2011-03-05 00:23:26 -0500 |
commit | adef658ddf71e709eb1bdc181b86c62b933b967b (patch) | |
tree | cb7b2c926ff5ed307eb0b48b76fd140f5b44dd97 /drivers/spi/omap2_mcspi.c | |
parent | 57d9c10dd91f942f836592f407d6351e2969548a (diff) |
spi/omap_mcspi: catch xfers of non-multiple SPI word size
If an SPI access was not a multiple of the SPI word size,
the while() loop would spin and the rx/tx ptrs would be incremented
indefinitely.
Signed-off-by: Michael Jones <michael.jones@matrix-vision.de>
Signed-off-by: Grant Likely <grant.likely@secretlab.ca>
Diffstat (limited to 'drivers/spi/omap2_mcspi.c')
-rw-r--r-- | drivers/spi/omap2_mcspi.c | 9 |
1 files changed, 6 insertions, 3 deletions
diff --git a/drivers/spi/omap2_mcspi.c b/drivers/spi/omap2_mcspi.c index 1a2d0b8bdd6a..6a982a25b7c3 100644 --- a/drivers/spi/omap2_mcspi.c +++ b/drivers/spi/omap2_mcspi.c | |||
@@ -487,6 +487,9 @@ omap2_mcspi_txrx_pio(struct spi_device *spi, struct spi_transfer *xfer) | |||
487 | rx_reg = base + OMAP2_MCSPI_RX0; | 487 | rx_reg = base + OMAP2_MCSPI_RX0; |
488 | chstat_reg = base + OMAP2_MCSPI_CHSTAT0; | 488 | chstat_reg = base + OMAP2_MCSPI_CHSTAT0; |
489 | 489 | ||
490 | if (c < (word_len>>3)) | ||
491 | return 0; | ||
492 | |||
490 | if (word_len <= 8) { | 493 | if (word_len <= 8) { |
491 | u8 *rx; | 494 | u8 *rx; |
492 | const u8 *tx; | 495 | const u8 *tx; |
@@ -534,7 +537,7 @@ omap2_mcspi_txrx_pio(struct spi_device *spi, struct spi_transfer *xfer) | |||
534 | dev_vdbg(&spi->dev, "read-%d %02x\n", | 537 | dev_vdbg(&spi->dev, "read-%d %02x\n", |
535 | word_len, *(rx - 1)); | 538 | word_len, *(rx - 1)); |
536 | } | 539 | } |
537 | } while (c); | 540 | } while (c > (word_len>>3)); |
538 | } else if (word_len <= 16) { | 541 | } else if (word_len <= 16) { |
539 | u16 *rx; | 542 | u16 *rx; |
540 | const u16 *tx; | 543 | const u16 *tx; |
@@ -581,7 +584,7 @@ omap2_mcspi_txrx_pio(struct spi_device *spi, struct spi_transfer *xfer) | |||
581 | dev_vdbg(&spi->dev, "read-%d %04x\n", | 584 | dev_vdbg(&spi->dev, "read-%d %04x\n", |
582 | word_len, *(rx - 1)); | 585 | word_len, *(rx - 1)); |
583 | } | 586 | } |
584 | } while (c); | 587 | } while (c > (word_len>>3)); |
585 | } else if (word_len <= 32) { | 588 | } else if (word_len <= 32) { |
586 | u32 *rx; | 589 | u32 *rx; |
587 | const u32 *tx; | 590 | const u32 *tx; |
@@ -628,7 +631,7 @@ omap2_mcspi_txrx_pio(struct spi_device *spi, struct spi_transfer *xfer) | |||
628 | dev_vdbg(&spi->dev, "read-%d %08x\n", | 631 | dev_vdbg(&spi->dev, "read-%d %08x\n", |
629 | word_len, *(rx - 1)); | 632 | word_len, *(rx - 1)); |
630 | } | 633 | } |
631 | } while (c); | 634 | } while (c > (word_len>>3)); |
632 | } | 635 | } |
633 | 636 | ||
634 | /* for TX_ONLY mode, be sure all words have shifted out */ | 637 | /* for TX_ONLY mode, be sure all words have shifted out */ |