mirror of
https://github.com/torvalds/linux.git
synced 2024-12-22 10:56:40 +00:00
be120397e7
Now that the common PSCI client code has been factored out to drivers/firmware, and made safe for 32-bit use, move the 32-bit ARM code over to it. This results in a moderate reduction of duplicated lines, and will prevent further duplication as the PSCI client code is updated for PSCI 1.0 and beyond. The two legacy platform users of the PSCI invocation code are updated to account for interface changes. In both cases the power state parameter (which is constant) is now generated using macros, so that the pack/unpack logic can be killed in preparation for PSCI 1.0 power state changes. Signed-off-by: Mark Rutland <mark.rutland@arm.com> Acked-by: Rob Herring <robh@kernel.org> Cc: Catalin Marinas <catalin.marinas@arm.com> Cc: Ashwin Chaugule <ashwin.chaugule@linaro.org> Cc: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com> Cc: Russell King <rmk+kernel@arm.linux.org.uk> Cc: Will Deacon <will.deacon@arm.com> Signed-off-by: Will Deacon <will.deacon@arm.com>
61 lines
1.5 KiB
C
61 lines
1.5 KiB
C
/*
|
|
* Copyright 2011 Calxeda, Inc.
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify it
|
|
* under the terms and conditions of the GNU General Public License,
|
|
* version 2, as published by the Free Software Foundation.
|
|
*
|
|
* This program is distributed in the hope it will be useful, but WITHOUT
|
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
* more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License along with
|
|
* this program. If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
#include <linux/cpu_pm.h>
|
|
#include <linux/init.h>
|
|
#include <linux/psci.h>
|
|
#include <linux/suspend.h>
|
|
|
|
#include <asm/suspend.h>
|
|
|
|
#include <uapi/linux/psci.h>
|
|
|
|
#define HIGHBANK_SUSPEND_PARAM \
|
|
((0 << PSCI_0_2_POWER_STATE_ID_SHIFT) | \
|
|
(1 << PSCI_0_2_POWER_STATE_AFFL_SHIFT) | \
|
|
(PSCI_POWER_STATE_TYPE_POWER_DOWN << PSCI_0_2_POWER_STATE_TYPE_SHIFT))
|
|
|
|
static int highbank_suspend_finish(unsigned long val)
|
|
{
|
|
return psci_ops.cpu_suspend(HIGHBANK_SUSPEND_PARAM, __pa(cpu_resume));
|
|
}
|
|
|
|
static int highbank_pm_enter(suspend_state_t state)
|
|
{
|
|
cpu_pm_enter();
|
|
cpu_cluster_pm_enter();
|
|
|
|
cpu_suspend(0, highbank_suspend_finish);
|
|
|
|
cpu_cluster_pm_exit();
|
|
cpu_pm_exit();
|
|
|
|
return 0;
|
|
}
|
|
|
|
static const struct platform_suspend_ops highbank_pm_ops = {
|
|
.enter = highbank_pm_enter,
|
|
.valid = suspend_valid_only_mem,
|
|
};
|
|
|
|
void __init highbank_pm_init(void)
|
|
{
|
|
if (!psci_ops.cpu_suspend)
|
|
return;
|
|
|
|
suspend_set_ops(&highbank_pm_ops);
|
|
}
|