aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/serial
diff options
context:
space:
mode:
authorManuel Lauss <manuel.lauss@googlemail.com>2010-09-25 09:13:45 -0400
committerGreg Kroah-Hartman <gregkh@suse.de>2010-10-22 13:20:09 -0400
commitc161afe9759ddcc174d08e7c4f683d08ac9ba86f (patch)
tree288e3f33efe083f7a243dee092f30df6375d5677 /drivers/serial
parent70eebd0b604989705f46697814e48fb4ea1d1bb9 (diff)
8250: allow platforms to override PM hook.
Add a hook for platforms to specify custom pm methods. Signed-off-by: Manuel Lauss <manuel.lauss@googlemail.com> Cc: Alan Cox <alan@lxorguk.ukuu.org.uk> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/serial')
-rw-r--r--drivers/serial/8250.c27
1 files changed, 16 insertions, 11 deletions
diff --git a/drivers/serial/8250.c b/drivers/serial/8250.c
index b586406f04ca..6994afb5571a 100644
--- a/drivers/serial/8250.c
+++ b/drivers/serial/8250.c
@@ -154,12 +154,6 @@ struct uart_8250_port {
154 unsigned char lsr_saved_flags; 154 unsigned char lsr_saved_flags;
155#define MSR_SAVE_FLAGS UART_MSR_ANY_DELTA 155#define MSR_SAVE_FLAGS UART_MSR_ANY_DELTA
156 unsigned char msr_saved_flags; 156 unsigned char msr_saved_flags;
157
158 /*
159 * We provide a per-port pm hook.
160 */
161 void (*pm)(struct uart_port *port,
162 unsigned int state, unsigned int old);
163}; 157};
164 158
165struct irq_info { 159struct irq_info {
@@ -2436,16 +2430,24 @@ serial8250_set_ldisc(struct uart_port *port, int new)
2436 port->flags &= ~UPF_HARDPPS_CD; 2430 port->flags &= ~UPF_HARDPPS_CD;
2437} 2431}
2438 2432
2439static void 2433
2440serial8250_pm(struct uart_port *port, unsigned int state, 2434void serial8250_do_pm(struct uart_port *port, unsigned int state,
2441 unsigned int oldstate) 2435 unsigned int oldstate)
2442{ 2436{
2443 struct uart_8250_port *p = (struct uart_8250_port *)port; 2437 struct uart_8250_port *p = (struct uart_8250_port *)port;
2444 2438
2445 serial8250_set_sleep(p, state != 0); 2439 serial8250_set_sleep(p, state != 0);
2440}
2441EXPORT_SYMBOL(serial8250_do_pm);
2446 2442
2447 if (p->pm) 2443static void
2448 p->pm(port, state, oldstate); 2444serial8250_pm(struct uart_port *port, unsigned int state,
2445 unsigned int oldstate)
2446{
2447 if (port->pm)
2448 port->pm(port, state, oldstate);
2449 else
2450 serial8250_do_pm(port, state, oldstate);
2449} 2451}
2450 2452
2451static unsigned int serial8250_port_size(struct uart_8250_port *pt) 2453static unsigned int serial8250_port_size(struct uart_8250_port *pt)
@@ -3006,6 +3008,7 @@ static int __devinit serial8250_probe(struct platform_device *dev)
3006 port.serial_in = p->serial_in; 3008 port.serial_in = p->serial_in;
3007 port.serial_out = p->serial_out; 3009 port.serial_out = p->serial_out;
3008 port.set_termios = p->set_termios; 3010 port.set_termios = p->set_termios;
3011 port.pm = p->pm;
3009 port.dev = &dev->dev; 3012 port.dev = &dev->dev;
3010 port.irqflags |= irqflag; 3013 port.irqflags |= irqflag;
3011 ret = serial8250_register_port(&port); 3014 ret = serial8250_register_port(&port);
@@ -3172,6 +3175,8 @@ int serial8250_register_port(struct uart_port *port)
3172 /* Possibly override set_termios call */ 3175 /* Possibly override set_termios call */
3173 if (port->set_termios) 3176 if (port->set_termios)
3174 uart->port.set_termios = port->set_termios; 3177 uart->port.set_termios = port->set_termios;
3178 if (port->pm)
3179 uart->port.pm = port->pm;
3175 3180
3176 ret = uart_add_one_port(&serial8250_reg, &uart->port); 3181 ret = uart_add_one_port(&serial8250_reg, &uart->port);
3177 if (ret == 0) 3182 if (ret == 0)