1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25#include <linux/init.h>
26#include <linux/io.h>
27#include <linux/suspend.h>
28#include <linux/errno.h>
29#include <linux/time.h>
30
31#include <mach/hardware.h>
32#include <asm/memory.h>
33#include <asm/suspend.h>
34#include <asm/mach/time.h>
35
36extern int sa1100_finish_suspend(unsigned long);
37
38#define SAVE(x) sleep_save[SLEEP_SAVE_##x] = x
39#define RESTORE(x) x = sleep_save[SLEEP_SAVE_##x]
40
41
42
43
44
45
46enum { SLEEP_SAVE_GPDR, SLEEP_SAVE_GAFR,
47 SLEEP_SAVE_PPDR, SLEEP_SAVE_PPSR, SLEEP_SAVE_PPAR, SLEEP_SAVE_PSDR,
48
49 SLEEP_SAVE_Ser1SDCR0,
50
51 SLEEP_SAVE_COUNT
52};
53
54
55static int sa11x0_pm_enter(suspend_state_t state)
56{
57 unsigned long gpio, sleep_save[SLEEP_SAVE_COUNT];
58
59 gpio = GPLR;
60
61
62 SAVE(GPDR);
63 SAVE(GAFR);
64
65 SAVE(PPDR);
66 SAVE(PPSR);
67 SAVE(PPAR);
68 SAVE(PSDR);
69
70 SAVE(Ser1SDCR0);
71
72
73 RCSR = RCSR_HWR | RCSR_SWR | RCSR_WDR | RCSR_SMR;
74
75
76 PSPR = __pa_symbol(cpu_resume);
77
78
79 cpu_suspend(0, sa1100_finish_suspend);
80
81
82
83
84 RCSR = RCSR_SMR;
85 PSPR = 0;
86
87
88
89
90
91 ICLR = 0;
92 ICCR = 1;
93 ICMR = 0;
94
95
96 RESTORE(GPDR);
97 RESTORE(GAFR);
98
99 RESTORE(PPDR);
100 RESTORE(PPSR);
101 RESTORE(PPAR);
102 RESTORE(PSDR);
103
104 RESTORE(Ser1SDCR0);
105
106 GPSR = gpio;
107 GPCR = ~gpio;
108
109
110
111
112 PSSR = PSSR_PH;
113
114 return 0;
115}
116
117static const struct platform_suspend_ops sa11x0_pm_ops = {
118 .enter = sa11x0_pm_enter,
119 .valid = suspend_valid_only_mem,
120};
121
122int __init sa11x0_pm_init(void)
123{
124 suspend_set_ops(&sa11x0_pm_ops);
125 return 0;
126}
127