aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/tty
diff options
context:
space:
mode:
authorPaul Walmsley <paul@pwsan.com>2012-01-25 21:50:36 -0500
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2012-02-09 13:48:32 -0500
commit0ba5f66836c9253c67c469fb4016f94ea30ff2ce (patch)
treedf0c699312cd9de2d97164034971f0e3988554bd /drivers/tty
parentc8a64268d187b2ace478d2147ce5c79658aca2d2 (diff)
tty: serial: OMAP: use a 1-byte RX FIFO threshold in PIO mode
In the (default) PIO mode, use a one-byte RX FIFO threshold. The OMAP UART IP blocks do not appear to be capable of waking the system under an RX timeout condition. Since the previous RX FIFO threshold was 16 bytes, this meant that omap-serial.c did not become aware of any received data until all those bytes arrived or until another UART interrupt occurred. This made the serial console and presumably other serial applications (GPS, serial Bluetooth) unusable or extremely slow. A 1-byte RX FIFO threshold also allows the MPU to enter a low-power consumption state while waiting for the FIFO to fill. This can be verified using the serial console by comparing the behavior when "0123456789abcde" is pasted in from another window, with the behavior when "0123456789abcdef" is pasted in. Since the former string is less than sixteen bytes long, the string is not echoed for some time, while the latter string is echoed immediately. DMA operation is unaffected by this patch. Thanks to Russell King - ARM Linux <linux@arm.linux.org.uk> for some additional information on the standard behavior of the RX timeout event, which was used to improve this commit description. Signed-off-by: Paul Walmsley <paul@pwsan.com> Cc: Tomi Valkeinen <tomi.valkeinen@ti.com> Cc: Govindraj Raja <govindraj.r@ti.com> Cc: Alan Cox <alan@linux.intel.com> Cc: Russell King <linux@arm.linux.org.uk> Reviewed-by: Kevin Hilman <khilman@ti.com> Tested-by: Kevin Hilman <khilman@ti.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/tty')
-rw-r--r--drivers/tty/serial/omap-serial.c20
1 files changed, 17 insertions, 3 deletions
diff --git a/drivers/tty/serial/omap-serial.c b/drivers/tty/serial/omap-serial.c
index 1c2426931484..a3f5ea46f345 100644
--- a/drivers/tty/serial/omap-serial.c
+++ b/drivers/tty/serial/omap-serial.c
@@ -46,6 +46,13 @@
46 46
47#define DEFAULT_CLK_SPEED 48000000 /* 48Mhz*/ 47#define DEFAULT_CLK_SPEED 48000000 /* 48Mhz*/
48 48
49/* SCR register bitmasks */
50#define OMAP_UART_SCR_RX_TRIG_GRANU1_MASK (1 << 7)
51
52/* FCR register bitmasks */
53#define OMAP_UART_FCR_RX_FIFO_TRIG_SHIFT 6
54#define OMAP_UART_FCR_RX_FIFO_TRIG_MASK (0x3 << 6)
55
49static struct uart_omap_port *ui[OMAP_MAX_HSUART_PORTS]; 56static struct uart_omap_port *ui[OMAP_MAX_HSUART_PORTS];
50 57
51/* Forward declaration of functions */ 58/* Forward declaration of functions */
@@ -811,14 +818,21 @@ serial_omap_set_termios(struct uart_port *port, struct ktermios *termios,
811 up->mcr = serial_in(up, UART_MCR); 818 up->mcr = serial_in(up, UART_MCR);
812 serial_out(up, UART_MCR, up->mcr | UART_MCR_TCRTLR); 819 serial_out(up, UART_MCR, up->mcr | UART_MCR_TCRTLR);
813 /* FIFO ENABLE, DMA MODE */ 820 /* FIFO ENABLE, DMA MODE */
814 serial_out(up, UART_FCR, up->fcr); 821
815 serial_out(up, UART_LCR, UART_LCR_CONF_MODE_B); 822 up->scr |= OMAP_UART_SCR_RX_TRIG_GRANU1_MASK;
816 823
817 if (up->use_dma) { 824 if (up->use_dma) {
818 serial_out(up, UART_TI752_TLR, 0); 825 serial_out(up, UART_TI752_TLR, 0);
819 up->scr |= (UART_FCR_TRIGGER_4 | UART_FCR_TRIGGER_8); 826 up->scr |= UART_FCR_TRIGGER_4;
827 } else {
828 /* Set receive FIFO threshold to 1 byte */
829 up->fcr &= ~OMAP_UART_FCR_RX_FIFO_TRIG_MASK;
830 up->fcr |= (0x1 << OMAP_UART_FCR_RX_FIFO_TRIG_SHIFT);
820 } 831 }
821 832
833 serial_out(up, UART_FCR, up->fcr);
834 serial_out(up, UART_LCR, UART_LCR_CONF_MODE_B);
835
822 serial_out(up, UART_OMAP_SCR, up->scr); 836 serial_out(up, UART_OMAP_SCR, up->scr);
823 837
824 serial_out(up, UART_EFR, up->efr); 838 serial_out(up, UART_EFR, up->efr);