ARM: psci: cpuidle: Enable PSCI CPUidle driver
authorLorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Fri, 9 Aug 2019 11:03:11 +0000 (12:03 +0100)
committerWill Deacon <will@kernel.org>
Fri, 9 Aug 2019 16:51:39 +0000 (17:51 +0100)
Allow selection of the PSCI CPUidle in the kernel by updating
the respective Kconfig entry.

Remove PSCI callbacks from ARM/ARM64 generic CPU ops
to prevent the PSCI idle driver from clashing with the generic
ARM CPUidle driver initialization, that relies on CPU ops
to initialize and enter idle states.

Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Reviewed-by: Ulf Hansson <ulf.hansson@linaro.org>
Cc: Will Deacon <will@kernel.org>
Cc: Ulf Hansson <ulf.hansson@linaro.org>
Cc: Sudeep Holla <sudeep.holla@arm.com>
Cc: Daniel Lezcano <daniel.lezcano@linaro.org>
Cc: Catalin Marinas <catalin.marinas@arm.com>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: "Rafael J. Wysocki" <rjw@rjwysocki.net>
Signed-off-by: Will Deacon <will@kernel.org>
arch/arm64/kernel/cpuidle.c
arch/arm64/kernel/psci.c
drivers/cpuidle/Kconfig.arm
drivers/firmware/psci/psci.c

index d1048173fd8a1bdcf77b607def93b4d629dae71c..619e0ebb8399f2a81aaac721a1d413489f64a6f0 100644 (file)
@@ -11,6 +11,7 @@
 #include <linux/cpu_pm.h>
 #include <linux/of.h>
 #include <linux/of_device.h>
+#include <linux/psci.h>
 
 #include <asm/cpuidle.h>
 #include <asm/cpu_ops.h>
@@ -48,15 +49,15 @@ int arm_cpuidle_suspend(int index)
 
 int acpi_processor_ffh_lpi_probe(unsigned int cpu)
 {
-       return arm_cpuidle_init(cpu);
+       return psci_cpu_init_idle(cpu);
 }
 
 int acpi_processor_ffh_lpi_enter(struct acpi_lpi_state *lpi)
 {
        if (ARM64_LPI_IS_RETENTION_STATE(lpi->arch_flags))
-               return CPU_PM_CPU_IDLE_ENTER_RETENTION(arm_cpuidle_suspend,
+               return CPU_PM_CPU_IDLE_ENTER_RETENTION(psci_cpu_suspend_enter,
                                                lpi->index);
        else
-               return CPU_PM_CPU_IDLE_ENTER(arm_cpuidle_suspend, lpi->index);
+               return CPU_PM_CPU_IDLE_ENTER(psci_cpu_suspend_enter, lpi->index);
 }
 #endif
index 85ee7d07889e785c6128a09e1b04dbe5639695eb..a543ab7e007cc562158f8990e1421e0db0b51866 100644 (file)
@@ -105,10 +105,6 @@ static int cpu_psci_cpu_kill(unsigned int cpu)
 
 const struct cpu_operations cpu_psci_ops = {
        .name           = "psci",
-#ifdef CONFIG_CPU_IDLE
-       .cpu_init_idle  = psci_cpu_init_idle,
-       .cpu_suspend    = psci_cpu_suspend_enter,
-#endif
        .cpu_init       = cpu_psci_cpu_init,
        .cpu_prepare    = cpu_psci_cpu_prepare,
        .cpu_boot       = cpu_psci_cpu_boot,
index eb014aa5ce6b9dd27129b81ab96e07244245e59f..d8530475493cb552e308021b449aaab3d12c5382 100644 (file)
@@ -14,7 +14,7 @@ config ARM_CPUIDLE
           provided by architecture code.
 
 config ARM_PSCI_CPUIDLE
-       bool
+       bool "PSCI CPU idle Driver"
        depends on ARM_PSCI_FW
        select DT_IDLE_STATES
        select CPU_IDLE_MULTIPLE_DRIVERS
index f82ccd39a913f2c4b8fe726b79b8b04c52ccd3b5..b343f8a34c6ac38c901fab6094d529c0aee9d636 100644 (file)
@@ -436,16 +436,6 @@ int psci_cpu_suspend_enter(unsigned long index)
 
        return ret;
 }
-
-/* ARM specific CPU idle operations */
-#ifdef CONFIG_ARM
-static const struct cpuidle_ops psci_cpuidle_ops __initconst = {
-       .suspend = psci_cpu_suspend_enter,
-       .init = psci_dt_cpu_init_idle,
-};
-
-CPUIDLE_METHOD_OF_DECLARE(psci, "psci", &psci_cpuidle_ops);
-#endif
 #endif
 
 static int psci_system_suspend(unsigned long unused)