Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 354745
b: refs/heads/master
c: 6f538fe
h: refs/heads/master
i:
  354743: 67bd659
v: v3
  • Loading branch information
Linus Walleij authored and Greg Kroah-Hartman committed Jan 16, 2013
1 parent f47ada6 commit be4e938
Show file tree
Hide file tree
Showing 4 changed files with 32 additions and 19 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: fdbc7353e45d78ea8ee4a0cdc9e2700035a3a77d
refs/heads/master: 6f538fe31c1d453b7e7fc4f6e7c6a9bdead4a6f2
5 changes: 2 additions & 3 deletions trunk/Documentation/serial/driver
Original file line number Diff line number Diff line change
Expand Up @@ -242,9 +242,8 @@ hardware.

pm(port,state,oldstate)
Perform any power management related activities on the specified
port. State indicates the new state (defined by ACPI D0-D3),
oldstate indicates the previous state. Essentially, D0 means
fully on, D3 means powered down.
port. State indicates the new state (defined by
enum uart_pm_state), oldstate indicates the previous state.

This function should not be used to grab any resources.

Expand Down
30 changes: 16 additions & 14 deletions trunk/drivers/tty/serial/serial_core.c
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,8 @@ static struct lock_class_key port_lock_key;
static void uart_change_speed(struct tty_struct *tty, struct uart_state *state,
struct ktermios *old_termios);
static void uart_wait_until_sent(struct tty_struct *tty, int timeout);
static void uart_change_pm(struct uart_state *state, int pm_state);
static void uart_change_pm(struct uart_state *state,
enum uart_pm_state pm_state);

static void uart_port_shutdown(struct tty_port *port);

Expand Down Expand Up @@ -1365,7 +1366,7 @@ static void uart_close(struct tty_struct *tty, struct file *filp)
spin_lock_irqsave(&port->lock, flags);
} else if (!uart_console(uport)) {
spin_unlock_irqrestore(&port->lock, flags);
uart_change_pm(state, 3);
uart_change_pm(state, UART_PM_STATE_OFF);
spin_lock_irqsave(&port->lock, flags);
}

Expand Down Expand Up @@ -1579,7 +1580,7 @@ static int uart_open(struct tty_struct *tty, struct file *filp)
* Make sure the device is in D0 state.
*/
if (port->count == 1)
uart_change_pm(state, 0);
uart_change_pm(state, UART_PM_STATE_ON);

/*
* Start up the serial port.
Expand Down Expand Up @@ -1620,7 +1621,7 @@ static void uart_line_info(struct seq_file *m, struct uart_driver *drv, int i)
{
struct uart_state *state = drv->state + i;
struct tty_port *port = &state->port;
int pm_state;
enum uart_pm_state pm_state;
struct uart_port *uport = state->uart_port;
char stat_buf[32];
unsigned int status;
Expand All @@ -1645,12 +1646,12 @@ static void uart_line_info(struct seq_file *m, struct uart_driver *drv, int i)
if (capable(CAP_SYS_ADMIN)) {
mutex_lock(&port->mutex);
pm_state = state->pm_state;
if (pm_state)
uart_change_pm(state, 0);
if (pm_state != UART_PM_STATE_ON)
uart_change_pm(state, UART_PM_STATE_ON);
spin_lock_irq(&uport->lock);
status = uport->ops->get_mctrl(uport);
spin_unlock_irq(&uport->lock);
if (pm_state)
if (pm_state != UART_PM_STATE_ON)
uart_change_pm(state, pm_state);
mutex_unlock(&port->mutex);

Expand Down Expand Up @@ -1897,7 +1898,8 @@ EXPORT_SYMBOL_GPL(uart_set_options);
*
* Locking: port->mutex has to be held
*/
static void uart_change_pm(struct uart_state *state, int pm_state)
static void uart_change_pm(struct uart_state *state,
enum uart_pm_state pm_state)
{
struct uart_port *port = state->uart_port;

Expand Down Expand Up @@ -1982,7 +1984,7 @@ int uart_suspend_port(struct uart_driver *drv, struct uart_port *uport)
console_stop(uport->cons);

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

mutex_unlock(&port->mutex);

Expand Down Expand Up @@ -2027,7 +2029,7 @@ int uart_resume_port(struct uart_driver *drv, struct uart_port *uport)
termios = port->tty->termios;

if (console_suspend_enabled)
uart_change_pm(state, 0);
uart_change_pm(state, UART_PM_STATE_ON);
uport->ops->set_termios(uport, &termios, NULL);
if (console_suspend_enabled)
console_start(uport->cons);
Expand All @@ -2037,7 +2039,7 @@ int uart_resume_port(struct uart_driver *drv, struct uart_port *uport)
const struct uart_ops *ops = uport->ops;
int ret;

uart_change_pm(state, 0);
uart_change_pm(state, UART_PM_STATE_ON);
spin_lock_irq(&uport->lock);
ops->set_mctrl(uport, 0);
spin_unlock_irq(&uport->lock);
Expand Down Expand Up @@ -2137,7 +2139,7 @@ uart_configure_port(struct uart_driver *drv, struct uart_state *state,
uart_report_port(drv, port);

/* Power up port for set_mctrl() */
uart_change_pm(state, 0);
uart_change_pm(state, UART_PM_STATE_ON);

/*
* Ensure that the modem control lines are de-activated.
Expand All @@ -2161,7 +2163,7 @@ uart_configure_port(struct uart_driver *drv, struct uart_state *state,
* console if we have one.
*/
if (!uart_console(port))
uart_change_pm(state, 3);
uart_change_pm(state, UART_PM_STATE_OFF);
}
}

Expand Down Expand Up @@ -2588,7 +2590,7 @@ int uart_add_one_port(struct uart_driver *drv, struct uart_port *uport)
}

state->uart_port = uport;
state->pm_state = -1;
state->pm_state = UART_PM_STATE_UNDEFINED;

uport->cons = drv->cons;
uport->state = state;
Expand Down
14 changes: 13 additions & 1 deletion trunk/include/linux/serial_core.h
Original file line number Diff line number Diff line change
Expand Up @@ -208,13 +208,25 @@ static inline void serial_port_out(struct uart_port *up, int offset, int value)
up->serial_out(up, offset, value);
}

/**
* enum uart_pm_state - power states for UARTs
* @UART_PM_STATE_ON: UART is powered, up and operational
* @UART_PM_STATE_OFF: UART is powered off
* @UART_PM_STATE_UNDEFINED: sentinel
*/
enum uart_pm_state {
UART_PM_STATE_ON = 0,
UART_PM_STATE_OFF = 3, /* number taken from ACPI */
UART_PM_STATE_UNDEFINED,
};

/*
* This is the state information which is persistent across opens.
*/
struct uart_state {
struct tty_port port;

int pm_state;
enum uart_pm_state pm_state;
struct circ_buf xmit;

struct uart_port *uart_port;
Expand Down

0 comments on commit be4e938

Please sign in to comment.