1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0-only 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * Copyright 2011 Calxeda, Inc. 4*4882a593Smuzhiyun */ 5*4882a593Smuzhiyun 6*4882a593Smuzhiyun #include <linux/cpu_pm.h> 7*4882a593Smuzhiyun #include <linux/init.h> 8*4882a593Smuzhiyun #include <linux/psci.h> 9*4882a593Smuzhiyun #include <linux/suspend.h> 10*4882a593Smuzhiyun 11*4882a593Smuzhiyun #include <asm/suspend.h> 12*4882a593Smuzhiyun 13*4882a593Smuzhiyun #include <uapi/linux/psci.h> 14*4882a593Smuzhiyun 15*4882a593Smuzhiyun #define HIGHBANK_SUSPEND_PARAM \ 16*4882a593Smuzhiyun ((0 << PSCI_0_2_POWER_STATE_ID_SHIFT) | \ 17*4882a593Smuzhiyun (1 << PSCI_0_2_POWER_STATE_AFFL_SHIFT) | \ 18*4882a593Smuzhiyun (PSCI_POWER_STATE_TYPE_POWER_DOWN << PSCI_0_2_POWER_STATE_TYPE_SHIFT)) 19*4882a593Smuzhiyun highbank_suspend_finish(unsigned long val)20*4882a593Smuzhiyunstatic int highbank_suspend_finish(unsigned long val) 21*4882a593Smuzhiyun { 22*4882a593Smuzhiyun return psci_ops.cpu_suspend(HIGHBANK_SUSPEND_PARAM, __pa(cpu_resume)); 23*4882a593Smuzhiyun } 24*4882a593Smuzhiyun highbank_pm_enter(suspend_state_t state)25*4882a593Smuzhiyunstatic int highbank_pm_enter(suspend_state_t state) 26*4882a593Smuzhiyun { 27*4882a593Smuzhiyun cpu_pm_enter(); 28*4882a593Smuzhiyun cpu_cluster_pm_enter(); 29*4882a593Smuzhiyun 30*4882a593Smuzhiyun cpu_suspend(0, highbank_suspend_finish); 31*4882a593Smuzhiyun 32*4882a593Smuzhiyun cpu_cluster_pm_exit(); 33*4882a593Smuzhiyun cpu_pm_exit(); 34*4882a593Smuzhiyun 35*4882a593Smuzhiyun return 0; 36*4882a593Smuzhiyun } 37*4882a593Smuzhiyun 38*4882a593Smuzhiyun static const struct platform_suspend_ops highbank_pm_ops = { 39*4882a593Smuzhiyun .enter = highbank_pm_enter, 40*4882a593Smuzhiyun .valid = suspend_valid_only_mem, 41*4882a593Smuzhiyun }; 42*4882a593Smuzhiyun highbank_pm_init(void)43*4882a593Smuzhiyunvoid __init highbank_pm_init(void) 44*4882a593Smuzhiyun { 45*4882a593Smuzhiyun if (!psci_ops.cpu_suspend) 46*4882a593Smuzhiyun return; 47*4882a593Smuzhiyun 48*4882a593Smuzhiyun suspend_set_ops(&highbank_pm_ops); 49*4882a593Smuzhiyun } 50