openwrt-owl/target/linux/s3c24xx/patches-2.6.26/1242-silence-serial-console...

77 lines
2.7 KiB
Diff
Executable File

From 85ef1fb82db8188fd5a615e557bf5407113d163f Mon Sep 17 00:00:00 2001
From: Mike Westerhof <mwester@dls.net>
Date: Sun, 10 Aug 2008 09:13:20 +0100
Subject: [PATCH] silence-serial-console-gta01.patch
This patch ensures that no console data will go the UART while
the GSM mux is switched to the GSM. This is necessary despite
the code that disables the console due to the fact that the
console resumes before the neo1973_pm_gsm driver, and consoles
always resume in the "on" state.
Signed-off-by: Mike Westerhof <mwester@dls.net>
---
arch/arm/plat-s3c24xx/neo1973_pm_gsm.c | 3 +++
drivers/serial/s3c2410.c | 10 ++++++++++
2 files changed, 13 insertions(+), 0 deletions(-)
diff --git a/arch/arm/plat-s3c24xx/neo1973_pm_gsm.c b/arch/arm/plat-s3c24xx/neo1973_pm_gsm.c
index 901f8fb..8d5e41c 100644
--- a/arch/arm/plat-s3c24xx/neo1973_pm_gsm.c
+++ b/arch/arm/plat-s3c24xx/neo1973_pm_gsm.c
@@ -31,6 +31,7 @@
#include <asm/arch/regs-gpioj.h>
#endif
+extern void s3c24xx_serial_console_set_silence(int silence);
extern void s3c24xx_serial_register_resume_dependency(struct resume_dependency *
resume_dependency, int uart_index);
@@ -105,6 +106,7 @@ static ssize_t gsm_write(struct device *dev, struct device_attribute *attr,
"disconnecting serial console\n");
console_stop(gta01_gsm.con);
+ s3c24xx_serial_console_set_silence(1);
}
if (gta01_gsm.gpio_ngsm_en)
@@ -144,6 +146,7 @@ static ssize_t gsm_write(struct device *dev, struct device_attribute *attr,
s3c2410_gpio_setpin(gta01_gsm.gpio_ngsm_en, 1);
if (gta01_gsm.con) {
+ s3c24xx_serial_console_set_silence(0);
console_start(gta01_gsm.con);
dev_dbg(dev, "powered down GSM, thus enabling "
diff --git a/drivers/serial/s3c2410.c b/drivers/serial/s3c2410.c
index d0b55b1..8de1564 100644
--- a/drivers/serial/s3c2410.c
+++ b/drivers/serial/s3c2410.c
@@ -1791,6 +1791,13 @@ module_exit(s3c24xx_serial_modexit);
#ifdef CONFIG_SERIAL_S3C2410_CONSOLE
static struct uart_port *cons_uart;
+static int cons_silenced;
+
+void s3c24xx_serial_console_set_silence(int silenced)
+{
+ cons_silenced = silenced;
+}
+EXPORT_SYMBOL(s3c24xx_serial_console_set_silence);
static int
s3c24xx_serial_console_txrdy(struct uart_port *port, unsigned int ufcon)
@@ -1817,6 +1824,9 @@ s3c24xx_serial_console_putchar(struct uart_port *port, int ch)
unsigned int ufcon = rd_regl(cons_uart, S3C2410_UFCON);
unsigned int umcon = rd_regl(cons_uart, S3C2410_UMCON);
+ if (cons_silenced)
+ return;
+
/* If auto HW flow control enabled, temporarily turn it off */
if (umcon & S3C2410_UMCOM_AFC)
wr_regl(port, S3C2410_UMCON, (umcon & !S3C2410_UMCOM_AFC));
--
1.5.6.3