From: Murali Nalajala Date: Tue, 19 May 2015 17:26:11 +0000 (-0700) Subject: lpm-levels: Do not disable non-sec interrupts in suspend X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=b3445ac6ea92f4751ba5f5671aa2c3fce6b6e55b;p=sagit-ice-cold%2Fkernel_xiaomi_msm8998.git lpm-levels: Do not disable non-sec interrupts in suspend When the system suspend is happening, last core disables the non-sec interrupts at QGIC by setting the GRPEN1_EL1_NS to ZERO. This makes core not seen any non-sec interrupts and would result into system do not wake up from any of interrupts. Do not touch GRPEN1_EL1_NS register while system is going into suspend. Change-Id: I7d6c5047fb4743df187fe49fba18b64db3179bc9 Signed-off-by: Murali Nalajala Conflicts: drivers/irqchip/irq-gic-common.h --- diff --git a/drivers/irqchip/irq-gic-common.h b/drivers/irqchip/irq-gic-common.h index fff697db8e22..a6fceec46ba7 100644 --- a/drivers/irqchip/irq-gic-common.h +++ b/drivers/irqchip/irq-gic-common.h @@ -26,6 +26,8 @@ struct gic_quirk { u32 iidr; u32 mask; }; +extern bool from_suspend; +extern struct irq_chip gic_arch_extn; int gic_configure_irq(unsigned int irq, unsigned int type, void __iomem *base, void (*sync_access)(void)); diff --git a/drivers/irqchip/irq-gic-v3.c b/drivers/irqchip/irq-gic-v3.c index d7be6ddc34f6..0ebd9b00db04 100644 --- a/drivers/irqchip/irq-gic-v3.c +++ b/drivers/irqchip/irq-gic-v3.c @@ -645,6 +645,9 @@ static int gic_set_affinity(struct irq_data *d, const struct cpumask *mask_val, static int gic_cpu_pm_notifier(struct notifier_block *self, unsigned long cmd, void *v) { + if (from_suspend) + return NOTIFY_OK; + if (cmd == CPU_PM_EXIT) { gic_enable_redist(true); gic_cpu_sys_reg_init(); diff --git a/kernel/cpu_pm.c b/kernel/cpu_pm.c index 6c3523f83776..774bfe7a2893 100644 --- a/kernel/cpu_pm.c +++ b/kernel/cpu_pm.c @@ -22,6 +22,8 @@ #include #include +bool from_suspend = false; + static DEFINE_RWLOCK(cpu_pm_notifier_lock); static RAW_NOTIFIER_HEAD(cpu_pm_notifier_chain); @@ -208,6 +210,7 @@ static int cpu_pm_suspend(void) { int ret; + from_suspend = true; ret = cpu_pm_enter(); if (ret) return ret; @@ -218,6 +221,7 @@ static int cpu_pm_suspend(void) static void cpu_pm_resume(void) { + from_suspend = false; cpu_cluster_pm_exit(0); cpu_pm_exit(); }