/* * sh7372 Power management support * * Copyright (C) 2011 Magnus Damm * * This file is subject to the terms and conditions of the GNU General Public * License. See the file "COPYING" in the main directory of this archive * for more details. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include /* DBG */ #define DBGREG1 IOMEM(0xe6100020) #define DBGREG9 IOMEM(0xe6100040) /* CPGA */ #define SYSTBCR IOMEM(0xe6150024) #define MSTPSR0 IOMEM(0xe6150030) #define MSTPSR1 IOMEM(0xe6150038) #define MSTPSR2 IOMEM(0xe6150040) #define MSTPSR3 IOMEM(0xe6150048) #define MSTPSR4 IOMEM(0xe615004c) #define PLLC01STPCR IOMEM(0xe61500c8) /* SYSC */ #define SBAR IOMEM(0xe6180020) #define WUPRMSK IOMEM(0xe6180028) #define WUPSMSK IOMEM(0xe618002c) #define WUPSMSK2 IOMEM(0xe6180048) #define WUPSFAC IOMEM(0xe6180098) #define IRQCR IOMEM(0xe618022c) #define IRQCR2 IOMEM(0xe6180238) #define IRQCR3 IOMEM(0xe6180244) #define IRQCR4 IOMEM(0xe6180248) #define PDNSEL IOMEM(0xe6180254) /* INTC */ #define ICR1A IOMEM(0xe6900000) #define ICR2A IOMEM(0xe6900004) #define ICR3A IOMEM(0xe6900008) #define ICR4A IOMEM(0xe690000c) #define INTMSK00A IOMEM(0xe6900040) #define INTMSK10A IOMEM(0xe6900044) #define INTMSK20A IOMEM(0xe6900048) #define INTMSK30A IOMEM(0xe690004c) /* MFIS */ /* FIXME: pointing where? */ #define SMFRAM 0xe6a70000 /* AP-System Core */ #define APARMBAREA IOMEM(0xe6f10020) #ifdef CONFIG_PM #define PM_DOMAIN_ON_OFF_LATENCY_NS 250000 static int sh7372_a4r_pd_suspend(void) { sh7372_intcs_suspend(); __raw_writel(0x300fffff, WUPRMSK); /* avoid wakeup */ return 0; } static bool a4s_suspend_ready; static int sh7372_a4s_pd_suspend(void) { /* * The A4S domain contains the CPU core and therefore it should * 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_a4s_pd_resume(void) { a4s_suspend_ready = false; } 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; } static struct rmobile_pm_domain sh7372_pm_domains[] = { { .genpd.name = "A4LC", .genpd.power_on_latency_ns = PM_DOMAIN_ON_OFF_LATENCY_NS,