]>
Commit | Line | Data |
---|---|---|
e85390dc WD |
1 | /* |
2 | * COM1 NS16550 support | |
a47a12be | 3 | * originally from linux source (arch/powerpc/boot/ns16550.c) |
6d0f6bcf | 4 | * modified to use CONFIG_SYS_ISA_MEM and new defines |
e85390dc WD |
5 | */ |
6 | ||
7 | #include <config.h> | |
e85390dc | 8 | #include <ns16550.h> |
a1b322a9 | 9 | #include <watchdog.h> |
167cdad1 GR |
10 | #include <linux/types.h> |
11 | #include <asm/io.h> | |
e85390dc | 12 | |
200779e3 DZ |
13 | #define UART_LCRVAL UART_LCR_8N1 /* 8 data, 1 stop, no parity */ |
14 | #define UART_MCRVAL (UART_MCR_DTR | \ | |
15 | UART_MCR_RTS) /* RTS/DTR */ | |
16 | #define UART_FCRVAL (UART_FCR_FIFO_EN | \ | |
17 | UART_FCR_RXSR | \ | |
18 | UART_FCR_TXSR) /* Clear & enable FIFOs */ | |
167cdad1 GR |
19 | #ifdef CONFIG_SYS_NS16550_PORT_MAPPED |
20 | #define serial_out(x,y) outb(x,(ulong)y) | |
21 | #define serial_in(y) inb((ulong)y) | |
79df1208 DA |
22 | #elif defined(CONFIG_SYS_NS16550_MEM32) && (CONFIG_SYS_NS16550_REG_SIZE > 0) |
23 | #define serial_out(x,y) out_be32(y,x) | |
24 | #define serial_in(y) in_be32(y) | |
25 | #elif defined(CONFIG_SYS_NS16550_MEM32) && (CONFIG_SYS_NS16550_REG_SIZE < 0) | |
26 | #define serial_out(x,y) out_le32(y,x) | |
27 | #define serial_in(y) in_le32(y) | |
167cdad1 GR |
28 | #else |
29 | #define serial_out(x,y) writeb(x,y) | |
30 | #define serial_in(y) readb(y) | |
31 | #endif | |
e85390dc | 32 | |
a160ea0b PW |
33 | #ifndef CONFIG_SYS_NS16550_IER |
34 | #define CONFIG_SYS_NS16550_IER 0x00 | |
35 | #endif /* CONFIG_SYS_NS16550_IER */ | |
36 | ||
e85390dc WD |
37 | void NS16550_init (NS16550_t com_port, int baud_divisor) |
38 | { | |
a160ea0b | 39 | serial_out(CONFIG_SYS_NS16550_IER, &com_port->ier); |
660888b7 | 40 | #if defined(CONFIG_OMAP) && !defined(CONFIG_OMAP3_ZOOM2) |
167cdad1 | 41 | serial_out(0x7, &com_port->mdr1); /* mode select reset TL16C750*/ |
945af8d7 | 42 | #endif |
167cdad1 GR |
43 | serial_out(UART_LCR_BKSE | UART_LCRVAL, (ulong)&com_port->lcr); |
44 | serial_out(0, &com_port->dll); | |
45 | serial_out(0, &com_port->dlm); | |
46 | serial_out(UART_LCRVAL, &com_port->lcr); | |
47 | serial_out(UART_MCRVAL, &com_port->mcr); | |
48 | serial_out(UART_FCRVAL, &com_port->fcr); | |
49 | serial_out(UART_LCR_BKSE | UART_LCRVAL, &com_port->lcr); | |
50 | serial_out(baud_divisor & 0xff, &com_port->dll); | |
51 | serial_out((baud_divisor >> 8) & 0xff, &com_port->dlm); | |
52 | serial_out(UART_LCRVAL, &com_port->lcr); | |
660888b7 | 53 | #if defined(CONFIG_OMAP) && !defined(CONFIG_OMAP3_ZOOM2) |
8ed96046 | 54 | #if defined(CONFIG_APTIX) |
167cdad1 | 55 | serial_out(3, &com_port->mdr1); /* /13 mode so Aptix 6MHz can hit 115200 */ |
8ed96046 | 56 | #else |
167cdad1 | 57 | serial_out(0, &com_port->mdr1); /* /16 is proper to hit 115200 with 48MHz */ |
8ed96046 | 58 | #endif |
b4746d8b | 59 | #endif /* CONFIG_OMAP */ |
e85390dc WD |
60 | } |
61 | ||
f5675aa5 | 62 | #ifndef CONFIG_NS16550_MIN_FUNCTIONS |
e85390dc WD |
63 | void NS16550_reinit (NS16550_t com_port, int baud_divisor) |
64 | { | |
a160ea0b | 65 | serial_out(CONFIG_SYS_NS16550_IER, &com_port->ier); |
167cdad1 GR |
66 | serial_out(UART_LCR_BKSE | UART_LCRVAL, &com_port->lcr); |
67 | serial_out(0, &com_port->dll); | |
68 | serial_out(0, &com_port->dlm); | |
69 | serial_out(UART_LCRVAL, &com_port->lcr); | |
70 | serial_out(UART_MCRVAL, &com_port->mcr); | |
71 | serial_out(UART_FCRVAL, &com_port->fcr); | |
72 | serial_out(UART_LCR_BKSE, &com_port->lcr); | |
73 | serial_out(baud_divisor & 0xff, &com_port->dll); | |
74 | serial_out((baud_divisor >> 8) & 0xff, &com_port->dlm); | |
75 | serial_out(UART_LCRVAL, &com_port->lcr); | |
e85390dc | 76 | } |
f5675aa5 | 77 | #endif /* CONFIG_NS16550_MIN_FUNCTIONS */ |
e85390dc WD |
78 | |
79 | void NS16550_putc (NS16550_t com_port, char c) | |
80 | { | |
167cdad1 GR |
81 | while ((serial_in(&com_port->lsr) & UART_LSR_THRE) == 0); |
82 | serial_out(c, &com_port->thr); | |
1a2d9b30 SR |
83 | |
84 | /* | |
85 | * Call watchdog_reset() upon newline. This is done here in putc | |
86 | * since the environment code uses a single puts() to print the complete | |
87 | * environment upon "printenv". So we can't put this watchdog call | |
88 | * in puts(). | |
89 | */ | |
90 | if (c == '\n') | |
91 | WATCHDOG_RESET(); | |
e85390dc WD |
92 | } |
93 | ||
f5675aa5 | 94 | #ifndef CONFIG_NS16550_MIN_FUNCTIONS |
e85390dc WD |
95 | char NS16550_getc (NS16550_t com_port) |
96 | { | |
167cdad1 | 97 | while ((serial_in(&com_port->lsr) & UART_LSR_DR) == 0) { |
232c150a WD |
98 | #ifdef CONFIG_USB_TTY |
99 | extern void usbtty_poll(void); | |
100 | usbtty_poll(); | |
101 | #endif | |
a1b322a9 | 102 | WATCHDOG_RESET(); |
232c150a | 103 | } |
167cdad1 | 104 | return serial_in(&com_port->rbr); |
e85390dc WD |
105 | } |
106 | ||
107 | int NS16550_tstc (NS16550_t com_port) | |
108 | { | |
167cdad1 | 109 | return ((serial_in(&com_port->lsr) & UART_LSR_DR) != 0); |
e85390dc WD |
110 | } |
111 | ||
f5675aa5 | 112 | #endif /* CONFIG_NS16550_MIN_FUNCTIONS */ |