ARM: tegra: pcie: Remove dock detect variable
[linux-3.10.git] / arch / arm / mach-tegra / powergate-priv.h
1 /*
2  * Copyright (c) 2012-2013, 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/clk/tegra.h>
22 #include <linux/err.h>
23 #include <linux/spinlock.h>
24 #include <linux/io.h>
25 #include <linux/tegra-powergate.h>
26
27 #include "clock.h"
28 #include "iomap.h"
29
30 #define MAX_CLK_EN_NUM                  9
31 #define MAX_HOTRESET_CLIENT_NUM         4
32
33 #define PWRGATE_CLAMP_STATUS    0x2c
34 #define PWRGATE_TOGGLE          0x30
35 #define PWRGATE_TOGGLE_START    (1 << 8)
36 #define REMOVE_CLAMPING         0x34
37 #define PWRGATE_STATUS          0x38
38
39 /* MC register read/write */
40 static void __iomem *mc = IO_ADDRESS(TEGRA_MC_BASE);
41 static inline u32 mc_read(unsigned long reg)
42 {
43         return readl(mc + reg);
44 }
45
46 static inline void mc_write(u32 val, unsigned long reg)
47 {
48         writel_relaxed(val, mc + reg);
49 }
50
51 /* PMC register read/write */
52 static void __iomem *pmc = IO_ADDRESS(TEGRA_PMC_BASE);
53 static inline u32 pmc_read(unsigned long reg)
54 {
55         return readl(pmc + reg);
56 }
57
58 static inline void pmc_write(u32 val, unsigned long reg)
59 {
60         writel_relaxed(val, pmc + reg);
61 }
62
63 enum clk_type {
64         CLK_AND_RST,
65         RST_ONLY,
66         CLK_ONLY,
67 };
68
69 struct partition_clk_info {
70         const char *clk_name;
71         enum clk_type clk_type;
72         struct clk *clk_ptr;
73 };
74
75 struct powergate_partition_info {
76         const char *name;
77         struct partition_clk_info clk_info[MAX_CLK_EN_NUM];
78 };
79
80 struct powergate_ops {
81         const char *soc_name;
82
83         int num_powerdomains;
84         int num_cpu_domains;
85         u8 *cpu_domains;
86
87         spinlock_t *(*get_powergate_lock)(void);
88
89         const char *(*get_powergate_domain_name)(int id);
90
91         int (*powergate_partition)(int);
92         int (*unpowergate_partition)(int id);
93
94         int (*powergate_partition_with_clk_off)(int);
95         int (*unpowergate_partition_with_clk_on)(int);
96
97         int (*powergate_mc_enable)(int id);
98         int (*powergate_mc_disable)(int id);
99
100         int (*powergate_mc_flush)(int id);
101         int (*powergate_mc_flush_done)(int id);
102
103         int (*powergate_init_refcount)(void);
104
105         bool (*powergate_check_clamping)(int id);
106
107         bool (*powergate_skip)(int id);
108
109         bool (*powergate_is_powered)(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__ */