Commit e3a2be30 authored by Martin Sperl's avatar Martin Sperl Committed by Mark Brown

spi: bcm2835: fill FIFO before enabling interrupts to reduce interrupts/message

To reduce the number of interrupts/message we fill the FIFO before
enabling interrupts - for short messages this reduces the interrupt count
from 2 to 1 interrupt.

There have been rare cases where short (<200ns) chip-select switches with
native CS have been observed during such operation, this is why this
optimization is only enabled for GPIO-CS.
Signed-off-by: default avatarMartin Sperl <kernel@martin.sperl.org>
Tested-by: default avatarMartin Sperl <kernel@martin.sperl.org>
Signed-off-by: default avatarMark Brown <broonie@kernel.org>
parent 1e4df62d
...@@ -203,6 +203,22 @@ static int bcm2835_spi_transfer_one(struct spi_master *master, ...@@ -203,6 +203,22 @@ static int bcm2835_spi_transfer_one(struct spi_master *master,
bs->tx_len = tfr->len; bs->tx_len = tfr->len;
bs->rx_len = tfr->len; bs->rx_len = tfr->len;
/* fill in fifo if we have gpio-cs
* note that there have been rare events where the native-CS
* flapped for <1us which may change the behaviour
* with gpio-cs this does not happen, so it is implemented
* only for this case
*/
if (gpio_is_valid(spi->cs_gpio)) {
/* enable HW block, but without interrupts enabled
* this would triggern an immediate interrupt
*/
bcm2835_wr(bs, BCM2835_SPI_CS,
cs | BCM2835_SPI_CS_TA);
/* fill in tx fifo as much as possible */
bcm2835_wr_fifo(bs);
}
/* /*
* Enable the HW block. This will immediately trigger a DONE (TX * Enable the HW block. This will immediately trigger a DONE (TX
* empty) interrupt, upon which we will fill the TX FIFO with the * empty) interrupt, upon which we will fill the TX FIFO with the
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment