From: Andy Shevchenko <andriy.shevche...@linux.intel.com> Backport: - Upstream-Status: Pending. - Backport fix. [https://bitbucket.org/andy-shev/linux/commits/881267aa49844618a01a9d11895b48822e68c1a1?at=master]
Since we have runtime PM calls in serial_core.c the individual drivers do not need them anymore. Remove unnecessary runtime PM calls. Signed-off-by: Andy Shevchenko <andriy.shevche...@linux.intel.com> Signed-off-by: Nilesh Bacchewar <nilesh.bacche...@intel.com> --- drivers/tty/serial/8250/8250_port.c | 74 +++++++++++++------------------------ 1 file changed, 25 insertions(+), 49 deletions(-) diff --git a/drivers/tty/serial/8250/8250_port.c b/drivers/tty/serial/8250/8250_port.c index 805a15c..880fb4c 100644 --- a/drivers/tty/serial/8250/8250_port.c +++ b/drivers/tty/serial/8250/8250_port.c @@ -543,7 +543,12 @@ void serial8250_rpm_get_tx(struct uart_8250_port *p) rpm_active = xchg(&p->rpm_tx_active, 1); if (rpm_active) return; - pm_runtime_get_sync(p->port.dev); + /* + * Device has to be powered on at this point. Here we just increase + * reference count to prevent autosuspend until the TX FIFO becomes + * empty. See also a comment in serial8250_tx_chars(). + */ + pm_runtime_get_noresume(p->port.dev); } EXPORT_SYMBOL_GPL(serial8250_rpm_get_tx); @@ -577,11 +582,10 @@ static void serial8250_set_sleep(struct uart_8250_port *p, int sleep) * offset but the UART channel may only write to the corresponding * bit. */ - serial8250_rpm_get(p); if ((p->port.type == PORT_XR17V35X) || (p->port.type == PORT_XR17D15X)) { serial_out(p, UART_EXAR_SLEEP, sleep ? 0xff : 0); - goto out; + return; } if (p->capabilities & UART_CAP_SLEEP) { @@ -599,8 +603,6 @@ static void serial8250_set_sleep(struct uart_8250_port *p, int sleep) serial_out(p, UART_LCR, lcr); } } -out: - serial8250_rpm_put(p); } #ifdef CONFIG_SERIAL_8250_RSA @@ -1295,7 +1297,6 @@ static void serial8250_stop_tx(struct uart_port *port) { struct uart_8250_port *up = up_to_u8250p(port); - serial8250_rpm_get(up); __stop_tx(up); /* @@ -1305,7 +1306,6 @@ static void serial8250_stop_tx(struct uart_port *port) up->acr |= UART_ACR_TXDIS; serial_icr_write(up, UART_ACR, up->acr); } - serial8250_rpm_put(up); } static void serial8250_start_tx(struct uart_port *port) @@ -1353,13 +1353,9 @@ static void serial8250_stop_rx(struct uart_port *port) { struct uart_8250_port *up = up_to_u8250p(port); - serial8250_rpm_get(up); - up->ier &= ~(UART_IER_RLSI | UART_IER_RDI); up->port.read_status_mask &= ~UART_LSR_DR; serial_port_out(port, UART_IER, up->ier); - - serial8250_rpm_put(up); } static void serial8250_disable_ms(struct uart_port *port) @@ -1385,9 +1381,7 @@ static void serial8250_enable_ms(struct uart_port *port) up->ier |= UART_IER_MSI; - serial8250_rpm_get(up); serial_port_out(port, UART_IER, up->ier); - serial8250_rpm_put(up); } /* @@ -1629,15 +1623,11 @@ static unsigned int serial8250_tx_empty(struct uart_port *port) unsigned long flags; unsigned int lsr; - serial8250_rpm_get(up); - spin_lock_irqsave(&port->lock, flags); lsr = serial_port_in(port, UART_LSR); up->lsr_saved_flags |= lsr & LSR_SAVE_FLAGS; spin_unlock_irqrestore(&port->lock, flags); - serial8250_rpm_put(up); - return (lsr & BOTH_EMPTY) == BOTH_EMPTY ? TIOCSER_TEMT : 0; } @@ -1647,9 +1637,7 @@ static unsigned int serial8250_get_mctrl(struct uart_port *port) unsigned int status; unsigned int ret; - serial8250_rpm_get(up); status = serial8250_modem_status(up); - serial8250_rpm_put(up); ret = 0; if (status & UART_MSR_DCD) @@ -1698,7 +1686,6 @@ static void serial8250_break_ctl(struct uart_port *port, int break_state) struct uart_8250_port *up = up_to_u8250p(port); unsigned long flags; - serial8250_rpm_get(up); spin_lock_irqsave(&port->lock, flags); if (break_state == -1) up->lcr |= UART_LCR_SBC; @@ -1706,7 +1693,6 @@ static void serial8250_break_ctl(struct uart_port *port, int break_state) up->lcr &= ~UART_LCR_SBC; serial_port_out(port, UART_LCR, up->lcr); spin_unlock_irqrestore(&port->lock, flags); - serial8250_rpm_put(up); } /* @@ -1753,21 +1739,12 @@ static int serial8250_get_poll_char(struct uart_port *port) { struct uart_8250_port *up = up_to_u8250p(port); unsigned char lsr; - int status; - - serial8250_rpm_get(up); lsr = serial_port_in(port, UART_LSR); + if (!(lsr & UART_LSR_DR)) + return NO_POLL_CHAR; - if (!(lsr & UART_LSR_DR)) { - status = NO_POLL_CHAR; - goto out; - } - - status = serial_port_in(port, UART_RX); -out: - serial8250_rpm_put(up); - return status; + return serial_port_in(port, UART_RX); } @@ -1777,7 +1754,6 @@ static void serial8250_put_poll_char(struct uart_port *port, unsigned int ier; struct uart_8250_port *up = up_to_u8250p(port); - serial8250_rpm_get(up); /* * First save the IER then disable the interrupts */ @@ -1799,7 +1775,6 @@ static void serial8250_put_poll_char(struct uart_port *port, */ wait_for_xmitr(up, BOTH_EMPTY); serial_port_out(port, UART_IER, ier); - serial8250_rpm_put(up); } #endif /* CONFIG_CONSOLE_POLL */ @@ -1822,7 +1797,6 @@ int serial8250_do_startup(struct uart_port *port) if (port->iotype != up->cur_iotype) set_io_from_upio(port); - serial8250_rpm_get(up); if (port->type == PORT_16C950) { /* Wake up and initialize UART */ up->acr = 0; @@ -1881,8 +1855,7 @@ int serial8250_do_startup(struct uart_port *port) (serial_port_in(port, UART_LSR) == 0xff)) { printk_ratelimited(KERN_INFO "ttyS%d: LSR safety check engaged!\n", serial_index(port)); - retval = -ENODEV; - goto out; + return -ENODEV; } /* @@ -1945,7 +1918,7 @@ int serial8250_do_startup(struct uart_port *port) retval = up->ops->setup_irq(up); if (retval) - goto out; + return retval; /* * Now, initialize the UART @@ -2041,10 +2014,7 @@ dont_test_tx_en: outb_p(0x80, icp); inb_p(icp); } - retval = 0; -out: - serial8250_rpm_put(up); - return retval; + return 0; } EXPORT_SYMBOL_GPL(serial8250_do_startup); @@ -2060,7 +2030,6 @@ void serial8250_do_shutdown(struct uart_port *port) struct uart_8250_port *up = up_to_u8250p(port); unsigned long flags; - serial8250_rpm_get(up); /* * Disable interrupts from this port */ @@ -2100,7 +2069,6 @@ void serial8250_do_shutdown(struct uart_port *port) * the IRQ chain. */ serial_port_in(port, UART_RX); - serial8250_rpm_put(up); up->ops->release_irq(up); } @@ -2302,7 +2270,6 @@ serial8250_do_set_termios(struct uart_port *port, struct ktermios *termios, * Ok, we're now changing the port state. Do it with * interrupts disabled. */ - serial8250_rpm_get(up); spin_lock_irqsave(&port->lock, flags); up->lcr = cval; /* Save computed LCR */ @@ -2394,7 +2361,6 @@ serial8250_do_set_termios(struct uart_port *port, struct ktermios *termios, serial8250_do_restore_context(port); spin_unlock_irqrestore(&port->lock, flags); - serial8250_rpm_put(up); /* Don't rewrite B0 */ if (tty_termios_baud_rate(termios)) @@ -2853,6 +2819,11 @@ static void serial8250_console_restore(struct uart_8250_port *up) * any possible real use of the port... * * The console_lock must be held when we get here. + * + * Doing runtime PM is a really bad idea for the kernel console. + * Nevertheless we leave the calls here and allow individual drivers to + * decide how to proceed. + * */ void serial8250_console_write(struct uart_8250_port *up, const char *s, unsigned int count) @@ -2864,7 +2835,9 @@ void serial8250_console_write(struct uart_8250_port *up, const char *s, touch_nmi_watchdog(); - serial8250_rpm_get(up); + /* At early stage device is not created yet, we can't do PM */ + if (port->dev) + serial8250_rpm_get(up); if (port->sysrq) locked = 0; @@ -2910,7 +2883,10 @@ void serial8250_console_write(struct uart_8250_port *up, const char *s, if (locked) spin_unlock_irqrestore(&port->lock, flags); - serial8250_rpm_put(up); + + /* At early stage device is not created yet, we can't do PM */ + if (port->dev) + serial8250_rpm_put(up); } static unsigned int probe_baud(struct uart_port *port) -- 1.9.1 -- _______________________________________________ linux-yocto mailing list linux-yocto@yoctoproject.org https://lists.yoctoproject.org/listinfo/linux-yocto