bcma: prevent irq handler from firing when registered
authorHauke Mehrtens <hauke@hauke-m.de>
Thu, 2 Jan 2014 18:01:08 +0000 (19:01 +0100)
committerRalf Baechle <ralf@linux-mips.org>
Fri, 24 Jan 2014 21:39:52 +0000 (22:39 +0100)
With this patch we prevent the irq from being fired when it is
registered. The Hardware fires an IRQ when input signal XOR polarity
AND gpio mask is 1. Now we are setting polarity to a vlaue so that is
is 0 when we register it.

In addition we also set the irq mask register to 0 when the irq handler
is initialized, so all gpio irqs are masked and there will be no
unexpected irq.

Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
Tested-by: Rafał Miłecki <zajec5@gmail.com>
Signed-off-by: John Crispin <blogic@openwrt.org>
Patchwork: http://patchwork.linux-mips.org/patch/6304/

drivers/bcma/driver_gpio.c

index 9d87b97341a3a113c65353c1d2c06fc546a81c28..040241979fcbb98f6e86425e63033132d9e7a43e 100644 (file)
@@ -91,7 +91,9 @@ static void bcma_gpio_irq_unmask(struct irq_data *d)
 {
        struct bcma_drv_cc *cc = irq_data_get_irq_chip_data(d);
        int gpio = irqd_to_hwirq(d);
+       u32 val = bcma_chipco_gpio_in(cc, BIT(gpio));
 
+       bcma_chipco_gpio_polarity(cc, BIT(gpio), val);
        bcma_chipco_gpio_intmask(cc, BIT(gpio), BIT(gpio));
 }
 
@@ -156,6 +158,7 @@ static int bcma_gpio_irq_domain_init(struct bcma_drv_cc *cc)
        if (err)
                goto err_req_irq;
 
+       bcma_chipco_gpio_intmask(cc, ~0, 0);
        bcma_cc_set32(cc, BCMA_CC_IRQMASK, BCMA_CC_IRQ_GPIO);
 
        return 0;