• Sebastian Andrzej Siewior's avatar
    tty: serial: 8250_core: add run time pm · d74d5d1b
    Sebastian Andrzej Siewior authored
    While comparing the OMAP-serial and the 8250 part of this I noticed that
    the latter does not use run time-pm. Here are the pieces. It is
    basically a get before first register access and a last_busy + put after
    last access. This has to be enabled from userland _and_ UART_CAP_RPM is
    required for this.
    The runtime PM can usually work transparently in the background however
    there is one exception to this: After serial8250_tx_chars() completes
    there still may be unsent bytes in the FIFO (depending on CPU speed vs
    baud rate + flow control). Even if the TTY-buffer is empty we do not
    want RPM to disable the device because it won't send the remaining
    bytes. Instead we leave serial8250_tx_chars() with RPM enabled and wait
    for the FIFO empty interrupt. Once we enter serial8250_tx_chars() with
    an empty buffer we know that the FIFO is empty and since we are not going
    to send anything, we can disable the device.
    That xchg() is to ensure that serial8250_tx_chars() can be called
    multiple times and only the first invocation will actually invoke the
    runtime PM function. So that the last invocation of __stop_tx() will
    disable runtime pm.
    
    NOTE: do not enable RPM on the device unless you know what you do! If
    the device goes idle, it won't be woken up by incomming RX data _unless_
    there is a wakeup irq configured which is usually the RX pin configure
    for wakeup via the reset module. The RX activity will then wake up the
    device from idle. However the first character is garbage and lost. The
    following bytes will be received once the device is up in time. On the
    beagle board xm (omap3) it takes approx 13ms from the first wakeup byte
    until the first byte that is received properly if the device was in
    core-off.
    
    v5…v8:
    	- drop RPM from serial8250_set_mctrl() it will be used in
    	  restore path which already has RPM active and holds
    	  dev->power.lock
    v4…v5:
    	- add a wrapper around rpm function and introduce UART_CAP_RPM
    	  to ensure RPM put is invoked after the TX FIFO is empty.
    v3…v4:
    	- added runtime to the console code
    	- removed device_may_wakeup() from serial8250_set_sleep()
    
    Cc: mika.westerberg@linux.intel.com
    Reviewed-by: default avatarTony Lindgren <tony@atomide.com>
    Tested-by: default avatarTony Lindgren <tony@atomide.com>
    Signed-off-by: default avatarSebastian Andrzej Siewior <bigeasy@linutronix.de>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    d74d5d1b
8250_core.c 94.7 KB