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:
parent
70eebd0b60
commit
c161afe975
|
@ -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)
|
||||||
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)
|
||||||
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)
|
||||||
/* 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 {
|
||||||
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);
|
||||||
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 {
|
||||||
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 */
|
||||||
|
|
Loading…
Reference in New Issue