rk_fiq_debugger: Reset and set uart to loopback mode before init
authorHuibin Hong <huibin.hong@rock-chips.com>
Mon, 26 Sep 2016 08:09:10 +0000 (16:09 +0800)
committerHuang, Tao <huangtao@rock-chips.com>
Mon, 26 Sep 2016 10:33:23 +0000 (18:33 +0800)
The uart may be reinitialized when resume, if uart is in busy
state, which would fail to configure the baud rate. So reset
and set uart to loopback mode can make sure uart is in idle
state.

Change-Id: I54d9ac8de1531cd06da8c223583cd2e330178eff
Signed-off-by: Huibin Hong <huibin.hong@rock-chips.com>
drivers/soc/rockchip/rk_fiq_debugger.c

index e6f960894b89e844a24cf48110f952f10312cc3c..d9d798f0d3c1ad82ead1c667a3acbbe417ffe704 100755 (executable)
@@ -36,6 +36,7 @@
 #include <../drivers/staging/android/fiq_debugger/fiq_debugger.h>
 #include <linux/irqchip/arm-gic.h>
 #include <linux/clk.h>
+#include <linux/delay.h>
 #include <linux/soc/rockchip/rk_fiq_debugger.h>
 
 #ifdef CONFIG_FIQ_DEBUGGER_EL3_TO_EL1
@@ -48,6 +49,7 @@
 #define UART_USR_TX_FIFO_EMPTY         0x04 /* Transmit FIFO empty */
 #define UART_USR_TX_FIFO_NOT_FULL      0x02 /* Transmit FIFO not full */
 #define UART_USR_BUSY                  0x01 /* UART busy indicator */
+#define UART_SRR                       0x22 /* software reset register */
 
 struct rk_fiq_debugger {
        int irq;
@@ -102,6 +104,11 @@ static int debug_port_init(struct platform_device *pdev)
                dll = 0xd;
                break;
        }
+       /* reset uart */
+       rk_fiq_write(t, 0x07, UART_SRR);
+       udelay(10);
+       /* set uart to loop back mode */
+       rk_fiq_write(t, 0x10, UART_MCR);
 
        rk_fiq_write(t, 0x83, UART_LCR);
        /* set baud rate */
@@ -118,6 +125,7 @@ static int debug_port_init(struct platform_device *pdev)
        found unregistered, so it is disable.
        hhb@rock-chips.com */
        rk_fiq_write(t, 0xc1, UART_FCR);
+       rk_fiq_write(t, 0x0, UART_MCR);
 
        return 0;
 }