diff options
author | Manuel Lauss <manuel.lauss@googlemail.com> | 2010-09-25 09:13:45 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2010-10-22 13:20:09 -0400 |
commit | c161afe9759ddcc174d08e7c4f683d08ac9ba86f (patch) | |
tree | 288e3f33efe083f7a243dee092f30df6375d5677 /drivers/serial | |
parent | 70eebd0b604989705f46697814e48fb4ea1d1bb9 (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.c | 27 |
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 | ||
165 | struct irq_info { | 159 | struct 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 | ||
2439 | static void | 2433 | |
2440 | serial8250_pm(struct uart_port *port, unsigned int state, | 2434 | void 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 | } | ||
2441 | EXPORT_SYMBOL(serial8250_do_pm); | ||
2446 | 2442 | ||
2447 | if (p->pm) | 2443 | static void |
2448 | p->pm(port, state, oldstate); | 2444 | serial8250_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 | ||
2451 | static unsigned int serial8250_port_size(struct uart_8250_port *pt) | 2453 | static 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) |