Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+16 −11
Original line number Diff line number Diff line
@@ -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,

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)
+4 −0
Original line number Diff line number Diff line
@@ -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
+2 −0
Original line number Diff line number Diff line
@@ -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 */