summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBo Yan <byan@nvidia.com>2011-04-18 17:04:47 -0700
committerDan Willemsen <dwillemsen@nvidia.com>2011-11-30 21:42:32 -0800
commitdf2009abf96414d23278f5342296d645b43a9fde (patch)
tree2438322a8f644b6dce863970390a19ebd33f5af8
parent59c7b7b5b71f1b7328e0ae29c069a4d4888b712e (diff)
ARM: tegra: flush serial console earlier in reboot
This is to make sure this function will not cause any lock-up during actual reboot Original-Change-Id: I68333adaf36b6da663ff8e6ec369d8ed2afc64b7 Reviewed-on: http://git-master/r/28345 Reviewed-by: Varun Colbert <vcolbert@nvidia.com> Tested-by: Varun Colbert <vcolbert@nvidia.com> Original-Change-Id: I2195805562d762c2cee39c216b8f9d81ad9b7e46 Rebase-Id: R18df606a2f33cdc8611ed1b17ba044e8c9c5122a
-rw-r--r--arch/arm/mach-tegra/common.c18
1 files changed, 14 insertions, 4 deletions
diff --git a/arch/arm/mach-tegra/common.c b/arch/arm/mach-tegra/common.c
index d33d8a7b9cb4..c6b6aaca5d21 100644
--- a/arch/arm/mach-tegra/common.c
+++ b/arch/arm/mach-tegra/common.c
@@ -25,6 +25,9 @@
#include <linux/delay.h>
#include <linux/highmem.h>
#include <linux/memblock.h>
+#include <linux/notifier.h>
+#include <linux/reboot.h>
+#include <linux/mqueue.h>
#include <asm/hardware/cache-l2x0.h>
#include <asm/system.h>
@@ -157,17 +160,19 @@ static void __init tegra_init_power(void)
static bool console_flushed;
-static void tegra_pm_flush_console(void)
+static int tegra_pm_flush_console(struct notifier_block *this,
+ unsigned long code,
+ void *unused)
{
if (console_flushed)
- return;
+ return NOTIFY_NONE;
console_flushed = true;
printk("\n");
pr_emerg("Restarting %s\n", linux_banner);
if (console_trylock()) {
console_unlock();
- return;
+ return NOTIFY_NONE;
}
mdelay(50);
@@ -178,17 +183,22 @@ static void tegra_pm_flush_console(void)
else
pr_emerg("tegra_restart: Console was locked!\n");
console_unlock();
+ return NOTIFY_NONE;
}
+static struct notifier_block tegra_reboot_notifier = {
+ .notifier_call = tegra_pm_flush_console,
+};
+
static void tegra_pm_restart(char mode, const char *cmd)
{
- tegra_pm_flush_console();
arm_machine_restart(mode, cmd);
}
void __init tegra_init_early(void)
{
arm_pm_restart = tegra_pm_restart;
+ register_reboot_notifier(&tegra_reboot_notifier);
tegra_init_fuse();
tegra_gpio_resume_init();
tegra_init_clock();