18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * Copyright 2011 Calxeda, Inc. 48c2ecf20Sopenharmony_ci */ 58c2ecf20Sopenharmony_ci 68c2ecf20Sopenharmony_ci#include <linux/cpu_pm.h> 78c2ecf20Sopenharmony_ci#include <linux/init.h> 88c2ecf20Sopenharmony_ci#include <linux/psci.h> 98c2ecf20Sopenharmony_ci#include <linux/suspend.h> 108c2ecf20Sopenharmony_ci 118c2ecf20Sopenharmony_ci#include <asm/suspend.h> 128c2ecf20Sopenharmony_ci 138c2ecf20Sopenharmony_ci#include <uapi/linux/psci.h> 148c2ecf20Sopenharmony_ci 158c2ecf20Sopenharmony_ci#define HIGHBANK_SUSPEND_PARAM \ 168c2ecf20Sopenharmony_ci ((0 << PSCI_0_2_POWER_STATE_ID_SHIFT) | \ 178c2ecf20Sopenharmony_ci (1 << PSCI_0_2_POWER_STATE_AFFL_SHIFT) | \ 188c2ecf20Sopenharmony_ci (PSCI_POWER_STATE_TYPE_POWER_DOWN << PSCI_0_2_POWER_STATE_TYPE_SHIFT)) 198c2ecf20Sopenharmony_ci 208c2ecf20Sopenharmony_cistatic int highbank_suspend_finish(unsigned long val) 218c2ecf20Sopenharmony_ci{ 228c2ecf20Sopenharmony_ci return psci_ops.cpu_suspend(HIGHBANK_SUSPEND_PARAM, __pa(cpu_resume)); 238c2ecf20Sopenharmony_ci} 248c2ecf20Sopenharmony_ci 258c2ecf20Sopenharmony_cistatic int highbank_pm_enter(suspend_state_t state) 268c2ecf20Sopenharmony_ci{ 278c2ecf20Sopenharmony_ci cpu_pm_enter(); 288c2ecf20Sopenharmony_ci cpu_cluster_pm_enter(); 298c2ecf20Sopenharmony_ci 308c2ecf20Sopenharmony_ci cpu_suspend(0, highbank_suspend_finish); 318c2ecf20Sopenharmony_ci 328c2ecf20Sopenharmony_ci cpu_cluster_pm_exit(); 338c2ecf20Sopenharmony_ci cpu_pm_exit(); 348c2ecf20Sopenharmony_ci 358c2ecf20Sopenharmony_ci return 0; 368c2ecf20Sopenharmony_ci} 378c2ecf20Sopenharmony_ci 388c2ecf20Sopenharmony_cistatic const struct platform_suspend_ops highbank_pm_ops = { 398c2ecf20Sopenharmony_ci .enter = highbank_pm_enter, 408c2ecf20Sopenharmony_ci .valid = suspend_valid_only_mem, 418c2ecf20Sopenharmony_ci}; 428c2ecf20Sopenharmony_ci 438c2ecf20Sopenharmony_civoid __init highbank_pm_init(void) 448c2ecf20Sopenharmony_ci{ 458c2ecf20Sopenharmony_ci if (!psci_ops.cpu_suspend) 468c2ecf20Sopenharmony_ci return; 478c2ecf20Sopenharmony_ci 488c2ecf20Sopenharmony_ci suspend_set_ops(&highbank_pm_ops); 498c2ecf20Sopenharmony_ci} 50