| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117 | 
							- /*
 
-  * 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 <linux/pm.h>
 
- #include <linux/suspend.h>
 
- #include <linux/cpuidle.h>
 
- #include <linux/module.h>
 
- #include <linux/list.h>
 
- #include <linux/err.h>
 
- #include <linux/slab.h>
 
- #include <linux/pm_clock.h>
 
- #include <linux/platform_device.h>
 
- #include <linux/delay.h>
 
- #include <linux/irq.h>
 
- #include <linux/bitrev.h>
 
- #include <linux/console.h>
 
- #include <asm/cpuidle.h>
 
- #include <asm/io.h>
 
- #include <asm/tlbflush.h>
 
- #include <asm/suspend.h>
 
- #include <mach/common.h>
 
- #include <mach/sh7372.h>
 
- #include <mach/pm-rmobile.h>
 
- /* 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,
 
 
  |