aboutsummaryrefslogtreecommitdiff
path: root/drivers/serial
diff options
context:
space:
mode:
authorStephan Gerhold <stephan@gerhold.net>2021-07-14 10:56:26 +0200
committerTom Rini <trini@konsulko.com>2021-07-23 18:53:46 -0400
commitad7e967738a9c639e07cf50b83ffccdf9a8537b0 (patch)
treea8b752dd4bbbdf924b95d0a3b0a59b0bdf505492 /drivers/serial
parentccb8de2387c66b61bb8b974dea9018a8ab63d847 (diff)
downloadu-boot-ad7e967738a9c639e07cf50b83ffccdf9a8537b0.zip
u-boot-ad7e967738a9c639e07cf50b83ffccdf9a8537b0.tar.gz
u-boot-ad7e967738a9c639e07cf50b83ffccdf9a8537b0.tar.bz2
serial: serial_msm: Delay initialization to let pins stabilize
For some reason, the DragonBoard 410c aborts autoboot immediately if U-Boot is started without LK. It looks like it picks up a single broken character via serial and therefore believes a key was pressed to abort autoboot. After some debugging, it seems like adding some delay after pinctrl setup but before UART initialization fixes the issue. It's also worth mentioning that unlike when booting from LK, the pinctrl setup is actually necessary when booting U-Boot without LK since UART is broken if the pinctrl line is removed. I suspect that reconfiguring the pins might take some time to stabilize and if the UART controller is enabled too quickly it will pick up some random noise. Adding a few milliseconds of delay fixes the issue and shouldn't have any other negative side effects. 3ms seems to be the minimum delay required in my tests, use 5ms instead just to be sure. Signed-off-by: Stephan Gerhold <stephan@gerhold.net>
Diffstat (limited to 'drivers/serial')
-rw-r--r--drivers/serial/serial_msm.c4
1 files changed, 4 insertions, 0 deletions
diff --git a/drivers/serial/serial_msm.c b/drivers/serial/serial_msm.c
index d8dd5c1..ac4d082 100644
--- a/drivers/serial/serial_msm.c
+++ b/drivers/serial/serial_msm.c
@@ -18,6 +18,7 @@
#include <asm/global_data.h>
#include <asm/io.h>
#include <linux/compiler.h>
+#include <linux/delay.h>
#include <dm/pinctrl.h>
/* Serial registers - this driver works in uartdm mode*/
@@ -193,6 +194,9 @@ static int msm_uart_clk_init(struct udevice *dev)
static void uart_dm_init(struct msm_serial_data *priv)
{
+ /* Delay initialization for a bit to let pins stabilize if necessary */
+ mdelay(5);
+
writel(priv->clk_bit_rate, priv->base + UARTDM_CSR);
writel(0x0, priv->base + UARTDM_MR1);
writel(MSM_BOOT_UART_DM_8_N_1_MODE, priv->base + UARTDM_MR2);