ARM: shmobile: sh7372: add pm-rmobile domain support
authorKuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Thu, 5 Jul 2012 08:28:32 +0000 (01:28 -0700)
committerRafael J. Wysocki <rjw@sisk.pl>
Fri, 6 Jul 2012 18:53:38 +0000 (20:53 +0200)
This patch adds pm-rmobile common API base PM domain.
sh7372 CPU/platform will switch to using it from
original implementation

Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Acked-by: Magnus Damm <damm@opensource.se>
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
arch/arm/mach-shmobile/include/mach/sh7372.h
arch/arm/mach-shmobile/pm-sh7372.c
arch/arm/mach-shmobile/setup-sh7372.c

index 915d009..a7620c1 100644 (file)
@@ -13,6 +13,7 @@
 
 #include <linux/sh_clk.h>
 #include <linux/pm_domain.h>
+#include <mach/pm-rmobile.h>
 
 /*
  * Pin Function Controller:
@@ -494,6 +495,16 @@ static inline struct sh7372_pm_domain *to_sh7372_pd(struct generic_pm_domain *d)
 }
 
 #ifdef CONFIG_PM
+extern struct rmobile_pm_domain sh7372_pd_a4lc;
+extern struct rmobile_pm_domain sh7372_pd_a4mp;
+extern struct rmobile_pm_domain sh7372_pd_d4;
+extern struct rmobile_pm_domain sh7372_pd_a4r;
+extern struct rmobile_pm_domain sh7372_pd_a3rv;
+extern struct rmobile_pm_domain sh7372_pd_a3ri;
+extern struct rmobile_pm_domain sh7372_pd_a4s;
+extern struct rmobile_pm_domain sh7372_pd_a3sp;
+extern struct rmobile_pm_domain sh7372_pd_a3sg;
+
 extern struct sh7372_pm_domain sh7372_a4lc;
 extern struct sh7372_pm_domain sh7372_a4mp;
 extern struct sh7372_pm_domain sh7372_d4;
index a38be7f..3b131c7 100644 (file)
@@ -26,6 +26,7 @@
 #include <asm/suspend.h>
 #include <mach/common.h>
 #include <mach/sh7372.h>
+#include <mach/pm-rmobile.h>
 
 /* DBG */
 #define DBGREG1 0xe6100020
@@ -290,6 +291,85 @@ struct sh7372_pm_domain sh7372_a3sg = {
        .genpd.name = "A3SG",
        .bit_shift = 13,
 };
+
+struct rmobile_pm_domain sh7372_pd_a4lc = {
+       .genpd.name = "A4LC",
+       .bit_shift = 1,
+};
+
+struct rmobile_pm_domain sh7372_pd_a4mp = {
+       .genpd.name = "A4MP",
+       .bit_shift = 2,
+};
+
+struct rmobile_pm_domain sh7372_pd_d4 = {
+       .genpd.name = "D4",
+       .bit_shift = 3,
+};
+
+static int sh7372_a4r_pd_suspend(void)
+{
+       sh7372_intcs_suspend();
+       __raw_writel(0x300fffff, WUPRMSK); /* avoid wakeup */
+       return 0;
+}
+
+struct rmobile_pm_domain sh7372_pd_a4r = {
+       .genpd.name = "A4R",
+       .bit_shift = 5,
+       .suspend = sh7372_a4r_pd_suspend,
+       .resume = sh7372_intcs_resume,
+};
+
+struct rmobile_pm_domain sh7372_pd_a3rv = {
+       .genpd.name = "A3RV",
+       .bit_shift = 6,
+};
+
+struct rmobile_pm_domain sh7372_pd_a3ri = {
+       .genpd.name = "A3RI",
+       .bit_shift = 8,
+};
+
+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.
+        */
+       return -EBUSY;
+}
+
+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,
+};
+
+static int sh7372_a3sp_pd_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 ? 0 : -EBUSY;
+}
+
+struct rmobile_pm_domain sh7372_pd_a3sp = {
+       .genpd.name = "A3SP",
+       .bit_shift = 11,
+       .gov = &pm_domain_always_on_gov,
+       .no_debug = true,
+       .suspend = sh7372_a3sp_pd_suspend,
+};
+
+struct rmobile_pm_domain sh7372_pd_a3sg = {
+       .genpd.name = "A3SG",
+       .bit_shift = 13,
+};
+
 #endif /* CONFIG_PM */
 
 #if defined(CONFIG_SUSPEND) || defined(CONFIG_CPU_IDLE)
@@ -531,7 +611,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_a4s.genpd.status == GPD_STATE_POWER_OFF) {
+                   sh7372_pd_a4s.genpd.status == GPD_STATE_POWER_OFF) {
                        /* convert INTC mask/sense to SYSC mask/sense */
                        sh7372_setup_sysc(msk, msk2);
 
@@ -565,7 +645,7 @@ static int sh7372_pm_notifier_fn(struct notifier_block *notifier,
                 * executed during system suspend and resume, respectively, so
                 * that those functions don't crash while accessing the INTCS.
                 */
-               pm_genpd_poweron(&sh7372_a4r.genpd);
+               pm_genpd_poweron(&sh7372_pd_a4r.genpd);
                break;
        case PM_POST_SUSPEND:
                pm_genpd_poweroff_unused();
index 4f47332..3648b35 100644 (file)
@@ -1017,6 +1017,22 @@ void __init sh7372_add_standard_devices(void)
        sh7372_pm_add_subdomain(&sh7372_a4s, &sh7372_a3sg);
        sh7372_pm_add_subdomain(&sh7372_a4s, &sh7372_a3sp);
 
+       rmobile_init_pm_domain(&sh7372_pd_a4lc);
+       rmobile_init_pm_domain(&sh7372_pd_a4mp);
+       rmobile_init_pm_domain(&sh7372_pd_d4);
+       rmobile_init_pm_domain(&sh7372_pd_a4r);
+       rmobile_init_pm_domain(&sh7372_pd_a3rv);
+       rmobile_init_pm_domain(&sh7372_pd_a3ri);
+       rmobile_init_pm_domain(&sh7372_pd_a4s);
+       rmobile_init_pm_domain(&sh7372_pd_a3sp);
+       rmobile_init_pm_domain(&sh7372_pd_a3sg);
+
+       rmobile_pm_add_subdomain(&sh7372_pd_a4lc, &sh7372_pd_a3rv);
+       rmobile_pm_add_subdomain(&sh7372_pd_a4r, &sh7372_pd_a4lc);
+
+       rmobile_pm_add_subdomain(&sh7372_pd_a4s, &sh7372_pd_a3sg);
+       rmobile_pm_add_subdomain(&sh7372_pd_a4s, &sh7372_pd_a3sp);
+
        platform_add_devices(sh7372_early_devices,
                            ARRAY_SIZE(sh7372_early_devices));
 
@@ -1047,6 +1063,31 @@ void __init sh7372_add_standard_devices(void)
        sh7372_add_device_to_domain(&sh7372_a4r, &jpu_device);
        sh7372_add_device_to_domain(&sh7372_a4r, &tmu00_device);
        sh7372_add_device_to_domain(&sh7372_a4r, &tmu01_device);
+
+       rmobile_add_device_to_domain(&sh7372_pd_a3rv, &vpu_device);
+       rmobile_add_device_to_domain(&sh7372_pd_a4mp, &spu0_device);
+       rmobile_add_device_to_domain(&sh7372_pd_a4mp, &spu1_device);
+       rmobile_add_device_to_domain(&sh7372_pd_a3sp, &scif0_device);
+       rmobile_add_device_to_domain(&sh7372_pd_a3sp, &scif1_device);
+       rmobile_add_device_to_domain(&sh7372_pd_a3sp, &scif2_device);
+       rmobile_add_device_to_domain(&sh7372_pd_a3sp, &scif3_device);
+       rmobile_add_device_to_domain(&sh7372_pd_a3sp, &scif4_device);
+       rmobile_add_device_to_domain(&sh7372_pd_a3sp, &scif5_device);
+       rmobile_add_device_to_domain(&sh7372_pd_a3sp, &scif6_device);
+       rmobile_add_device_to_domain(&sh7372_pd_a3sp, &iic1_device);
+       rmobile_add_device_to_domain(&sh7372_pd_a3sp, &dma0_device);
+       rmobile_add_device_to_domain(&sh7372_pd_a3sp, &dma1_device);
+       rmobile_add_device_to_domain(&sh7372_pd_a3sp, &dma2_device);
+       rmobile_add_device_to_domain(&sh7372_pd_a3sp, &usb_dma0_device);
+       rmobile_add_device_to_domain(&sh7372_pd_a3sp, &usb_dma1_device);
+       rmobile_add_device_to_domain(&sh7372_pd_a4r, &iic0_device);
+       rmobile_add_device_to_domain(&sh7372_pd_a4r, &veu0_device);
+       rmobile_add_device_to_domain(&sh7372_pd_a4r, &veu1_device);
+       rmobile_add_device_to_domain(&sh7372_pd_a4r, &veu2_device);
+       rmobile_add_device_to_domain(&sh7372_pd_a4r, &veu3_device);
+       rmobile_add_device_to_domain(&sh7372_pd_a4r, &jpu_device);
+       rmobile_add_device_to_domain(&sh7372_pd_a4r, &tmu00_device);
+       rmobile_add_device_to_domain(&sh7372_pd_a4r, &tmu01_device);
 }
 
 static void __init sh7372_earlytimer_init(void)