| From 94abc56f4d90f289ea32a0a11d3577fcd8cb28fb Mon Sep 17 00:00:00 2001 |
| From: Ning Jiang <ning.jiang@marvell.com> |
| Date: Mon, 5 Sep 2011 16:28:18 +0800 |
| Subject: serial-core: power up uart port early before we do set_termios when resuming |
| |
| From: Ning Jiang <ning.jiang@marvell.com> |
| |
| commit 94abc56f4d90f289ea32a0a11d3577fcd8cb28fb upstream. |
| |
| The following patch removed uart_change_pm() in uart_resume_port(): |
| |
| commit 5933a161abcb8d83a2c145177f48027c3c0a8995 |
| Author: Yin Kangkai <kangkai.yin@linux.intel.com> |
| serial-core: reset the console speed on resume |
| |
| It will break the pxa serial driver when the system resumes from suspend mode |
| as it will try to set baud rate divider register in set_termios but with |
| clock off. The register value can not be set correctly on some platform if |
| the clock is disabled. The pxa driver will check the value and report the |
| following warning: |
| |
| ------------[ cut here ]------------ |
| WARNING: at drivers/tty/serial/pxa.c:545 serial_pxa_set_termios+0x1dc/0x250() |
| Modules linked in: |
| [<c0281f30>] (unwind_backtrace+0x0/0xf0) from [<c029341c>] (warn_slowpath_common+0x4c/0x64) |
| [<c029341c>] (warn_slowpath_common+0x4c/0x64) from [<c029344c>] (warn_slowpath_null+0x18/0x1c) |
| [<c029344c>] (warn_slowpath_null+0x18/0x1c) from [<c044b1e4>] (serial_pxa_set_termios+0x1dc/0x250) |
| [<c044b1e4>] (serial_pxa_set_termios+0x1dc/0x250) from [<c044a840>] (uart_resume_port+0x128/0x2dc) |
| [<c044a840>] (uart_resume_port+0x128/0x2dc) from [<c044bbe0>] (serial_pxa_resume+0x18/0x24) |
| [<c044bbe0>] (serial_pxa_resume+0x18/0x24) from [<c0454d34>] (platform_pm_resume+0x40/0x4c) |
| [<c0454d34>] (platform_pm_resume+0x40/0x4c) from [<c0457ebc>] (pm_op+0x68/0xb4) |
| [<c0457ebc>] (pm_op+0x68/0xb4) from [<c0458368>] (device_resume+0xb0/0xec) |
| [<c0458368>] (device_resume+0xb0/0xec) from [<c04584c8>] (dpm_resume+0xe0/0x194) |
| [<c04584c8>] (dpm_resume+0xe0/0x194) from [<c0458588>] (dpm_resume_end+0xc/0x18) |
| [<c0458588>] (dpm_resume_end+0xc/0x18) from [<c02c518c>] (suspend_devices_and_enter+0x16c/0x1ac) |
| [<c02c518c>] (suspend_devices_and_enter+0x16c/0x1ac) from [<c02c5278>] (enter_state+0xac/0xdc) |
| [<c02c5278>] (enter_state+0xac/0xdc) from [<c02c48ec>] (state_store+0xa0/0xbc) |
| [<c02c48ec>] (state_store+0xa0/0xbc) from [<c0408f7c>] (kobj_attr_store+0x18/0x1c) |
| [<c0408f7c>] (kobj_attr_store+0x18/0x1c) from [<c034a6a4>] (sysfs_write_file+0x108/0x140) |
| [<c034a6a4>] (sysfs_write_file+0x108/0x140) from [<c02fb798>] (vfs_write+0xac/0x134) |
| [<c02fb798>] (vfs_write+0xac/0x134) from [<c02fb8cc>] (sys_write+0x3c/0x68) |
| [<c02fb8cc>] (sys_write+0x3c/0x68) from [<c027c700>] (ret_fast_syscall+0x0/0x2c) |
| ---[ end trace 88289eceb4675b04 ]--- |
| |
| This patch fix the problem by adding the power on opertion back for uart |
| console when console_suspend_enabled is true. |
| |
| Signed-off-by: Ning Jiang <ning.jiang@marvell.com> |
| Tested-by: Mayank Rana <mrana@codeaurora.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| drivers/tty/serial/serial_core.c | 2 ++ |
| 1 file changed, 2 insertions(+) |
| |
| --- a/drivers/tty/serial/serial_core.c |
| +++ b/drivers/tty/serial/serial_core.c |
| @@ -2008,6 +2008,8 @@ int uart_resume_port(struct uart_driver |
| if (port->tty && port->tty->termios && termios.c_cflag == 0) |
| termios = *(port->tty->termios); |
| |
| + if (console_suspend_enabled) |
| + uart_change_pm(state, 0); |
| uport->ops->set_termios(uport, &termios, NULL); |
| if (console_suspend_enabled) |
| console_start(uport->cons); |