linux/drivers/spi
Lukas Wunner 4c524191c0
spi: bcm2835: Work around DONE bit erratum
Commit 3bd7f6589f ("spi: bcm2835: Overcome sglist entry length
limitation") amended the BCM2835 SPI driver with support for DMA
transfers whose buffers are not aligned to 4 bytes and require more than
one sglist entry.

When testing this feature with upcoming commits to speed up TX-only and
RX-only transfers, I noticed that SPI transmission sometimes breaks.
A function introduced by the commit, bcm2835_spi_transfer_prologue(),
performs one or two PIO transmissions as a prologue to the actual DMA
transmission.  It turns out that the breakage goes away if the DONE bit
in the CS register is set when ending such a PIO transmission.

The DONE bit signifies emptiness of the TX FIFO.  According to the spec,
the bit is of type RO, so writing it should never have any effect.
Perhaps the spec is wrong and the bit is actually of type RW1C.
E.g. the I2C controller on the BCM2835 does have an RW1C DONE bit which
needs to be cleared by the driver.  Another, possibly more likely
explanation is that it's a hardware erratum since the issue does not
occur consistently.

Either way, amend bcm2835_spi_transfer_prologue() to always write the
DONE bit.

Usually a transmission is ended by bcm2835_spi_reset_hw().  If the
transmission was successful, the TX FIFO is empty and thus the DONE bit
is set when bcm2835_spi_reset_hw() reads the CS register.  The bit is
then written back to the register, so we happen to do the right thing.

However if DONE is not set, e.g. because transmission is aborted with
a non-empty TX FIFO, the bit won't be written by bcm2835_spi_reset_hw()
and it seems possible that transmission might subsequently break.  To be
on the safe side, likewise amend bcm2835_spi_reset_hw() to always write
the bit.

Tested-by: Nuno Sá <nuno.sa@analog.com>
Signed-off-by: Lukas Wunner <lukas@wunner.de>
Acked-by: Stefan Wahren <wahrenst@gmx.net>
Acked-by: Martin Sperl <kernel@martin.sperl.org>
Link: https://lore.kernel.org/r/edb004dff4af6106f6bfcb89e1a96391e96eb857.1564825752.git.lukas@wunner.de
Signed-off-by: Mark Brown <broonie@kernel.org>
2019-09-10 11:28:44 +01:00
..
atmel-quadspi.c spi: atmel-quadspi: fix resume call 2019-07-02 14:09:23 +01:00
internals.h spi: Add an helper to flush the message queue 2018-04-23 15:48:18 +01:00
Kconfig Linux 5.2-rc4 2019-06-10 18:52:53 +01:00
Makefile spi: Add spi driver for Socionext SynQuacer platform 2019-06-04 15:50:33 +01:00
spi-altera.c
spi-armada-3700.c
spi-at91-usart.c spi: at91-usart: add DMA support 2019-05-08 17:45:26 +09:00
spi-ath79.c spi: ath79: Remove now useless code 2019-01-17 12:34:55 +00:00
spi-atmel.c spi-atmel: support inter-word delay 2019-01-30 23:02:11 +00:00
spi-au1550.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 157 2019-05-30 11:26:37 -07:00
spi-axi-spi-engine.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 177 2019-05-30 11:29:19 -07:00
spi-bcm63xx-hsspi.c spi/bcm63xx-hsspi: keep pll clk enabled 2018-09-18 09:16:34 -07:00
spi-bcm63xx.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 157 2019-05-30 11:26:37 -07:00
spi-bcm2835.c spi: bcm2835: Work around DONE bit erratum 2019-09-10 11:28:44 +01:00
spi-bcm2835aux.c Linux 5.2-rc4 2019-06-10 18:52:53 +01:00
spi-bcm-qspi.c spi: bcm-qspi: Fix BSPI QUAD and DUAL mode support when using flex mode 2019-08-07 14:23:48 +01:00
spi-bcm-qspi.h
spi-bitbang-txrx.h
spi-bitbang.c Linux 5.2-rc4 2019-06-10 18:52:53 +01:00
spi-brcmstb-qspi.c
spi-butterfly.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 157 2019-05-30 11:26:37 -07:00
spi-cadence.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 39 2019-05-24 17:27:12 +02:00
spi-cavium-octeon.c
spi-cavium-thunderx.c treewide: Add SPDX license identifier for more missed files 2019-05-21 10:50:45 +02:00
spi-cavium.c
spi-cavium.h
spi-clps711x.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 152 2019-05-30 11:26:32 -07:00
spi-coldfire-qspi.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 157 2019-05-30 11:26:37 -07:00
spi-davinci.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 157 2019-05-30 11:26:37 -07:00
spi-dln2.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 372 2019-06-05 17:37:10 +02:00
spi-dw-mid.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 288 2019-06-05 17:36:37 +02:00
spi-dw-mmio.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 422 2019-06-05 17:37:15 +02:00
spi-dw-pci.c spi: dw-pci: Add MODULE_DEVICE_TABLE 2019-08-30 12:40:57 +01:00
spi-dw.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 288 2019-06-05 17:36:37 +02:00
spi-dw.h dw: spi: add support for Amazon's Alpine spi controller 2018-10-11 15:11:04 +01:00
spi-efm32.c
spi-ep93xx.c spi: ep93xx: Drop unused variable 2019-05-08 17:37:43 +09:00
spi-falcon.c
spi-fsl-cpm.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 152 2019-05-30 11:26:32 -07:00
spi-fsl-cpm.h treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 152 2019-05-30 11:26:32 -07:00
spi-fsl-dspi.c spi: spi-fsl-dspi: Exit the ISR with IRQ_NONE when it's not ours 2019-08-23 11:52:42 +01:00
spi-fsl-espi.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 152 2019-05-30 11:26:32 -07:00
spi-fsl-lib.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 152 2019-05-30 11:26:32 -07:00
spi-fsl-lib.h treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 152 2019-05-30 11:26:32 -07:00
spi-fsl-lpspi.c spi: fsl-lpspi: Clean up fsl_lpspi_probe 2019-04-08 14:08:53 +07:00
spi-fsl-qspi.c spi: spi-fsl-qspi: change i.MX7D RX FIFO size 2019-07-10 16:31:35 +01:00
spi-fsl-spi.c Linux 5.2-rc4 2019-06-10 18:52:53 +01:00
spi-fsl-spi.h treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 152 2019-05-30 11:26:32 -07:00
spi-geni-qcom.c spi: spi-geni-qcom: Get rid of forward declaration 2019-01-14 12:24:05 +00:00
spi-gpio.c spi: gpio: Add SPI_MASTER_GPIO_SS flag 2019-07-17 18:51:21 +01:00
spi-img-spfi.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 422 2019-06-05 17:37:15 +02:00
spi-imx.c Merge branch 'spi-5.1' into spi-5.2 for stm32 2019-03-15 17:06:34 +00:00
spi-iproc-qspi.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 174 2019-05-30 11:26:41 -07:00
spi-jcore.c treewide: Add SPDX license identifier for more missed files 2019-05-21 10:50:45 +02:00
spi-lantiq-ssc.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 352 2019-06-05 17:37:09 +02:00
spi-lm70llp.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 157 2019-05-30 11:26:37 -07:00
spi-loopback-test.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 157 2019-05-30 11:26:37 -07:00
spi-lp8841-rtc.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 157 2019-05-30 11:26:37 -07:00
spi-mem.c spi-mem: fix kernel-doc for spi_mem_dirmap_{read|write}() 2019-04-08 14:06:51 +07:00
spi-meson-spicc.c spi: meson-spicc: Fix error handling in meson_spicc_probe() 2018-05-02 05:59:21 +09:00
spi-meson-spifc.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 446 2019-06-05 17:37:18 +02:00
spi-mpc52xx-psc.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 152 2019-05-30 11:26:32 -07:00
spi-mpc52xx.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 428 2019-06-05 17:37:16 +02:00
spi-mpc512x-psc.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 152 2019-05-30 11:26:32 -07:00
spi-mt65xx.c Linux 5.2-rc4 2019-06-10 18:52:53 +01:00
spi-mt7621.c Staging / IIO driver patches for 5.2-rc1 2019-05-07 13:31:29 -07:00
spi-mxic.c spi: mxic: simplify getting .driver_data 2019-03-20 17:20:29 +00:00
spi-mxs.c spi: mxs: add tracing to custom .transfer_one_message callback 2019-01-29 15:08:58 +00:00
spi-npcm-pspi.c spi: npcm-pspi: Fix wrong priv pointer 2019-01-03 12:27:17 +00:00
spi-nuc900.c
spi-nxp-fspi.c spi: spi-mem: spi-nxp-fspi: add module license info 2019-01-29 11:55:41 +00:00
spi-oc-tiny.c treewide: devm_kzalloc() -> devm_kcalloc() 2018-06-12 16:19:22 -07:00
spi-omap2-mcspi.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 157 2019-05-30 11:26:37 -07:00
spi-omap-100k.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 157 2019-05-30 11:26:37 -07:00
spi-omap-uwire.c
spi-orion.c spi: orion: Support spi_xfer->word_delay_usecs 2019-03-18 12:18:42 +00:00
spi-pic32-sqi.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 445 2019-06-05 17:37:18 +02:00
spi-pic32.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 445 2019-06-05 17:37:18 +02:00
spi-pl022.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 157 2019-05-30 11:26:37 -07:00
spi-ppc4xx.c
spi-pxa2xx-dma.c spi: pxa2xx: Introduce DMA burst size support 2019-03-20 17:21:17 +00:00
spi-pxa2xx-pci.c treewide: Add SPDX license identifier for more missed files 2019-05-21 10:50:45 +02:00
spi-pxa2xx.c spi: pxa2xx: Add support for Intel Tiger Lake 2019-08-02 12:14:23 +01:00
spi-pxa2xx.h pxa2xx: replace spi_master with spi_controller 2019-01-23 10:59:56 +00:00
spi-qcom-qspi.c spi: spi-qcom-qspi: Fix remaining driver nits 2018-11-22 14:38:13 +00:00
spi-qup.c Linux 5.2-rc4 2019-06-10 18:52:53 +01:00
spi-rb4xx.c spi: rb4xx: Use SPI_BPW_MASK to set bits_per_word_mask 2018-10-10 12:48:06 +01:00
spi-rockchip.c Linux 5.2-rc4 2019-06-10 18:52:53 +01:00
spi-rspi.c spi: rspi: Fix handling of QSPI code when transmit and receive 2019-05-02 10:38:44 +09:00
spi-s3c24xx-fiq.h
spi-s3c24xx-fiq.S
spi-s3c24xx.c
spi-s3c64xx.c spi: spi-s3c64xx: Fix system resume support 2018-05-17 13:27:08 +09:00
spi-sc18is602.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 157 2019-05-30 11:26:37 -07:00
spi-sh-hspi.c spi: sh-hspi: Replace spi_master by spi_controller 2019-02-08 13:04:19 +00:00
spi-sh-msiof.c spi: sh-msiof: Reduce delays in sh_msiof_modify_ctr_wait() 2019-05-28 15:57:03 +01:00
spi-sh-sci.c spi: add flags parameter to txrx_word function pointers 2018-08-01 14:50:24 +01:00
spi-sh.c spi: use SPDX identifier for Renesas drivers 2018-08-28 20:32:00 +01:00
spi-sifive.c spi: sifive: Remove redundant dev_err call in sifive_spi_probe() 2019-02-22 15:17:58 +00:00
spi-sirf.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 4 2019-05-21 11:28:40 +02:00
spi-slave-mt27xx.c spi: mediatek: add spi slave for Mediatek MT2712 2018-09-28 14:29:14 +01:00
spi-slave-system-control.c spi: slave: Fix missing break in switch 2018-10-03 16:23:10 +01:00
spi-slave-time.c
spi-sprd-adi.c spi: sprd: Change to use devm_hwspin_lock_request_specific() 2018-06-26 13:52:27 -07:00
spi-sprd.c Merge branch 'for-5.0' of https://git.kernel.org/pub/scm/linux/kernel/git/broonie/spi into spi-5.1 2019-02-20 17:58:18 +00:00
spi-st-ssc4.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 310 2019-06-05 17:37:04 +02:00
spi-stm32-qspi.c spi: stm32-qspi: remove signal sensitive on completion 2019-06-28 15:25:40 +01:00
spi-stm32.c spi: stm32: return the get_irq error 2019-05-02 10:38:41 +09:00
spi-sun4i.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 152 2019-05-30 11:26:32 -07:00
spi-sun6i.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 152 2019-05-30 11:26:32 -07:00
spi-synquacer.c spi: spi-synquacer: Fixed build on architectures missing readsl/writesl series 2019-06-20 13:08:26 +01:00
spi-tegra20-sflash.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 201 2019-05-30 11:29:52 -07:00
spi-tegra20-slink.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 201 2019-05-30 11:29:52 -07:00
spi-tegra114.c Linux 5.2-rc4 2019-06-10 18:52:53 +01:00
spi-test.h treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 157 2019-05-30 11:26:37 -07:00
spi-ti-qspi.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 296 2019-06-05 17:36:38 +02:00
spi-tle62x0.c
spi-topcliff-pch.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 285 2019-06-05 17:36:37 +02:00
spi-txx9.c
spi-uniphier.c spi: uniphier: fix wrong register overwrite 2019-09-03 12:38:20 +01:00
spi-xcomm.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 149 2019-05-30 11:25:18 -07:00
spi-xilinx.c
spi-xlp.c
spi-xtensa-xtfpga.c spi: add flags parameter to txrx_word function pointers 2018-08-01 14:50:24 +01:00
spi-zynq-qspi.c spi: zynq-qspi: Fix missing spi_unregister_controller when unload module 2019-08-20 13:10:48 +01:00
spi-zynqmp-gqspi.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 39 2019-05-24 17:27:12 +02:00
spi.c spi/acpi: avoid spurious matches during slave enumeration 2019-06-24 17:30:34 +01:00
spidev.c Linux 5.2-rc4 2019-06-10 18:52:53 +01:00