Merge branch 'cpuidle' into test
authorLen Brown <len.brown@intel.com>
Thu, 23 Oct 2008 03:20:05 +0000 (23:20 -0400)
committerLen Brown <len.brown@intel.com>
Thu, 23 Oct 2008 03:20:05 +0000 (23:20 -0400)
arch/x86/Kconfig
drivers/acpi/processor_idle.c
drivers/cpuidle/cpuidle.c

index ed92864..f8caf04 100644 (file)
@@ -123,6 +123,9 @@ config GENERIC_TIME_VSYSCALL
 config ARCH_HAS_CPU_RELAX
        def_bool y
 
+config ARCH_HAS_DEFAULT_IDLE
+       def_bool y
+
 config ARCH_HAS_CACHE_LINE_SIZE
        def_bool y
 
index cf5b1b7..81b40ed 100644 (file)
@@ -1587,6 +1587,7 @@ static int acpi_idle_enter_bm(struct cpuidle_device *dev,
 
        if (acpi_idle_bm_check()) {
                if (dev->safe_state) {
+                       dev->last_state = dev->safe_state;
                        return dev->safe_state->enter(dev, dev->safe_state);
                } else {
                        local_irq_disable();
index 5ce07b5..bb6e3b3 100644 (file)
@@ -56,7 +56,11 @@ static void cpuidle_idle_call(void)
                if (pm_idle_old)
                        pm_idle_old();
                else
+#if defined(CONFIG_ARCH_HAS_DEFAULT_IDLE)
+                       default_idle();
+#else
                        local_irq_enable();
+#endif
                return;
        }
 
@@ -67,8 +71,11 @@ static void cpuidle_idle_call(void)
        target_state = &dev->states[next_state];
 
        /* enter the state and update stats */
-       dev->last_residency = target_state->enter(dev, target_state);
        dev->last_state = target_state;
+       dev->last_residency = target_state->enter(dev, target_state);
+       if (dev->last_state)
+               target_state = dev->last_state;
+
        target_state->time += (unsigned long long)dev->last_residency;
        target_state->usage++;