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