cpuidle: Make drivers initialize polling state
authorRafael J. Wysocki <rafael.j.wysocki@intel.com>
Tue, 29 Aug 2017 01:14:37 +0000 (03:14 +0200)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Wed, 30 Aug 2017 01:06:33 +0000 (03:06 +0200)
Make the drivers that want to include the polling state into their
states table initialize it explicitly and drop the initialization of
it (which in fact is conditional, but that is not obvious from the
code) from the core.

Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Tested-by: Sudeep Holla <sudeep.holla@arm.com>
Acked-by: Daniel Lezcano <daniel.lezcano@linaro.org>
drivers/acpi/processor_idle.c
drivers/cpuidle/driver.c
drivers/cpuidle/poll_state.c
drivers/idle/intel_idle.c
include/linux/cpuidle.h

index 39a01ea7a46d8747927a613d22f378fae11662ab..df38e81cc6721fd8d1495493a0b601f5867ecb3d 100644 (file)
@@ -842,7 +842,7 @@ static int acpi_processor_setup_cpuidle_cx(struct acpi_processor *pr,
 
 static int acpi_processor_setup_cstates(struct acpi_processor *pr)
 {
-       int i, count = ACPI_IDLE_STATE_START;
+       int i, count;
        struct acpi_processor_cx *cx;
        struct cpuidle_state *state;
        struct cpuidle_driver *drv = &acpi_idle_driver;
@@ -850,6 +850,13 @@ static int acpi_processor_setup_cstates(struct acpi_processor *pr)
        if (max_cstate == 0)
                max_cstate = 1;
 
+       if (IS_ENABLED(CONFIG_ARCH_HAS_CPU_RELAX)) {
+               cpuidle_poll_state_init(drv);
+               count = 1;
+       } else {
+               count = 0;
+       }
+
        for (i = 1; i < ACPI_PROCESSOR_MAX_POWER && i <= max_cstate; i++) {
                cx = &pr->power.states[i];
 
index 6f694c86f3fa7c9c8c5a2daa606e1b4a481476d2..dc32f34e68d9379dceee6f04795fe81473a8f9ca 100644 (file)
@@ -216,8 +216,6 @@ static int __cpuidle_register_driver(struct cpuidle_driver *drv)
                on_each_cpu_mask(drv->cpumask, cpuidle_setup_broadcast_timer,
                                 (void *)1, 1);
 
-       poll_idle_init(drv);
-
        return 0;
 }
 
index 0db4f72739528d654253efb93c9fbfec57fd2525..7416b16287de040190d28db95f11cc76c4650b87 100644 (file)
@@ -21,7 +21,7 @@ static int __cpuidle poll_idle(struct cpuidle_device *dev,
        return index;
 }
 
-void poll_idle_init(struct cpuidle_driver *drv)
+void cpuidle_poll_state_init(struct cpuidle_driver *drv)
 {
        struct cpuidle_state *state = &drv->states[0];
 
@@ -34,3 +34,4 @@ void poll_idle_init(struct cpuidle_driver *drv)
        state->disabled = false;
        state->flags = CPUIDLE_FLAG_POLLING;
 }
+EXPORT_SYMBOL_GPL(cpuidle_poll_state_init);
index c2ae819a871cb6d8f09412702e46463397f9fc0f..7bf8739e33bc833185a27cbd1249aea70d896fa4 100644 (file)
@@ -1331,6 +1331,7 @@ static void __init intel_idle_cpuidle_driver_init(void)
 
        intel_idle_state_table_update();
 
+       cpuidle_poll_state_init(drv);
        drv->state_count = 1;
 
        for (cstate = 0; cstate < CPUIDLE_STATE_MAX; ++cstate) {
index 561bc536506754605dc813d2a136be05c3d814de..5baacd3a0559c19315f519f6c8077746e40b75b2 100644 (file)
@@ -226,9 +226,9 @@ static inline void cpuidle_coupled_parallel_barrier(struct cpuidle_device *dev,
 #endif
 
 #ifdef CONFIG_ARCH_HAS_CPU_RELAX
-void poll_idle_init(struct cpuidle_driver *drv);
+void cpuidle_poll_state_init(struct cpuidle_driver *drv);
 #else
-static void poll_idle_init(struct cpuidle_driver *drv) {}
+static inline void cpuidle_poll_state_init(struct cpuidle_driver *drv) {}
 #endif
 
 /******************************