mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-15 08:14:15 +08:00
drivers: firmware: psci: Decouple checker from generic ARM CPUidle
The PSCI checker currently relies on the generic ARM CPUidle infrastructure to enter an idle state, which in turn creates a dependency that is not really needed. The PSCI checker code to test PSCI CPU suspend is built on top of the CPUidle framework and can easily reuse the struct cpuidle_state.enter() function (previously initialized by an idle driver, with a PSCI back-end) to trigger an entry into an idle state, decoupling the PSCI checker from the generic ARM CPUidle infrastructure and simplyfing the code in the process. Convert the PSCI checker suspend entry function to use the struct cpuidle_state.enter() function callback. Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com> Acked-by: Daniel Lezcano <daniel.lezcano@linaro.org> Reviewed-by: Ulf Hansson <ulf.hansson@linaro.org> Reviewed-by: Sudeep Holla <sudeep.holla@arm.com> Cc: Sudeep Holla <sudeep.holla@arm.com> Cc: Mark Rutland <mark.rutland@arm.com> Signed-off-by: Will Deacon <will@kernel.org>
This commit is contained in:
parent
6460d7ba48
commit
e76d8b7027
@ -228,8 +228,11 @@ out_free_cpus:
|
|||||||
|
|
||||||
static void dummy_callback(struct timer_list *unused) {}
|
static void dummy_callback(struct timer_list *unused) {}
|
||||||
|
|
||||||
static int suspend_cpu(int index, bool broadcast)
|
static int suspend_cpu(struct cpuidle_device *dev,
|
||||||
|
struct cpuidle_driver *drv, int index)
|
||||||
{
|
{
|
||||||
|
struct cpuidle_state *state = &drv->states[index];
|
||||||
|
bool broadcast = state->flags & CPUIDLE_FLAG_TIMER_STOP;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
arch_cpu_idle_enter();
|
arch_cpu_idle_enter();
|
||||||
@ -254,11 +257,7 @@ static int suspend_cpu(int index, bool broadcast)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
ret = state->enter(dev, drv, index);
|
||||||
* Replicate the common ARM cpuidle enter function
|
|
||||||
* (arm_enter_idle_state).
|
|
||||||
*/
|
|
||||||
ret = CPU_PM_CPU_IDLE_ENTER(arm_cpuidle_suspend, index);
|
|
||||||
|
|
||||||
if (broadcast)
|
if (broadcast)
|
||||||
tick_broadcast_exit();
|
tick_broadcast_exit();
|
||||||
@ -301,9 +300,8 @@ static int suspend_test_thread(void *arg)
|
|||||||
* doesn't use PSCI).
|
* doesn't use PSCI).
|
||||||
*/
|
*/
|
||||||
for (index = 1; index < drv->state_count; ++index) {
|
for (index = 1; index < drv->state_count; ++index) {
|
||||||
struct cpuidle_state *state = &drv->states[index];
|
|
||||||
bool broadcast = state->flags & CPUIDLE_FLAG_TIMER_STOP;
|
|
||||||
int ret;
|
int ret;
|
||||||
|
struct cpuidle_state *state = &drv->states[index];
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Set the timer to wake this CPU up in some time (which
|
* Set the timer to wake this CPU up in some time (which
|
||||||
@ -318,7 +316,7 @@ static int suspend_test_thread(void *arg)
|
|||||||
/* IRQs must be disabled during suspend operations. */
|
/* IRQs must be disabled during suspend operations. */
|
||||||
local_irq_disable();
|
local_irq_disable();
|
||||||
|
|
||||||
ret = suspend_cpu(index, broadcast);
|
ret = suspend_cpu(dev, drv, index);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* We have woken up. Re-enable IRQs to handle any
|
* We have woken up. Re-enable IRQs to handle any
|
||||||
|
Loading…
Reference in New Issue
Block a user