aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/spi/spi_fsl_espi.c
diff options
context:
space:
mode:
authorMingkai Hu <Mingkai.hu@freescale.com>2010-12-01 04:29:18 -0500
committerGrant Likely <grant.likely@secretlab.ca>2010-12-30 01:04:46 -0500
commit477ca3ad6ac5cdbd5bd40941fc22c6eedc9aa90d (patch)
tree9552afcd670e798b1d98ccc4efe2f5baae572d3d /drivers/spi/spi_fsl_espi.c
parent94a544a4e8d05a027613443c529c399c39cc3371 (diff)
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 amout 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: Mingkai Hu <Mingkai.hu@freescale.com> Signed-off-by: Grant Likely <grant.likely@secretlab.ca>
Diffstat (limited to 'drivers/spi/spi_fsl_espi.c')
-rw-r--r--drivers/spi/spi_fsl_espi.c19
1 files changed, 16 insertions, 3 deletions
diff --git a/drivers/spi/spi_fsl_espi.c b/drivers/spi/spi_fsl_espi.c
index e3b4f6451966..ae789262c981 100644
--- a/drivers/spi/spi_fsl_espi.c
+++ b/drivers/spi/spi_fsl_espi.c
@@ -507,16 +507,29 @@ void fsl_espi_cpu_irq(struct mpc8xxx_spi *mspi, u32 events)
507 507
508 /* We need handle RX first */ 508 /* We need handle RX first */
509 if (events & SPIE_NE) { 509 if (events & SPIE_NE) {
510 u32 rx_data; 510 u32 rx_data, tmp;
511 u8 rx_data_8;
511 512
512 /* Spin until RX is done */ 513 /* Spin until RX is done */
513 while (SPIE_RXCNT(events) < min(4, mspi->len)) { 514 while (SPIE_RXCNT(events) < min(4, mspi->len)) {
514 cpu_relax(); 515 cpu_relax();
515 events = mpc8xxx_spi_read_reg(&reg_base->event); 516 events = mpc8xxx_spi_read_reg(&reg_base->event);
516 } 517 }
517 mspi->len -= 4;
518 518
519 rx_data = mpc8xxx_spi_read_reg(&reg_base->receive); 519 if (mspi->len >= 4) {
520 rx_data = mpc8xxx_spi_read_reg(&reg_base->receive);
521 } else {
522 tmp = mspi->len;
523 rx_data = 0;
524 while (tmp--) {
525 rx_data_8 = in_8((u8 *)&reg_base->receive);
526 rx_data |= (rx_data_8 << (tmp * 8));
527 }
528
529 rx_data <<= (4 - mspi->len) * 8;
530 }
531
532 mspi->len -= 4;
520 533
521 if (mspi->rx) 534 if (mspi->rx)
522 mspi->get_rx(rx_data, mspi); 535 mspi->get_rx(rx_data, mspi);