|
@@ -894,7 +894,7 @@ static void autoconfig_16550a(struct uart_8250_port *up)
|
|
|
quot = serial_dl_read(up);
|
|
|
quot <<= 3;
|
|
|
|
|
|
- status1 = serial_in(up, 0x04); /* EXCR1 */
|
|
|
+ status1 = serial_in(up, 0x04); /* EXCR2 */
|
|
|
status1 &= ~0xB0; /* Disable LOCK, mask out PRESL[01] */
|
|
|
status1 |= 0x10; /* 1.625 divisor for baud_base --> 921600 */
|
|
|
serial_outp(up, 0x04, status1);
|
|
@@ -2617,7 +2617,22 @@ void serial8250_suspend_port(int line)
|
|
|
*/
|
|
|
void serial8250_resume_port(int line)
|
|
|
{
|
|
|
- uart_resume_port(&serial8250_reg, &serial8250_ports[line].port);
|
|
|
+ struct uart_8250_port *up = &serial8250_ports[line];
|
|
|
+
|
|
|
+ if (up->capabilities & UART_NATSEMI) {
|
|
|
+ unsigned char tmp;
|
|
|
+
|
|
|
+ /* Ensure it's still in high speed mode */
|
|
|
+ serial_outp(up, UART_LCR, 0xE0);
|
|
|
+
|
|
|
+ tmp = serial_in(up, 0x04); /* EXCR2 */
|
|
|
+ tmp &= ~0xB0; /* Disable LOCK, mask out PRESL[01] */
|
|
|
+ tmp |= 0x10; /* 1.625 divisor for baud_base --> 921600 */
|
|
|
+ serial_outp(up, 0x04, tmp);
|
|
|
+
|
|
|
+ serial_outp(up, UART_LCR, 0);
|
|
|
+ }
|
|
|
+ uart_resume_port(&serial8250_reg, &up->port);
|
|
|
}
|
|
|
|
|
|
/*
|
|
@@ -2694,7 +2709,7 @@ static int serial8250_resume(struct platform_device *dev)
|
|
|
struct uart_8250_port *up = &serial8250_ports[i];
|
|
|
|
|
|
if (up->port.type != PORT_UNKNOWN && up->port.dev == &dev->dev)
|
|
|
- uart_resume_port(&serial8250_reg, &up->port);
|
|
|
+ serial8250_resume_port(i);
|
|
|
}
|
|
|
|
|
|
return 0;
|