Commit c161afe9 authored by Manuel Lauss's avatar Manuel Lauss Committed by Greg Kroah-Hartman

8250: allow platforms to override PM hook.

Add a hook for platforms to specify custom pm methods.
Signed-off-by: default avatarManuel Lauss <manuel.lauss@googlemail.com>
Cc: Alan Cox <alan@lxorguk.ukuu.org.uk>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent 70eebd0b
...@@ -154,12 +154,6 @@ struct uart_8250_port { ...@@ -154,12 +154,6 @@ struct uart_8250_port {
unsigned char lsr_saved_flags; unsigned char lsr_saved_flags;
#define MSR_SAVE_FLAGS UART_MSR_ANY_DELTA #define MSR_SAVE_FLAGS UART_MSR_ANY_DELTA
unsigned char msr_saved_flags; unsigned char msr_saved_flags;
/*
* We provide a per-port pm hook.
*/
void (*pm)(struct uart_port *port,
unsigned int state, unsigned int old);
}; };
struct irq_info { struct irq_info {
...@@ -2436,16 +2430,24 @@ serial8250_set_ldisc(struct uart_port *port, int new) ...@@ -2436,16 +2430,24 @@ serial8250_set_ldisc(struct uart_port *port, int new)
port->flags &= ~UPF_HARDPPS_CD; port->flags &= ~UPF_HARDPPS_CD;
} }
static void
serial8250_pm(struct uart_port *port, unsigned int state, void serial8250_do_pm(struct uart_port *port, unsigned int state,
unsigned int oldstate) unsigned int oldstate)
{ {
struct uart_8250_port *p = (struct uart_8250_port *)port; struct uart_8250_port *p = (struct uart_8250_port *)port;
serial8250_set_sleep(p, state != 0); serial8250_set_sleep(p, state != 0);
}
EXPORT_SYMBOL(serial8250_do_pm);
if (p->pm) static void
p->pm(port, state, oldstate); serial8250_pm(struct uart_port *port, unsigned int state,
unsigned int oldstate)
{
if (port->pm)
port->pm(port, state, oldstate);
else
serial8250_do_pm(port, state, oldstate);
} }
static unsigned int serial8250_port_size(struct uart_8250_port *pt) 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,6 +3008,7 @@ static int __devinit serial8250_probe(struct platform_device *dev)
port.serial_in = p->serial_in; port.serial_in = p->serial_in;
port.serial_out = p->serial_out; port.serial_out = p->serial_out;
port.set_termios = p->set_termios; port.set_termios = p->set_termios;
port.pm = p->pm;
port.dev = &dev->dev; port.dev = &dev->dev;
port.irqflags |= irqflag; port.irqflags |= irqflag;
ret = serial8250_register_port(&port); ret = serial8250_register_port(&port);
...@@ -3172,6 +3175,8 @@ int serial8250_register_port(struct uart_port *port) ...@@ -3172,6 +3175,8 @@ int serial8250_register_port(struct uart_port *port)
/* Possibly override set_termios call */ /* Possibly override set_termios call */
if (port->set_termios) if (port->set_termios)
uart->port.set_termios = port->set_termios; uart->port.set_termios = port->set_termios;
if (port->pm)
uart->port.pm = port->pm;
ret = uart_add_one_port(&serial8250_reg, &uart->port); ret = uart_add_one_port(&serial8250_reg, &uart->port);
if (ret == 0) if (ret == 0)
......
...@@ -35,6 +35,8 @@ struct plat_serial8250_port { ...@@ -35,6 +35,8 @@ struct plat_serial8250_port {
void (*set_termios)(struct uart_port *, void (*set_termios)(struct uart_port *,
struct ktermios *new, struct ktermios *new,
struct ktermios *old); struct ktermios *old);
void (*pm)(struct uart_port *, unsigned int state,
unsigned old);
}; };
/* /*
...@@ -76,5 +78,7 @@ extern int serial8250_find_port_for_earlycon(void); ...@@ -76,5 +78,7 @@ extern int serial8250_find_port_for_earlycon(void);
extern int setup_early_serial8250_console(char *cmdline); extern int setup_early_serial8250_console(char *cmdline);
extern void serial8250_do_set_termios(struct uart_port *port, extern void serial8250_do_set_termios(struct uart_port *port,
struct ktermios *termios, struct ktermios *old); struct ktermios *termios, struct ktermios *old);
extern void serial8250_do_pm(struct uart_port *port, unsigned int state,
unsigned int oldstate);
#endif #endif
...@@ -289,6 +289,8 @@ struct uart_port { ...@@ -289,6 +289,8 @@ struct uart_port {
void (*set_termios)(struct uart_port *, void (*set_termios)(struct uart_port *,
struct ktermios *new, struct ktermios *new,
struct ktermios *old); struct ktermios *old);
void (*pm)(struct uart_port *, unsigned int state,
unsigned int old);
unsigned int irq; /* irq number */ unsigned int irq; /* irq number */
unsigned long irqflags; /* irq flags */ unsigned long irqflags; /* irq flags */
unsigned int uartclk; /* base uart clock */ unsigned int uartclk; /* base uart clock */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment