162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Copyright 2011 Calxeda, Inc. 462306a36Sopenharmony_ci */ 562306a36Sopenharmony_ci 662306a36Sopenharmony_ci#include <linux/cpu_pm.h> 762306a36Sopenharmony_ci#include <linux/init.h> 862306a36Sopenharmony_ci#include <linux/psci.h> 962306a36Sopenharmony_ci#include <linux/suspend.h> 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ci#include <asm/suspend.h> 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_ci#include <uapi/linux/psci.h> 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_ci#include "core.h" 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_ci#define HIGHBANK_SUSPEND_PARAM \ 1862306a36Sopenharmony_ci ((0 << PSCI_0_2_POWER_STATE_ID_SHIFT) | \ 1962306a36Sopenharmony_ci (1 << PSCI_0_2_POWER_STATE_AFFL_SHIFT) | \ 2062306a36Sopenharmony_ci (PSCI_POWER_STATE_TYPE_POWER_DOWN << PSCI_0_2_POWER_STATE_TYPE_SHIFT)) 2162306a36Sopenharmony_ci 2262306a36Sopenharmony_cistatic int highbank_suspend_finish(unsigned long val) 2362306a36Sopenharmony_ci{ 2462306a36Sopenharmony_ci return psci_ops.cpu_suspend(HIGHBANK_SUSPEND_PARAM, __pa(cpu_resume)); 2562306a36Sopenharmony_ci} 2662306a36Sopenharmony_ci 2762306a36Sopenharmony_cistatic int highbank_pm_enter(suspend_state_t state) 2862306a36Sopenharmony_ci{ 2962306a36Sopenharmony_ci cpu_pm_enter(); 3062306a36Sopenharmony_ci cpu_cluster_pm_enter(); 3162306a36Sopenharmony_ci 3262306a36Sopenharmony_ci cpu_suspend(0, highbank_suspend_finish); 3362306a36Sopenharmony_ci 3462306a36Sopenharmony_ci cpu_cluster_pm_exit(); 3562306a36Sopenharmony_ci cpu_pm_exit(); 3662306a36Sopenharmony_ci 3762306a36Sopenharmony_ci return 0; 3862306a36Sopenharmony_ci} 3962306a36Sopenharmony_ci 4062306a36Sopenharmony_cistatic const struct platform_suspend_ops highbank_pm_ops = { 4162306a36Sopenharmony_ci .enter = highbank_pm_enter, 4262306a36Sopenharmony_ci .valid = suspend_valid_only_mem, 4362306a36Sopenharmony_ci}; 4462306a36Sopenharmony_ci 4562306a36Sopenharmony_civoid __init highbank_pm_init(void) 4662306a36Sopenharmony_ci{ 4762306a36Sopenharmony_ci if (!psci_ops.cpu_suspend) 4862306a36Sopenharmony_ci return; 4962306a36Sopenharmony_ci 5062306a36Sopenharmony_ci suspend_set_ops(&highbank_pm_ops); 5162306a36Sopenharmony_ci} 52