aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/brcm2708/patches-4.1/0155-spi-bcm2835-fallback-to-interrupt-for-polling-timeou.patch
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/brcm2708/patches-4.1/0155-spi-bcm2835-fallback-to-interrupt-for-polling-timeou.patch')
-rw-r--r--target/linux/brcm2708/patches-4.1/0155-spi-bcm2835-fallback-to-interrupt-for-polling-timeou.patch136
1 files changed, 0 insertions, 136 deletions
diff --git a/target/linux/brcm2708/patches-4.1/0155-spi-bcm2835-fallback-to-interrupt-for-polling-timeou.patch b/target/linux/brcm2708/patches-4.1/0155-spi-bcm2835-fallback-to-interrupt-for-polling-timeou.patch
deleted file mode 100644
index 01612e53af..0000000000
--- a/target/linux/brcm2708/patches-4.1/0155-spi-bcm2835-fallback-to-interrupt-for-polling-timeou.patch
+++ /dev/null
@@ -1,136 +0,0 @@
-From 4a42130b7fe39652a3ed8ced413a71c7f5d7ce61 Mon Sep 17 00:00:00 2001
-From: Martin Sperl <kernel@martin.sperl.org>
-Date: Wed, 22 Apr 2015 07:33:03 +0000
-Subject: [PATCH 155/222] spi: bcm2835: fallback to interrupt for polling
- timeouts exceeding 2 jiffies
-
-The polling mode of the driver is designed for transfers that run
-less than 30us - it will only execute under those circumstances.
-So it should run comfortably without getting interrupted by the
-scheduler.
-
-But there are situations where the raspberry pi is so overloaded
-that it can take up to 80 jiffies until the polling thread gets
-rescheduled - this has been observed especially under heavy
-IO situations.
-
-In such a situation we now fall back to the interrupt handler and
-log the situation at debug level.
-
-Signed-off-by: Martin Sperl <kernel@martin.sperl.org>
-Signed-off-by: Mark Brown <broonie@kernel.org>
-(cherry picked from commit a750b124cfd27bae1a12df22318db5a2083dfb12)
----
- drivers/spi/spi-bcm2835.c | 87 +++++++++++++++++++++++++++--------------------
- 1 file changed, 50 insertions(+), 37 deletions(-)
-
---- a/drivers/spi/spi-bcm2835.c
-+++ b/drivers/spi/spi-bcm2835.c
-@@ -69,7 +69,7 @@
- #define BCM2835_SPI_CS_CS_01 0x00000001
-
- #define BCM2835_SPI_POLLING_LIMIT_US 30
--#define BCM2835_SPI_TIMEOUT_MS 30000
-+#define BCM2835_SPI_POLLING_JIFFIES 2
- #define BCM2835_SPI_MODE_BITS (SPI_CPOL | SPI_CPHA | SPI_CS_HIGH \
- | SPI_NO_CS | SPI_3WIRE)
-
-@@ -157,42 +157,6 @@ static irqreturn_t bcm2835_spi_interrupt
- return IRQ_HANDLED;
- }
-
--static int bcm2835_spi_transfer_one_poll(struct spi_master *master,
-- struct spi_device *spi,
-- struct spi_transfer *tfr,
-- u32 cs,
-- unsigned long xfer_time_us)
--{
-- struct bcm2835_spi *bs = spi_master_get_devdata(master);
-- /* set timeout to 1 second of maximum polling */
-- unsigned long timeout = jiffies + HZ;
--
-- /* enable HW block without interrupts */
-- bcm2835_wr(bs, BCM2835_SPI_CS, cs | BCM2835_SPI_CS_TA);
--
-- /* loop until finished the transfer */
-- while (bs->rx_len) {
-- /* read from fifo as much as possible */
-- bcm2835_rd_fifo(bs);
-- /* fill in tx fifo as much as possible */
-- bcm2835_wr_fifo(bs);
-- /* if we still expect some data after the read,
-- * check for a possible timeout
-- */
-- if (bs->rx_len && time_after(jiffies, timeout)) {
-- /* Transfer complete - reset SPI HW */
-- bcm2835_spi_reset_hw(master);
-- /* and return timeout */
-- return -ETIMEDOUT;
-- }
-- }
--
-- /* Transfer complete - reset SPI HW */
-- bcm2835_spi_reset_hw(master);
-- /* and return without waiting for completion */
-- return 0;
--}
--
- static int bcm2835_spi_transfer_one_irq(struct spi_master *master,
- struct spi_device *spi,
- struct spi_transfer *tfr,
-@@ -229,6 +193,55 @@ static int bcm2835_spi_transfer_one_irq(
- return 1;
- }
-
-+static int bcm2835_spi_transfer_one_poll(struct spi_master *master,
-+ struct spi_device *spi,
-+ struct spi_transfer *tfr,
-+ u32 cs,
-+ unsigned long xfer_time_us)
-+{
-+ struct bcm2835_spi *bs = spi_master_get_devdata(master);
-+ unsigned long timeout;
-+
-+ /* enable HW block without interrupts */
-+ bcm2835_wr(bs, BCM2835_SPI_CS, cs | BCM2835_SPI_CS_TA);
-+
-+ /* fill in the fifo before timeout calculations
-+ * if we are interrupted here, then the data is
-+ * getting transferred by the HW while we are interrupted
-+ */
-+ bcm2835_wr_fifo(bs);
-+
-+ /* set the timeout */
-+ timeout = jiffies + BCM2835_SPI_POLLING_JIFFIES;
-+
-+ /* loop until finished the transfer */
-+ while (bs->rx_len) {
-+ /* fill in tx fifo with remaining data */
-+ bcm2835_wr_fifo(bs);
-+
-+ /* read from fifo as much as possible */
-+ bcm2835_rd_fifo(bs);
-+
-+ /* if there is still data pending to read
-+ * then check the timeout
-+ */
-+ if (bs->rx_len && time_after(jiffies, timeout)) {
-+ dev_dbg_ratelimited(&spi->dev,
-+ "timeout period reached: jiffies: %lu remaining tx/rx: %d/%d - falling back to interrupt mode\n",
-+ jiffies - timeout,
-+ bs->tx_len, bs->rx_len);
-+ /* fall back to interrupt mode */
-+ return bcm2835_spi_transfer_one_irq(master, spi,
-+ tfr, cs);
-+ }
-+ }
-+
-+ /* Transfer complete - reset SPI HW */
-+ bcm2835_spi_reset_hw(master);
-+ /* and return without waiting for completion */
-+ return 0;
-+}
-+
- static int bcm2835_spi_transfer_one(struct spi_master *master,
- struct spi_device *spi,
- struct spi_transfer *tfr)