1*1da177e4SLinus Torvalds /* 2*1da177e4SLinus Torvalds * This file is subject to the terms and conditions of the GNU General Public 3*1da177e4SLinus Torvalds * License. See the file "COPYING" in the main directory of this archive 4*1da177e4SLinus Torvalds * for more details. 5*1da177e4SLinus Torvalds * 6*1da177e4SLinus Torvalds * Copyright (C) 2001, 2002 Ralf Baechle 7*1da177e4SLinus Torvalds */ 8*1da177e4SLinus Torvalds #include <linux/init.h> 9*1da177e4SLinus Torvalds #include <linux/console.h> 10*1da177e4SLinus Torvalds #include <linux/kdev_t.h> 11*1da177e4SLinus Torvalds #include <linux/major.h> 12*1da177e4SLinus Torvalds #include <linux/termios.h> 13*1da177e4SLinus Torvalds #include <linux/sched.h> 14*1da177e4SLinus Torvalds #include <linux/tty.h> 15*1da177e4SLinus Torvalds 16*1da177e4SLinus Torvalds #include <asm/page.h> 17*1da177e4SLinus Torvalds #include <asm/semaphore.h> 18*1da177e4SLinus Torvalds #include <asm/sn/addrs.h> 19*1da177e4SLinus Torvalds #include <asm/sn/sn0/hub.h> 20*1da177e4SLinus Torvalds #include <asm/sn/klconfig.h> 21*1da177e4SLinus Torvalds #include <asm/sn/ioc3.h> 22*1da177e4SLinus Torvalds #include <asm/sn/sn_private.h> 23*1da177e4SLinus Torvalds 24*1da177e4SLinus Torvalds #include <linux/serial.h> 25*1da177e4SLinus Torvalds #include <linux/serial_core.h> 26*1da177e4SLinus Torvalds 27*1da177e4SLinus Torvalds #define IOC3_CLK (22000000 / 3) 28*1da177e4SLinus Torvalds #define IOC3_FLAGS (0) 29*1da177e4SLinus Torvalds 30*1da177e4SLinus Torvalds static inline struct ioc3_uartregs *console_uart(void) 31*1da177e4SLinus Torvalds { 32*1da177e4SLinus Torvalds struct ioc3 *ioc3; 33*1da177e4SLinus Torvalds 34*1da177e4SLinus Torvalds ioc3 = (struct ioc3 *)KL_CONFIG_CH_CONS_INFO(get_nasid())->memory_base; 35*1da177e4SLinus Torvalds 36*1da177e4SLinus Torvalds return &ioc3->sregs.uarta; 37*1da177e4SLinus Torvalds } 38*1da177e4SLinus Torvalds 39*1da177e4SLinus Torvalds void prom_putchar(char c) 40*1da177e4SLinus Torvalds { 41*1da177e4SLinus Torvalds struct ioc3_uartregs *uart = console_uart(); 42*1da177e4SLinus Torvalds 43*1da177e4SLinus Torvalds while ((uart->iu_lsr & 0x20) == 0); 44*1da177e4SLinus Torvalds uart->iu_thr = c; 45*1da177e4SLinus Torvalds } 46*1da177e4SLinus Torvalds 47*1da177e4SLinus Torvalds char __init prom_getchar(void) 48*1da177e4SLinus Torvalds { 49*1da177e4SLinus Torvalds return 0; 50*1da177e4SLinus Torvalds } 51*1da177e4SLinus Torvalds 52*1da177e4SLinus Torvalds static void inline ioc3_console_probe(void) 53*1da177e4SLinus Torvalds { 54*1da177e4SLinus Torvalds struct uart_port up; 55*1da177e4SLinus Torvalds 56*1da177e4SLinus Torvalds /* 57*1da177e4SLinus Torvalds * Register to interrupt zero because we share the interrupt with 58*1da177e4SLinus Torvalds * the serial driver which we don't properly support yet. 59*1da177e4SLinus Torvalds */ 60*1da177e4SLinus Torvalds memset(&up, 0, sizeof(up)); 61*1da177e4SLinus Torvalds up.membase = (unsigned char *) console_uart(); 62*1da177e4SLinus Torvalds up.irq = 0; 63*1da177e4SLinus Torvalds up.uartclk = IOC3_CLK; 64*1da177e4SLinus Torvalds up.regshift = 0; 65*1da177e4SLinus Torvalds up.iotype = UPIO_MEM; 66*1da177e4SLinus Torvalds up.flags = IOC3_FLAGS; 67*1da177e4SLinus Torvalds up.line = 0; 68*1da177e4SLinus Torvalds 69*1da177e4SLinus Torvalds if (early_serial_setup(&up)) 70*1da177e4SLinus Torvalds printk(KERN_ERR "Early serial init of port 0 failed\n"); 71*1da177e4SLinus Torvalds } 72*1da177e4SLinus Torvalds 73*1da177e4SLinus Torvalds __init void ip27_setup_console(void) 74*1da177e4SLinus Torvalds { 75*1da177e4SLinus Torvalds ioc3_console_probe(); 76*1da177e4SLinus Torvalds } 77