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

Stefan Wahren stefan.wahren at i2se.com
Thu May 3 11:31:37 PDT 2018


Hi,

[added Martin, Noralf and Phil]


> Rob Herring <robh at kernel.org> hat am 3. Mai 2018 um 20:09 geschrieben:
> 
> 
> 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 at suse.de>
> Cc: Marc Zyngier <marc.zyngier at arm.com>
> Cc: Mark Brown <broonie at kernel.org>
> Cc: Eric Anholt <eric at anholt.net>
> Cc: Stefan Wahren <stefan.wahren at i2se.com>
> Cc: Florian Fainelli <f.fainelli at gmail.com>
> Cc: Ray Jui <rjui at broadcom.com>
> Cc: Scott Branden <sbranden at broadcom.com>
> Cc: bcm-kernel-feedback-list at broadcom.com
> Cc: linux-spi at vger.kernel.org
> Cc: linux-rpi-kernel at lists.infradead.org
> Cc: linux-arm-kernel at lists.infradead.org
> Signed-off-by: Rob Herring <robh at kernel.org>
> ---
> Compile tested only. I'll add something to the related github issue on 
> this and hopefully someone can test and confirm.
> 
> I'm assuming the 8250 driver can handle shared irqs correctly.
> 
> Rob
> 
>  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 1431cb98fe40..3094d818cf06 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) &
> -- 
> 2.17.0

does anyone have a setup to test this patch (i assume it requires a compute module)?

@Rob: Thank you very much for this patch



More information about the linux-arm-kernel mailing list