Revert "gpio-msm: remove logging of wakeup reason"
This reverts commit 7bdc794d7819ec55a34ca4bd5969e0f4a232d67c.
Also rename:
- log_wakeup_reason(irq);
+ log_base_wakeup_reason(irq);
Change-Id: I57b5540252cc7476dd6f443cb0016c86573fe883
Signed-off-by: Iliyan Malchev <malchev@google.com>
diff --git a/drivers/gpio/gpio-msm-common.c b/drivers/gpio/gpio-msm-common.c
index 09a94e5..5e5f664 100644
--- a/drivers/gpio/gpio-msm-common.c
+++ b/drivers/gpio/gpio-msm-common.c
@@ -19,6 +19,7 @@
#include <linux/io.h>
#include <linux/module.h>
#include <linux/spinlock.h>
+#include <linux/syscore_ops.h>
#include <linux/irqdomain.h>
#include <linux/of.h>
#include <linux/err.h>
@@ -411,6 +412,71 @@
.irq_disable = msm_gpio_irq_disable,
};
+#ifdef CONFIG_PM
+static int msm_gpio_suspend(void)
+{
+ unsigned long irq_flags;
+ unsigned long i;
+ int ngpio = msm_gpio.gpio_chip.ngpio;
+
+ spin_lock_irqsave(&tlmm_lock, irq_flags);
+ for_each_set_bit(i, msm_gpio.enabled_irqs, ngpio)
+ __msm_gpio_set_intr_cfg_enable(i, 0);
+
+ for_each_set_bit(i, msm_gpio.wake_irqs, ngpio)
+ __msm_gpio_set_intr_cfg_enable(i, 1);
+ mb();
+ spin_unlock_irqrestore(&tlmm_lock, irq_flags);
+ return 0;
+}
+
+void msm_gpio_show_resume_irq(void)
+{
+ unsigned long irq_flags;
+ int i, irq, intstat;
+ int ngpio = msm_gpio.gpio_chip.ngpio;
+
+ if (!msm_show_resume_irq_mask)
+ return;
+
+ spin_lock_irqsave(&tlmm_lock, irq_flags);
+ for_each_set_bit(i, msm_gpio.wake_irqs, ngpio) {
+ intstat = __msm_gpio_get_intr_status(i);
+ if (intstat) {
+ irq = msm_gpio_to_irq(&msm_gpio.gpio_chip, i);
+ log_base_wakeup_reason(irq);
+ }
+ }
+ spin_unlock_irqrestore(&tlmm_lock, irq_flags);
+}
+
+static void msm_gpio_resume(void)
+{
+ unsigned long irq_flags;
+ unsigned long i;
+ int ngpio = msm_gpio.gpio_chip.ngpio;
+
+ msm_gpio_show_resume_irq();
+
+ spin_lock_irqsave(&tlmm_lock, irq_flags);
+ for_each_set_bit(i, msm_gpio.wake_irqs, ngpio)
+ __msm_gpio_set_intr_cfg_enable(i, 0);
+
+ for_each_set_bit(i, msm_gpio.enabled_irqs, ngpio)
+ __msm_gpio_set_intr_cfg_enable(i, 1);
+ mb();
+ spin_unlock_irqrestore(&tlmm_lock, irq_flags);
+}
+#else
+#define msm_gpio_suspend NULL
+#define msm_gpio_resume NULL
+#endif
+
+static struct syscore_ops msm_gpio_syscore_ops = {
+ .suspend = msm_gpio_suspend,
+ .resume = msm_gpio_resume,
+};
+
static void msm_tlmm_set_field(const struct tlmm_field_cfg *configs,
unsigned id, unsigned width, unsigned val)
{
@@ -567,6 +633,7 @@
ret);
return ret;
}
+ register_syscore_ops(&msm_gpio_syscore_ops);
return 0;
}
@@ -581,6 +648,7 @@
{
int ret;
+ unregister_syscore_ops(&msm_gpio_syscore_ops);
ret = gpiochip_remove(&msm_gpio.gpio_chip);
if (ret < 0)
return ret;