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));
}
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]))
#include <linux/init.h>
#include <linux/types.h>
-#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