Merge tag 'pinctrl-v4.15-1' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw...
[sfrench/cifs-2.6.git] / drivers / pinctrl / pinctrl-amd.c
index 3f6b34febbf11249cf2a30e400647038f4a66f33..61d830c2bc17d94b4b2caadd70699a914275da68 100644 (file)
@@ -532,10 +532,18 @@ static irqreturn_t amd_gpio_irq_handler(int irq, void *dev_id)
                        regval = readl(regs + i);
                        if (!(regval & PIN_IRQ_PENDING))
                                continue;
-                       irq = irq_find_mapping(gc->irqdomain, irqnr + i);
+                       irq = irq_find_mapping(gc->irq.domain, irqnr + i);
                        generic_handle_irq(irq);
-                       /* Clear interrupt */
+
+                       /* Clear interrupt.
+                        * We must read the pin register again, in case the
+                        * value was changed while executing
+                        * generic_handle_irq() above.
+                        */
+                       raw_spin_lock_irqsave(&gpio_dev->lock, flags);
+                       regval = readl(regs + i);
                        writel(regval, regs + i);
+                       raw_spin_unlock_irqrestore(&gpio_dev->lock, flags);
                        ret = IRQ_HANDLED;
                }
        }
@@ -745,7 +753,7 @@ static bool amd_gpio_should_save(struct amd_gpio *gpio_dev, unsigned int pin)
        return false;
 }
 
-int amd_gpio_suspend(struct device *dev)
+static int amd_gpio_suspend(struct device *dev)
 {
        struct platform_device *pdev = to_platform_device(dev);
        struct amd_gpio *gpio_dev = platform_get_drvdata(pdev);
@@ -764,7 +772,7 @@ int amd_gpio_suspend(struct device *dev)
        return 0;
 }
 
-int amd_gpio_resume(struct device *dev)
+static int amd_gpio_resume(struct device *dev)
 {
        struct platform_device *pdev = to_platform_device(dev);
        struct amd_gpio *gpio_dev = platform_get_drvdata(pdev);