spi: pxa2xx: Prepare for edge-triggered interrupts
authorJan Kiszka <jan.kiszka@siemens.com>
Sat, 21 Jan 2017 09:06:38 +0000 (10:06 +0100)
committerMark Brown <broonie@kernel.org>
Mon, 23 Jan 2017 18:09:37 +0000 (18:09 +0000)
When using the a device with edge-triggered interrupts, such as MSIs,
the interrupt handler has to ensure that there is a point in time during
its execution where all interrupts sources are silent so that a new
event can trigger a new interrupt again.

This is achieved here by disabling all interrupt sources for a moment
before processing them according to the status register. If a new
interrupt should have arrived after we read the status, it will now
re-trigger the interrupt, even in edge mode.

Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
Acked-by: Robert Jarzmik <robert.jarzmik@free.fr>
Signed-off-by: Mark Brown <broonie@kernel.org>
drivers/spi/spi-pxa2xx.c

index 8c65bc1823f351e44f9abd1bbf62a49ff80f37e2..06ade434c083e446db6cd41ed2bbb33538200170 100644 (file)
@@ -785,6 +785,9 @@ static irqreturn_t ssp_int(int irq, void *dev_id)
        if (!(status & mask))
                return IRQ_NONE;
 
+       pxa2xx_spi_write(drv_data, SSCR1, sccr1_reg & ~drv_data->int_cr1);
+       pxa2xx_spi_write(drv_data, SSCR1, sccr1_reg);
+
        if (!drv_data->master->cur_msg) {
                handle_bad_msg(drv_data);
                /* Never fail */