Skip to content

Commit

Permalink
ARM: EXYNOS: Move the power sequence call in the cpu_pm notifier
Browse files Browse the repository at this point in the history
The code to initiate and exit the powerdown sequence is the same in
pm.c and cpuidle.c.

Let's split the common part in the pm.c and reuse it from the cpu_pm notifier.

That is one more step forward to make the cpuidle driver arch indenpendant.

Signed-off-by: Daniel Lezcano <[email protected]>
Reviewed-by: Viresh Kumar <[email protected]>
Reviewed-by: Bartlomiej Zolnierkiewicz <[email protected]>
Reviewed-by: Tomasz Figa <[email protected]>
Signed-off-by: Kukjin Kim <[email protected]>
  • Loading branch information
dlezcano authored and kgene committed May 25, 2014
1 parent 3681baf commit 0ebc13e
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 27 deletions.
22 changes: 0 additions & 22 deletions arch/arm/mach-exynos/cpuidle.c
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,6 @@
#include <mach/map.h>

#include "common.h"
#include "regs-pmu.h"

static int idle_finisher(unsigned long flags)
{
Expand All @@ -43,31 +42,10 @@ static int exynos_enter_core0_aftr(struct cpuidle_device *dev,
struct cpuidle_driver *drv,
int index)
{
unsigned long tmp;

/* Setting Central Sequence Register for power down mode */
tmp = __raw_readl(S5P_CENTRAL_SEQ_CONFIGURATION);
tmp &= ~S5P_CENTRAL_LOWPWR_CFG;
__raw_writel(tmp, S5P_CENTRAL_SEQ_CONFIGURATION);

cpu_pm_enter();
cpu_suspend(0, idle_finisher);
cpu_pm_exit();

/*
* If PMU failed while entering sleep mode, WFI will be
* ignored by PMU and then exiting cpu_do_idle().
* S5P_CENTRAL_LOWPWR_CFG bit will not be set automatically
* in this situation.
*/
tmp = __raw_readl(S5P_CENTRAL_SEQ_CONFIGURATION);
if (!(tmp & S5P_CENTRAL_LOWPWR_CFG)) {
tmp |= S5P_CENTRAL_LOWPWR_CFG;
__raw_writel(tmp, S5P_CENTRAL_SEQ_CONFIGURATION);
/* Clear wakeup state register */
__raw_writel(0x0, S5P_WAKEUP_STAT);
}

return index;
}

Expand Down
27 changes: 22 additions & 5 deletions arch/arm/mach-exynos/pm.c
Original file line number Diff line number Diff line change
Expand Up @@ -279,15 +279,21 @@ static void exynos_pm_prepare(void)
__raw_writel(virt_to_phys(exynos_cpu_resume), S5P_INFORM0);
}

static int exynos_pm_suspend(void)
static void exynos_pm_central_suspend(void)
{
unsigned long tmp;

/* Setting Central Sequence Register for power down mode */

tmp = __raw_readl(S5P_CENTRAL_SEQ_CONFIGURATION);
tmp &= ~S5P_CENTRAL_LOWPWR_CFG;
__raw_writel(tmp, S5P_CENTRAL_SEQ_CONFIGURATION);
}

static int exynos_pm_suspend(void)
{
unsigned long tmp;

exynos_pm_central_suspend();

/* Setting SEQ_OPTION register */

Expand All @@ -300,7 +306,7 @@ static int exynos_pm_suspend(void)
return 0;
}

static void exynos_pm_resume(void)
static int exynos_pm_central_resume(void)
{
unsigned long tmp;

Expand All @@ -317,9 +323,17 @@ static void exynos_pm_resume(void)
/* clear the wakeup state register */
__raw_writel(0x0, S5P_WAKEUP_STAT);
/* No need to perform below restore code */
goto early_wakeup;
return -1;
}

return 0;
}

static void exynos_pm_resume(void)
{
if (exynos_pm_central_resume())
goto early_wakeup;

if (!soc_is_exynos5250())
exynos_cpu_restore_register();

Expand Down Expand Up @@ -424,15 +438,18 @@ static int exynos_cpu_pm_notifier(struct notifier_block *self,

switch (cmd) {
case CPU_PM_ENTER:
if (cpu == 0)
if (cpu == 0) {
exynos_pm_central_suspend();
exynos_cpu_save_register();
}
break;

case CPU_PM_EXIT:
if (cpu == 0) {
if (!soc_is_exynos5250())
scu_enable(S5P_VA_SCU);
exynos_cpu_restore_register();
exynos_pm_central_resume();
}
break;
}
Expand Down

0 comments on commit 0ebc13e

Please sign in to comment.