pm.c revision a09e64fbc0094e3073dbb09c3b4bfe4ab669244b
1/*
2 * linux/arch/arm/mach-omap2/pm.c
3 *
4 * OMAP2 Power Management Routines
5 *
6 * Copyright (C) 2006 Nokia Corporation
7 * Tony Lindgren <tony@atomide.com>
8 *
9 * Copyright (C) 2005 Texas Instruments, Inc.
10 * Richard Woodruff <r-woodruff2@ti.com>
11 *
12 * Based on pm.c for omap1
13 *
14 * This program is free software; you can redistribute it and/or modify
15 * it under the terms of the GNU General Public License version 2 as
16 * published by the Free Software Foundation.
17 */
18
19#include <linux/suspend.h>
20#include <linux/sched.h>
21#include <linux/proc_fs.h>
22#include <linux/interrupt.h>
23#include <linux/sysfs.h>
24#include <linux/module.h>
25#include <linux/delay.h>
26#include <linux/clk.h>
27
28#include <asm/io.h>
29#include <asm/irq.h>
30#include <asm/atomic.h>
31#include <asm/mach/time.h>
32#include <asm/mach/irq.h>
33
34#include <mach/irqs.h>
35#include <mach/clock.h>
36#include <mach/sram.h>
37#include <mach/pm.h>
38
39static struct clk *vclk;
40static void (*omap2_sram_idle)(void);
41static void (*omap2_sram_suspend)(int dllctrl, int cpu_rev);
42static void (*saved_idle)(void);
43
44extern void __init pmdomain_init(void);
45extern void pmdomain_set_autoidle(void);
46
47static unsigned int omap24xx_sleep_save[OMAP24XX_SLEEP_SAVE_SIZE];
48
49void omap2_pm_idle(void)
50{
51	local_irq_disable();
52	local_fiq_disable();
53	if (need_resched()) {
54		local_fiq_enable();
55		local_irq_enable();
56		return;
57	}
58
59	omap2_sram_idle();
60	local_fiq_enable();
61	local_irq_enable();
62}
63
64static int omap2_pm_prepare(void)
65{
66	/* We cannot sleep in idle until we have resumed */
67	saved_idle = pm_idle;
68	pm_idle = NULL;
69	return 0;
70}
71
72static int omap2_pm_suspend(void)
73{
74	return 0;
75}
76
77static int omap2_pm_enter(suspend_state_t state)
78{
79	int ret = 0;
80
81	switch (state)
82	{
83	case PM_SUSPEND_STANDBY:
84	case PM_SUSPEND_MEM:
85		ret = omap2_pm_suspend();
86		break;
87	default:
88		ret = -EINVAL;
89	}
90
91	return ret;
92}
93
94static void omap2_pm_finish(void)
95{
96	pm_idle = saved_idle;
97}
98
99static struct platform_suspend_ops omap_pm_ops = {
100	.prepare	= omap2_pm_prepare,
101	.enter		= omap2_pm_enter,
102	.finish		= omap2_pm_finish,
103	.valid		= suspend_valid_only_mem,
104};
105
106int __init omap2_pm_init(void)
107{
108	return 0;
109}
110
111__initcall(omap2_pm_init);
112