[V4,10/20] ARM: exynos: cpuidle: Move clock setup to pm.c

Message ID 1397123751-1957-11-git-send-email-daniel.lezcano@linaro.org
State New
Headers show

Commit Message

Daniel Lezcano April 10, 2014, 9:55 a.m.
One more step is moving the clock ratio setting at idle time in pm.c

The macro names have been changed to be consistent with the other macros
name in the file.

Note, the clock divider was working only when cpuidle was enabled because it
was in its init routine. With this change, the clock divider is set in the pm's
init routine, so it will also operate when the cpuidle driver is not set, which
is good.

Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
Reviewed-by: Viresh Kumar <viresh.kumar@linaro.org>
Reviewed-by: Bartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com>
Reviewed-by: Tomasz Figa <t.figa@samsung.com>
---
 arch/arm/mach-exynos/cpuidle.c  |   54 ---------------------------------------
 arch/arm/mach-exynos/pm.c       |   35 +++++++++++++++++++++++++
 arch/arm/mach-exynos/regs-pmu.h |   19 ++++++++++++++
 3 files changed, 54 insertions(+), 54 deletions(-)

Comments

Tomasz Figa April 10, 2014, 1:57 p.m. | #1
Hi Daniel,

On 10.04.2014 11:55, Daniel Lezcano wrote:
> One more step is moving the clock ratio setting at idle time in pm.c
>
> The macro names have been changed to be consistent with the other macros
> name in the file.
>
> Note, the clock divider was working only when cpuidle was enabled because it
> was in its init routine. With this change, the clock divider is set in the pm's
> init routine, so it will also operate when the cpuidle driver is not set, which
> is good.
>
> Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
> Reviewed-by: Viresh Kumar <viresh.kumar@linaro.org>
> Reviewed-by: Bartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com>
> Reviewed-by: Tomasz Figa <t.figa@samsung.com>
> ---
>   arch/arm/mach-exynos/cpuidle.c  |   54 ---------------------------------------
>   arch/arm/mach-exynos/pm.c       |   35 +++++++++++++++++++++++++
>   arch/arm/mach-exynos/regs-pmu.h |   19 ++++++++++++++
>   3 files changed, 54 insertions(+), 54 deletions(-)

Sorry that I didn't mention that before, but now I recall that there was 
already a similar patch moving this code to Exynos5250 clock driver, 
which is the best place for setup of any CMU registers and a step 
towards removing one more static IO mapping.

Also one more thing below.

> diff --git a/arch/arm/mach-exynos/cpuidle.c b/arch/arm/mach-exynos/cpuidle.c
> index ce31004..97a441f 100644
> --- a/arch/arm/mach-exynos/cpuidle.c
> +++ b/arch/arm/mach-exynos/cpuidle.c
> @@ -39,25 +39,6 @@
>
>   #define S5P_CHECK_AFTR		0xFCBA0D10
>
> -#define EXYNOS5_PWR_CTRL1			(S5P_VA_CMU + 0x01020)
> -#define EXYNOS5_PWR_CTRL2			(S5P_VA_CMU + 0x01024)
> -
> -#define PWR_CTRL1_CORE2_DOWN_RATIO		(7 << 28)
> -#define PWR_CTRL1_CORE1_DOWN_RATIO		(7 << 16)
> -#define PWR_CTRL1_DIV2_DOWN_EN			(1 << 9)
> -#define PWR_CTRL1_DIV1_DOWN_EN			(1 << 8)
> -#define PWR_CTRL1_USE_CORE1_WFE			(1 << 5)
> -#define PWR_CTRL1_USE_CORE0_WFE			(1 << 4)
> -#define PWR_CTRL1_USE_CORE1_WFI			(1 << 1)
> -#define PWR_CTRL1_USE_CORE0_WFI			(1 << 0)
> -
> -#define PWR_CTRL2_DIV2_UP_EN			(1 << 25)
> -#define PWR_CTRL2_DIV1_UP_EN			(1 << 24)
> -#define PWR_CTRL2_DUR_STANDBY2_VAL		(1 << 16)
> -#define PWR_CTRL2_DUR_STANDBY1_VAL		(1 << 8)
> -#define PWR_CTRL2_CORE2_UP_RATIO		(1 << 4)
> -#define PWR_CTRL2_CORE1_UP_RATIO		(1 << 0)
> -
>   /* Ext-GIC nIRQ/nFIQ is the only wakeup source in AFTR */
>   static void exynos_set_wakeupmask(void)
>   {
> @@ -127,38 +108,6 @@ static int exynos_enter_lowpower(struct cpuidle_device *dev,
>   		return exynos_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 struct cpuidle_driver exynos_idle_driver = {
>   	.name			= "exynos_idle",
>   	.owner			= THIS_MODULE,
> @@ -181,9 +130,6 @@ static int exynos_cpuidle_probe(struct platform_device *pdev)
>   {
>   	int ret;
>
> -	if (soc_is_exynos5250())
> -		exynos5_core_down_clk();
> -
>   	if (soc_is_exynos5440())
>   		exynos_idle_driver.state_count = 1;
>
> diff --git a/arch/arm/mach-exynos/pm.c b/arch/arm/mach-exynos/pm.c
> index 9773a00..c4138bf 100644
> --- a/arch/arm/mach-exynos/pm.c
> +++ b/arch/arm/mach-exynos/pm.c
> @@ -140,6 +140,38 @@ static void exynos_cpu_restore_register(void)
>   		      : "cc");
>   }
>
> +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 = EXYNOS5_PWR_CTRL1_CORE2_DOWN_RATIO | \
> +	      EXYNOS5_PWR_CTRL1_CORE1_DOWN_RATIO | \
> +	      EXYNOS5_PWR_CTRL1_DIV2_DOWN_EN	 | \
> +	      EXYNOS5_PWR_CTRL1_DIV1_DOWN_EN	 | \
> +	      EXYNOS5_PWR_CTRL1_USE_CORE1_WFE	 | \
> +	      EXYNOS5_PWR_CTRL1_USE_CORE0_WFE	 | \
> +	      EXYNOS5_PWR_CTRL1_USE_CORE1_WFI	 | \
> +	      EXYNOS5_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 = EXYNOS5_PWR_CTRL2_DIV2_UP_EN	 | \
> +	      EXYNOS5_PWR_CTRL2_DIV1_UP_EN	 | \
> +	      EXYNOS5_PWR_CTRL2_DUR_STANDBY2_VAL | \
> +	      EXYNOS5_PWR_CTRL2_DUR_STANDBY1_VAL | \
> +	      EXYNOS5_PWR_CTRL2_CORE2_UP_RATIO	 | \
> +	      EXYNOS5_PWR_CTRL2_CORE1_UP_RATIO;
> +	__raw_writel(tmp, EXYNOS5_PWR_CTRL2);
> +}
> +
>   static int exynos_cpu_suspend(unsigned long arg)
>   {
>   #ifdef CONFIG_CACHE_L2X0
> @@ -244,6 +276,9 @@ static void exynos_pm_resume(void)
>
>   	s3c_pm_do_restore_core(exynos_core_save, ARRAY_SIZE(exynos_core_save));
>
> +	if (soc_is_exynos5250())
> +		exynos5_core_down_clk();
> +

Originally this code was executed at system boot-up, but now it is 
happening on resume from sleep. Is this change desired?

Best regards,
Tomasz
--
To unsubscribe from this list: send the line "unsubscribe linux-samsung-soc" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Daniel Lezcano April 10, 2014, 2:23 p.m. | #2
On 04/10/2014 03:57 PM, Tomasz Figa wrote:
> Hi Daniel,
>
> On 10.04.2014 11:55, Daniel Lezcano wrote:
>> One more step is moving the clock ratio setting at idle time in pm.c
>>
>> The macro names have been changed to be consistent with the other macros
>> name in the file.
>>
>> Note, the clock divider was working only when cpuidle was enabled
>> because it
>> was in its init routine. With this change, the clock divider is set in
>> the pm's
>> init routine, so it will also operate when the cpuidle driver is not
>> set, which
>> is good.
>>
>> Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
>> Reviewed-by: Viresh Kumar <viresh.kumar@linaro.org>
>> Reviewed-by: Bartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com>
>> Reviewed-by: Tomasz Figa <t.figa@samsung.com>
>> ---
>>   arch/arm/mach-exynos/cpuidle.c  |   54
>> ---------------------------------------
>>   arch/arm/mach-exynos/pm.c       |   35 +++++++++++++++++++++++++
>>   arch/arm/mach-exynos/regs-pmu.h |   19 ++++++++++++++
>>   3 files changed, 54 insertions(+), 54 deletions(-)
>
> Sorry that I didn't mention that before, but now I recall that there was
> already a similar patch moving this code to Exynos5250 clock driver,
> which is the best place for setup of any CMU registers and a step
> towards removing one more static IO mapping.

Yes, Bartlomiej mentioned it.

Is it possible to merge this mentioned patch or to give a pointer to it 
so I can integrate it into the patchset ?

> Also one more thing below.
>

[ ... ]

>>   {
>>   #ifdef CONFIG_CACHE_L2X0
>> @@ -244,6 +276,9 @@ static void exynos_pm_resume(void)
>>
>>       s3c_pm_do_restore_core(exynos_core_save,
>> ARRAY_SIZE(exynos_core_save));
>>
>> +    if (soc_is_exynos5250())
>> +        exynos5_core_down_clk();
>> +
>
> Originally this code was executed at system boot-up, but now it is
> happening on resume from sleep. Is this change desired?

Argh ! Sounds like I got a bad fuzz there.
Tomasz Figa April 10, 2014, 3:34 p.m. | #3
On 10.04.2014 16:23, Daniel Lezcano wrote:
> On 04/10/2014 03:57 PM, Tomasz Figa wrote:
>> Hi Daniel,
>>
>> On 10.04.2014 11:55, Daniel Lezcano wrote:
>>> One more step is moving the clock ratio setting at idle time in pm.c
>>>
>>> The macro names have been changed to be consistent with the other macros
>>> name in the file.
>>>
>>> Note, the clock divider was working only when cpuidle was enabled
>>> because it
>>> was in its init routine. With this change, the clock divider is set in
>>> the pm's
>>> init routine, so it will also operate when the cpuidle driver is not
>>> set, which
>>> is good.
>>>
>>> Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
>>> Reviewed-by: Viresh Kumar <viresh.kumar@linaro.org>
>>> Reviewed-by: Bartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com>
>>> Reviewed-by: Tomasz Figa <t.figa@samsung.com>
>>> ---
>>>   arch/arm/mach-exynos/cpuidle.c  |   54
>>> ---------------------------------------
>>>   arch/arm/mach-exynos/pm.c       |   35 +++++++++++++++++++++++++
>>>   arch/arm/mach-exynos/regs-pmu.h |   19 ++++++++++++++
>>>   3 files changed, 54 insertions(+), 54 deletions(-)
>>
>> Sorry that I didn't mention that before, but now I recall that there was
>> already a similar patch moving this code to Exynos5250 clock driver,
>> which is the best place for setup of any CMU registers and a step
>> towards removing one more static IO mapping.
>
> Yes, Bartlomiej mentioned it.
>
> Is it possible to merge this mentioned patch or to give a pointer to it
> so I can integrate it into the patchset ?

http://marc.info/?l=linux-arm-kernel&m=138147021207626&w=2

I wonder if it still applies cleanly, though...

Best regards,
Tomasz
--
To unsubscribe from this list: send the line "unsubscribe linux-samsung-soc" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Daniel Lezcano April 11, 2014, 8:30 a.m. | #4
On 04/10/2014 05:34 PM, Tomasz Figa wrote:
> On 10.04.2014 16:23, Daniel Lezcano wrote:
>> On 04/10/2014 03:57 PM, Tomasz Figa wrote:
>>> Hi Daniel,
>>>
>>> On 10.04.2014 11:55, Daniel Lezcano wrote:
>>>> One more step is moving the clock ratio setting at idle time in pm.c
>>>>
>>>> The macro names have been changed to be consistent with the other
>>>> macros
>>>> name in the file.
>>>>
>>>> Note, the clock divider was working only when cpuidle was enabled
>>>> because it
>>>> was in its init routine. With this change, the clock divider is set in
>>>> the pm's
>>>> init routine, so it will also operate when the cpuidle driver is not
>>>> set, which
>>>> is good.
>>>>
>>>> Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
>>>> Reviewed-by: Viresh Kumar <viresh.kumar@linaro.org>
>>>> Reviewed-by: Bartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com>
>>>> Reviewed-by: Tomasz Figa <t.figa@samsung.com>
>>>> ---
>>>>   arch/arm/mach-exynos/cpuidle.c  |   54
>>>> ---------------------------------------
>>>>   arch/arm/mach-exynos/pm.c       |   35 +++++++++++++++++++++++++
>>>>   arch/arm/mach-exynos/regs-pmu.h |   19 ++++++++++++++
>>>>   3 files changed, 54 insertions(+), 54 deletions(-)
>>>
>>> Sorry that I didn't mention that before, but now I recall that there was
>>> already a similar patch moving this code to Exynos5250 clock driver,
>>> which is the best place for setup of any CMU registers and a step
>>> towards removing one more static IO mapping.
>>
>> Yes, Bartlomiej mentioned it.
>>
>> Is it possible to merge this mentioned patch or to give a pointer to it
>> so I can integrate it into the patchset ?
>
> http://marc.info/?l=linux-arm-kernel&m=138147021207626&w=2
>
> I wonder if it still applies cleanly, though...

Ok, if I refer to the date, this patch has been lost in the limbus. So I 
can integrate it with my patchset without conflicting with any tree. Right ?
Daniel Lezcano April 11, 2014, 8:55 a.m. | #5
On 04/11/2014 10:49 AM, Tomasz Figa wrote:
> On 11.04.2014 10:30, Daniel Lezcano wrote:
>> On 04/10/2014 05:34 PM, Tomasz Figa wrote:
>>> On 10.04.2014 16:23, Daniel Lezcano wrote:
>>>> On 04/10/2014 03:57 PM, Tomasz Figa wrote:
>>>>> Hi Daniel,
>>>>>
>>>>> On 10.04.2014 11:55, Daniel Lezcano wrote:
>>>>>> One more step is moving the clock ratio setting at idle time in pm.c
>>>>>>
>>>>>> The macro names have been changed to be consistent with the other
>>>>>> macros
>>>>>> name in the file.
>>>>>>
>>>>>> Note, the clock divider was working only when cpuidle was enabled
>>>>>> because it
>>>>>> was in its init routine. With this change, the clock divider is
>>>>>> set in
>>>>>> the pm's
>>>>>> init routine, so it will also operate when the cpuidle driver is not
>>>>>> set, which
>>>>>> is good.
>>>>>>
>>>>>> Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
>>>>>> Reviewed-by: Viresh Kumar <viresh.kumar@linaro.org>
>>>>>> Reviewed-by: Bartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com>
>>>>>> Reviewed-by: Tomasz Figa <t.figa@samsung.com>
>>>>>> ---
>>>>>>   arch/arm/mach-exynos/cpuidle.c  |   54
>>>>>> ---------------------------------------
>>>>>>   arch/arm/mach-exynos/pm.c       |   35 +++++++++++++++++++++++++
>>>>>>   arch/arm/mach-exynos/regs-pmu.h |   19 ++++++++++++++
>>>>>>   3 files changed, 54 insertions(+), 54 deletions(-)
>>>>>
>>>>> Sorry that I didn't mention that before, but now I recall that there
>>>>> was
>>>>> already a similar patch moving this code to Exynos5250 clock driver,
>>>>> which is the best place for setup of any CMU registers and a step
>>>>> towards removing one more static IO mapping.
>>>>
>>>> Yes, Bartlomiej mentioned it.
>>>>
>>>> Is it possible to merge this mentioned patch or to give a pointer to it
>>>> so I can integrate it into the patchset ?
>>>
>>> http://marc.info/?l=linux-arm-kernel&m=138147021207626&w=2
>>>
>>> I wonder if it still applies cleanly, though...
>>
>> Ok, if I refer to the date, this patch has been lost in the limbus. So I
>> can integrate it with my patchset without conflicting with any tree.
>> Right ?
>>
>
> As I suspected, it doesn't apply onto current sources. I have attached a
> rebased version. Feel free to send it as a part of next version of your
> series.

Thanks Tomasz !

Patch

diff --git a/arch/arm/mach-exynos/cpuidle.c b/arch/arm/mach-exynos/cpuidle.c
index ce31004..97a441f 100644
--- a/arch/arm/mach-exynos/cpuidle.c
+++ b/arch/arm/mach-exynos/cpuidle.c
@@ -39,25 +39,6 @@ 
 
 #define S5P_CHECK_AFTR		0xFCBA0D10
 
-#define EXYNOS5_PWR_CTRL1			(S5P_VA_CMU + 0x01020)
-#define EXYNOS5_PWR_CTRL2			(S5P_VA_CMU + 0x01024)
-
-#define PWR_CTRL1_CORE2_DOWN_RATIO		(7 << 28)
-#define PWR_CTRL1_CORE1_DOWN_RATIO		(7 << 16)
-#define PWR_CTRL1_DIV2_DOWN_EN			(1 << 9)
-#define PWR_CTRL1_DIV1_DOWN_EN			(1 << 8)
-#define PWR_CTRL1_USE_CORE1_WFE			(1 << 5)
-#define PWR_CTRL1_USE_CORE0_WFE			(1 << 4)
-#define PWR_CTRL1_USE_CORE1_WFI			(1 << 1)
-#define PWR_CTRL1_USE_CORE0_WFI			(1 << 0)
-
-#define PWR_CTRL2_DIV2_UP_EN			(1 << 25)
-#define PWR_CTRL2_DIV1_UP_EN			(1 << 24)
-#define PWR_CTRL2_DUR_STANDBY2_VAL		(1 << 16)
-#define PWR_CTRL2_DUR_STANDBY1_VAL		(1 << 8)
-#define PWR_CTRL2_CORE2_UP_RATIO		(1 << 4)
-#define PWR_CTRL2_CORE1_UP_RATIO		(1 << 0)
-
 /* Ext-GIC nIRQ/nFIQ is the only wakeup source in AFTR */
 static void exynos_set_wakeupmask(void)
 {
@@ -127,38 +108,6 @@  static int exynos_enter_lowpower(struct cpuidle_device *dev,
 		return exynos_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 struct cpuidle_driver exynos_idle_driver = {
 	.name			= "exynos_idle",
 	.owner			= THIS_MODULE,
@@ -181,9 +130,6 @@  static int exynos_cpuidle_probe(struct platform_device *pdev)
 {
 	int ret;
 
-	if (soc_is_exynos5250())
-		exynos5_core_down_clk();
-
 	if (soc_is_exynos5440())
 		exynos_idle_driver.state_count = 1;
 
diff --git a/arch/arm/mach-exynos/pm.c b/arch/arm/mach-exynos/pm.c
index 9773a00..c4138bf 100644
--- a/arch/arm/mach-exynos/pm.c
+++ b/arch/arm/mach-exynos/pm.c
@@ -140,6 +140,38 @@  static void exynos_cpu_restore_register(void)
 		      : "cc");
 }
 
+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 = EXYNOS5_PWR_CTRL1_CORE2_DOWN_RATIO | \
+	      EXYNOS5_PWR_CTRL1_CORE1_DOWN_RATIO | \
+	      EXYNOS5_PWR_CTRL1_DIV2_DOWN_EN	 | \
+	      EXYNOS5_PWR_CTRL1_DIV1_DOWN_EN	 | \
+	      EXYNOS5_PWR_CTRL1_USE_CORE1_WFE	 | \
+	      EXYNOS5_PWR_CTRL1_USE_CORE0_WFE	 | \
+	      EXYNOS5_PWR_CTRL1_USE_CORE1_WFI	 | \
+	      EXYNOS5_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 = EXYNOS5_PWR_CTRL2_DIV2_UP_EN	 | \
+	      EXYNOS5_PWR_CTRL2_DIV1_UP_EN	 | \
+	      EXYNOS5_PWR_CTRL2_DUR_STANDBY2_VAL | \
+	      EXYNOS5_PWR_CTRL2_DUR_STANDBY1_VAL | \
+	      EXYNOS5_PWR_CTRL2_CORE2_UP_RATIO	 | \
+	      EXYNOS5_PWR_CTRL2_CORE1_UP_RATIO;
+	__raw_writel(tmp, EXYNOS5_PWR_CTRL2);
+}
+
 static int exynos_cpu_suspend(unsigned long arg)
 {
 #ifdef CONFIG_CACHE_L2X0
@@ -244,6 +276,9 @@  static void exynos_pm_resume(void)
 
 	s3c_pm_do_restore_core(exynos_core_save, ARRAY_SIZE(exynos_core_save));
 
+	if (soc_is_exynos5250())
+		exynos5_core_down_clk();
+
 	if (!soc_is_exynos5250())
 		scu_enable(S5P_VA_SCU);
 
diff --git a/arch/arm/mach-exynos/regs-pmu.h b/arch/arm/mach-exynos/regs-pmu.h
index 4f6a256..35c4eb3 100644
--- a/arch/arm/mach-exynos/regs-pmu.h
+++ b/arch/arm/mach-exynos/regs-pmu.h
@@ -313,4 +313,23 @@ 
 
 #define EXYNOS5_OPTION_USE_RETENTION				(1 << 4)
 
+#define EXYNOS5_PWR_CTRL1			(S5P_VA_CMU + 0x01020)
+#define EXYNOS5_PWR_CTRL2			(S5P_VA_CMU + 0x01024)
+
+#define EXYNOS5_PWR_CTRL1_CORE2_DOWN_RATIO	(7 << 28)
+#define EXYNOS5_PWR_CTRL1_CORE1_DOWN_RATIO	(7 << 16)
+#define EXYNOS5_PWR_CTRL1_DIV2_DOWN_EN		(1 << 9)
+#define EXYNOS5_PWR_CTRL1_DIV1_DOWN_EN		(1 << 8)
+#define EXYNOS5_PWR_CTRL1_USE_CORE1_WFE		(1 << 5)
+#define EXYNOS5_PWR_CTRL1_USE_CORE0_WFE		(1 << 4)
+#define EXYNOS5_PWR_CTRL1_USE_CORE1_WFI		(1 << 1)
+#define EXYNOS5_PWR_CTRL1_USE_CORE0_WFI		(1 << 0)
+
+#define EXYNOS5_PWR_CTRL2_DIV2_UP_EN		(1 << 25)
+#define EXYNOS5_PWR_CTRL2_DIV1_UP_EN		(1 << 24)
+#define EXYNOS5_PWR_CTRL2_DUR_STANDBY2_VAL	(1 << 16)
+#define EXYNOS5_PWR_CTRL2_DUR_STANDBY1_VAL	(1 << 8)
+#define EXYNOS5_PWR_CTRL2_CORE2_UP_RATIO	(1 << 4)
+#define EXYNOS5_PWR_CTRL2_CORE1_UP_RATIO	(1 << 0)
+
 #endif /* __ASM_ARCH_REGS_PMU_H */