ARM: tegra: add support for powergate skip list
[linux-3.10.git] / arch / arm / mach-tegra / powergate-priv.h
1 /*
2  * Copyright (c) 2012, NVIDIA CORPORATION.  All rights reserved.
3  *
4  * This software is licensed under the terms of the GNU General Public
5  * License version 2, as published by the Free Software Foundation, and
6  * may be copied, distributed, and modified under those terms.
7  *
8  * This program is distributed in the hope that it will be useful,
9  * but WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11  * GNU General Public License for more details.
12  *
13  */
14
15 #ifndef __POWERGATE_PRIV_H__
16 #define __POWERGATE_PRIV_H__
17
18 #include <linux/kernel.h>
19 #include <linux/module.h>
20 #include <linux/clk.h>
21 #include <linux/err.h>
22 #include <linux/spinlock.h>
23 #include <linux/io.h>
24
25 #include <mach/clk.h>
26 #include <mach/powergate.h>
27
28 #include "clock.h"
29 #include "fuse.h"
30 #include "iomap.h"
31
32 #define MAX_CLK_EN_NUM                  9
33 #define MAX_HOTRESET_CLIENT_NUM         4
34
35 #define PWRGATE_CLAMP_STATUS    0x2c
36 #define PWRGATE_TOGGLE          0x30
37 #define PWRGATE_TOGGLE_START    (1 << 8)
38 #define REMOVE_CLAMPING         0x34
39 #define PWRGATE_STATUS          0x38
40
41 /* MC register read/write */
42 static void __iomem *mc = IO_ADDRESS(TEGRA_MC_BASE);
43 static inline u32 mc_read(unsigned long reg)
44 {
45         return readl(mc + reg);
46 }
47
48 static inline void mc_write(u32 val, unsigned long reg)
49 {
50         writel_relaxed(val, mc + reg);
51 }
52
53 /* PMC register read/write */
54 static void __iomem *pmc = IO_ADDRESS(TEGRA_PMC_BASE);
55 static inline u32 pmc_read(unsigned long reg)
56 {
57         return readl(pmc + reg);
58 }
59
60 static inline void pmc_write(u32 val, unsigned long reg)
61 {
62         writel_relaxed(val, pmc + reg);
63 }
64
65 enum clk_type {
66         CLK_AND_RST,
67         RST_ONLY,
68         CLK_ONLY,
69 };
70
71 struct partition_clk_info {
72         const char *clk_name;
73         enum clk_type clk_type;
74         struct clk *clk_ptr;
75 };
76
77 struct powergate_partition_info {
78         const char *name;
79         struct partition_clk_info clk_info[MAX_CLK_EN_NUM];
80 };
81
82 struct powergate_ops {
83         const char *soc_name;
84
85         int num_powerdomains;
86         int num_cpu_domains;
87         u8 *cpu_domains;
88
89         spinlock_t *(*get_powergate_lock)(void);
90
91         const char *(*get_powergate_domain_name)(int id);
92
93         int (*powergate_partition)(int);
94         int (*unpowergate_partition)(int id);
95
96         int (*powergate_partition_with_clk_off)(int);
97         int (*unpowergate_partition_with_clk_on)(int);
98
99         int (*powergate_mc_enable)(int id);
100         int (*powergate_mc_disable)(int id);
101
102         int (*powergate_mc_flush)(int id);
103         int (*powergate_mc_flush_done)(int id);
104
105         int (*powergate_init_refcount)(void);
106
107         bool (*powergate_check_clamping)(int id);
108
109         bool (*powergate_skip)(int id);
110 };
111
112 void get_clk_info(struct powergate_partition_info *pg_info);
113 int tegra_powergate_remove_clamping(int id);
114 int partition_clk_enable(struct powergate_partition_info *pg_info);
115 void partition_clk_disable(struct powergate_partition_info *pg_info);
116 int is_partition_clk_disabled(struct powergate_partition_info *pg_info);
117 void powergate_partition_deassert_reset(struct powergate_partition_info *pg_info);
118 void powergate_partition_assert_reset(struct powergate_partition_info *pg_info);
119 int tegra_powergate_reset_module(struct powergate_partition_info *pg_info);
120 int powergate_module(int id);
121 int unpowergate_module(int id);
122 int tegra_powergate_set(int id, bool new_state);
123
124 /* INIT APIs: New SoC needs to add its support here */
125 #if defined(CONFIG_ARCH_TEGRA_2x_SOC)
126 struct powergate_ops *tegra2_powergate_init_chip_support(void);
127 #else
128 static inline struct powergate_ops *tegra2_powergate_init_chip_support(void)
129 {
130         return NULL;
131 }
132 #endif
133
134 #if defined(CONFIG_ARCH_TEGRA_3x_SOC)
135 struct powergate_ops *tegra3_powergate_init_chip_support(void);
136 #else
137 static inline struct powergate_ops *tegra3_powergate_init_chip_support(void)
138 {
139         return NULL;
140 }
141 #endif
142
143 #if defined(CONFIG_ARCH_TEGRA_11x_SOC)
144 struct powergate_ops *tegra11x_powergate_init_chip_support(void);
145 #else
146 static inline struct powergate_ops *tegra11x_powergate_init_chip_support(void)
147 {
148         return NULL;
149 }
150 #endif
151
152 #if defined(CONFIG_ARCH_TEGRA_12x_SOC)
153 struct powergate_ops *tegra12x_powergate_init_chip_support(void);
154 #else
155 static inline struct powergate_ops *tegra12x_powergate_init_chip_support(void)
156 {
157         return NULL;
158 }
159 #endif
160
161 #if defined(CONFIG_ARCH_TEGRA_14x_SOC)
162 struct powergate_ops *tegra14x_powergate_init_chip_support(void);
163 #else
164 static inline struct powergate_ops *tegra14x_powergate_init_chip_support(void)
165 {
166         return NULL;
167 }
168 #endif
169
170 #endif /* __POWERGATE_PRIV_H__ */