Merge tag 'renesas-soc-fixes-for-v3.19' of git://git.kernel.org/pub/scm/linux/kernel...
[cascardo/linux.git] / arch / arm / mach-shmobile / pm-r8a7740.c
1 /*
2  * r8a7740 power management support
3  *
4  * Copyright (C) 2012  Renesas Solutions Corp.
5  * Copyright (C) 2012  Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
6  *
7  * This file is subject to the terms and conditions of the GNU General Public
8  * License.  See the file "COPYING" in the main directory of this archive
9  * for more details.
10  */
11 #include <linux/console.h>
12 #include <linux/suspend.h>
13 #include "common.h"
14 #include "pm-rmobile.h"
15
16 #if defined(CONFIG_PM) && !defined(CONFIG_ARCH_MULTIPLATFORM)
17 static int r8a7740_pd_a3sm_suspend(void)
18 {
19         /*
20          * The A3SM domain contains the CPU core and therefore it should
21          * only be turned off if the CPU is not in use.
22          */
23         return -EBUSY;
24 }
25
26 static int r8a7740_pd_a3sp_suspend(void)
27 {
28         /*
29          * Serial consoles make use of SCIF hardware located in A3SP,
30          * keep such power domain on if "no_console_suspend" is set.
31          */
32         return console_suspend_enabled ? 0 : -EBUSY;
33 }
34
35 static int r8a7740_pd_d4_suspend(void)
36 {
37         /*
38          * The D4 domain contains the Coresight-ETM hardware block and
39          * therefore it should only be turned off if the debug module is
40          * not in use.
41          */
42         return -EBUSY;
43 }
44
45 static struct rmobile_pm_domain r8a7740_pm_domains[] = {
46         {
47                 .genpd.name     = "A4LC",
48                 .bit_shift      = 1,
49         }, {
50                 .genpd.name     = "A4MP",
51                 .bit_shift      = 2,
52         }, {
53                 .genpd.name     = "D4",
54                 .bit_shift      = 3,
55                 .gov            = &pm_domain_always_on_gov,
56                 .suspend        = r8a7740_pd_d4_suspend,
57         }, {
58                 .genpd.name     = "A4R",
59                 .bit_shift      = 5,
60         }, {
61                 .genpd.name     = "A3RV",
62                 .bit_shift      = 6,
63         }, {
64                 .genpd.name     = "A4S",
65                 .bit_shift      = 10,
66                 .no_debug       = true,
67         }, {
68                 .genpd.name     = "A3SP",
69                 .bit_shift      = 11,
70                 .gov            = &pm_domain_always_on_gov,
71                 .no_debug       = true,
72                 .suspend        = r8a7740_pd_a3sp_suspend,
73         }, {
74                 .genpd.name     = "A3SM",
75                 .bit_shift      = 12,
76                 .gov            = &pm_domain_always_on_gov,
77                 .suspend        = r8a7740_pd_a3sm_suspend,
78         }, {
79                 .genpd.name     = "A3SG",
80                 .bit_shift      = 13,
81         }, {
82                 .genpd.name     = "A4SU",
83                 .bit_shift      = 20,
84         },
85 };
86
87 void __init r8a7740_init_pm_domains(void)
88 {
89         rmobile_init_domains(r8a7740_pm_domains, ARRAY_SIZE(r8a7740_pm_domains));
90         pm_genpd_add_subdomain_names("A4R", "A3RV");
91         pm_genpd_add_subdomain_names("A4S", "A3SP");
92         pm_genpd_add_subdomain_names("A4S", "A3SM");
93         pm_genpd_add_subdomain_names("A4S", "A3SG");
94 }
95 #endif /* CONFIG_PM && !CONFIG_ARCH_MULTIPLATFORM */
96
97 #ifdef CONFIG_SUSPEND
98 static int r8a7740_enter_suspend(suspend_state_t suspend_state)
99 {
100         cpu_do_idle();
101         return 0;
102 }
103
104 static void r8a7740_suspend_init(void)
105 {
106         shmobile_suspend_ops.enter = r8a7740_enter_suspend;
107 }
108 #else
109 static void r8a7740_suspend_init(void) {}
110 #endif
111
112 void __init r8a7740_pm_init(void)
113 {
114         r8a7740_suspend_init();
115 }