在 2016年3月27日星期日 UTC+8下午8:46:51,Priit Laes写道: > > On Sun, 2016-03-27 at 02:10 -0700, Iru Cai wrote: > > Thanks for this patch, and I can use flashrom in Cubieboard with the > > patch v6 and mainline kernel. > > > > However, there's still some problems. I flashed a chip off the board > > and it works well, but when I read a chip on a mainboard twice, the > > result is different. Is there something wrong with the SPI driver, or > > is it a hardware issue? > > Could you also provide link (or send a new letter with attachment) to > patch v6? >
Oh, just in this thread. https://groups.google.com/d/msg/linux-sunxi/M8ZSFzWKjfY/DhIuWxWjAgAJ > > > > > 在 2014年3月18日星期二 UTC+8上午9:28:26,mrnuke写道: > > > From c541c363b339d145f326747db5a3b0fabce2780a Mon Sep 17 00:00:00 > > > 2001 > > > From: Alexandru Gagniuc <[email protected]> > > > Date: Mon, 17 Mar 2014 20:08:05 -0500 > > > Subject: [PATCH] NOTFORMERGE: ARM: sun4i: spi: Allow transfers > > > larger than > > > FIFO size > > > > > > SPI transfers were limited to one FIFO depth, which is 64 bytes. > > > This was an artificial limitation, however, as the hardware can > > > handle > > > much larger bursts. To accommodate this, we enable the interrupt > > > when > > > the Rx FIFO is 3/4 full, and drain the FIFO within the interrupt > > > handler. The 3/4 ratio was chosen arbitrarily, with the intention > > > to > > > reduce the potential number of interrupts. > > > > > > Since the SUN4I_CTL_TP bit is set, the hardware will pause > > > transmission whenever the FIFO is full, so there is no risk of > > > losing > > > data if we can't service the interrupt in time. > > > > > > In the long term, we'll be better off handling this as DMA > > > transfers, > > > but for now, this enables some userspace software, such as > > > flashrom, > > > to use the A10 SPI controller via the spidev interfac without > > > receing > > > -EINVAL. > > > > > > This patch should NOT be merged, as it only handles long Rx > > > transfers. > > > Long Tx transfers have not been tested, and they will most likely > > > fail > > > miserably. There is currently no refreshing of Tx FIFOs when they > > > run > > > empty on long transfers. > > > > > > I'm, watching the bus with a logic analyzer, and at low speeds (2 > > > MHz > > > or less), the bursts are continuous. However, on higher speeds, the > > > bursts seem to happen in 64-byte micro-bursts. My assumption is > > > that > > > we aren't servicing the 3/4 FIFO interrupts fast enough, the FIFOs > > > get > > > filled, and the controller pauses communication. At higher speeds, > > > there seem to be weird effects, such as the transmission pausing > > > mid- > > > byte for a long period of time, but I suspect this to be due to my > > > logic analyzer being too slow and/or too much impedance in the > > > connecting wires (logic analyzer missing SCLK transitions). > > > > > > This patch is currently tested on top of sunxi-devel, but should > > > apply > > > cleanly to sunxi-next as well. > > > > > > Signed-off-by: Alexandru Gagniuc <[email protected]> > > > --- > > > drivers/spi/spi-sun4i.c | 20 ++++++++++++++++---- > > > 1 file changed, 16 insertions(+), 4 deletions(-) > > > > > > diff --git a/drivers/spi/spi-sun4i.c b/drivers/spi/spi-sun4i.c > > > index 3f82705..f3d06bb 100644 > > > --- a/drivers/spi/spi-sun4i.c > > > +++ b/drivers/spi/spi-sun4i.c > > > @@ -47,6 +47,7 @@ > > > #define SUN4I_CTL_TP BIT(18) > > > > > > #define SUN4I_INT_CTL_REG 0x0c > > > +#define SUN4I_INT_CTL_RF_F34 BIT(4) > > > #define SUN4I_INT_CTL_TC BIT(16) > > > > > > #define SUN4I_INT_STA_REG 0x10 > > > @@ -68,6 +69,8 @@ > > > #define SUN4I_XMIT_CNT_REG 0x24 > > > #define SUN4I_XMIT_CNT(cnt) ((cnt) & > > > 0xffffff) > > > > > > +#define SUN4I_MAX_XFER_SIZE 0xffffff > > > + > > > #define SUN4I_FIFO_STA_REG 0x28 > > > #define SUN4I_FIFO_STA_RF_CNT_MASK 0x7f > > > #define SUN4I_FIFO_STA_RF_CNT_BITS 0 > > > @@ -175,8 +178,7 @@ static int sun4i_spi_transfer_one(struct > > > spi_master > > > *master, > > > int ret = 0; > > > u32 reg; > > > > > > - /* We don't support transfer larger than the FIFO */ > > > - if (tfr->len > SUN4I_FIFO_DEPTH) > > > + if (tfr->len > SUN4I_MAX_XFER_SIZE) > > > return -EINVAL; > > > > > > reinit_completion(&sspi->done); > > > @@ -274,7 +276,8 @@ static int sun4i_spi_transfer_one(struct > > > spi_master > > > *master, > > > sun4i_spi_fill_fifo(sspi, SUN4I_FIFO_DEPTH); > > > > > > /* Enable the interrupts */ > > > - sun4i_spi_write(sspi, SUN4I_INT_CTL_REG, > > > SUN4I_INT_CTL_TC); > > > + sun4i_spi_write(sspi, SUN4I_INT_CTL_REG, SUN4I_INT_CTL_TC > > > | > > > + > > > SUN4I_INT_CTL_RF_F34); > > > > > > /* Start the transfer */ > > > reg = sun4i_spi_read(sspi, SUN4I_CTL_REG); > > > @@ -287,7 +290,7 @@ static int sun4i_spi_transfer_one(struct > > > spi_master > > > *master, > > > goto out; > > > } > > > > > > - sun4i_spi_drain_fifo(sspi, SUN4I_FIFO_DEPTH); > > > + /* FIFO is drained during the interrupt handler */ > > > > > > out: > > > sun4i_spi_write(sspi, SUN4I_INT_CTL_REG, 0); > > > @@ -300,9 +303,18 @@ static irqreturn_t sun4i_spi_handler(int irq, > > > void > > > *dev_id) > > > struct sun4i_spi *sspi = dev_id; > > > u32 status = sun4i_spi_read(sspi, SUN4I_INT_STA_REG); > > > > > > + /* Receive FIFO 3/4 full */ > > > + if (status & SUN4I_INT_CTL_RF_F34) { > > > + sun4i_spi_drain_fifo(sspi, SUN4I_FIFO_DEPTH); > > > + /* Only clear the interrupt _after_ draining the > > > FIFO */ > > > + sun4i_spi_write(sspi, SUN4I_INT_STA_REG, > > > SUN4I_INT_CTL_RF_F34); > > > + return IRQ_HANDLED; > > > + } > > > + > > > /* Transfer complete */ > > > if (status & SUN4I_INT_CTL_TC) { > > > sun4i_spi_write(sspi, SUN4I_INT_STA_REG, > > > SUN4I_INT_CTL_TC); > > > + sun4i_spi_drain_fifo(sspi, SUN4I_FIFO_DEPTH); > > > complete(&sspi->done); > > > return IRQ_HANDLED; > > > } > > > > -- You received this message because you are subscribed to the Google Groups "linux-sunxi" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. For more options, visit https://groups.google.com/d/optout.
