]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/commitdiff
gpio: gpio-wcove: fix GPIO IRQ status mask
authorKuppuswamy Sathyanarayanan <sathyanarayanan.kuppuswamy@linux.intel.com>
Mon, 24 Apr 2017 19:15:04 +0000 (12:15 -0700)
committerLinus Walleij <linus.walleij@linaro.org>
Fri, 28 Apr 2017 07:33:04 +0000 (09:33 +0200)
According to Whiskey Cove PMIC spec, bit 7 of GPIOIRQ0_REG belongs to
battery IO. So we should skip this bit when checking for GPIO IRQ pending
status. Otherwise, wcove_gpio_irq_handler() might go into the infinite
loop until IRQ "pending" status becomes 0. This patch fixes this issue.

Signed-off-by: Kuppuswamy Sathyanarayanan <sathyanarayanan.kuppuswamy@linux.intel.com>
Acked-by: Mika Westerberg <mika.westerberg@linux.intel.com>
Acked-by: Andy Shevchenko <andy.shevchenko@gmail.com>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
drivers/gpio/gpio-wcove.c

index bf7b71d7cf5bf60425927a2168418f42f3714180..7b1bc20be209a3ca6ba37a20e7be137195eaddc5 100644 (file)
@@ -51,6 +51,8 @@
 #define GROUP1_NR_IRQS         6
 #define IRQ_MASK_BASE          0x4e19
 #define IRQ_STATUS_BASE                0x4e0b
+#define GPIO_IRQ0_MASK         GENMASK(6, 0)
+#define GPIO_IRQ1_MASK         GENMASK(5, 0)
 #define UPDATE_IRQ_TYPE                BIT(0)
 #define UPDATE_IRQ_MASK                BIT(1)
 
@@ -309,7 +311,7 @@ static irqreturn_t wcove_gpio_irq_handler(int irq, void *data)
                return IRQ_NONE;
        }
 
-       pending = p[0] | (p[1] << 8);
+       pending = (p[0] & GPIO_IRQ0_MASK) | ((p[1] & GPIO_IRQ1_MASK) << 7);
        if (!pending)
                return IRQ_NONE;
 
@@ -333,7 +335,7 @@ static irqreturn_t wcove_gpio_irq_handler(int irq, void *data)
                        break;
                }
 
-               pending = p[0] | (p[1] << 8);
+               pending = (p[0] & GPIO_IRQ0_MASK) | ((p[1] & GPIO_IRQ1_MASK) << 7);
        }
 
        return IRQ_HANDLED;