Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 179720
b: refs/heads/master
c: 4547be7
h: refs/heads/master
v: v3
  • Loading branch information
Stanislav Brabec authored and Greg Kroah-Hartman committed Jan 20, 2010
1 parent ab71004 commit aa429b0
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 56 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 6d34855d9aa281f72c533ecb827405139d1b0fe9
refs/heads/master: 4547be7809a3b775ce750ec7f8b5748954741523
88 changes: 33 additions & 55 deletions trunk/drivers/serial/serial_core.c
Original file line number Diff line number Diff line change
Expand Up @@ -2006,33 +2006,30 @@ int uart_suspend_port(struct uart_driver *drv, struct uart_port *uport)

mutex_lock(&port->mutex);

if (!console_suspend_enabled && uart_console(uport)) {
/* we're going to avoid suspending serial console */
mutex_unlock(&port->mutex);
return 0;
}

tty_dev = device_find_child(uport->dev, &match, serial_match_port);
if (device_may_wakeup(tty_dev)) {
enable_irq_wake(uport->irq);
put_device(tty_dev);
mutex_unlock(&port->mutex);
return 0;
}
uport->suspended = 1;
if (console_suspend_enabled || !uart_console(uport))
uport->suspended = 1;

if (port->flags & ASYNC_INITIALIZED) {
const struct uart_ops *ops = uport->ops;
int tries;

set_bit(ASYNCB_SUSPENDED, &port->flags);
clear_bit(ASYNCB_INITIALIZED, &port->flags);
if (console_suspend_enabled || !uart_console(uport)) {
set_bit(ASYNCB_SUSPENDED, &port->flags);
clear_bit(ASYNCB_INITIALIZED, &port->flags);

spin_lock_irq(&uport->lock);
ops->stop_tx(uport);
ops->set_mctrl(uport, 0);
ops->stop_rx(uport);
spin_unlock_irq(&uport->lock);
spin_lock_irq(&uport->lock);
ops->stop_tx(uport);
ops->set_mctrl(uport, 0);
ops->stop_rx(uport);
spin_unlock_irq(&uport->lock);
}

/*
* Wait for the transmitter to empty.
Expand All @@ -2047,16 +2044,18 @@ int uart_suspend_port(struct uart_driver *drv, struct uart_port *uport)
drv->dev_name,
drv->tty_driver->name_base + uport->line);

ops->shutdown(uport);
if (console_suspend_enabled || !uart_console(uport))
ops->shutdown(uport);
}

/*
* Disable the console device before suspending.
*/
if (uart_console(uport))
if (console_suspend_enabled && uart_console(uport))
console_stop(uport->cons);

uart_change_pm(state, 3);
if (console_suspend_enabled || !uart_console(uport))
uart_change_pm(state, 3);

mutex_unlock(&port->mutex);

Expand All @@ -2073,29 +2072,6 @@ int uart_resume_port(struct uart_driver *drv, struct uart_port *uport)

mutex_lock(&port->mutex);

if (!console_suspend_enabled && uart_console(uport)) {
/* no need to resume serial console, it wasn't suspended */
/*
* First try to use the console cflag setting.
*/
memset(&termios, 0, sizeof(struct ktermios));
termios.c_cflag = uport->cons->cflag;
/*
* If that's unset, use the tty termios setting.
*/
if (termios.c_cflag == 0)
termios = *state->port.tty->termios;
else {
termios.c_ispeed = termios.c_ospeed =
tty_termios_input_baud_rate(&termios);
termios.c_ispeed = termios.c_ospeed =
tty_termios_baud_rate(&termios);
}
uport->ops->set_termios(uport, &termios, NULL);
mutex_unlock(&port->mutex);
return 0;
}

tty_dev = device_find_child(uport->dev, &match, serial_match_port);
if (!uport->suspended && device_may_wakeup(tty_dev)) {
disable_irq_wake(uport->irq);
Expand All @@ -2121,21 +2097,23 @@ int uart_resume_port(struct uart_driver *drv, struct uart_port *uport)
spin_lock_irq(&uport->lock);
ops->set_mctrl(uport, 0);
spin_unlock_irq(&uport->lock);
ret = ops->startup(uport);
if (ret == 0) {
uart_change_speed(state, NULL);
spin_lock_irq(&uport->lock);
ops->set_mctrl(uport, uport->mctrl);
ops->start_tx(uport);
spin_unlock_irq(&uport->lock);
set_bit(ASYNCB_INITIALIZED, &port->flags);
} else {
/*
* Failed to resume - maybe hardware went away?
* Clear the "initialized" flag so we won't try
* to call the low level drivers shutdown method.
*/
uart_shutdown(state);
if (console_suspend_enabled || !uart_console(uport)) {
ret = ops->startup(uport);
if (ret == 0) {
uart_change_speed(state, NULL);
spin_lock_irq(&uport->lock);
ops->set_mctrl(uport, uport->mctrl);
ops->start_tx(uport);
spin_unlock_irq(&uport->lock);
set_bit(ASYNCB_INITIALIZED, &port->flags);
} else {
/*
* Failed to resume - maybe hardware went away?
* Clear the "initialized" flag so we won't try
* to call the low level drivers shutdown method.
*/
uart_shutdown(state);
}
}

clear_bit(ASYNCB_SUSPENDED, &port->flags);
Expand Down

0 comments on commit aa429b0

Please sign in to comment.