dd427b07ba1b5a19f060c062052ac23877ae65b9
[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         bool (*powergate_check_clamping)(int id);
107 };
108
109 void get_clk_info(struct powergate_partition_info *pg_info);
110 int tegra_powergate_remove_clamping(int id);
111 int partition_clk_enable(struct powergate_partition_info *pg_info);
112 void partition_clk_disable(struct powergate_partition_info *pg_info);
113 int is_partition_clk_disabled(struct powergate_partition_info *pg_info);
114 void powergate_partition_deassert_reset(struct powergate_partition_info *pg_info);
115 void powergate_partition_assert_reset(struct powergate_partition_info *pg_info);
116 int tegra_powergate_reset_module(struct powergate_partition_info *pg_info);
117 int powergate_module(int id);
118 int unpowergate_module(int id);
119 int tegra_powergate_set(int id, bool new_state);
120
121 /* INIT APIs: New SoC needs to add its support here */
122 #if defined(CONFIG_ARCH_TEGRA_2x_SOC)
123 struct powergate_ops *tegra2_powergate_init_chip_support(void);
124 #else
125 static inline struct powergate_ops *tegra2_powergate_init_chip_support(void)
126 {
127         return NULL;
128 }
129 #endif
130
131 #if defined(CONFIG_ARCH_TEGRA_3x_SOC)
132 struct powergate_ops *tegra3_powergate_init_chip_support(void);
133 #else
134 static inline struct powergate_ops *tegra3_powergate_init_chip_support(void)
135 {
136         return NULL;
137 }
138 #endif
139
140 #if defined(CONFIG_ARCH_TEGRA_11x_SOC)
141 struct powergate_ops *tegra11x_powergate_init_chip_support(void);
142 #else
143 static inline struct powergate_ops *tegra11x_powergate_init_chip_support(void)
144 {
145         return NULL;
146 }
147 #endif
148
149 #if defined(CONFIG_ARCH_TEGRA_12x_SOC)
150 struct powergate_ops *tegra12x_powergate_init_chip_support(void);
151 #else
152 static inline struct powergate_ops *tegra12x_powergate_init_chip_support(void)
153 {
154         return NULL;
155 }
156 #endif
157
158 #if defined(CONFIG_ARCH_TEGRA_14x_SOC)
159 struct powergate_ops *tegra14x_powergate_init_chip_support(void);
160 #else
161 static inline struct powergate_ops *tegra14x_powergate_init_chip_support(void)
162 {
163         return NULL;
164 }
165 #endif
166
167 #endif /* __POWERGATE_PRIV_H__ */