Hello Yutaka Ando,
Kernel calling stack
user space :
echo mem > /sys/power/state
Kernel space:
kernel/power/main.c
state_store();
pm_suspend(state);
kernel/power/suspend.c:
pm_suspend(){
enter_state(state);
suspend_devices_and_enter(state);
suspend_enter()
suspend_ops->enter(state); ();---------------------------Here system begin to suspend
syscore_resume();-------------------------------------------Here system begin to resume
system_state = SYSTEM_RUNNING;
enable_nonboot_cpus();
…
drivers/firmware/psci.c:
struct platform_suspend_ops psci_suspend_ops = {
.enter = psci_system_suspend_enter,
psci_system_suspend_enter() {
cpu_suspend(0, psci_system_suspend)
psci_system_suspend()
psci_cpu_suspend()
fn = psci_fuanction_id[PSCI_FN_CPU_SUSPEND]
invoke_psci_fn(… vir_to_phys(cpu_resume),…)
__invoke_psci_fn_smc()
smc---------------------------------------------Here TF-A/atf will take over, and will jump back to cpu_resume() when system wake up.
arch/arm64/kernel/sleep.S:
ENTRY(cpu_resume)
_cpu_resume
cpu_do_resume
arch/arm64/mm/proc.S:
ENTRY(cpu_do_resume)
…
ret
ASLEEP:
Please refer to LS1046 Reference Manual, RCW of pin mux.

LPM20 entry related programming

Thanks,
Yiping