Skip to content

Commit

Permalink
PM / shmobile: Remove the stay_on flag from SH7372's PM domains
Browse files Browse the repository at this point in the history
SH7372 uses two independent mechanisms for ensuring that power
domains will never be turned off: the stay_on flag and the "always
on" domain governor.  Moreover, the "always on" governor is only taken
into accout by runtime PM code paths, while the stay_on flag affects
all attempts to turn the given domain off.  Thus setting the stay_on
flag causes the "always on" governor to be unnecessary, which is
quite confusing.

However, the stay_on flag is currently only set for two domains: A3SP
and A4S.  Moreover, it only is set for the A3SP domain if
console_suspend_enabled is set, so stay_on won't be necessary for
that domain any more if console_suspend_enabled is checked directly
in its .suspend() routine.  [This requires domain .suspend() to
return a result, but that is a minor modification.]  Analogously,
stay_on won't be necessary for the A4S domain if it's .suspend()
routine always returns an error code.

Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
Acked-by: Magnus Damm <damm@opensource.se>
  • Loading branch information
Rafael J. Wysocki committed Dec 25, 2011
1 parent 0f966d7 commit 767c0f3
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 23 deletions.
3 changes: 1 addition & 2 deletions arch/arm/mach-shmobile/include/mach/sh7372.h
Original file line number Diff line number Diff line change
Expand Up @@ -480,11 +480,10 @@ struct platform_device;
struct sh7372_pm_domain {
struct generic_pm_domain genpd;
struct dev_power_governor *gov;
void (*suspend)(void);
int (*suspend)(void);
void (*resume)(void);
unsigned int bit_shift;
bool no_debug;
bool stay_on;
};

static inline struct sh7372_pm_domain *to_sh7372_pd(struct generic_pm_domain *d)
Expand Down
49 changes: 28 additions & 21 deletions arch/arm/mach-shmobile/pm-sh7372.c
Original file line number Diff line number Diff line change
Expand Up @@ -82,11 +82,12 @@ static int pd_power_down(struct generic_pm_domain *genpd)
struct sh7372_pm_domain *sh7372_pd = to_sh7372_pd(genpd);
unsigned int mask = 1 << sh7372_pd->bit_shift;

if (sh7372_pd->suspend)
sh7372_pd->suspend();
if (sh7372_pd->suspend) {
int ret = sh7372_pd->suspend();

if (sh7372_pd->stay_on)
return 0;
if (ret)
return ret;
}

if (__raw_readl(PSTR) & mask) {
unsigned int retry_count;
Expand All @@ -113,9 +114,6 @@ static int __pd_power_up(struct sh7372_pm_domain *sh7372_pd, bool do_resume)
unsigned int retry_count;
int ret = 0;

if (sh7372_pd->stay_on)
goto out;

if (__raw_readl(PSTR) & mask)
goto out;

Expand Down Expand Up @@ -148,10 +146,11 @@ static int pd_power_up(struct generic_pm_domain *genpd)
return __pd_power_up(to_sh7372_pd(genpd), true);
}

static void sh7372_a4r_suspend(void)
static int sh7372_a4r_suspend(void)
{
sh7372_intcs_suspend();
__raw_writel(0x300fffff, WUPRMSK); /* avoid wakeup */
return 0;
}

static bool pd_active_wakeup(struct device *dev)
Expand Down Expand Up @@ -243,7 +242,6 @@ struct sh7372_pm_domain sh7372_a4r = {
.gov = &pm_domain_always_on_gov,
.suspend = sh7372_a4r_suspend,
.resume = sh7372_intcs_resume,
.stay_on = true,
};

struct sh7372_pm_domain sh7372_a3rv = {
Expand All @@ -256,29 +254,40 @@ struct sh7372_pm_domain sh7372_a3ri = {
.bit_shift = 8,
};

static int sh7372_a4s_suspend(void)
{
/*
* The A4S domain contains the CPU core and therefore it should
* only be turned off if the CPU is in use.
*/
return -EBUSY;
}

struct sh7372_pm_domain sh7372_a4s = {
.genpd.name = "A4S",
.bit_shift = 10,
.gov = &pm_domain_always_on_gov,
.no_debug = true,
.stay_on = true,
.suspend = sh7372_a4s_suspend,
};

static int sh7372_a3sp_suspend(void)
{
/*
* Serial consoles make use of SCIF hardware located in A3SP,
* keep such power domain on if "no_console_suspend" is set.
*/
return console_suspend_enabled ? -EBUSY : 0;
}

struct sh7372_pm_domain sh7372_a3sp = {
.genpd.name = "A3SP",
.bit_shift = 11,
.gov = &pm_domain_always_on_gov,
.no_debug = true,
.suspend = sh7372_a3sp_suspend,
};

static void sh7372_a3sp_init(void)
{
/* serial consoles make use of SCIF hardware located in A3SP,
* keep such power domain on if "no_console_suspend" is set.
*/
sh7372_a3sp.stay_on = !console_suspend_enabled;
}

struct sh7372_pm_domain sh7372_a3sg = {
.genpd.name = "A3SG",
.bit_shift = 13,
Expand Down Expand Up @@ -508,7 +517,7 @@ static int sh7372_enter_suspend(suspend_state_t suspend_state)
/* convert INTC mask and sense to SYSC mask and sense */
sh7372_setup_sysc(msk, msk2);

if (!sh7372_a3sp.stay_on &&
if (!console_suspend_enabled &&
sh7372_a4s.genpd.status == GPD_STATE_POWER_OFF) {
/* enter A4S sleep with PLLC0 off */
pr_debug("entering A4S\n");
Expand Down Expand Up @@ -544,8 +553,6 @@ void __init sh7372_pm_init(void)
/* do not convert A3SM, A3SP, A3SG, A4R power down into A4S */
__raw_writel(0, PDNSEL);

sh7372_a3sp_init();

sh7372_suspend_init();
sh7372_cpuidle_init();
}

0 comments on commit 767c0f3

Please sign in to comment.