This Linux kernel change "spi: bcm2835aux: ensure interrupts are enabled for shared handler" is included in the Linux 4.4.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 c99ad4f (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 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.  https://patchwork.kernel.org/patch/9781221/ Cc: Alexander Graf <email@example.com> Cc: Marc Zyngier <firstname.lastname@example.org> Cc: Mark Brown <email@example.com> Cc: Eric Anholt <firstname.lastname@example.org> Cc: Stefan Wahren <email@example.com> Cc: Florian Fainelli <firstname.lastname@example.org> Cc: Ray Jui <email@example.com> Cc: Scott Branden <firstname.lastname@example.org> Cc: email@example.com Cc: firstname.lastname@example.org Cc: email@example.com Cc: firstname.lastname@example.org Signed-off-by: Rob Herring <email@example.com> Reviewed-by: Eric Anholt <firstname.lastname@example.org> Signed-off-by: Mark Brown <email@example.com> Signed-off-by: Sasha Levin <firstname.lastname@example.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 7de6f84..6f4c6aa 100644 --- a/drivers/spi/spi-bcm2835aux.c +++ b/drivers/spi/spi-bcm2835aux.c @@ -187,6 +187,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) &