Commit 857dde2e authored by David Woodhouse's avatar David Woodhouse Committed by Russell King

When we detect that a 16550 was in fact part of a NatSemi SuperIO chip

with high-speed mode enabled, we switch it to high-speed mode so that
baud_base becomes 921600. However, we also need to multiply the baud
divisor by 8 at the same time, in case it's already in use as a console.

Signed-off-by: David Woodhouse
Acked-by: Tom Rini
Signed-off-by: default avatarRussell King <rmk+kernel@arm.linux.org.uk>
parent 9636273d
...@@ -682,8 +682,6 @@ static void autoconfig_16550a(struct uart_8250_port *up) ...@@ -682,8 +682,6 @@ static void autoconfig_16550a(struct uart_8250_port *up)
* 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. -- dwmw2 * 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);
...@@ -699,16 +697,25 @@ static void autoconfig_16550a(struct uart_8250_port *up) ...@@ -699,16 +697,25 @@ 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 unsigned short quot;
serial_outp(up, UART_LCR, 0xE0); serial_outp(up, UART_LCR, 0xE0);
quot = serial_inp(up, UART_DLM) << 8;
quot += serial_inp(up, UART_DLL);
quot <<= 3;
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_DLL, quot & 0xff);
serial_outp(up, UART_DLM, quot >> 8);
serial_outp(up, UART_LCR, 0); serial_outp(up, UART_LCR, 0);
up->port.uartclk = 921600*16;
#endif
up->port.uartclk = 921600*16;
up->port.type = PORT_NS16550A; up->port.type = PORT_NS16550A;
up->capabilities |= UART_NATSEMI; up->capabilities |= UART_NATSEMI;
return; return;
......
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