Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a9735c81 authored by Linus Torvalds's avatar Linus Torvalds
Browse files

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
Loading
Loading
Loading
Loading
+7 −0
Original line number Original line Diff line number Diff line
@@ -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)
	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)
	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;
+10 −0
Original line number Original line Diff line number Diff line
@@ -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)
		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)
		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 ||
+6 −1
Original line number Original line Diff line number Diff line
@@ -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)
	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)


	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)
	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);