|
@@ -21,6 +21,7 @@
|
|
|
#include <asm/suspend.h>
|
|
|
#include <asm/unified.h>
|
|
|
#include <asm/cpuidle.h>
|
|
|
+#include <mach/regs-clock.h>
|
|
|
#include <mach/regs-pmu.h>
|
|
|
#include <mach/pmu.h>
|
|
|
|
|
@@ -156,12 +157,47 @@ 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)
|
|
|
+{
|
|
|
+ unsigned int tmp;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * Enable arm clock down (in idle) and set arm divider
|
|
|
+ * ratios in WFI/WFE state.
|
|
|
+ */
|
|
|
+ tmp = PWR_CTRL1_CORE2_DOWN_RATIO | \
|
|
|
+ PWR_CTRL1_CORE1_DOWN_RATIO | \
|
|
|
+ PWR_CTRL1_DIV2_DOWN_EN | \
|
|
|
+ PWR_CTRL1_DIV1_DOWN_EN | \
|
|
|
+ PWR_CTRL1_USE_CORE1_WFE | \
|
|
|
+ PWR_CTRL1_USE_CORE0_WFE | \
|
|
|
+ PWR_CTRL1_USE_CORE1_WFI | \
|
|
|
+ PWR_CTRL1_USE_CORE0_WFI;
|
|
|
+ __raw_writel(tmp, EXYNOS5_PWR_CTRL1);
|
|
|
+
|
|
|
+ /*
|
|
|
+ * Enable arm clock up (on exiting idle). Set arm divider
|
|
|
+ * ratios when not in idle along with the standby duration
|
|
|
+ * ratios.
|
|
|
+ */
|
|
|
+ tmp = PWR_CTRL2_DIV2_UP_EN | \
|
|
|
+ PWR_CTRL2_DIV1_UP_EN | \
|
|
|
+ PWR_CTRL2_DUR_STANDBY2_VAL | \
|
|
|
+ PWR_CTRL2_DUR_STANDBY1_VAL | \
|
|
|
+ PWR_CTRL2_CORE2_UP_RATIO | \
|
|
|
+ PWR_CTRL2_CORE1_UP_RATIO;
|
|
|
+ __raw_writel(tmp, EXYNOS5_PWR_CTRL2);
|
|
|
+}
|
|
|
+
|
|
|
static int __init exynos4_init_cpuidle(void)
|
|
|
{
|
|
|
int i, max_cpuidle_state, cpu_id;
|
|
|
struct cpuidle_device *device;
|
|
|
struct cpuidle_driver *drv = &exynos4_idle_driver;
|
|
|
|
|
|
+ if (soc_is_exynos5250())
|
|
|
+ exynos5_core_down_clk();
|
|
|
+
|
|
|
/* Setup cpuidle driver */
|
|
|
drv->state_count = (sizeof(exynos4_cpuidle_set) /
|
|
|
sizeof(struct cpuidle_state));
|