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>
This commit is contained in:
Родитель
70eebd0b60
Коммит
c161afe975
|
@ -154,12 +154,6 @@ struct uart_8250_port {
|
|||
unsigned char lsr_saved_flags;
|
||||
#define MSR_SAVE_FLAGS UART_MSR_ANY_DELTA
|
||||
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 {
|
||||
|
@ -2436,16 +2430,24 @@ serial8250_set_ldisc(struct uart_port *port, int new)
|
|||
port->flags &= ~UPF_HARDPPS_CD;
|
||||
}
|
||||
|
||||
static void
|
||||
serial8250_pm(struct uart_port *port, unsigned int state,
|
||||
unsigned int oldstate)
|
||||
|
||||
void serial8250_do_pm(struct uart_port *port, unsigned int state,
|
||||
unsigned int oldstate)
|
||||
{
|
||||
struct uart_8250_port *p = (struct uart_8250_port *)port;
|
||||
|
||||
serial8250_set_sleep(p, state != 0);
|
||||
}
|
||||
EXPORT_SYMBOL(serial8250_do_pm);
|
||||
|
||||
if (p->pm)
|
||||
p->pm(port, state, oldstate);
|
||||
static void
|
||||
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)
|
||||
|
@ -3006,6 +3008,7 @@ static int __devinit serial8250_probe(struct platform_device *dev)
|
|||
port.serial_in = p->serial_in;
|
||||
port.serial_out = p->serial_out;
|
||||
port.set_termios = p->set_termios;
|
||||
port.pm = p->pm;
|
||||
port.dev = &dev->dev;
|
||||
port.irqflags |= irqflag;
|
||||
ret = serial8250_register_port(&port);
|
||||
|
@ -3172,6 +3175,8 @@ int serial8250_register_port(struct uart_port *port)
|
|||
/* Possibly override set_termios call */
|
||||
if (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);
|
||||
if (ret == 0)
|
||||
|
|
|
@ -35,6 +35,8 @@ struct plat_serial8250_port {
|
|||
void (*set_termios)(struct uart_port *,
|
||||
struct ktermios *new,
|
||||
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);
|
|||
extern int setup_early_serial8250_console(char *cmdline);
|
||||
extern void serial8250_do_set_termios(struct uart_port *port,
|
||||
struct ktermios *termios, struct ktermios *old);
|
||||
extern void serial8250_do_pm(struct uart_port *port, unsigned int state,
|
||||
unsigned int oldstate);
|
||||
|
||||
#endif
|
||||
|
|
|
@ -289,6 +289,8 @@ struct uart_port {
|
|||
void (*set_termios)(struct uart_port *,
|
||||
struct ktermios *new,
|
||||
struct ktermios *old);
|
||||
void (*pm)(struct uart_port *, unsigned int state,
|
||||
unsigned int old);
|
||||
unsigned int irq; /* irq number */
|
||||
unsigned long irqflags; /* irq flags */
|
||||
unsigned int uartclk; /* base uart clock */
|
||||
|
|
Загрузка…
Ссылка в новой задаче