]> git.karo-electronics.de Git - mv-sheeva.git/commitdiff
spi/pxa2xx: add support for shared IRQ handler
authorSebastian Andrzej Siewior <bigeasy@linutronix.de>
Tue, 23 Nov 2010 01:12:14 +0000 (17:12 -0800)
committerSebastian Andrzej Siewior <bigeasy@linutronix.de>
Wed, 1 Dec 2010 11:18:31 +0000 (12:18 +0100)
This is required in case the interrupt line is shared with other
devices.

Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Signed-off-by: Dirk Brandewie <dirk.brandewie@gmail.com>
drivers/spi/pxa2xx_spi.c

index 4e169b579efbdd9db686a25c14887d890dadbced..1865c23f21753bbcb12560ae90863c4fcf0e598c 100644 (file)
@@ -742,6 +742,18 @@ static irqreturn_t ssp_int(int irq, void *dev_id)
 {
        struct driver_data *drv_data = dev_id;
        void __iomem *reg = drv_data->ioaddr;
+       u32 sccr1_reg = read_SSCR1(reg);
+       u32 mask = drv_data->mask_sr;
+       u32 status;
+
+       status = read_SSSR(reg);
+
+       /* Ignore possible writes if we don't need to write */
+       if (!(sccr1_reg & SSCR1_TIE))
+               mask &= ~SSSR_TFS;
+
+       if (!(status & mask))
+               return IRQ_NONE;
 
        if (!drv_data->cur_msg) {
 
@@ -1512,7 +1524,8 @@ static int __devinit pxa2xx_spi_probe(struct platform_device *pdev)
                drv_data->mask_sr = SSSR_TINT | SSSR_RFS | SSSR_TFS | SSSR_ROR;
        }
 
-       status = request_irq(ssp->irq, ssp_int, 0, dev_name(dev), drv_data);
+       status = request_irq(ssp->irq, ssp_int, IRQF_SHARED, dev_name(dev),
+                       drv_data);
        if (status < 0) {
                dev_err(&pdev->dev, "cannot get IRQ %d\n", ssp->irq);
                goto out_error_master_alloc;