gpio: zynq: Disable the irq if it is not a wakeup source
authorShubhrajyoti Datta <shubhrajyoti.datta@xilinx.com>
Wed, 17 Jun 2020 11:37:25 +0000 (17:07 +0530)
committerBartosz Golaszewski <bgolaszewski@baylibre.com>
Wed, 24 Jun 2020 10:16:39 +0000 (12:16 +0200)
If gpio is not set to wake disable the interrupt. ATF set all slaves with
enabled interrupts as wakeup sources and if gpio is used in r5 then it
wakes up linux.

Signed-off-by: Shubhrajyoti Datta <shubhrajyoti.datta@xilinx.com>
Signed-off-by: Michal Simek <michal.simek@xilinx.com>
Signed-off-by: Bartosz Golaszewski <bgolaszewski@baylibre.com>
drivers/gpio/gpio-zynq.c

index 9ac69144a0ebe0cee8bb1c358e4037c67e935d4d..b6261a3aec5584309427ca4d0842b55650968953 100644 (file)
@@ -735,6 +735,9 @@ static int __maybe_unused zynq_gpio_suspend(struct device *dev)
        struct zynq_gpio *gpio = dev_get_drvdata(dev);
        struct irq_data *data = irq_get_irq_data(gpio->irq);
 
+       if (!device_may_wakeup(dev))
+               disable_irq(gpio->irq);
+
        if (!irqd_is_wakeup_set(data)) {
                zynq_gpio_save_context(gpio);
                return pm_runtime_force_suspend(dev);
@@ -749,6 +752,9 @@ static int __maybe_unused zynq_gpio_resume(struct device *dev)
        struct irq_data *data = irq_get_irq_data(gpio->irq);
        int ret;
 
+       if (!device_may_wakeup(dev))
+               enable_irq(gpio->irq);
+
        if (!irqd_is_wakeup_set(data)) {
                ret = pm_runtime_force_resume(dev);
                zynq_gpio_restore_context(gpio);
@@ -956,6 +962,8 @@ static int zynq_gpio_probe(struct platform_device *pdev)
                goto err_pm_put;
        }
 
+       irq_set_status_flags(gpio->irq, IRQ_DISABLE_UNLAZY);
+       device_init_wakeup(&pdev->dev, 1);
        pm_runtime_put(&pdev->dev);
 
        return 0;