|  | /* | 
|  | * PROM console for Cobalt Raq2 | 
|  | * | 
|  | * This file is subject to the terms and conditions of the GNU General Public | 
|  | * License.  See the file "COPYING" in the main directory of this archive | 
|  | * for more details. | 
|  | * | 
|  | * Copyright (C) 1995, 1996, 1997 by Ralf Baechle | 
|  | * Copyright (C) 2001 by Liam Davies (ldavies@agile.tv) | 
|  | * | 
|  | */ | 
|  |  | 
|  | #include <linux/init.h> | 
|  | #include <linux/console.h> | 
|  | #include <linux/kdev_t.h> | 
|  | #include <linux/serial_reg.h> | 
|  |  | 
|  | #include <asm/delay.h> | 
|  | #include <asm/serial.h> | 
|  | #include <asm/io.h> | 
|  |  | 
|  | static unsigned long port = 0xc800000; | 
|  |  | 
|  | static __inline__ void ns16550_cons_put_char(char ch, unsigned long ioaddr) | 
|  | { | 
|  | char lsr; | 
|  |  | 
|  | do { | 
|  | lsr = inb(ioaddr + UART_LSR); | 
|  | } while ((lsr & (UART_LSR_TEMT | UART_LSR_THRE)) != (UART_LSR_TEMT | UART_LSR_THRE)); | 
|  | outb(ch, ioaddr + UART_TX); | 
|  | } | 
|  |  | 
|  | static __inline__ char ns16550_cons_get_char(unsigned long ioaddr) | 
|  | { | 
|  | while ((inb(ioaddr + UART_LSR) & UART_LSR_DR) == 0) | 
|  | udelay(1); | 
|  | return inb(ioaddr + UART_RX); | 
|  | } | 
|  |  | 
|  | void ns16550_console_write(struct console *co, const char *s, unsigned count) | 
|  | { | 
|  | char lsr, ier; | 
|  | unsigned i; | 
|  |  | 
|  | ier = inb(port + UART_IER); | 
|  | outb(0x00, port + UART_IER); | 
|  | for (i=0; i < count; i++, s++) { | 
|  |  | 
|  | if(*s == '\n') | 
|  | ns16550_cons_put_char('\r', port); | 
|  | ns16550_cons_put_char(*s, port); | 
|  | } | 
|  |  | 
|  | do { | 
|  | lsr = inb(port + UART_LSR); | 
|  | } while ((lsr & (UART_LSR_TEMT | UART_LSR_THRE)) != (UART_LSR_TEMT | UART_LSR_THRE)); | 
|  |  | 
|  | outb(ier, port + UART_IER); | 
|  | } | 
|  |  | 
|  | char getDebugChar(void) | 
|  | { | 
|  | return ns16550_cons_get_char(port); | 
|  | } | 
|  |  | 
|  | void putDebugChar(char kgdb_char) | 
|  | { | 
|  | ns16550_cons_put_char(kgdb_char, port); | 
|  | } | 
|  |  | 
|  | static struct console ns16550_console = { | 
|  | .name	= "prom", | 
|  | .setup	= NULL, | 
|  | .write	= ns16550_console_write, | 
|  | .flags	= CON_PRINTBUFFER, | 
|  | .index	= -1, | 
|  | }; | 
|  |  | 
|  | static int __init ns16550_setup_console(void) | 
|  | { | 
|  | register_console(&ns16550_console); | 
|  |  | 
|  | return 0; | 
|  | } | 
|  |  | 
|  | console_initcall(ns16550_setup_console); |