These changes are the raw update to linux-4.4.6-rt14. Kernel sources
[kvmfornfv.git] / kernel / arch / arm / mach-tegra / cpuidle-tegra114.c
index 155807f..9157546 100644 (file)
@@ -24,6 +24,7 @@
 #include <asm/cpuidle.h>
 #include <asm/smp_plat.h>
 #include <asm/suspend.h>
+#include <asm/psci.h>
 
 #include "pm.h"
 #include "sleep.h"
@@ -44,16 +45,12 @@ static int tegra114_idle_power_down(struct cpuidle_device *dev,
        tegra_set_cpu_in_lp2();
        cpu_pm_enter();
 
-       tick_broadcast_enter();
-
        call_firmware_op(prepare_idle);
 
        /* Do suspend by ourselves if the firmware does not implement it */
        if (call_firmware_op(do_idle, 0) == -ENOSYS)
                cpu_suspend(0, tegra30_sleep_cpu_secondary_finish);
 
-       tick_broadcast_exit();
-
        cpu_pm_exit();
        tegra_clear_cpu_in_lp2();
 
@@ -61,6 +58,13 @@ static int tegra114_idle_power_down(struct cpuidle_device *dev,
 
        return index;
 }
+
+static void tegra114_idle_enter_freeze(struct cpuidle_device *dev,
+                                      struct cpuidle_driver *drv,
+                                      int index)
+{
+       tegra114_idle_power_down(dev, drv, index);
+}
 #endif
 
 static struct cpuidle_driver tegra_idle_driver = {
@@ -72,8 +76,10 @@ static struct cpuidle_driver tegra_idle_driver = {
 #ifdef CONFIG_PM_SLEEP
                [1] = {
                        .enter                  = tegra114_idle_power_down,
+                       .enter_freeze           = tegra114_idle_enter_freeze,
                        .exit_latency           = 500,
                        .target_residency       = 1000,
+                       .flags                  = CPUIDLE_FLAG_TIMER_STOP,
                        .power_usage            = 0,
                        .name                   = "powered-down",
                        .desc                   = "CPU power gated",
@@ -84,5 +90,8 @@ static struct cpuidle_driver tegra_idle_driver = {
 
 int __init tegra114_cpuidle_init(void)
 {
-       return cpuidle_register(&tegra_idle_driver, NULL);
+       if (!psci_smp_available())
+               return cpuidle_register(&tegra_idle_driver, NULL);
+
+       return 0;
 }