diff options
Diffstat (limited to 'drivers/serial/8250.c')
| -rw-r--r-- | drivers/serial/8250.c | 21 |
1 files changed, 18 insertions, 3 deletions
diff --git a/drivers/serial/8250.c b/drivers/serial/8250.c index 48e259a0167d..c84dab083a85 100644 --- a/drivers/serial/8250.c +++ b/drivers/serial/8250.c | |||
| @@ -894,7 +894,7 @@ static void autoconfig_16550a(struct uart_8250_port *up) | |||
| 894 | quot = serial_dl_read(up); | 894 | quot = serial_dl_read(up); |
| 895 | quot <<= 3; | 895 | quot <<= 3; |
| 896 | 896 | ||
| 897 | status1 = serial_in(up, 0x04); /* EXCR1 */ | 897 | status1 = serial_in(up, 0x04); /* EXCR2 */ |
| 898 | status1 &= ~0xB0; /* Disable LOCK, mask out PRESL[01] */ | 898 | status1 &= ~0xB0; /* Disable LOCK, mask out PRESL[01] */ |
| 899 | status1 |= 0x10; /* 1.625 divisor for baud_base --> 921600 */ | 899 | status1 |= 0x10; /* 1.625 divisor for baud_base --> 921600 */ |
| 900 | serial_outp(up, 0x04, status1); | 900 | serial_outp(up, 0x04, status1); |
| @@ -2617,7 +2617,22 @@ void serial8250_suspend_port(int line) | |||
| 2617 | */ | 2617 | */ |
| 2618 | void serial8250_resume_port(int line) | 2618 | void serial8250_resume_port(int line) |
| 2619 | { | 2619 | { |
| 2620 | uart_resume_port(&serial8250_reg, &serial8250_ports[line].port); | 2620 | struct uart_8250_port *up = &serial8250_ports[line]; |
| 2621 | |||
| 2622 | if (up->capabilities & UART_NATSEMI) { | ||
| 2623 | unsigned char tmp; | ||
| 2624 | |||
| 2625 | /* Ensure it's still in high speed mode */ | ||
| 2626 | serial_outp(up, UART_LCR, 0xE0); | ||
| 2627 | |||
| 2628 | tmp = serial_in(up, 0x04); /* EXCR2 */ | ||
| 2629 | tmp &= ~0xB0; /* Disable LOCK, mask out PRESL[01] */ | ||
| 2630 | tmp |= 0x10; /* 1.625 divisor for baud_base --> 921600 */ | ||
| 2631 | serial_outp(up, 0x04, tmp); | ||
| 2632 | |||
| 2633 | serial_outp(up, UART_LCR, 0); | ||
| 2634 | } | ||
| 2635 | uart_resume_port(&serial8250_reg, &up->port); | ||
| 2621 | } | 2636 | } |
| 2622 | 2637 | ||
| 2623 | /* | 2638 | /* |
| @@ -2694,7 +2709,7 @@ static int serial8250_resume(struct platform_device *dev) | |||
| 2694 | struct uart_8250_port *up = &serial8250_ports[i]; | 2709 | struct uart_8250_port *up = &serial8250_ports[i]; |
| 2695 | 2710 | ||
| 2696 | if (up->port.type != PORT_UNKNOWN && up->port.dev == &dev->dev) | 2711 | if (up->port.type != PORT_UNKNOWN && up->port.dev == &dev->dev) |
| 2697 | uart_resume_port(&serial8250_reg, &up->port); | 2712 | serial8250_resume_port(i); |
| 2698 | } | 2713 | } |
| 2699 | 2714 | ||
| 2700 | return 0; | 2715 | return 0; |
