aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/tty
diff options
context:
space:
mode:
authorFelipe Balbi <balbi@ti.com>2012-09-06 08:45:26 -0400
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2012-09-06 12:17:01 -0400
commit660ac5f48a64026ad54c77d06f8360544e84dc84 (patch)
treedda250aa4856567c3f884232b9457b34fe327cf4 /drivers/tty
parentbf63a0862c964f9015d0d8e3c2ccca7005eebea2 (diff)
serial: omap: stick to put_autosuspend
Everytime we're done using our TTY, we want the pm timer to be reinitilized. By sticking to pm_runtime_pm_autosuspend() we make sure that this will always be the case. The idea behind this patch is to make sure we will always reinitialize the pm timer so that we don't fall into a situation where pm_runtime_put() expires right away (if timer was already about to expire when we made the call to pm_runtime_put()). While suspending right away wouldn't cause any issues, reinitializing the pm timer can help us avoiding unnecessary context save & restore operations (which are somewhat expensive) if there's another read/write/set_termios request coming right after. IOW, we are trying to make sure UART is still powered up while it's still under heavy usage. Tested-by: Shubhrajyoti D <shubhrajyoti@ti.com> Acked-by: Santosh Shilimkar <santosh.shilimkar@ti.com> Signed-off-by: Felipe Balbi <balbi@ti.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/tty')
-rw-r--r--drivers/tty/serial/omap-serial.c33
1 files changed, 22 insertions, 11 deletions
diff --git a/drivers/tty/serial/omap-serial.c b/drivers/tty/serial/omap-serial.c
index d3fbb70a8e8a..b2043df42a4f 100644
--- a/drivers/tty/serial/omap-serial.c
+++ b/drivers/tty/serial/omap-serial.c
@@ -165,7 +165,8 @@ static void serial_omap_enable_ms(struct uart_port *port)
165 pm_runtime_get_sync(up->dev); 165 pm_runtime_get_sync(up->dev);
166 up->ier |= UART_IER_MSI; 166 up->ier |= UART_IER_MSI;
167 serial_out(up, UART_IER, up->ier); 167 serial_out(up, UART_IER, up->ier);
168 pm_runtime_put(up->dev); 168 pm_runtime_mark_last_busy(up->dev);
169 pm_runtime_put_autosuspend(up->dev);
169} 170}
170 171
171static void serial_omap_stop_tx(struct uart_port *port) 172static void serial_omap_stop_tx(struct uart_port *port)
@@ -415,7 +416,8 @@ static unsigned int serial_omap_tx_empty(struct uart_port *port)
415 spin_lock_irqsave(&up->port.lock, flags); 416 spin_lock_irqsave(&up->port.lock, flags);
416 ret = serial_in(up, UART_LSR) & UART_LSR_TEMT ? TIOCSER_TEMT : 0; 417 ret = serial_in(up, UART_LSR) & UART_LSR_TEMT ? TIOCSER_TEMT : 0;
417 spin_unlock_irqrestore(&up->port.lock, flags); 418 spin_unlock_irqrestore(&up->port.lock, flags);
418 pm_runtime_put(up->dev); 419 pm_runtime_mark_last_busy(up->dev);
420 pm_runtime_put_autosuspend(up->dev);
419 return ret; 421 return ret;
420} 422}
421 423
@@ -427,7 +429,8 @@ static unsigned int serial_omap_get_mctrl(struct uart_port *port)
427 429
428 pm_runtime_get_sync(up->dev); 430 pm_runtime_get_sync(up->dev);
429 status = check_modem_status(up); 431 status = check_modem_status(up);
430 pm_runtime_put(up->dev); 432 pm_runtime_mark_last_busy(up->dev);
433 pm_runtime_put_autosuspend(up->dev);
431 434
432 dev_dbg(up->port.dev, "serial_omap_get_mctrl+%d\n", up->port.line); 435 dev_dbg(up->port.dev, "serial_omap_get_mctrl+%d\n", up->port.line);
433 436
@@ -463,7 +466,8 @@ static void serial_omap_set_mctrl(struct uart_port *port, unsigned int mctrl)
463 up->mcr = serial_in(up, UART_MCR); 466 up->mcr = serial_in(up, UART_MCR);
464 up->mcr |= mcr; 467 up->mcr |= mcr;
465 serial_out(up, UART_MCR, up->mcr); 468 serial_out(up, UART_MCR, up->mcr);
466 pm_runtime_put(up->dev); 469 pm_runtime_mark_last_busy(up->dev);
470 pm_runtime_put_autosuspend(up->dev);
467 471
468 if (gpio_is_valid(up->DTR_gpio) && 472 if (gpio_is_valid(up->DTR_gpio) &&
469 !!(mctrl & TIOCM_DTR) != up->DTR_active) { 473 !!(mctrl & TIOCM_DTR) != up->DTR_active) {
@@ -490,7 +494,8 @@ static void serial_omap_break_ctl(struct uart_port *port, int break_state)
490 up->lcr &= ~UART_LCR_SBC; 494 up->lcr &= ~UART_LCR_SBC;
491 serial_out(up, UART_LCR, up->lcr); 495 serial_out(up, UART_LCR, up->lcr);
492 spin_unlock_irqrestore(&up->port.lock, flags); 496 spin_unlock_irqrestore(&up->port.lock, flags);
493 pm_runtime_put(up->dev); 497 pm_runtime_mark_last_busy(up->dev);
498 pm_runtime_put_autosuspend(up->dev);
494} 499}
495 500
496static int serial_omap_startup(struct uart_port *port) 501static int serial_omap_startup(struct uart_port *port)
@@ -588,7 +593,8 @@ static void serial_omap_shutdown(struct uart_port *port)
588 if (serial_in(up, UART_LSR) & UART_LSR_DR) 593 if (serial_in(up, UART_LSR) & UART_LSR_DR)
589 (void) serial_in(up, UART_RX); 594 (void) serial_in(up, UART_RX);
590 595
591 pm_runtime_put(up->dev); 596 pm_runtime_mark_last_busy(up->dev);
597 pm_runtime_put_autosuspend(up->dev);
592 free_irq(up->port.irq, up); 598 free_irq(up->port.irq, up);
593} 599}
594 600
@@ -862,7 +868,8 @@ serial_omap_set_termios(struct uart_port *port, struct ktermios *termios,
862 serial_omap_configure_xonxoff(up, termios); 868 serial_omap_configure_xonxoff(up, termios);
863 869
864 spin_unlock_irqrestore(&up->port.lock, flags); 870 spin_unlock_irqrestore(&up->port.lock, flags);
865 pm_runtime_put(up->dev); 871 pm_runtime_mark_last_busy(up->dev);
872 pm_runtime_put_autosuspend(up->dev);
866 dev_dbg(up->port.dev, "serial_omap_set_termios+%d\n", up->port.line); 873 dev_dbg(up->port.dev, "serial_omap_set_termios+%d\n", up->port.line);
867} 874}
868 875
@@ -893,7 +900,8 @@ serial_omap_pm(struct uart_port *port, unsigned int state,
893 pm_runtime_allow(up->dev); 900 pm_runtime_allow(up->dev);
894 } 901 }
895 902
896 pm_runtime_put(up->dev); 903 pm_runtime_mark_last_busy(up->dev);
904 pm_runtime_put_autosuspend(up->dev);
897} 905}
898 906
899static void serial_omap_release_port(struct uart_port *port) 907static void serial_omap_release_port(struct uart_port *port)
@@ -975,7 +983,8 @@ static void serial_omap_poll_put_char(struct uart_port *port, unsigned char ch)
975 pm_runtime_get_sync(up->dev); 983 pm_runtime_get_sync(up->dev);
976 wait_for_xmitr(up); 984 wait_for_xmitr(up);
977 serial_out(up, UART_TX, ch); 985 serial_out(up, UART_TX, ch);
978 pm_runtime_put(up->dev); 986 pm_runtime_mark_last_busy(up->dev);
987 pm_runtime_put_autosuspend(up->dev);
979} 988}
980 989
981static int serial_omap_poll_get_char(struct uart_port *port) 990static int serial_omap_poll_get_char(struct uart_port *port)
@@ -989,7 +998,8 @@ static int serial_omap_poll_get_char(struct uart_port *port)
989 return NO_POLL_CHAR; 998 return NO_POLL_CHAR;
990 999
991 status = serial_in(up, UART_RX); 1000 status = serial_in(up, UART_RX);
992 pm_runtime_put(up->dev); 1001 pm_runtime_mark_last_busy(up->dev);
1002 pm_runtime_put_autosuspend(up->dev);
993 return status; 1003 return status;
994} 1004}
995 1005
@@ -1340,7 +1350,8 @@ static int serial_omap_probe(struct platform_device *pdev)
1340 if (ret != 0) 1350 if (ret != 0)
1341 goto err_add_port; 1351 goto err_add_port;
1342 1352
1343 pm_runtime_put(&pdev->dev); 1353 pm_runtime_mark_last_busy(up->dev);
1354 pm_runtime_put_autosuspend(up->dev);
1344 platform_set_drvdata(pdev, up); 1355 platform_set_drvdata(pdev, up);
1345 return 0; 1356 return 0;
1346 1357