Commit e6289d63 authored by Mingkai Hu's avatar Mingkai Hu Committed by Grant Likely

spi/fsl_espi: change the read behaviour of the SPIRF

The user must read N bytes of SPIRF (1 <= N <= 4) that do not exceed the
amount of data in the receive FIFO, so read the SPIRF byte by byte when
the data in receive FIFO is less than 4 bytes.

On Simics, when read N bytes that exceed the amount of data in receive
FIFO, we can't read the data out, that is we can't clear the rx FIFO,
then the CPU will loop on the espi rx interrupt.
Signed-off-by: default avatarMingkai Hu <Mingkai.hu@freescale.com>
Signed-off-by: default avatarGrant Likely <grant.likely@secretlab.ca>
parent 02086264
...@@ -507,16 +507,29 @@ void fsl_espi_cpu_irq(struct mpc8xxx_spi *mspi, u32 events) ...@@ -507,16 +507,29 @@ void fsl_espi_cpu_irq(struct mpc8xxx_spi *mspi, u32 events)
/* We need handle RX first */ /* We need handle RX first */
if (events & SPIE_NE) { if (events & SPIE_NE) {
u32 rx_data; u32 rx_data, tmp;
u8 rx_data_8;
/* Spin until RX is done */ /* Spin until RX is done */
while (SPIE_RXCNT(events) < min(4, mspi->len)) { while (SPIE_RXCNT(events) < min(4, mspi->len)) {
cpu_relax(); cpu_relax();
events = mpc8xxx_spi_read_reg(&reg_base->event); events = mpc8xxx_spi_read_reg(&reg_base->event);
} }
mspi->len -= 4;
rx_data = mpc8xxx_spi_read_reg(&reg_base->receive); if (mspi->len >= 4) {
rx_data = mpc8xxx_spi_read_reg(&reg_base->receive);
} else {
tmp = mspi->len;
rx_data = 0;
while (tmp--) {
rx_data_8 = in_8((u8 *)&reg_base->receive);
rx_data |= (rx_data_8 << (tmp * 8));
}
rx_data <<= (4 - mspi->len) * 8;
}
mspi->len -= 4;
if (mspi->rx) if (mspi->rx)
mspi->get_rx(rx_data, mspi); mspi->get_rx(rx_data, mspi);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment