diff options
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 1a2d0b8bdd6..6a982a25b7c 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)  	rx_reg		= base + OMAP2_MCSPI_RX0;  	chstat_reg	= base + OMAP2_MCSPI_CHSTAT0; +	if (c < (word_len>>3)) +		return 0; +  	if (word_len <= 8) {  		u8		*rx;  		const u8	*tx; @@ -534,7 +537,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); +		} while (c > (word_len>>3));  	} else if (word_len <= 16) {  		u16		*rx;  		const u16	*tx; @@ -581,7 +584,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); +		} while (c > (word_len>>3));  	} else if (word_len <= 32) {  		u32		*rx;  		const u32	*tx; @@ -628,7 +631,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); +		} while (c > (word_len>>3));  	}  	/* for TX_ONLY mode, be sure all words have shifted out */  |