Skip to content

Commit

Permalink
Merge branch 'omap-fixes-for-linus' of git://git.kernel.org/pub/scm/l…
Browse files Browse the repository at this point in the history
…inux/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.
  • Loading branch information
Linus Torvalds committed Nov 29, 2010
2 parents aa3fc52 + 0d8e2d0 commit a9735c8
Show file tree
Hide file tree
Showing 3 changed files with 23 additions and 1 deletion.
7 changes: 7 additions & 0 deletions arch/arm/mach-omap2/pm24xx.c
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
#include <linux/irq.h>
#include <linux/time.h>
#include <linux/gpio.h>
#include <linux/console.h>

#include <asm/mach/time.h>
#include <asm/mach/irq.h>
Expand Down Expand Up @@ -118,6 +119,10 @@ static void omap2_enter_full_retention(void)
if (omap_irq_pending())
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(1);
omap_uart_prepare_idle(2);
Expand All @@ -131,6 +136,8 @@ static void omap2_enter_full_retention(void)
omap_uart_resume_idle(1);
omap_uart_resume_idle(0);

release_console_sem();

no_sleep:
if (omap2_pm_debug) {
unsigned long long tmp;
Expand Down
10 changes: 10 additions & 0 deletions arch/arm/mach-omap2/pm34xx.c
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
#include <linux/clk.h>
#include <linux/delay.h>
#include <linux/slab.h>
#include <linux/console.h>

#include <plat/sram.h>
#include <plat/clockdomain.h>
Expand Down Expand Up @@ -385,6 +386,12 @@ void omap_sram_idle(void)
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 */
if (per_next_state < PWRDM_POWER_ON) {
omap_uart_prepare_idle(2);
Expand Down Expand Up @@ -463,6 +470,9 @@ void omap_sram_idle(void)
omap_uart_resume_idle(3);
}

release_console_sem();

console_still_active:
/* Disable IO-PAD and IO-CHAIN wakeup */
if (omap3_has_io_wakeup() &&
(per_next_state < PWRDM_POWER_ON ||
Expand Down
7 changes: 6 additions & 1 deletion arch/arm/mach-omap2/serial.c
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
#include <linux/slab.h>
#include <linux/serial_8250.h>
#include <linux/pm_runtime.h>
#include <linux/console.h>

#ifdef CONFIG_SERIAL_OMAP
#include <plat/omap-serial.h>
Expand Down Expand Up @@ -406,7 +407,7 @@ void omap_uart_resume_idle(int num)
struct omap_uart_state *uart;

list_for_each_entry(uart, &uart_list, node) {
if (num == uart->num) {
if (num == uart->num && uart->can_sleep) {
omap_uart_enable_clocks(uart);

/* Check for IO pad wakeup */
Expand Down Expand Up @@ -807,6 +808,8 @@ void __init omap_serial_init_port(int port)

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
* on init. Now that omap_device is ready, ensure full idle
Expand All @@ -831,6 +834,8 @@ void __init omap_serial_init_port(int port)
omap_uart_block_sleep(uart);
uart->timeout = DEFAULT_TIMEOUT;

release_console_sem();

if ((cpu_is_omap34xx() && uart->padconf) ||
(uart->wk_en && uart->wk_mask)) {
device_init_wakeup(&od->pdev.dev, true);
Expand Down

0 comments on commit a9735c8

Please sign in to comment.