1 /* 2 * 8250/16550-type serial ports prom_putchar() 3 * 4 * Copyright (C) 2010 Yoichi Yuasa <yuasa@linux-mips.org> 5 * 6 * This program is free software; you can redistribute it and/or modify 7 * it under the terms of the GNU General Public License as published by 8 * the Free Software Foundation; either version 2 of the License, or 9 * (at your option) any later version. 10 * 11 * This program is distributed in the hope that it will be useful, 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 * GNU General Public License for more details. 15 * 16 * You should have received a copy of the GNU General Public License 17 * along with this program; if not, write to the Free Software 18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 19 */ 20 #include <linux/io.h> 21 #include <linux/serial_core.h> 22 #include <linux/serial_reg.h> 23 24 static void __iomem *serial8250_base; 25 static unsigned int serial8250_reg_shift; 26 static unsigned int serial8250_tx_timeout; 27 28 void setup_8250_early_printk_port(unsigned long base, unsigned int reg_shift, 29 unsigned int timeout) 30 { 31 serial8250_base = (void __iomem *)base; 32 serial8250_reg_shift = reg_shift; 33 serial8250_tx_timeout = timeout; 34 } 35 36 static inline u8 serial_in(int offset) 37 { 38 return readb(serial8250_base + (offset << serial8250_reg_shift)); 39 } 40 41 static inline void serial_out(int offset, char value) 42 { 43 writeb(value, serial8250_base + (offset << serial8250_reg_shift)); 44 } 45 46 void prom_putchar(char c) 47 { 48 unsigned int timeout; 49 int status, bits; 50 51 if (!serial8250_base) 52 return; 53 54 timeout = serial8250_tx_timeout; 55 bits = UART_LSR_TEMT | UART_LSR_THRE; 56 57 do { 58 status = serial_in(UART_LSR); 59 60 if (--timeout == 0) 61 break; 62 } while ((status & bits) != bits); 63 64 if (timeout) 65 serial_out(UART_TX, c); 66 } 67