Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit adef658d authored by Michael Jones's avatar Michael Jones Committed by Grant Likely
Browse files

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: default avatarMichael Jones <michael.jones@matrix-vision.de>
Signed-off-by: default avatarGrant Likely <grant.likely@secretlab.ca>
parent 57d9c10d
Loading
Loading
Loading
Loading
+6 −3
Original line number Diff line number Diff line
@@ -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 */