spi: bcm2835aux: ensure interrupts are enabled for shared handler [Linux 4.9.192]

This Linux kernel change "spi: bcm2835aux: ensure interrupts are enabled for shared handler" is included in the Linux 4.9.192 release. This change is authored by Rob Herring <robh [at] kernel.org> on Thu May 3 13:09:44 2018 -0500. The commit for this change in Linux stable tree is fd5811e (patch) which is from upstream commit bc519d9. The same Linux upstream change may have been applied to various maintained Linux releases and you can find all Linux releases containing changes from upstream bc519d9.

spi: bcm2835aux: ensure interrupts are enabled for shared handler

[ Upstream commit bc519d9574618e47a0c788000fb78da95e18d953 ]

The BCM2835 AUX SPI has a shared interrupt line (with AUX UART).
Downstream fixes this with an AUX irqchip to demux the IRQ sources and a
DT change which breaks compatibility with older kernels. The AUX irqchip
was already rejected for upstream[1] and the DT change would break
working systems if the DTB is updated to a newer one. The latter issue
was brought to my attention by Alex Graf.

The root cause however is a bug in the shared handler. Shared handlers
must check that interrupts are actually enabled before servicing the
interrupt. Add a check that the TXEMPTY or IDLE interrupts are enabled.

[1] https://patchwork.kernel.org/patch/9781221/

Cc: Alexander Graf <agraf@suse.de>
Cc: Marc Zyngier <marc.zyngier@arm.com>
Cc: Mark Brown <broonie@kernel.org>
Cc: Eric Anholt <eric@anholt.net>
Cc: Stefan Wahren <stefan.wahren@i2se.com>
Cc: Florian Fainelli <f.fainelli@gmail.com>
Cc: Ray Jui <rjui@broadcom.com>
Cc: Scott Branden <sbranden@broadcom.com>
Cc: bcm-kernel-feedback-list@broadcom.com
Cc: linux-spi@vger.kernel.org
Cc: linux-rpi-kernel@lists.infradead.org
Cc: linux-arm-kernel@lists.infradead.org
Signed-off-by: Rob Herring <robh@kernel.org>
Reviewed-by: Eric Anholt <eric@anholt.net>
Signed-off-by: Mark Brown <broonie@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>

There are 5 lines of Linux source code added/deleted in this change. Code changes to Linux kernel are as follows.

 drivers/spi/spi-bcm2835aux.c | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/drivers/spi/spi-bcm2835aux.c b/drivers/spi/spi-bcm2835aux.c
index 7428091..bd00b7c 100644
--- a/drivers/spi/spi-bcm2835aux.c
+++ b/drivers/spi/spi-bcm2835aux.c
@@ -184,6 +184,11 @@ static irqreturn_t bcm2835aux_spi_interrupt(int irq, void *dev_id)
    struct bcm2835aux_spi *bs = spi_master_get_devdata(master);
    irqreturn_t ret = IRQ_NONE;

+   /* IRQ may be shared, so return if our interrupts are disabled */
+   if (!(bcm2835aux_rd(bs, BCM2835_AUX_SPI_CNTL1) &
+         (BCM2835_AUX_SPI_CNTL1_TXEMPTY | BCM2835_AUX_SPI_CNTL1_IDLE)))
+       return ret;
+
    /* check if we have data to read */
    while (bs->rx_len &&
           (!(bcm2835aux_rd(bs, BCM2835_AUX_SPI_STAT) &

Leave a Reply

Your email address will not be published. Required fields are marked *