Blame view

kernel/linux-imx6_3.14.28/arch/arm/mach-kirkwood/pm.c 1.74 KB
6b13f685e   김민수   BSP 최초 추가
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
  /*
   * Power Management driver for Marvell Kirkwood SoCs
   *
   * Copyright (C) 2013 Ezequiel Garcia <ezequiel@free-electrons.com>
   * Copyright (C) 2010 Simon Guinot <sguinot@lacie.com>
   *
   * This program is free software; you can redistribute it and/or modify
   * it under the terms of the GNU General Public License,
   * version 2 of the License.
   *
   * This program is distributed in the hope that 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.
   */
  
  #include <linux/kernel.h>
  #include <linux/suspend.h>
  #include <linux/io.h>
  #include <mach/bridge-regs.h>
  #include "common.h"
  
  static void __iomem *ddr_operation_base;
  
  static void kirkwood_low_power(void)
  {
  	u32 mem_pm_ctrl;
  
  	mem_pm_ctrl = readl(MEMORY_PM_CTRL);
  
  	/* Set peripherals to low-power mode */
  	writel_relaxed(~0, MEMORY_PM_CTRL);
  
  	/* Set DDR in self-refresh */
  	writel_relaxed(0x7, ddr_operation_base);
  
  	/*
  	 * Set CPU in wait-for-interrupt state.
  	 * This disables the CPU core clocks,
  	 * the array clocks, and also the L2 controller.
  	 */
  	cpu_do_idle();
  
  	writel_relaxed(mem_pm_ctrl, MEMORY_PM_CTRL);
  }
  
  static int kirkwood_suspend_enter(suspend_state_t state)
  {
  	switch (state) {
  	case PM_SUSPEND_STANDBY:
  		kirkwood_low_power();
  		break;
  	default:
  		return -EINVAL;
  	}
  	return 0;
  }
  
  static int kirkwood_pm_valid_standby(suspend_state_t state)
  {
  	return state == PM_SUSPEND_STANDBY;
  }
  
  static const struct platform_suspend_ops kirkwood_suspend_ops = {
  	.enter = kirkwood_suspend_enter,
  	.valid = kirkwood_pm_valid_standby,
  };
  
  void __init kirkwood_pm_init(void)
  {
  	ddr_operation_base = ioremap(DDR_OPERATION_BASE, 4);
  	suspend_set_ops(&kirkwood_suspend_ops);
  }