From 7a190318dbac558bd34c62eaac2ed304eb09b302 Mon Sep 17 00:00:00 2001 From: Park Bumgyu Date: Wed, 31 Jan 2018 15:38:46 +0900 Subject: [PATCH] psci: change customized PSCI to support bit operation Change-Id: I8cf40dbe290e56d6d93fb2c193342eda166b3857 Signed-off-by: Park Bumgyu Signed-off-by: Soohyun Kim --- drivers/firmware/psci.c | 37 +++++++++++++++---------------------- include/linux/psci.h | 12 +++++------- 2 files changed, 20 insertions(+), 29 deletions(-) diff --git a/drivers/firmware/psci.c b/drivers/firmware/psci.c index 2d7557c77e4b..8d60b4cd1df4 100644 --- a/drivers/firmware/psci.c +++ b/drivers/firmware/psci.c @@ -431,28 +431,21 @@ static u32 psci_power_state_pack(u32 id, u32 type, u32 affinity_level) static int psci_suspend_customized_finisher(unsigned long index) { u32 state; + u32 id = 0, type = 0, affinity_level = 0; - switch (index) { - case PSCI_CLUSTER_SLEEP: - state = psci_power_state_pack(0, 0, 1); - break; - case PSCI_SYSTEM_IDLE: - case PSCI_SYSTEM_IDLE_AUDIO: - state = psci_power_state_pack(1, 0, 0); - break; - case PSCI_SYSTEM_IDLE_CLUSTER_SLEEP: - state = psci_power_state_pack(1, 0, 1); - break; - case PSCI_CP_CALL: - state = psci_power_state_pack(0, 0, 2); - break; - case PSCI_SYSTEM_SLEEP: - state = psci_power_state_pack(0, 0, 3); - break; - default: - panic("Unsupported psci state, index = %ld\n", index); - break; - }; + if (index & PSCI_SYSTEM_IDLE) + id = 1; + + if (index & PSCI_CLUSTER_SLEEP) + affinity_level = 1; + + if (index & PSCI_CP_CALL) + affinity_level = 2; + + if (index & PSCI_SYSTEM_SLEEP) + affinity_level = 3; + + state = psci_power_state_pack(id, type, affinity_level); return psci_ops.cpu_suspend(state, virt_to_phys(cpu_resume)); } @@ -468,7 +461,7 @@ int psci_cpu_suspend_enter(unsigned long index) if (WARN_ON_ONCE(!index)) return -EINVAL; - if (unlikely(index >= PSCI_UNUSED_INDEX)) + if (unlikely(index >= PSCI_CUSTOMIZED_INDEX)) return cpu_suspend(index, psci_suspend_customized_finisher); if (!psci_power_state_loses_context(state[index - 1])) diff --git a/include/linux/psci.h b/include/linux/psci.h index 99095024eb86..577d037f1650 100644 --- a/include/linux/psci.h +++ b/include/linux/psci.h @@ -17,13 +17,11 @@ #include #include -#define PSCI_UNUSED_INDEX 128 -#define PSCI_CLUSTER_SLEEP (PSCI_UNUSED_INDEX) -#define PSCI_SYSTEM_IDLE (PSCI_UNUSED_INDEX + 1) -#define PSCI_SYSTEM_IDLE_CLUSTER_SLEEP (PSCI_UNUSED_INDEX + 2) -#define PSCI_SYSTEM_IDLE_AUDIO (PSCI_UNUSED_INDEX + 3) -#define PSCI_CP_CALL (PSCI_UNUSED_INDEX + 4) -#define PSCI_SYSTEM_SLEEP (PSCI_UNUSED_INDEX + 5) +#define PSCI_CUSTOMIZED_INDEX (1 << 7) +#define PSCI_CLUSTER_SLEEP (PSCI_CUSTOMIZED_INDEX) +#define PSCI_SYSTEM_IDLE (1 << 8) +#define PSCI_CP_CALL (1 << 9) +#define PSCI_SYSTEM_SLEEP (1 << 10) #define PSCI_POWER_STATE_TYPE_STANDBY 0 #define PSCI_POWER_STATE_TYPE_POWER_DOWN 1 -- 2.20.1