From mboxrd@z Thu Jan 1 00:00:00 1970 From: Grant Likely Subject: Re: [PATCH 1/2] eSPI: change the read behavior of the SPIRF Date: Fri, 24 Dec 2010 01:55:13 -0700 Message-ID: <20101224085513.GF5544@angua.secretlab.ca> References: <1292894768-6737-1-git-send-email-Mingkai.hu@freescale.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Cc: linuxppc-dev@ozlabs.org, kumar.gala@freescale.com, spi-devel-general@lists.sourceforge.net To: Mingkai Hu Return-path: Content-Disposition: inline In-Reply-To: <1292894768-6737-1-git-send-email-Mingkai.hu@freescale.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: linuxppc-dev-bounces+glppe-linuxppc-embedded-2=m.gmane.org@lists.ozlabs.org Errors-To: linuxppc-dev-bounces+glppe-linuxppc-embedded-2=m.gmane.org@lists.ozlabs.org List-Id: linux-spi.vger.kernel.org On Tue, Dec 21, 2010 at 09:26:07AM +0800, Mingkai Hu wrote: > 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 Applied to merge branch for 2.6.27, thanks. g. > --- > The patch 2/2 is againsted on this patch, so I resent this patch again > for convience which sent several weeks ago. > > drivers/spi/spi_fsl_espi.c | 19 ++++++++++++++++--- > 1 files changed, 16 insertions(+), 3 deletions(-) > > diff --git a/drivers/spi/spi_fsl_espi.c b/drivers/spi/spi_fsl_espi.c > index e3b4f64..ae78926 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) > > /* We need handle RX first */ > if (events & SPIE_NE) { > - u32 rx_data; > + u32 rx_data, tmp; > + u8 rx_data_8; > > /* Spin until RX is done */ > while (SPIE_RXCNT(events) < min(4, mspi->len)) { > cpu_relax(); > events = mpc8xxx_spi_read_reg(®_base->event); > } > - mspi->len -= 4; > > - rx_data = mpc8xxx_spi_read_reg(®_base->receive); > + if (mspi->len >= 4) { > + rx_data = mpc8xxx_spi_read_reg(®_base->receive); > + } else { > + tmp = mspi->len; > + rx_data = 0; > + while (tmp--) { > + rx_data_8 = in_8((u8 *)®_base->receive); > + rx_data |= (rx_data_8 << (tmp * 8)); > + } > + > + rx_data <<= (4 - mspi->len) * 8; > + } > + > + mspi->len -= 4; > > if (mspi->rx) > mspi->get_rx(rx_data, mspi); > -- > 1.6.4 > >