serial: sirf: add serial loopback function support
authorQipan Li <Qipan.Li@csr.com>
Thu, 14 May 2015 06:45:25 +0000 (06:45 +0000)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sun, 24 May 2015 19:50:41 +0000 (12:50 -0700)
Signed-off-by: Qipan Li <Qipan.Li@csr.com>
Signed-off-by: Barry Song <Baohua.Song@csr.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/tty/serial/sirfsoc_uart.c
drivers/tty/serial/sirfsoc_uart.h

index a5007216338d0229470407ee774f3f389d966955..0e43799397039310c53e85a448734bca084046ae 100644 (file)
@@ -108,6 +108,26 @@ static void sirfsoc_uart_set_mctrl(struct uart_port *port, unsigned int mctrl)
        unsigned int val = assert ? SIRFUART_AFC_CTRL_RX_THD : 0x0;
        unsigned int current_val;
 
+       if (mctrl & TIOCM_LOOP) {
+               if (sirfport->uart_reg->uart_type == SIRF_REAL_UART)
+                       wr_regl(port, ureg->sirfsoc_line_ctrl,
+                               rd_regl(port, ureg->sirfsoc_line_ctrl) |
+                               SIRFUART_LOOP_BACK);
+               else
+                       wr_regl(port, ureg->sirfsoc_mode1,
+                               rd_regl(port, ureg->sirfsoc_mode1) |
+                               SIRFSOC_USP_LOOP_BACK_CTRL);
+       } else {
+               if (sirfport->uart_reg->uart_type == SIRF_REAL_UART)
+                       wr_regl(port, ureg->sirfsoc_line_ctrl,
+                               rd_regl(port, ureg->sirfsoc_line_ctrl) &
+                               ~SIRFUART_LOOP_BACK);
+               else
+                       wr_regl(port, ureg->sirfsoc_mode1,
+                               rd_regl(port, ureg->sirfsoc_mode1) &
+                               ~SIRFSOC_USP_LOOP_BACK_CTRL);
+       }
+
        if (!sirfport->hw_flow_ctrl || !sirfport->ms_enabled)
                return;
        if (sirfport->uart_reg->uart_type == SIRF_REAL_UART) {
index b49c23a94ee8be57995fea531835e7b0426bdbfa..3ab3141e1aae0733907673b4878f4bb9a8ff2313 100644 (file)
@@ -322,7 +322,7 @@ struct sirfsoc_uart_register sirfsoc_uart = {
 #define SIRFSOC_USP_RX_CLK_DIVISOR_OFFSET      24
 #define SIRFSOC_USP_ASYNC_DIV2_MASK            0x3f
 #define SIRFSOC_USP_ASYNC_DIV2_OFFSET          16
-
+#define SIRFSOC_USP_LOOP_BACK_CTRL             BIT(2)
 /* USP-UART Common */
 #define SIRFSOC_UART_RX_TIMEOUT(br, to)        (((br) * (((to) + 999) / 1000)) / 1000)
 #define SIRFUART_RECV_TIMEOUT_VALUE(x) \