From: Frank Rowand <frank.rowand@xxxxxxxxxxx> Add polled debug driver support to serial_txx9.c for kgdb, and initialize the driver for the Toshiba RBTX4927. Signed-off-by: Frank Rowand <frank.rowand@xxxxxxxxxxx> --- arch/mips/tx4927/toshiba_rbtx4927/toshiba_rbtx4927_setup.c | 6 6 + 0 - 0 ! drivers/serial/serial_txx9.c | 90 90 + 0 - 0 ! 2 files changed, 96 insertions(+) Index: linux-2.6.24-rc7/drivers/serial/serial_txx9.c =================================================================== --- linux-2.6.24-rc7.orig/drivers/serial/serial_txx9.c +++ linux-2.6.24-rc7/drivers/serial/serial_txx9.c @@ -1237,6 +1237,96 @@ void prom_putchar(char ch) #endif +/******************************************************************************/ +/* BEG: KDBG Routines */ +/******************************************************************************/ + +#ifdef CONFIG_KGDB +int kgdb_initialized; + +void txx9_sio_kgdb_hook(unsigned int port, unsigned int baud_rate) +{ + static struct resource kgdb_resource; + int ret; + struct uart_txx9_port *up = &serial_txx9_ports[port]; + + /* prevent initialization by driver */ + kgdb_resource.name = "serial_txx9(debug)"; + kgdb_resource.start = (resource_size_t)up->port.membase; + kgdb_resource.end = (resource_size_t)up->port.membase + 36 - 1; + kgdb_resource.flags = IORESOURCE_MEM | IORESOURCE_BUSY; + + ret = request_resource(&iomem_resource, &kgdb_resource); + if (ret == -EBUSY) + printk(KERN_ERR + "txx9_sio_kgdb_hook(): request_resource failed\n"); + + return; +} +void +txx9_sio_kdbg_init(unsigned int port_number) +{ + if (port_number == 1) { + txx9_sio_kgdb_hook(port_number, 38400); + kgdb_initialized = 1; + } else { + printk(KERN_ERR + "txx9_sio_kdbg_init(): Bad Port Number [%u] != [1]\n", + port_number); + } + + return; +} + +u8 +txx9_sio_kdbg_rd(void) +{ + unsigned int status, ch; + struct uart_txx9_port *up = &serial_txx9_ports[1]; + + if (!kgdb_initialized) + return 0; + + while (1) { + status = sio_in(up, TXX9_SIDISR); + if (status & 0x1f) { + ch = sio_in(up, TXX9_SIRFIFO); + break; + } + } + + return ch; +} + +int +txx9_sio_kdbg_wr(u8 ch) +{ + unsigned int status; + struct uart_txx9_port *up = &serial_txx9_ports[1]; + + if (!kgdb_initialized) + return 0; + + while (1) { + status = sio_in(up, TXX9_SICISR); + if (status & TXX9_SICISR_TRDY) { + if (ch == '\n') + txx9_sio_kdbg_wr('\r'); + sio_out(up, TXX9_SITFIFO, (u32)ch); + + break; + } + } + + return 1; +} +#endif /* CONFIG_KGDB */ + + +/******************************************************************************/ +/* END: KDBG Routines */ +/******************************************************************************/ + static int __init serial_txx9_init(void) { int ret; Index: linux-2.6.24-rc7/arch/mips/tx4927/toshiba_rbtx4927/toshiba_rbtx4927_setup.c =================================================================== --- linux-2.6.24-rc7.orig/arch/mips/tx4927/toshiba_rbtx4927/toshiba_rbtx4927_setup.c +++ linux-2.6.24-rc7/arch/mips/tx4927/toshiba_rbtx4927/toshiba_rbtx4927_setup.c @@ -919,6 +919,12 @@ void __init toshiba_rbtx4927_setup(void) early_printk_serial_txx9_console_setup(); } #endif +#ifdef CONFIG_KGDB + { + extern void txx9_sio_kdbg_init(unsigned int port_number); + txx9_sio_kdbg_init(1); + } +#endif #endif #endif