diff options
Diffstat (limited to 'arch/arm/mach-pxa/pxa25x.c')
-rw-r--r-- | arch/arm/mach-pxa/pxa25x.c | 43 |
1 files changed, 19 insertions, 24 deletions
diff --git a/arch/arm/mach-pxa/pxa25x.c b/arch/arm/mach-pxa/pxa25x.c index ddd05bf78e02..599e53fcc2c5 100644 --- a/arch/arm/mach-pxa/pxa25x.c +++ b/arch/arm/mach-pxa/pxa25x.c | |||
@@ -21,6 +21,7 @@ | |||
21 | #include <linux/init.h> | 21 | #include <linux/init.h> |
22 | #include <linux/platform_device.h> | 22 | #include <linux/platform_device.h> |
23 | #include <linux/suspend.h> | 23 | #include <linux/suspend.h> |
24 | #include <linux/sysdev.h> | ||
24 | 25 | ||
25 | #include <asm/hardware.h> | 26 | #include <asm/hardware.h> |
26 | #include <asm/arch/irqs.h> | 27 | #include <asm/arch/irqs.h> |
@@ -141,11 +142,6 @@ static struct clk pxa25x_clks[] = { | |||
141 | #define SAVE(x) sleep_save[SLEEP_SAVE_##x] = x | 142 | #define SAVE(x) sleep_save[SLEEP_SAVE_##x] = x |
142 | #define RESTORE(x) x = sleep_save[SLEEP_SAVE_##x] | 143 | #define RESTORE(x) x = sleep_save[SLEEP_SAVE_##x] |
143 | 144 | ||
144 | #define RESTORE_GPLEVEL(n) do { \ | ||
145 | GPSR##n = sleep_save[SLEEP_SAVE_GPLR##n]; \ | ||
146 | GPCR##n = ~sleep_save[SLEEP_SAVE_GPLR##n]; \ | ||
147 | } while (0) | ||
148 | |||
149 | /* | 145 | /* |
150 | * List of global PXA peripheral registers to preserve. | 146 | * List of global PXA peripheral registers to preserve. |
151 | * More ones like CP and general purpose register values are preserved | 147 | * More ones like CP and general purpose register values are preserved |
@@ -153,10 +149,6 @@ static struct clk pxa25x_clks[] = { | |||
153 | */ | 149 | */ |
154 | enum { SLEEP_SAVE_START = 0, | 150 | enum { SLEEP_SAVE_START = 0, |
155 | 151 | ||
156 | SLEEP_SAVE_GPLR0, SLEEP_SAVE_GPLR1, SLEEP_SAVE_GPLR2, | ||
157 | SLEEP_SAVE_GPDR0, SLEEP_SAVE_GPDR1, SLEEP_SAVE_GPDR2, | ||
158 | SLEEP_SAVE_GRER0, SLEEP_SAVE_GRER1, SLEEP_SAVE_GRER2, | ||
159 | SLEEP_SAVE_GFER0, SLEEP_SAVE_GFER1, SLEEP_SAVE_GFER2, | ||
160 | SLEEP_SAVE_PGSR0, SLEEP_SAVE_PGSR1, SLEEP_SAVE_PGSR2, | 152 | SLEEP_SAVE_PGSR0, SLEEP_SAVE_PGSR1, SLEEP_SAVE_PGSR2, |
161 | 153 | ||
162 | SLEEP_SAVE_GAFR0_L, SLEEP_SAVE_GAFR0_U, | 154 | SLEEP_SAVE_GAFR0_L, SLEEP_SAVE_GAFR0_U, |
@@ -165,7 +157,6 @@ enum { SLEEP_SAVE_START = 0, | |||
165 | 157 | ||
166 | SLEEP_SAVE_PSTR, | 158 | SLEEP_SAVE_PSTR, |
167 | 159 | ||
168 | SLEEP_SAVE_ICMR, | ||
169 | SLEEP_SAVE_CKEN, | 160 | SLEEP_SAVE_CKEN, |
170 | 161 | ||
171 | SLEEP_SAVE_SIZE | 162 | SLEEP_SAVE_SIZE |
@@ -174,17 +165,12 @@ enum { SLEEP_SAVE_START = 0, | |||
174 | 165 | ||
175 | static void pxa25x_cpu_pm_save(unsigned long *sleep_save) | 166 | static void pxa25x_cpu_pm_save(unsigned long *sleep_save) |
176 | { | 167 | { |
177 | SAVE(GPLR0); SAVE(GPLR1); SAVE(GPLR2); | ||
178 | SAVE(GPDR0); SAVE(GPDR1); SAVE(GPDR2); | ||
179 | SAVE(GRER0); SAVE(GRER1); SAVE(GRER2); | ||
180 | SAVE(GFER0); SAVE(GFER1); SAVE(GFER2); | ||
181 | SAVE(PGSR0); SAVE(PGSR1); SAVE(PGSR2); | 168 | SAVE(PGSR0); SAVE(PGSR1); SAVE(PGSR2); |
182 | 169 | ||
183 | SAVE(GAFR0_L); SAVE(GAFR0_U); | 170 | SAVE(GAFR0_L); SAVE(GAFR0_U); |
184 | SAVE(GAFR1_L); SAVE(GAFR1_U); | 171 | SAVE(GAFR1_L); SAVE(GAFR1_U); |
185 | SAVE(GAFR2_L); SAVE(GAFR2_U); | 172 | SAVE(GAFR2_L); SAVE(GAFR2_U); |
186 | 173 | ||
187 | SAVE(ICMR); ICMR = 0; | ||
188 | SAVE(CKEN); | 174 | SAVE(CKEN); |
189 | SAVE(PSTR); | 175 | SAVE(PSTR); |
190 | 176 | ||
@@ -198,22 +184,14 @@ static void pxa25x_cpu_pm_restore(unsigned long *sleep_save) | |||
198 | PSPR = 0; | 184 | PSPR = 0; |
199 | 185 | ||
200 | /* restore registers */ | 186 | /* restore registers */ |
201 | RESTORE_GPLEVEL(0); RESTORE_GPLEVEL(1); RESTORE_GPLEVEL(2); | ||
202 | RESTORE(GPDR0); RESTORE(GPDR1); RESTORE(GPDR2); | ||
203 | RESTORE(GAFR0_L); RESTORE(GAFR0_U); | 187 | RESTORE(GAFR0_L); RESTORE(GAFR0_U); |
204 | RESTORE(GAFR1_L); RESTORE(GAFR1_U); | 188 | RESTORE(GAFR1_L); RESTORE(GAFR1_U); |
205 | RESTORE(GAFR2_L); RESTORE(GAFR2_U); | 189 | RESTORE(GAFR2_L); RESTORE(GAFR2_U); |
206 | RESTORE(GRER0); RESTORE(GRER1); RESTORE(GRER2); | ||
207 | RESTORE(GFER0); RESTORE(GFER1); RESTORE(GFER2); | ||
208 | RESTORE(PGSR0); RESTORE(PGSR1); RESTORE(PGSR2); | 190 | RESTORE(PGSR0); RESTORE(PGSR1); RESTORE(PGSR2); |
209 | 191 | ||
210 | PSSR = PSSR_RDH | PSSR_PH; | 192 | PSSR = PSSR_RDH | PSSR_PH; |
211 | 193 | ||
212 | RESTORE(CKEN); | 194 | RESTORE(CKEN); |
213 | |||
214 | ICLR = 0; | ||
215 | ICCR = 1; | ||
216 | RESTORE(ICMR); | ||
217 | RESTORE(PSTR); | 195 | RESTORE(PSTR); |
218 | } | 196 | } |
219 | 197 | ||
@@ -304,9 +282,17 @@ static struct platform_device *pxa25x_devices[] __initdata = { | |||
304 | &pxa25x_device_assp, | 282 | &pxa25x_device_assp, |
305 | }; | 283 | }; |
306 | 284 | ||
285 | static struct sys_device pxa25x_sysdev[] = { | ||
286 | { | ||
287 | .cls = &pxa_irq_sysclass, | ||
288 | }, { | ||
289 | .cls = &pxa_gpio_sysclass, | ||
290 | }, | ||
291 | }; | ||
292 | |||
307 | static int __init pxa25x_init(void) | 293 | static int __init pxa25x_init(void) |
308 | { | 294 | { |
309 | int ret = 0; | 295 | int i, ret = 0; |
310 | 296 | ||
311 | /* Only add HWUART for PXA255/26x; PXA210/250/27x do not have it. */ | 297 | /* Only add HWUART for PXA255/26x; PXA210/250/27x do not have it. */ |
312 | if (cpu_is_pxa25x()) | 298 | if (cpu_is_pxa25x()) |
@@ -320,9 +306,18 @@ static int __init pxa25x_init(void) | |||
320 | 306 | ||
321 | pxa25x_init_pm(); | 307 | pxa25x_init_pm(); |
322 | 308 | ||
309 | for (i = 0; i < ARRAY_SIZE(pxa25x_sysdev); i++) { | ||
310 | ret = sysdev_register(&pxa25x_sysdev[i]); | ||
311 | if (ret) | ||
312 | pr_err("failed to register sysdev[%d]\n", i); | ||
313 | } | ||
314 | |||
323 | ret = platform_add_devices(pxa25x_devices, | 315 | ret = platform_add_devices(pxa25x_devices, |
324 | ARRAY_SIZE(pxa25x_devices)); | 316 | ARRAY_SIZE(pxa25x_devices)); |
317 | if (ret) | ||
318 | return ret; | ||
325 | } | 319 | } |
320 | |||
326 | /* Only add HWUART for PXA255/26x; PXA210/250/27x do not have it. */ | 321 | /* Only add HWUART for PXA255/26x; PXA210/250/27x do not have it. */ |
327 | if (cpu_is_pxa25x()) | 322 | if (cpu_is_pxa25x()) |
328 | ret = platform_device_register(&pxa_device_hwuart); | 323 | ret = platform_device_register(&pxa_device_hwuart); |