Commit 0c0146c2 authored by Linus Torvalds's avatar Linus Torvalds

Merge bk://bk.arm.linux.org.uk/linux-2.6-serial

into home.osdl.org:/home/torvalds/v2.5/linux
parents a94e02c7 5b751b85
...@@ -114,8 +114,8 @@ W: http://sourceforge.net/projects/gkernel/ ...@@ -114,8 +114,8 @@ W: http://sourceforge.net/projects/gkernel/
S: Maintained S: Maintained
8250/16?50 (AND CLONE UARTS) SERIAL DRIVER 8250/16?50 (AND CLONE UARTS) SERIAL DRIVER
P: Theodore Ts'o P: Russell King
M: tytso@mit.edu M: rmk+serial@arm.linux.org.uk
L: linux-serial@vger.kernel.org L: linux-serial@vger.kernel.org
W: http://serial.sourceforge.net W: http://serial.sourceforge.net
S: Maintained S: Maintained
......
...@@ -469,8 +469,14 @@ static void autoconfig_16550a(struct uart_8250_port *up) ...@@ -469,8 +469,14 @@ static void autoconfig_16550a(struct uart_8250_port *up)
*/ */
serial_outp(up, UART_LCR, UART_LCR_DLAB); serial_outp(up, UART_LCR, UART_LCR_DLAB);
if (serial_in(up, UART_EFR) == 0) { if (serial_in(up, UART_EFR) == 0) {
DEBUG_AUTOCONF("EFRv1 "); serial_outp(up, UART_EFR, 0xA8);
up->port.type = PORT_16650; if (serial_in(up, UART_EFR) != 0) {
DEBUG_AUTOCONF("EFRv1 ");
up->port.type = PORT_16650;
} else {
DEBUG_AUTOCONF("Motorola 8xxx DUART ");
}
serial_outp(up, UART_EFR, 0);
return; return;
} }
...@@ -490,7 +496,9 @@ static void autoconfig_16550a(struct uart_8250_port *up) ...@@ -490,7 +496,9 @@ static void autoconfig_16550a(struct uart_8250_port *up)
* Attempt to switch to bank 2, read the value of the LOOP bit * Attempt to switch to bank 2, read the value of the LOOP bit
* from EXCR1. Switch back to bank 0, change it in MCR. Then * from EXCR1. Switch back to bank 0, change it in MCR. Then
* switch back to bank 2, read it from EXCR1 again and check * switch back to bank 2, read it from EXCR1 again and check
* it's changed. If so, set baud_base in EXCR2 to 921600. * it's changed. If so, set baud_base in EXCR2 to 921600. -- dwmw2
* On PowerPC we don't want to change baud_base, as we have
* a number of different divisors. -- Tom Rini
*/ */
serial_outp(up, UART_LCR, 0); serial_outp(up, UART_LCR, 0);
status1 = serial_in(up, UART_MCR); status1 = serial_in(up, UART_MCR);
...@@ -506,12 +514,14 @@ static void autoconfig_16550a(struct uart_8250_port *up) ...@@ -506,12 +514,14 @@ static void autoconfig_16550a(struct uart_8250_port *up)
serial_outp(up, UART_MCR, status1); serial_outp(up, UART_MCR, status1);
if ((status2 ^ status1) & UART_MCR_LOOP) { if ((status2 ^ status1) & UART_MCR_LOOP) {
#ifndef CONFIG_PPC
serial_outp(up, UART_LCR, 0xE0); serial_outp(up, UART_LCR, 0xE0);
status1 = serial_in(up, 0x04); /* EXCR1 */ status1 = serial_in(up, 0x04); /* EXCR1 */
status1 &= ~0xB0; /* Disable LOCK, mask out PRESL[01] */ status1 &= ~0xB0; /* Disable LOCK, mask out PRESL[01] */
status1 |= 0x10; /* 1.625 divisor for baud_base --> 921600 */ status1 |= 0x10; /* 1.625 divisor for baud_base --> 921600 */
serial_outp(up, 0x04, status1); serial_outp(up, 0x04, status1);
serial_outp(up, UART_LCR, 0); serial_outp(up, UART_LCR, 0);
#endif
up->port.type = PORT_NS16550A; up->port.type = PORT_NS16550A;
up->port.uartclk = 921600*16; up->port.uartclk = 921600*16;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment