Commit a9735c81 authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'omap-fixes-for-linus' of...

Merge branch 'omap-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tmlind/linux-omap-2.6

* 'omap-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tmlind/linux-omap-2.6:
  OMAP2+: PM/serial: hold console semaphore while OMAP UARTs are disabled
  OMAP: UART: don't resume UARTs that are not enabled.
parents aa3fc525 0d8e2d0d
...@@ -30,6 +30,7 @@ ...@@ -30,6 +30,7 @@
#include <linux/irq.h> #include <linux/irq.h>
#include <linux/time.h> #include <linux/time.h>
#include <linux/gpio.h> #include <linux/gpio.h>
#include <linux/console.h>
#include <asm/mach/time.h> #include <asm/mach/time.h>
#include <asm/mach/irq.h> #include <asm/mach/irq.h>
...@@ -118,6 +119,10 @@ static void omap2_enter_full_retention(void) ...@@ -118,6 +119,10 @@ static void omap2_enter_full_retention(void)
if (omap_irq_pending()) if (omap_irq_pending())
goto no_sleep; goto no_sleep;
/* Block console output in case it is on one of the OMAP UARTs */
if (try_acquire_console_sem())
goto no_sleep;
omap_uart_prepare_idle(0); omap_uart_prepare_idle(0);
omap_uart_prepare_idle(1); omap_uart_prepare_idle(1);
omap_uart_prepare_idle(2); omap_uart_prepare_idle(2);
...@@ -131,6 +136,8 @@ static void omap2_enter_full_retention(void) ...@@ -131,6 +136,8 @@ static void omap2_enter_full_retention(void)
omap_uart_resume_idle(1); omap_uart_resume_idle(1);
omap_uart_resume_idle(0); omap_uart_resume_idle(0);
release_console_sem();
no_sleep: no_sleep:
if (omap2_pm_debug) { if (omap2_pm_debug) {
unsigned long long tmp; unsigned long long tmp;
......
...@@ -28,6 +28,7 @@ ...@@ -28,6 +28,7 @@
#include <linux/clk.h> #include <linux/clk.h>
#include <linux/delay.h> #include <linux/delay.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/console.h>
#include <plat/sram.h> #include <plat/sram.h>
#include <plat/clockdomain.h> #include <plat/clockdomain.h>
...@@ -385,6 +386,12 @@ void omap_sram_idle(void) ...@@ -385,6 +386,12 @@ void omap_sram_idle(void)
omap3_enable_io_chain(); omap3_enable_io_chain();
} }
/* Block console output in case it is on one of the OMAP UARTs */
if (per_next_state < PWRDM_POWER_ON ||
core_next_state < PWRDM_POWER_ON)
if (try_acquire_console_sem())
goto console_still_active;
/* PER */ /* PER */
if (per_next_state < PWRDM_POWER_ON) { if (per_next_state < PWRDM_POWER_ON) {
omap_uart_prepare_idle(2); omap_uart_prepare_idle(2);
...@@ -463,6 +470,9 @@ void omap_sram_idle(void) ...@@ -463,6 +470,9 @@ void omap_sram_idle(void)
omap_uart_resume_idle(3); omap_uart_resume_idle(3);
} }
release_console_sem();
console_still_active:
/* Disable IO-PAD and IO-CHAIN wakeup */ /* Disable IO-PAD and IO-CHAIN wakeup */
if (omap3_has_io_wakeup() && if (omap3_has_io_wakeup() &&
(per_next_state < PWRDM_POWER_ON || (per_next_state < PWRDM_POWER_ON ||
......
...@@ -27,6 +27,7 @@ ...@@ -27,6 +27,7 @@
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/serial_8250.h> #include <linux/serial_8250.h>
#include <linux/pm_runtime.h> #include <linux/pm_runtime.h>
#include <linux/console.h>
#ifdef CONFIG_SERIAL_OMAP #ifdef CONFIG_SERIAL_OMAP
#include <plat/omap-serial.h> #include <plat/omap-serial.h>
...@@ -406,7 +407,7 @@ void omap_uart_resume_idle(int num) ...@@ -406,7 +407,7 @@ void omap_uart_resume_idle(int num)
struct omap_uart_state *uart; struct omap_uart_state *uart;
list_for_each_entry(uart, &uart_list, node) { list_for_each_entry(uart, &uart_list, node) {
if (num == uart->num) { if (num == uart->num && uart->can_sleep) {
omap_uart_enable_clocks(uart); omap_uart_enable_clocks(uart);
/* Check for IO pad wakeup */ /* Check for IO pad wakeup */
...@@ -807,6 +808,8 @@ void __init omap_serial_init_port(int port) ...@@ -807,6 +808,8 @@ void __init omap_serial_init_port(int port)
oh->dev_attr = uart; oh->dev_attr = uart;
acquire_console_sem(); /* in case the earlycon is on the UART */
/* /*
* Because of early UART probing, UART did not get idled * Because of early UART probing, UART did not get idled
* on init. Now that omap_device is ready, ensure full idle * on init. Now that omap_device is ready, ensure full idle
...@@ -831,6 +834,8 @@ void __init omap_serial_init_port(int port) ...@@ -831,6 +834,8 @@ void __init omap_serial_init_port(int port)
omap_uart_block_sleep(uart); omap_uart_block_sleep(uart);
uart->timeout = DEFAULT_TIMEOUT; uart->timeout = DEFAULT_TIMEOUT;
release_console_sem();
if ((cpu_is_omap34xx() && uart->padconf) || if ((cpu_is_omap34xx() && uart->padconf) ||
(uart->wk_en && uart->wk_mask)) { (uart->wk_en && uart->wk_mask)) {
device_init_wakeup(&od->pdev.dev, true); device_init_wakeup(&od->pdev.dev, true);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment