diff --git a/arch/arm/mach-tegra/common.c b/arch/arm/mach-tegra/common.c index 2fdb99b6fdc5..12ce86b7ab9c 100644 --- a/arch/arm/mach-tegra/common.c +++ b/arch/arm/mach-tegra/common.c @@ -17,6 +17,7 @@ * */ +#include #include #include #include @@ -25,6 +26,7 @@ #include #include +#include #include #include @@ -98,8 +100,41 @@ static void __init tegra_init_power(void) tegra_powergate_power_off(TEGRA_POWERGATE_3D); } +static bool console_flushed; + +static void tegra_pm_flush_console(void) +{ + if (console_flushed) + return; + console_flushed = true; + + printk("\n"); + pr_emerg("Restarting %s\n", linux_banner); + if (!try_acquire_console_sem()) { + release_console_sem(); + return; + } + + mdelay(50); + + local_irq_disable(); + if (try_acquire_console_sem()) + pr_emerg("tegra_restart: Console was locked! Busting\n"); + else + pr_emerg("tegra_restart: Console was locked!\n"); + release_console_sem(); +} + +static void tegra_pm_restart(char mode, const char *cmd) +{ + tegra_pm_flush_console(); + arm_machine_restart(mode, cmd); +} + void __init tegra_common_init(void) { + arm_pm_restart = tegra_pm_restart; + tegra_init_fuse(); tegra_init_clock(); tegra_clk_init_from_table(common_clk_init_table);