Diff
Modified: trunk/drivers/serial/bfin_5xx.c (5296 => 5297)
--- trunk/drivers/serial/bfin_5xx.c 2008-09-16 01:33:57 UTC (rev 5296)
+++ trunk/drivers/serial/bfin_5xx.c 2008-09-16 11:16:41 UTC (rev 5297)
@@ -23,7 +23,8 @@
#include <linux/serial_core.h>
#include <stdarg.h>
-#ifdef CONFIG_KGDB_SERIAL_CONSOLE
+#if defined(CONFIG_KGDB_SERIAL_CONSOLE) || \
+ defined(CONFIG_KGDB_SERIAL_CONSOLE_MODULE)
#include <linux/kgdb.h>
#include <asm/irq_regs.h>
#endif
@@ -46,13 +47,15 @@
static struct bfin_serial_port bfin_serial_ports[BFIN_UART_NR_PORTS];
static int nr_active_ports = ARRAY_SIZE(bfin_serial_resource);
-#ifdef CONFIG_KGDB_SERIAL_CONSOLE
+#if defined(CONFIG_KGDB_SERIAL_CONSOLE) || \
+ defined(CONFIG_KGDB_SERIAL_CONSOLE_MODULE)
# ifndef CONFIG_SERIAL_BFIN_PIO
# error KGDB only support UART in PIO mode.
# endif
-static int gdb_break_enabled;
+static int kgdboc_port_line;
+static int kgdboc_break_enabled;
#endif
/*
* Setup for console. Argument comes from the menuconfig
@@ -161,8 +164,10 @@
ch = UART_GET_CHAR(uart);
uart->port.icount.rx++;
-#ifdef CONFIG_KGDB_SERIAL_CONSOLE
- if (kgdb_connected && is_kgdb_tty_line(uart->port.line)) {
+#if defined(CONFIG_KGDB_SERIAL_CONSOLE) || \
+ defined(CONFIG_KGDB_SERIAL_CONSOLE_MODULE)
+ if (kgdb_connected && kgdboc_break_enabled &&
+ kgdboc_port_line == uart->port.line) {
if (ch == 0x3) {/* Ctrl + C */
kgdb_breakpoint();
return;
@@ -593,9 +598,10 @@
uart->rx_dma_timer.expires = jiffies + DMA_RX_FLUSH_JIFFIES;
add_timer(&(uart->rx_dma_timer));
#else
-# ifdef CONFIG_KGDB_SERIAL_CONSOLE
- if (is_kgdb_tty_line(uart->port.line) && gdb_break_enabled == 1)
- gdb_break_enabled = 0;
+#if defined(CONFIG_KGDB_SERIAL_CONSOLE) || \
+ defined(CONFIG_KGDB_SERIAL_CONSOLE_MODULE)
+ if (kgdboc_port_line == uart->port.line && kgdboc_break_enabled)
+ kgdboc_break_enabled = 0;
else {
# endif
if (request_irq(uart->port.irq, bfin_serial_rx_int, IRQF_DISABLED,
@@ -647,7 +653,8 @@
}
}
# endif
-# ifdef CONFIG_KGDB_SERIAL_CONSOLE
+#if defined(CONFIG_KGDB_SERIAL_CONSOLE) || \
+ defined(CONFIG_KGDB_SERIAL_CONSOLE_MODULE)
}
# endif
#endif
@@ -863,8 +870,8 @@
SSYNC();
}
-#ifdef CONFIG_KGDB_SERIAL_CONSOLE
-void bfin_serial_poll_put_char(struct uart_port *port, unsigned char chr)
+#ifdef CONFIG_CONSOLE_POLL
+static void bfin_serial_poll_put_char(struct uart_port *port, unsigned char chr)
{
struct bfin_serial_port *uart = (struct bfin_serial_port *)port;
@@ -875,7 +882,7 @@
UART_PUT_CHAR(uart, (unsigned char)chr);
}
-int bfin_serial_poll_get_char(struct uart_port *port)
+static int bfin_serial_poll_get_char(struct uart_port *port)
{
struct bfin_serial_port *uart = (struct bfin_serial_port *)port;
unsigned char chr;
@@ -888,23 +895,24 @@
return chr;
}
+#endif
-void kgdboc_uart_port_shutdown(int line)
+#if defined(CONFIG_KGDB_SERIAL_CONSOLE) || \
+ defined(CONFIG_KGDB_SERIAL_CONSOLE_MODULE)
+static void bfin_kgdboc_port_shutdown(struct uart_port *port)
{
- struct bfin_serial_port *uart = &bfin_serial_ports[line];
-
- if (gdb_break_enabled == 1) {
- bfin_serial_shutdown(&uart->port);
- gdb_break_enabled = 0;
+ if (kgdboc_break_enabled) {
+ bfin_serial_shutdown(port);
+ kgdboc_break_enabled = 0;
}
}
-void kgdboc_uart_port_startup(int line)
+static int bfin_kgdboc_port_startup(struct uart_port *port)
{
- struct bfin_serial_port *uart = &bfin_serial_ports[line];
+ bfin_serial_startup(port);
+ kgdboc_break_enabled = 1;
- bfin_serial_startup(&uart->port);
- gdb_break_enabled = 1;
+ return 0;
}
#endif
@@ -926,6 +934,11 @@
.request_port = bfin_serial_request_port,
.config_port = bfin_serial_config_port,
.verify_port = bfin_serial_verify_port,
+#if defined(CONFIG_KGDB_SERIAL_CONSOLE) || \
+ defined(CONFIG_KGDB_SERIAL_CONSOLE_MODULE)
+ .kgdboc_port_startup = bfin_kgdboc_port_startup,
+ .kgdboc_port_shutdown = bfin_kgdboc_port_shutdown,
+#endif
#ifdef CONFIG_CONSOLE_POLL
.poll_put_char = bfin_serial_poll_put_char,
.poll_get_char = bfin_serial_poll_get_char,
Modified: trunk/drivers/serial/kgdboc.c (5296 => 5297)
--- trunk/drivers/serial/kgdboc.c 2008-09-16 01:33:57 UTC (rev 5296)
+++ trunk/drivers/serial/kgdboc.c 2008-09-16 11:16:41 UTC (rev 5297)
@@ -32,24 +32,6 @@
static struct tty_driver *kgdb_tty_driver;
static int kgdb_tty_line;
-/* Allow UART driver to check if current tty device is used by kgdb.*/
-int is_kgdb_tty_line(int tty_line)
-{
- return tty_line == kgdb_tty_line;
-}
-EXPORT_SYMBOL_GPL(is_kgdb_tty_line);
-
-/* UART driver may decide whether to support gdb break signal Ctrl+C
- by request and handle UART RX interrupt. */
-void __weak kgdboc_uart_port_startup(int line)
-{
-}
-
-/* Free UART RX interrupt */
-void __weak kgdboc_uart_port_shutdown(int line)
-{
-}
-
static int kgdboc_option_setup(char *opt)
{
if (strlen(opt) > MAX_CONFIG_LEN) {
@@ -88,7 +70,8 @@
configured = 1;
- kgdboc_uart_port_startup(kgdb_tty_line);
+ kgdb_tty_driver->ops->kgdboc_port_startup(kgdb_tty_driver,
+ kgdb_tty_line);
return 0;
@@ -111,7 +94,8 @@
static void cleanup_kgdboc(void)
{
if (configured == 1) {
- kgdboc_uart_port_shutdown(kgdb_tty_line);
+ kgdb_tty_driver->ops->kgdboc_port_shutdown(kgdb_tty_driver,
+ kgdb_tty_line);
kgdb_unregister_io_module(&kgdboc_io_ops);
}
}
Modified: trunk/drivers/serial/serial_core.c (5296 => 5297)
--- trunk/drivers/serial/serial_core.c 2008-09-16 01:33:57 UTC (rev 5296)
+++ trunk/drivers/serial/serial_core.c 2008-09-16 11:16:41 UTC (rev 5297)
@@ -2245,6 +2245,39 @@
}
}
+#if defined(CONFIG_KGDB_SERIAL_CONSOLE) || \
+ defined(CONFIG_KGDB_SERIAL_CONSOLE_MODULE)
+static int uart_kgdboc_port_startup(struct tty_driver *driver, int line)
+{
+ struct uart_driver *drv = driver->driver_state;
+ struct uart_state *state = drv->state + line;
+ struct uart_port *port;
+
+ if (!state || !state->port)
+ return -1;
+
+ port = state->port;
+ if (port->ops->kgdboc_port_startup)
+ return port->ops->kgdboc_port_startup(port);
+ else
+ return -1;
+}
+
+static void uart_kgdboc_port_shutdown(struct tty_driver *driver, int line)
+{
+ struct uart_driver *drv = driver->driver_state;
+ struct uart_state *state = drv->state + line;
+ struct uart_port *port;
+
+ if (!state || !state->port)
+ return;
+
+ port = state->port;
+ if (port->ops->kgdboc_port_shutdown)
+ port->ops->kgdboc_port_shutdown(port);
+}
+#endif
+
#ifdef CONFIG_CONSOLE_POLL
static int uart_poll_init(struct tty_driver *driver, int line, char *options)
@@ -2324,6 +2357,11 @@
#endif
.tiocmget = uart_tiocmget,
.tiocmset = uart_tiocmset,
+#if defined(CONFIG_KGDB_SERIAL_CONSOLE) || \
+ defined(CONFIG_KGDB_SERIAL_CONSOLE_MODULE)
+ .kgdboc_port_startup = uart_kgdboc_port_startup,
+ .kgdboc_port_shutdown = uart_kgdboc_port_shutdown,
+#endif
#ifdef CONFIG_CONSOLE_POLL
.poll_init = uart_poll_init,
.poll_get_char = uart_poll_get_char,
Modified: trunk/include/linux/serial_core.h (5296 => 5297)
--- trunk/include/linux/serial_core.h 2008-09-16 01:33:57 UTC (rev 5296)
+++ trunk/include/linux/serial_core.h 2008-09-16 11:16:41 UTC (rev 5297)
@@ -216,6 +216,15 @@
void (*config_port)(struct uart_port *, int);
int (*verify_port)(struct uart_port *, struct serial_struct *);
int (*ioctl)(struct uart_port *, unsigned int, unsigned long);
+#if defined(CONFIG_KGDB_SERIAL_CONSOLE) || \
+ defined(CONFIG_KGDB_SERIAL_CONSOLE_MODULE)
+ /*
+ * Start up serial port earlier in kgdboc to support gdb break
+ * signal Ctrl+C.
+ */
+ int (*kgdboc_port_startup)(struct uart_port *);
+ void (*kgdboc_port_shutdown)(struct uart_port *);
+#endif
#ifdef CONFIG_CONSOLE_POLL
void (*poll_put_char)(struct uart_port *, unsigned char);
int (*poll_get_char)(struct uart_port *);
Modified: trunk/include/linux/tty_driver.h (5296 => 5297)
--- trunk/include/linux/tty_driver.h 2008-09-16 01:33:57 UTC (rev 5296)
+++ trunk/include/linux/tty_driver.h 2008-09-16 11:16:41 UTC (rev 5297)
@@ -202,6 +202,11 @@
int (*tiocmget)(struct tty_struct *tty, struct file *file);
int (*tiocmset)(struct tty_struct *tty, struct file *file,
unsigned int set, unsigned int clear);
+#if defined(CONFIG_KGDB_SERIAL_CONSOLE) || \
+ defined(CONFIG_KGDB_SERIAL_CONSOLE_MODULE)
+ int (*kgdboc_port_startup)(struct tty_driver *driver, int line);
+ int (*kgdboc_port_shutdown)(struct tty_driver *driver, int line);
+#endif
#ifdef CONFIG_CONSOLE_POLL
int (*poll_init)(struct tty_driver *driver, int line, char *options);
int (*poll_get_char)(struct tty_driver *driver, int line);