Last active
August 29, 2015 14:11
-
-
Save Oberon00/9fb17c20e635bbffcb7f to your computer and use it in GitHub Desktop.
Exynos 4210 FPU register corruption/music bug fix. (If you applied Lanchon's last change to vfphw.S, you should revert it before merging this).
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
From 56919e922baa154ac6e498bcc1520dc965065265 Mon Sep 17 00:00:00 2001 | |
From: Colin Cross <ccross@android.com> | |
Date: Fri, 22 Jul 2011 14:57:09 -0700 | |
Subject: [PATCH 1/5] cpu_pm: call notifiers during suspend | |
Implements syscore_ops in cpu_pm to call the cpu and | |
cpu cluster notifiers during suspend and resume, | |
allowing drivers receiving the notifications to | |
avoid implementing syscore_ops. | |
Signed-off-by: Colin Cross <ccross@android.com> | |
Signed-off-by: Santosh Shilimkar <santosh.shilimkar@ti.com> | |
Reviewed-by: Kevin Hilman <khilman@ti.com> | |
Tested-and-Acked-by: Shawn Guo <shawn.guo@linaro.org> | |
Tested-by: Vishwanath BS <vishwanath.bs@ti.com> | |
--- | |
kernel/cpu_pm.c | 33 +++++++++++++++++++++++++++++++++ | |
1 file changed, 33 insertions(+) | |
diff --git a/kernel/cpu_pm.c b/kernel/cpu_pm.c | |
index 4d1ff4a..249152e 100644 | |
--- a/kernel/cpu_pm.c | |
+++ b/kernel/cpu_pm.c | |
@@ -20,6 +20,7 @@ | |
#include <linux/module.h> | |
#include <linux/notifier.h> | |
#include <linux/spinlock.h> | |
+#include <linux/syscore_ops.h> | |
static DEFINE_RWLOCK(cpu_pm_notifier_lock); | |
static RAW_NOTIFIER_HEAD(cpu_pm_notifier_chain); | |
@@ -198,3 +199,35 @@ int cpu_cluster_pm_exit(void) | |
return ret; | |
} | |
EXPORT_SYMBOL_GPL(cpu_cluster_pm_exit); | |
+ | |
+#ifdef CONFIG_PM | |
+static int cpu_pm_suspend(void) | |
+{ | |
+ int ret; | |
+ | |
+ ret = cpu_pm_enter(); | |
+ if (ret) | |
+ return ret; | |
+ | |
+ ret = cpu_cluster_pm_enter(); | |
+ return ret; | |
+} | |
+ | |
+static void cpu_pm_resume(void) | |
+{ | |
+ cpu_cluster_pm_exit(); | |
+ cpu_pm_exit(); | |
+} | |
+ | |
+static struct syscore_ops cpu_pm_syscore_ops = { | |
+ .suspend = cpu_pm_suspend, | |
+ .resume = cpu_pm_resume, | |
+}; | |
+ | |
+static int cpu_pm_init(void) | |
+{ | |
+ register_syscore_ops(&cpu_pm_syscore_ops); | |
+ return 0; | |
+} | |
+core_initcall(cpu_pm_init); | |
+#endif | |
-- | |
1.9.1 | |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
From efa40b35215bade008c9909241bc5da62f88a1ec Mon Sep 17 00:00:00 2001 | |
From: Nicolas Pitre <nico@fluxnic.net> | |
Date: Thu, 31 May 2012 16:26:07 -0700 | |
Subject: [PATCH 2/5] kernel/cpu_pm.c: fix various typos | |
Signed-off-by: Nicolas Pitre <nico@linaro.org> | |
Acked-by: Colin Cross <ccross@android.com> | |
Acked-by: Santosh Shilimkar <santosh.shilimkar@ti.com> | |
Signed-off-by: Andrew Morton <akpm@linux-foundation.org> | |
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> | |
--- | |
kernel/cpu_pm.c | 16 ++++++++-------- | |
1 file changed, 8 insertions(+), 8 deletions(-) | |
diff --git a/kernel/cpu_pm.c b/kernel/cpu_pm.c | |
index 249152e..9656a3c 100644 | |
--- a/kernel/cpu_pm.c | |
+++ b/kernel/cpu_pm.c | |
@@ -81,7 +81,7 @@ int cpu_pm_unregister_notifier(struct notifier_block *nb) | |
EXPORT_SYMBOL_GPL(cpu_pm_unregister_notifier); | |
/** | |
- * cpm_pm_enter - CPU low power entry notifier | |
+ * cpu_pm_enter - CPU low power entry notifier | |
* | |
* Notifies listeners that a single CPU is entering a low power state that may | |
* cause some blocks in the same power domain as the cpu to reset. | |
@@ -89,7 +89,7 @@ EXPORT_SYMBOL_GPL(cpu_pm_unregister_notifier); | |
* Must be called on the affected CPU with interrupts disabled. Platform is | |
* responsible for ensuring that cpu_pm_enter is not called twice on the same | |
* CPU before cpu_pm_exit is called. Notified drivers can include VFP | |
- * co-processor, interrupt controller and it's PM extensions, local CPU | |
+ * co-processor, interrupt controller and its PM extensions, local CPU | |
* timers context save/restore which shouldn't be interrupted. Hence it | |
* must be called with interrupts disabled. | |
* | |
@@ -115,13 +115,13 @@ int cpu_pm_enter(void) | |
EXPORT_SYMBOL_GPL(cpu_pm_enter); | |
/** | |
- * cpm_pm_exit - CPU low power exit notifier | |
+ * cpu_pm_exit - CPU low power exit notifier | |
* | |
* Notifies listeners that a single CPU is exiting a low power state that may | |
* have caused some blocks in the same power domain as the cpu to reset. | |
* | |
* Notified drivers can include VFP co-processor, interrupt controller | |
- * and it's PM extensions, local CPU timers context save/restore which | |
+ * and its PM extensions, local CPU timers context save/restore which | |
* shouldn't be interrupted. Hence it must be called with interrupts disabled. | |
* | |
* Return conditions are same as __raw_notifier_call_chain. | |
@@ -139,7 +139,7 @@ int cpu_pm_exit(void) | |
EXPORT_SYMBOL_GPL(cpu_pm_exit); | |
/** | |
- * cpm_cluster_pm_enter - CPU cluster low power entry notifier | |
+ * cpu_cluster_pm_enter - CPU cluster low power entry notifier | |
* | |
* Notifies listeners that all cpus in a power domain are entering a low power | |
* state that may cause some blocks in the same power domain to reset. | |
@@ -147,7 +147,7 @@ EXPORT_SYMBOL_GPL(cpu_pm_exit); | |
* Must be called after cpu_pm_enter has been called on all cpus in the power | |
* domain, and before cpu_pm_exit has been called on any cpu in the power | |
* domain. Notified drivers can include VFP co-processor, interrupt controller | |
- * and it's PM extensions, local CPU timers context save/restore which | |
+ * and its PM extensions, local CPU timers context save/restore which | |
* shouldn't be interrupted. Hence it must be called with interrupts disabled. | |
* | |
* Must be called with interrupts disabled. | |
@@ -174,7 +174,7 @@ int cpu_cluster_pm_enter(void) | |
EXPORT_SYMBOL_GPL(cpu_cluster_pm_enter); | |
/** | |
- * cpm_cluster_pm_exit - CPU cluster low power exit notifier | |
+ * cpu_cluster_pm_exit - CPU cluster low power exit notifier | |
* | |
* Notifies listeners that all cpus in a power domain are exiting form a | |
* low power state that may have caused some blocks in the same power domain | |
@@ -183,7 +183,7 @@ EXPORT_SYMBOL_GPL(cpu_cluster_pm_enter); | |
* Must be called after cpu_pm_exit has been called on all cpus in the power | |
* domain, and before cpu_pm_exit has been called on any cpu in the power | |
* domain. Notified drivers can include VFP co-processor, interrupt controller | |
- * and it's PM extensions, local CPU timers context save/restore which | |
+ * and its PM extensions, local CPU timers context save/restore which | |
* shouldn't be interrupted. Hence it must be called with interrupts disabled. | |
* | |
* Return conditions are same as __raw_notifier_call_chain. | |
-- | |
1.9.1 | |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
From 8bb246dec012d300310091605e1ce80bc7590b1e Mon Sep 17 00:00:00 2001 | |
From: Santosh Shilimkar <santosh.shilimkar@ti.com> | |
Date: Sat, 10 Sep 2011 11:30:28 +0530 | |
Subject: [PATCH 3/5] ARM: Enable CPU_PM notifiers on ARM machines. | |
Signed-off-by: Santosh Shilimkar <santosh.shilimkar@ti.com> | |
Tested-and-Acked-by: Shawn Guo <shawn.guo@linaro.org> | |
Tested-by: Vishwanath BS <vishwanath.bs@ti.com> | |
--- | |
arch/arm/Kconfig | 1 + | |
1 file changed, 1 insertion(+) | |
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig | |
index af7e74d..6799d57 100644 | |
--- a/arch/arm/Kconfig | |
+++ b/arch/arm/Kconfig | |
@@ -30,6 +30,7 @@ config ARM | |
select HAVE_GENERIC_HARDIRQS | |
select HAVE_SPARSE_IRQ | |
select GENERIC_IRQ_SHOW | |
+ select CPU_PM if (SUSPEND || CPU_IDLE) | |
help | |
The ARM series is a line of low-power-consumption RISC chip designs | |
licensed by ARM Ltd and targeted at embedded applications and | |
-- | |
1.9.1 | |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
From 5de76fdfd0816eeeeac42dbd07c44522a77d1451 Mon Sep 17 00:00:00 2001 | |
From: Colin Cross <ccross@android.com> | |
Date: Thu, 10 Feb 2011 12:54:10 -0800 | |
Subject: [PATCH 4/5] ARM: gic: Use cpu pm notifiers to save gic state | |
When the cpu is powered down in a low power mode, the gic cpu | |
interface may be reset, and when the cpu cluster is powered | |
down, the gic distributor may also be reset. | |
This patch uses CPU_PM_ENTER and CPU_PM_EXIT notifiers to save | |
and restore the gic cpu interface registers, and the | |
CPU_CLUSTER_PM_ENTER and CPU_CLUSTER_PM_EXIT notifiers to save | |
and restore the gic distributor registers. | |
Merge note: | |
Samsung had already applied the changes to struct gic_chip_data, although it | |
still remains in the .c file instead of having been moved to the header. | |
Original-author: Gary King <gking@nvidia.com> | |
Signed-off-by: Colin Cross <ccross@android.com> | |
Signed-off-by: Santosh Shilimkar <santosh.shilimkar@ti.com> | |
Tested-and-Acked-by: Shawn Guo <shawn.guo@linaro.org> | |
Tested-by: Vishwanath BS <vishwanath.bs@ti.com> | |
Conflicts: | |
arch/arm/include/asm/hardware/gic.h | |
Change-Id: I50b5cdd161637ff7b871ac5ffb30d669ec60c662 | |
--- | |
arch/arm/common/gic.c | 187 ++++++++++++++++++++++++++++++++++++++++++++++++++ | |
1 file changed, 187 insertions(+) | |
diff --git a/arch/arm/common/gic.c b/arch/arm/common/gic.c | |
index 7d3e611..51a88a4 100644 | |
--- a/arch/arm/common/gic.c | |
+++ b/arch/arm/common/gic.c | |
@@ -26,6 +26,7 @@ | |
#include <linux/kernel.h> | |
#include <linux/list.h> | |
#include <linux/smp.h> | |
+#include <linux/cpu_pm.h> | |
#include <linux/cpumask.h> | |
#include <linux/io.h> | |
@@ -301,6 +302,8 @@ static void __init gic_dist_init(struct gic_chip_data *gic, | |
if (gic_irqs > 1020) | |
gic_irqs = 1020; | |
+ gic->gic_irqs = gic_irqs; | |
+ | |
/* | |
* Set all global interrupts to be level triggered, active low. | |
*/ | |
@@ -368,6 +371,189 @@ static void __cpuinit gic_cpu_init(struct gic_chip_data *gic) | |
writel_relaxed(1, base + GIC_CPU_CTRL); | |
} | |
+#ifdef CONFIG_CPU_PM | |
+/* | |
+ * Saves the GIC distributor registers during suspend or idle. Must be called | |
+ * with interrupts disabled but before powering down the GIC. After calling | |
+ * this function, no interrupts will be delivered by the GIC, and another | |
+ * platform-specific wakeup source must be enabled. | |
+ */ | |
+static void gic_dist_save(unsigned int gic_nr) | |
+{ | |
+ unsigned int gic_irqs; | |
+ void __iomem *dist_base; | |
+ int i; | |
+ | |
+ if (gic_nr >= MAX_GIC_NR) | |
+ BUG(); | |
+ | |
+ gic_irqs = gic_data[gic_nr].gic_irqs; | |
+ dist_base = gic_data[gic_nr].dist_base; | |
+ | |
+ if (!dist_base) | |
+ return; | |
+ | |
+ for (i = 0; i < DIV_ROUND_UP(gic_irqs, 16); i++) | |
+ gic_data[gic_nr].saved_spi_conf[i] = | |
+ readl_relaxed(dist_base + GIC_DIST_CONFIG + i * 4); | |
+ | |
+ for (i = 0; i < DIV_ROUND_UP(gic_irqs, 4); i++) | |
+ gic_data[gic_nr].saved_spi_target[i] = | |
+ readl_relaxed(dist_base + GIC_DIST_TARGET + i * 4); | |
+ | |
+ for (i = 0; i < DIV_ROUND_UP(gic_irqs, 32); i++) | |
+ gic_data[gic_nr].saved_spi_enable[i] = | |
+ readl_relaxed(dist_base + GIC_DIST_ENABLE_SET + i * 4); | |
+} | |
+ | |
+/* | |
+ * Restores the GIC distributor registers during resume or when coming out of | |
+ * idle. Must be called before enabling interrupts. If a level interrupt | |
+ * that occured while the GIC was suspended is still present, it will be | |
+ * handled normally, but any edge interrupts that occured will not be seen by | |
+ * the GIC and need to be handled by the platform-specific wakeup source. | |
+ */ | |
+static void gic_dist_restore(unsigned int gic_nr) | |
+{ | |
+ unsigned int gic_irqs; | |
+ unsigned int i; | |
+ void __iomem *dist_base; | |
+ | |
+ if (gic_nr >= MAX_GIC_NR) | |
+ BUG(); | |
+ | |
+ gic_irqs = gic_data[gic_nr].gic_irqs; | |
+ dist_base = gic_data[gic_nr].dist_base; | |
+ | |
+ if (!dist_base) | |
+ return; | |
+ | |
+ writel_relaxed(0, dist_base + GIC_DIST_CTRL); | |
+ | |
+ for (i = 0; i < DIV_ROUND_UP(gic_irqs, 16); i++) | |
+ writel_relaxed(gic_data[gic_nr].saved_spi_conf[i], | |
+ dist_base + GIC_DIST_CONFIG + i * 4); | |
+ | |
+ for (i = 0; i < DIV_ROUND_UP(gic_irqs, 4); i++) | |
+ writel_relaxed(0xa0a0a0a0, | |
+ dist_base + GIC_DIST_PRI + i * 4); | |
+ | |
+ for (i = 0; i < DIV_ROUND_UP(gic_irqs, 4); i++) | |
+ writel_relaxed(gic_data[gic_nr].saved_spi_target[i], | |
+ dist_base + GIC_DIST_TARGET + i * 4); | |
+ | |
+ for (i = 0; i < DIV_ROUND_UP(gic_irqs, 32); i++) | |
+ writel_relaxed(gic_data[gic_nr].saved_spi_enable[i], | |
+ dist_base + GIC_DIST_ENABLE_SET + i * 4); | |
+ | |
+ writel_relaxed(1, dist_base + GIC_DIST_CTRL); | |
+} | |
+ | |
+static void gic_cpu_save(unsigned int gic_nr) | |
+{ | |
+ int i; | |
+ u32 *ptr; | |
+ void __iomem *dist_base; | |
+ void __iomem *cpu_base; | |
+ | |
+ if (gic_nr >= MAX_GIC_NR) | |
+ BUG(); | |
+ | |
+ dist_base = gic_data[gic_nr].dist_base; | |
+ cpu_base = gic_data[gic_nr].cpu_base; | |
+ | |
+ if (!dist_base || !cpu_base) | |
+ return; | |
+ | |
+ ptr = __this_cpu_ptr(gic_data[gic_nr].saved_ppi_enable); | |
+ for (i = 0; i < DIV_ROUND_UP(32, 32); i++) | |
+ ptr[i] = readl_relaxed(dist_base + GIC_DIST_ENABLE_SET + i * 4); | |
+ | |
+ ptr = __this_cpu_ptr(gic_data[gic_nr].saved_ppi_conf); | |
+ for (i = 0; i < DIV_ROUND_UP(32, 16); i++) | |
+ ptr[i] = readl_relaxed(dist_base + GIC_DIST_CONFIG + i * 4); | |
+ | |
+} | |
+ | |
+static void gic_cpu_restore(unsigned int gic_nr) | |
+{ | |
+ int i; | |
+ u32 *ptr; | |
+ void __iomem *dist_base; | |
+ void __iomem *cpu_base; | |
+ | |
+ if (gic_nr >= MAX_GIC_NR) | |
+ BUG(); | |
+ | |
+ dist_base = gic_data[gic_nr].dist_base; | |
+ cpu_base = gic_data[gic_nr].cpu_base; | |
+ | |
+ if (!dist_base || !cpu_base) | |
+ return; | |
+ | |
+ ptr = __this_cpu_ptr(gic_data[gic_nr].saved_ppi_enable); | |
+ for (i = 0; i < DIV_ROUND_UP(32, 32); i++) | |
+ writel_relaxed(ptr[i], dist_base + GIC_DIST_ENABLE_SET + i * 4); | |
+ | |
+ ptr = __this_cpu_ptr(gic_data[gic_nr].saved_ppi_conf); | |
+ for (i = 0; i < DIV_ROUND_UP(32, 16); i++) | |
+ writel_relaxed(ptr[i], dist_base + GIC_DIST_CONFIG + i * 4); | |
+ | |
+ for (i = 0; i < DIV_ROUND_UP(32, 4); i++) | |
+ writel_relaxed(0xa0a0a0a0, dist_base + GIC_DIST_PRI + i * 4); | |
+ | |
+ writel_relaxed(0xf0, cpu_base + GIC_CPU_PRIMASK); | |
+ writel_relaxed(1, cpu_base + GIC_CPU_CTRL); | |
+} | |
+ | |
+static int gic_notifier(struct notifier_block *self, unsigned long cmd, void *v) | |
+{ | |
+ int i; | |
+ | |
+ for (i = 0; i < MAX_GIC_NR; i++) { | |
+ switch (cmd) { | |
+ case CPU_PM_ENTER: | |
+ gic_cpu_save(i); | |
+ break; | |
+ case CPU_PM_ENTER_FAILED: | |
+ case CPU_PM_EXIT: | |
+ gic_cpu_restore(i); | |
+ break; | |
+ case CPU_CLUSTER_PM_ENTER: | |
+ gic_dist_save(i); | |
+ break; | |
+ case CPU_CLUSTER_PM_ENTER_FAILED: | |
+ case CPU_CLUSTER_PM_EXIT: | |
+ gic_dist_restore(i); | |
+ break; | |
+ } | |
+ } | |
+ | |
+ return NOTIFY_OK; | |
+} | |
+ | |
+static struct notifier_block gic_notifier_block = { | |
+ .notifier_call = gic_notifier, | |
+}; | |
+ | |
+static void __init gic_pm_init(struct gic_chip_data *gic) | |
+{ | |
+ gic->saved_ppi_enable = __alloc_percpu(DIV_ROUND_UP(32, 32) * 4, | |
+ sizeof(u32)); | |
+ BUG_ON(!gic->saved_ppi_enable); | |
+ | |
+ gic->saved_ppi_conf = __alloc_percpu(DIV_ROUND_UP(32, 16) * 4, | |
+ sizeof(u32)); | |
+ BUG_ON(!gic->saved_ppi_conf); | |
+ | |
+ cpu_pm_register_notifier(&gic_notifier_block); | |
+} | |
+#else | |
+static void __init gic_pm_init(struct gic_chip_data *gic) | |
+{ | |
+} | |
+#endif | |
+ | |
void __init gic_init(unsigned int gic_nr, unsigned int irq_start, | |
void __iomem *dist_base, void __iomem *cpu_base) | |
{ | |
@@ -397,6 +583,7 @@ void __init gic_init(unsigned int gic_nr, unsigned int irq_start, | |
gic_dist_init(gic, irq_start); | |
gic_cpu_init(gic); | |
+ gic_pm_init(gic); | |
} | |
void __cpuinit gic_secondary_init_base(unsigned int gic_nr, | |
-- | |
1.9.1 | |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
From c78f2ea01afeb7dfc9be639af36768941ff94125 Mon Sep 17 00:00:00 2001 | |
From: =?UTF-8?q?Christian=20Neum=C3=BCller?= <cn00@gmx.at> | |
Date: Sat, 20 Dec 2014 23:59:48 +0100 | |
Subject: [PATCH 5/5] Call cpu_pm_enter/exit in Low Power States. | |
Change-Id: Id3a455b9c7c3ff5e45e9c0cdb04719bb370b87e9 | |
--- | |
arch/arm/mach-exynos/cpuidle-exynos4.c | 3 +++ | |
1 file changed, 3 insertions(+) | |
diff --git a/arch/arm/mach-exynos/cpuidle-exynos4.c b/arch/arm/mach-exynos/cpuidle-exynos4.c | |
index 2fd7953..06e9d91 100644 | |
--- a/arch/arm/mach-exynos/cpuidle-exynos4.c | |
+++ b/arch/arm/mach-exynos/cpuidle-exynos4.c | |
@@ -10,6 +10,7 @@ | |
#include <linux/kernel.h> | |
#include <linux/init.h> | |
+#include <linux/cpu_pm.h> | |
#include <linux/cpuidle.h> | |
#include <linux/io.h> | |
#include <linux/suspend.h> | |
@@ -923,6 +924,7 @@ static int exynos4_enter_lowpower(struct cpuidle_device *dev, | |
if (!enter_mode) | |
return exynos4_enter_idle(dev, new_state); | |
else { | |
+ cpu_pm_enter(); | |
#ifdef CONFIG_CORESIGHT_ETM | |
etm_disable(0); | |
#endif | |
@@ -933,6 +935,7 @@ static int exynos4_enter_lowpower(struct cpuidle_device *dev, | |
#ifdef CONFIG_CORESIGHT_ETM | |
etm_enable(0); | |
#endif | |
+ cpu_pm_exit(); | |
} | |
return ret; | |
-- | |
1.9.1 | |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
From 8fe954587f49710041f697c3689f1e3ba12852f5 Mon Sep 17 00:00:00 2001 | |
From: =?UTF-8?q?Christian=20Neum=C3=BCller?= <cn00@gmx.at> | |
Date: Sat, 27 Dec 2014 14:37:59 +0100 | |
Subject: [PATCH] ARM: Exynos: Call PM notifiers w/ IRQs disabled. | |
The comments at cpu_pm_enter/exit indicate that these functions must be called | |
with interrupts disabled, so move the calls between | |
local_irq_disable/local_irq_enble. | |
Change-Id: I57ddbb1b0d4c78371ea4cca3142c381942012311 | |
--- | |
arch/arm/mach-exynos/cpuidle-exynos4.c | 10 ++++++++-- | |
1 file changed, 8 insertions(+), 2 deletions(-) | |
diff --git a/arch/arm/mach-exynos/cpuidle-exynos4.c b/arch/arm/mach-exynos/cpuidle-exynos4.c | |
index 06e9d91..88b941f 100644 | |
--- a/arch/arm/mach-exynos/cpuidle-exynos4.c | |
+++ b/arch/arm/mach-exynos/cpuidle-exynos4.c | |
@@ -569,6 +569,8 @@ static int exynos4_enter_core0_aftr(struct cpuidle_device *dev, | |
local_irq_disable(); | |
+ cpu_pm_enter(); | |
+ | |
if (log_en) | |
pr_info("+++aftr\n"); | |
@@ -631,6 +633,8 @@ early_wakeup: | |
if (log_en) | |
pr_info("---aftr\n"); | |
+ cpu_pm_exit(); | |
+ | |
local_irq_enable(); | |
idle_time = (after.tv_sec - before.tv_sec) * USEC_PER_SEC + | |
(after.tv_usec - before.tv_usec); | |
@@ -664,6 +668,8 @@ static int exynos4_enter_core0_lpa(struct cpuidle_device *dev, | |
#endif | |
local_irq_disable(); | |
+ cpu_pm_enter(); | |
+ | |
#if defined(CONFIG_INTERNAL_MODEM_IF) || defined(CONFIG_SAMSUNG_PHONE_TTY) | |
gpio_set_value(GPIO_PDA_ACTIVE, 0); | |
#endif | |
@@ -764,6 +770,8 @@ early_wakeup: | |
gpio_set_value(GPIO_PDA_ACTIVE, 1); | |
#endif | |
+ cpu_pm_exit(); | |
+ | |
local_irq_enable(); | |
idle_time = (after.tv_sec - before.tv_sec) * USEC_PER_SEC + | |
(after.tv_usec - before.tv_usec); | |
@@ -924,7 +932,6 @@ static int exynos4_enter_lowpower(struct cpuidle_device *dev, | |
if (!enter_mode) | |
return exynos4_enter_idle(dev, new_state); | |
else { | |
- cpu_pm_enter(); | |
#ifdef CONFIG_CORESIGHT_ETM | |
etm_disable(0); | |
#endif | |
@@ -935,7 +942,6 @@ static int exynos4_enter_lowpower(struct cpuidle_device *dev, | |
#ifdef CONFIG_CORESIGHT_ETM | |
etm_enable(0); | |
#endif | |
- cpu_pm_exit(); | |
} | |
return ret; | |
-- | |
1.9.1 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment