diff options
Diffstat (limited to 'drivers/serial')
-rw-r--r-- | drivers/serial/8250.c | 17 |
1 files changed, 12 insertions, 5 deletions
diff --git a/drivers/serial/8250.c b/drivers/serial/8250.c index 3bbf0cc6e53f..30e8beb71430 100644 --- a/drivers/serial/8250.c +++ b/drivers/serial/8250.c | |||
@@ -682,8 +682,6 @@ static void autoconfig_16550a(struct uart_8250_port *up) | |||
682 | * from EXCR1. Switch back to bank 0, change it in MCR. Then | 682 | * from EXCR1. Switch back to bank 0, change it in MCR. Then |
683 | * switch back to bank 2, read it from EXCR1 again and check | 683 | * switch back to bank 2, read it from EXCR1 again and check |
684 | * it's changed. If so, set baud_base in EXCR2 to 921600. -- dwmw2 | 684 | * it's changed. If so, set baud_base in EXCR2 to 921600. -- dwmw2 |
685 | * On PowerPC we don't want to change baud_base, as we have | ||
686 | * a number of different divisors. -- Tom Rini | ||
687 | */ | 685 | */ |
688 | serial_outp(up, UART_LCR, 0); | 686 | serial_outp(up, UART_LCR, 0); |
689 | status1 = serial_in(up, UART_MCR); | 687 | status1 = serial_in(up, UART_MCR); |
@@ -699,16 +697,25 @@ static void autoconfig_16550a(struct uart_8250_port *up) | |||
699 | serial_outp(up, UART_MCR, status1); | 697 | serial_outp(up, UART_MCR, status1); |
700 | 698 | ||
701 | if ((status2 ^ status1) & UART_MCR_LOOP) { | 699 | if ((status2 ^ status1) & UART_MCR_LOOP) { |
702 | #ifndef CONFIG_PPC | 700 | unsigned short quot; |
701 | |||
703 | serial_outp(up, UART_LCR, 0xE0); | 702 | serial_outp(up, UART_LCR, 0xE0); |
703 | |||
704 | quot = serial_inp(up, UART_DLM) << 8; | ||
705 | quot += serial_inp(up, UART_DLL); | ||
706 | quot <<= 3; | ||
707 | |||
704 | status1 = serial_in(up, 0x04); /* EXCR1 */ | 708 | status1 = serial_in(up, 0x04); /* EXCR1 */ |
705 | status1 &= ~0xB0; /* Disable LOCK, mask out PRESL[01] */ | 709 | status1 &= ~0xB0; /* Disable LOCK, mask out PRESL[01] */ |
706 | status1 |= 0x10; /* 1.625 divisor for baud_base --> 921600 */ | 710 | status1 |= 0x10; /* 1.625 divisor for baud_base --> 921600 */ |
707 | serial_outp(up, 0x04, status1); | 711 | serial_outp(up, 0x04, status1); |
712 | |||
713 | serial_outp(up, UART_DLL, quot & 0xff); | ||
714 | serial_outp(up, UART_DLM, quot >> 8); | ||
715 | |||
708 | serial_outp(up, UART_LCR, 0); | 716 | serial_outp(up, UART_LCR, 0); |
709 | up->port.uartclk = 921600*16; | ||
710 | #endif | ||
711 | 717 | ||
718 | up->port.uartclk = 921600*16; | ||
712 | up->port.type = PORT_NS16550A; | 719 | up->port.type = PORT_NS16550A; |
713 | up->capabilities |= UART_NATSEMI; | 720 | up->capabilities |= UART_NATSEMI; |
714 | return; | 721 | return; |