ARM: shmobile: Do not access sh7372 A4S domain internals directly
authorRafael J. Wysocki <rjw@sisk.pl>
Wed, 15 Aug 2012 18:54:15 +0000 (20:54 +0200)
committerRafael J. Wysocki <rjw@sisk.pl>
Mon, 3 Sep 2012 23:44:57 +0000 (01:44 +0200)
The sh7372_enter_suspend() routine checks the status field of the
generic PM domain object corresponding to the A4S domain in order to
check if it can turn that domain off when entering system sleep.
However, it shouldn't rely on the specific values of the generic
data structures this way, so make it use its own mechanism to
recognize when it is safe to turn that domain off.

For this purpos, introduce a boolean variable a4s_suspend_ready
that will be set by the A4S' suspend routine and unset by its
resume routine executed by rmobile_pd_power_down() and
__rmobile_pd_power_up(), respectively.

Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
Acked-by: Magnus Damm <damm@opensource.se>
arch/arm/mach-shmobile/pm-sh7372.c

index 79203706922651dad75595869802fa3520c78a8c..0a4804694deee043dffcbf8d4afbce80f5b29fe7 100644 (file)
@@ -110,21 +110,33 @@ struct rmobile_pm_domain sh7372_pd_a3ri = {
        .bit_shift = 8,
 };
 
+static bool a4s_suspend_ready;
+
 static int sh7372_pd_a4s_suspend(void)
 {
        /*
         * The A4S domain contains the CPU core and therefore it should
-        * only be turned off if the CPU is in use.
+        * only be turned off if the CPU is not in use.  This may happen
+        * during system suspend, when SYSC is going to be used for generating
+        * resume signals and a4s_suspend_ready is set to let
+        * sh7372_enter_suspend() know that it can turn A4S off.
         */
+       a4s_suspend_ready = true;
        return -EBUSY;
 }
 
+static void sh7372_pd_a4s_resume(void)
+{
+       a4s_suspend_ready = false;
+}
+
 struct rmobile_pm_domain sh7372_pd_a4s = {
        .genpd.name = "A4S",
        .bit_shift = 10,
        .gov = &pm_domain_always_on_gov,
        .no_debug = true,
        .suspend = sh7372_pd_a4s_suspend,
+       .resume = sh7372_pd_a4s_resume,
 };
 
 static int sh7372_a3sp_pd_suspend(void)
@@ -390,8 +402,7 @@ static int sh7372_enter_suspend(suspend_state_t suspend_state)
 
        /* check active clocks to determine potential wakeup sources */
        if (sh7372_sysc_valid(&msk, &msk2)) {
-               if (!console_suspend_enabled &&
-                   sh7372_pd_a4s.genpd.status == GPD_STATE_POWER_OFF) {
+               if (!console_suspend_enabled && a4s_suspend_ready) {
                        /* convert INTC mask/sense to SYSC mask/sense */
                        sh7372_setup_sysc(msk, msk2);