summaryrefslogtreecommitdiff
path: root/arch/arm/mach-exynos/cpuidle.c
diff options
context:
space:
mode:
authorLukasz Majewski <l.majewski@samsung.com>2014-04-10 16:46:08 +0200
committerChanho Park <chanho61.park@samsung.com>2014-11-18 11:47:28 +0900
commit619b370f569ba6d3d05c175c1fe0dbc311f1d74b (patch)
treeb0f6d43fb86806f23e4b4f8239ff4fec4f878175 /arch/arm/mach-exynos/cpuidle.c
parentfd3a1558a2ae3f3636c25cbb22ae35138594e54e (diff)
downloadlinux-3.10-619b370f569ba6d3d05c175c1fe0dbc311f1d74b.tar.gz
linux-3.10-619b370f569ba6d3d05c175c1fe0dbc311f1d74b.tar.bz2
linux-3.10-619b370f569ba6d3d05c175c1fe0dbc311f1d74b.zip
cpuidle:clk:Exynos4412: Enable support for clock down when WFI cpuidle state is entered
This patch adds support for setting ARM cores' clock frequency down when entering WFI/WFE based cpuidle state. On the Trats2 device: performance governor, 1.4 GHz frequency, no extra load, 4 cores enabled: Without core clock down feature: 395 mA With core clock down feature: 337 mA Power consumption reduction around 15% Change-Id: I7bae29b0332a97c7b18ffb79f4b0a5ff3d70b7ce Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
Diffstat (limited to 'arch/arm/mach-exynos/cpuidle.c')
-rw-r--r--arch/arm/mach-exynos/cpuidle.c20
1 files changed, 15 insertions, 5 deletions
diff --git a/arch/arm/mach-exynos/cpuidle.c b/arch/arm/mach-exynos/cpuidle.c
index df195ed0891..11c3db7b165 100644
--- a/arch/arm/mach-exynos/cpuidle.c
+++ b/arch/arm/mach-exynos/cpuidle.c
@@ -167,7 +167,7 @@ static int exynos4_enter_lowpower(struct cpuidle_device *dev,
return exynos4_enter_core0_aftr(dev, drv, new_index);
}
-static void __init exynos5_core_down_clk(void)
+static void __init exynos_core_down_clk(void)
{
unsigned int tmp;
@@ -183,7 +183,15 @@ static void __init exynos5_core_down_clk(void)
PWR_CTRL1_USE_CORE0_WFE | \
PWR_CTRL1_USE_CORE1_WFI | \
PWR_CTRL1_USE_CORE0_WFI;
- __raw_writel(tmp, EXYNOS5_PWR_CTRL1);
+
+ if (soc_is_exynos4412())
+ tmp |= PWR_CTRL1_USE_CORE3_WFE | \
+ PWR_CTRL1_USE_CORE2_WFE | \
+ PWR_CTRL1_USE_CORE3_WFI | \
+ PWR_CTRL1_USE_CORE2_WFI;
+
+ __raw_writel(tmp, soc_is_exynos5250() ? EXYNOS5_PWR_CTRL1
+ : EXYNOS4_PWR_CTRL1);
/*
* Enable arm clock up (on exiting idle). Set arm divider
@@ -196,7 +204,9 @@ static void __init exynos5_core_down_clk(void)
PWR_CTRL2_DUR_STANDBY1_VAL | \
PWR_CTRL2_CORE2_UP_RATIO | \
PWR_CTRL2_CORE1_UP_RATIO;
- __raw_writel(tmp, EXYNOS5_PWR_CTRL2);
+
+ __raw_writel(tmp, soc_is_exynos5250() ? EXYNOS5_PWR_CTRL2
+ : EXYNOS4_PWR_CTRL2);
}
static int __init exynos4_init_cpuidle(void)
@@ -204,8 +214,8 @@ static int __init exynos4_init_cpuidle(void)
int cpu_id, ret;
struct cpuidle_device *device;
- if (soc_is_exynos5250())
- exynos5_core_down_clk();
+ if (soc_is_exynos4412() || soc_is_exynos5250())
+ exynos_core_down_clk();
ret = cpuidle_register_driver(&exynos4_idle_driver);
if (ret) {