diff options
author | Jiri Kosina <jkosina@suse.cz> | 2010-12-22 12:57:02 -0500 |
---|---|---|
committer | Jiri Kosina <jkosina@suse.cz> | 2010-12-22 12:57:02 -0500 |
commit | 4b7bd364700d9ac8372eff48832062b936d0793b (patch) | |
tree | 0dbf78c95456a0b02d07fcd473281f04a87e266d /arch/arm/mach-omap2/pm24xx.c | |
parent | c0d8768af260e2cbb4bf659ae6094a262c86b085 (diff) | |
parent | 90a8a73c06cc32b609a880d48449d7083327e11a (diff) |
Merge branch 'master' into for-next
Conflicts:
MAINTAINERS
arch/arm/mach-omap2/pm24xx.c
drivers/scsi/bfa/bfa_fcpim.c
Needed to update to apply fixes for which the old branch was too
outdated.
Diffstat (limited to 'arch/arm/mach-omap2/pm24xx.c')
-rw-r--r-- | arch/arm/mach-omap2/pm24xx.c | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/arch/arm/mach-omap2/pm24xx.c b/arch/arm/mach-omap2/pm24xx.c index aa9764eeb941..f3f3bfa230d7 100644 --- a/arch/arm/mach-omap2/pm24xx.c +++ b/arch/arm/mach-omap2/pm24xx.c | |||
@@ -30,6 +30,7 @@ | |||
30 | #include <linux/irq.h> | 30 | #include <linux/irq.h> |
31 | #include <linux/time.h> | 31 | #include <linux/time.h> |
32 | #include <linux/gpio.h> | 32 | #include <linux/gpio.h> |
33 | #include <linux/console.h> | ||
33 | 34 | ||
34 | #include <asm/mach/time.h> | 35 | #include <asm/mach/time.h> |
35 | #include <asm/mach/irq.h> | 36 | #include <asm/mach/irq.h> |
@@ -52,6 +53,19 @@ | |||
52 | #include <plat/powerdomain.h> | 53 | #include <plat/powerdomain.h> |
53 | #include <plat/clockdomain.h> | 54 | #include <plat/clockdomain.h> |
54 | 55 | ||
56 | #ifdef CONFIG_SUSPEND | ||
57 | static suspend_state_t suspend_state = PM_SUSPEND_ON; | ||
58 | static inline bool is_suspending(void) | ||
59 | { | ||
60 | return (suspend_state != PM_SUSPEND_ON); | ||
61 | } | ||
62 | #else | ||
63 | static inline bool is_suspending(void) | ||
64 | { | ||
65 | return false; | ||
66 | } | ||
67 | #endif | ||
68 | |||
55 | static void (*omap2_sram_idle)(void); | 69 | static void (*omap2_sram_idle)(void); |
56 | static void (*omap2_sram_suspend)(u32 dllctrl, void __iomem *sdrc_dlla_ctrl, | 70 | static void (*omap2_sram_suspend)(u32 dllctrl, void __iomem *sdrc_dlla_ctrl, |
57 | void __iomem *sdrc_power); | 71 | void __iomem *sdrc_power); |
@@ -118,6 +132,11 @@ static void omap2_enter_full_retention(void) | |||
118 | if (omap_irq_pending()) | 132 | if (omap_irq_pending()) |
119 | goto no_sleep; | 133 | goto no_sleep; |
120 | 134 | ||
135 | /* Block console output in case it is on one of the OMAP UARTs */ | ||
136 | if (!is_suspending()) | ||
137 | if (try_acquire_console_sem()) | ||
138 | goto no_sleep; | ||
139 | |||
121 | omap_uart_prepare_idle(0); | 140 | omap_uart_prepare_idle(0); |
122 | omap_uart_prepare_idle(1); | 141 | omap_uart_prepare_idle(1); |
123 | omap_uart_prepare_idle(2); | 142 | omap_uart_prepare_idle(2); |
@@ -131,6 +150,9 @@ static void omap2_enter_full_retention(void) | |||
131 | omap_uart_resume_idle(1); | 150 | omap_uart_resume_idle(1); |
132 | omap_uart_resume_idle(0); | 151 | omap_uart_resume_idle(0); |
133 | 152 | ||
153 | if (!is_suspending()) | ||
154 | release_console_sem(); | ||
155 | |||
134 | no_sleep: | 156 | no_sleep: |
135 | if (omap2_pm_debug) { | 157 | if (omap2_pm_debug) { |
136 | unsigned long long tmp; | 158 | unsigned long long tmp; |
@@ -277,6 +299,12 @@ out: | |||
277 | local_irq_enable(); | 299 | local_irq_enable(); |
278 | } | 300 | } |
279 | 301 | ||
302 | static int omap2_pm_begin(suspend_state_t state) | ||
303 | { | ||
304 | suspend_state = state; | ||
305 | return 0; | ||
306 | } | ||
307 | |||
280 | static int omap2_pm_prepare(void) | 308 | static int omap2_pm_prepare(void) |
281 | { | 309 | { |
282 | /* We cannot sleep in idle until we have resumed */ | 310 | /* We cannot sleep in idle until we have resumed */ |
@@ -326,10 +354,17 @@ static void omap2_pm_finish(void) | |||
326 | enable_hlt(); | 354 | enable_hlt(); |
327 | } | 355 | } |
328 | 356 | ||
357 | static void omap2_pm_end(void) | ||
358 | { | ||
359 | suspend_state = PM_SUSPEND_ON; | ||
360 | } | ||
361 | |||
329 | static const struct platform_suspend_ops omap_pm_ops = { | 362 | static const struct platform_suspend_ops omap_pm_ops = { |
363 | .begin = omap2_pm_begin, | ||
330 | .prepare = omap2_pm_prepare, | 364 | .prepare = omap2_pm_prepare, |
331 | .enter = omap2_pm_enter, | 365 | .enter = omap2_pm_enter, |
332 | .finish = omap2_pm_finish, | 366 | .finish = omap2_pm_finish, |
367 | .end = omap2_pm_end, | ||
333 | .valid = suspend_valid_only_mem, | 368 | .valid = suspend_valid_only_mem, |
334 | }; | 369 | }; |
335 | 370 | ||