arm: t12x: force disable console output during LP0
Robert Shih [Tue, 6 Jan 2015 10:38:58 +0000 (18:38 +0800)]
One common reason makes system hang cross LP0 is output
message earlier than uart get enabled.

E.g. Clocks resume is executed in very beginning stage of
LP0 resume and once any error output like PLL lock timeout
will output error message to console and cause system hang.

Due to T124 limitation we can't enable UART in AVP because
we need to clear pmc_dpd_sample after restoring pinmux for
uart and have side-effect to cause glitch. (T210 doesn't
have such problem.)

So suspend console internally/forcibly in late stage of LP0
for T12x and prevent from missing any useful message before
entering LP0.

bug 200015629

Change-Id: I65d98a4e52b25eea5cd0468a57eb12139d3df878
Signed-off-by: Robert Shih <rshih@nvidia.com>
Reviewed-on: http://git-master/r/669658
(cherry picked from commit d99a3152f0b87cf35bf78622256fd9c4024190fa)
Reviewed-on: http://git-master/r/672317
Reviewed-by: Aleksandr Frid <afrid@nvidia.com>
GVS: Gerrit_Virtual_Submit
Reviewed-by: Bharat Nihalani <bnihalani@nvidia.com>
Reviewed-by: Hayden Du <haydend@nvidia.com>

arch/arm/mach-tegra/pm.c
include/linux/console.h
kernel/printk.c

index c2f536e..a1373fb 100644 (file)
@@ -3,7 +3,7 @@
  *
  * CPU complex suspend & resume functions for Tegra SoCs
  *
- * Copyright (c) 2009-2014, NVIDIA CORPORATION.  All rights reserved.
+ * Copyright (c) 2009-2015, NVIDIA CORPORATION.  All rights reserved.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -1029,6 +1029,9 @@ static void tegra_suspend_wake(void)
 #ifdef CONFIG_ARCH_TEGRA_2x_SOC
        enable_irq(INT_SYS_STATS_MON);
 #endif
+#ifdef CONFIG_ARCH_TEGRA_12x_SOC
+       console_enabled = true;
+#endif
 }
 
 static void tegra_pm_set(enum tegra_suspend_mode mode)
@@ -1127,6 +1130,10 @@ static int tegra_suspend_enter(suspend_state_t state)
        ktime_t delta;
        struct timespec ts_entry, ts_exit;
 
+#ifdef CONFIG_ARCH_TEGRA_12x_SOC
+       console_enabled = false;
+#endif
+
        if (pdata && pdata->board_suspend)
                pdata->board_suspend(current_suspend_mode, TEGRA_SUSPEND_BEFORE_PERIPHERAL);
 
@@ -1155,6 +1162,11 @@ abort_suspend:
        if (pdata && pdata->board_resume)
                pdata->board_resume(current_suspend_mode, TEGRA_RESUME_AFTER_PERIPHERAL);
 
+#ifdef CONFIG_ARCH_TEGRA_12x_SOC
+       if (ret)
+               console_enabled = true;
+#endif
+
        return ret;
 }
 
index 73bab0f..521eb98 100644 (file)
@@ -167,6 +167,7 @@ static inline void console_sysfs_notify(void)
 { }
 #endif
 extern bool console_suspend_enabled;
+extern bool console_enabled;
 
 /* Suspend and resume console messages over PM events */
 extern void suspend_console(void);
index 1ebf81c..67f72f5 100644 (file)
@@ -1329,6 +1329,8 @@ static int have_callable_console(void)
        return 0;
 }
 
+bool console_enabled = 1;
+
 /*
  * Can we actually use the console at this time on this cpu?
  *
@@ -1339,7 +1341,7 @@ static int have_callable_console(void)
  */
 static inline int can_use_console(unsigned int cpu)
 {
-       return cpu_online(cpu) || have_callable_console();
+       return console_enabled && (cpu_online(cpu) || have_callable_console());
 }
 
 /*