0001
0002
0003
0004
0005
0006
0007 #include <linux/io.h>
0008 #include <linux/serial_core.h>
0009 #include <linux/serial_reg.h>
0010 #include <asm/setup.h>
0011
0012 static void __iomem *serial8250_base;
0013 static unsigned int serial8250_reg_shift;
0014 static unsigned int serial8250_tx_timeout;
0015
0016 void setup_8250_early_printk_port(unsigned long base, unsigned int reg_shift,
0017 unsigned int timeout)
0018 {
0019 serial8250_base = (void __iomem *)base;
0020 serial8250_reg_shift = reg_shift;
0021 serial8250_tx_timeout = timeout;
0022 }
0023
0024 static inline u8 serial_in(int offset)
0025 {
0026 return readb(serial8250_base + (offset << serial8250_reg_shift));
0027 }
0028
0029 static inline void serial_out(int offset, char value)
0030 {
0031 writeb(value, serial8250_base + (offset << serial8250_reg_shift));
0032 }
0033
0034 void prom_putchar(char c)
0035 {
0036 unsigned int timeout;
0037 int status, bits;
0038
0039 if (!serial8250_base)
0040 return;
0041
0042 timeout = serial8250_tx_timeout;
0043 bits = UART_LSR_TEMT | UART_LSR_THRE;
0044
0045 do {
0046 status = serial_in(UART_LSR);
0047
0048 if (--timeout == 0)
0049 break;
0050 } while ((status & bits) != bits);
0051
0052 if (timeout)
0053 serial_out(UART_TX, c);
0054 }