linux/drivers/spi
Gerard Kam dc329442b9 atmel_spi: fix hang due to missed interrupt
For some time my at91sam9260 board with JFFS2 on serial flash (m25p80)
would hang when accessing the serial flash and SPI bus.  Slowing the SPI
clock down to 9 MHz reduced the occurrence of the hang from "always"
during boot to a nuisance level that allowed other SW development to
continue.  Finally had to address this issue when an application stresses
the I/O to always cause a hang.

Hang seems to be caused by a missed SPI interrupt, so that the task ends
up waiting forever after calling spi_sync().  The fix has 2 parts.  First
is to halt the DMA engine before the "current" PDC registers are loaded.
This ensures that the "next" registers are loaded before the DMA operation
takes off.  The second part of the fix is a kludge that adds a
"completion" interrupt in case the ENDRX interrupt for the last segment of
the DMA chaining operation was missed.

The patch allows the SPI clock for the serial flash to be increased from 9
MHz to 15 MHz (or more?).  No hangs or SPI overruns were encountered.

Haavard: while this patch does indeed improve things, I still see overruns
and CRC errors on my NGW100 board when running the DataFlash at 10 MHz.
However, I think some improvement is better than nothing, so I'm passing
this on for inclusion in 2.6.27.

Signed-off-by: Gerard Kam <gerardk5@verizon.net>
Signed-off-by: Haavard Skinnemoen <haavard.skinnemoen@atmel.com>
Cc: David Brownell <david-b@pacbell.net>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2008-08-04 16:58:45 -07:00
..
Kconfig SPI Kconfig simplifications 2008-07-24 10:47:30 -07:00
Makefile spi: SuperH SPI using SCI 2008-02-06 10:41:11 -08:00
at25.c spi: at25 driver is for EEPROM not FLASH 2007-12-05 09:21:18 -08:00
atmel_spi.c atmel_spi: fix hang due to missed interrupt 2008-08-04 16:58:45 -07:00
atmel_spi.h [PATCH] SPI: atmel_spi driver 2007-02-14 08:09:53 -08:00
au1550_spi.c dma-mapping: add the device argument to dma_mapping_error() 2008-07-26 12:00:03 -07:00
mpc52xx_psc_spi.c mpc52xx_psc_spi: fix block transfer 2008-07-28 16:30:21 -07:00
omap2_mcspi.c dma-mapping: add the device argument to dma_mapping_error() 2008-07-26 12:00:03 -07:00
omap_uwire.c spi: replace remaining __FUNCTION__ occurrences 2008-04-28 08:58:31 -07:00
pxa2xx_spi.c dma-mapping: add the device argument to dma_mapping_error() 2008-07-26 12:00:03 -07:00
spi.c spi: split up spi_new_device() to allow two stage registration. 2008-07-25 22:34:29 -04:00
spi_bfin5xx.c spi_bfin5xx: use PIO for full duplex, not DMA 2008-05-01 08:04:01 -07:00
spi_bitbang.c spi: replace remaining __FUNCTION__ occurrences 2008-04-28 08:58:31 -07:00
spi_butterfly.c minor spi_butterfly cleanup 2007-05-08 11:15:15 -07:00
spi_imx.c dma-mapping: add the device argument to dma_mapping_error() 2008-07-26 12:00:03 -07:00
spi_lm70llp.c spi doesn't need class_device 2007-10-16 09:43:10 -07:00
spi_mpc83xx.c spi: spi_mpc83xx clockrate fixes 2008-07-24 10:47:30 -07:00
spi_s3c24xx.c spi: S3C24XX: reset register status on resume. 2008-08-04 16:58:45 -07:00
spi_s3c24xx_gpio.c spi: fix platform driver hotplug/coldplug 2008-04-11 08:06:43 -07:00
spi_sh_sci.c spi: fix platform driver hotplug/coldplug 2008-04-11 08:06:43 -07:00
spi_txx9.c spi: fix platform driver hotplug/coldplug 2008-04-11 08:06:43 -07:00
spidev.c spidev: BKL removal 2008-07-24 10:47:30 -07:00
tle62x0.c tle62x0 driver stops ignoring read errors 2007-11-14 18:45:42 -08:00
xilinx_spi.c xilinx_spi: test below 0 on unsigned irq in xilinx_spi_probe() 2008-07-24 10:47:30 -07:00