diff options
author | Bo Yan <byan@nvidia.com> | 2011-04-18 17:04:47 -0700 |
---|---|---|
committer | Dan Willemsen <dwillemsen@nvidia.com> | 2011-11-30 21:42:32 -0800 |
commit | df2009abf96414d23278f5342296d645b43a9fde (patch) | |
tree | 2438322a8f644b6dce863970390a19ebd33f5af8 /arch/arm/mach-tegra/common.c | |
parent | 59c7b7b5b71f1b7328e0ae29c069a4d4888b712e (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
Diffstat (limited to 'arch/arm/mach-tegra/common.c')
-rw-r--r-- | arch/arm/mach-tegra/common.c | 18 |
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(); |