[ARM/tegra] Add Tegra3 support
[linux-2.6.git] / arch / arm / mach-tegra / include / mach / pinmux.h
1 /*
2  * linux/arch/arm/mach-tegra/include/mach/pinmux.h
3  *
4  * Copyright (C) 2010 Google, Inc.
5  *
6  * This software is licensed under the terms of the GNU General Public
7  * License version 2, as published by the Free Software Foundation, and
8  * may be copied, distributed, and modified under those terms.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU General Public License for more details.
14  *
15  */
16
17 #ifndef __MACH_TEGRA_PINMUX_H
18 #define __MACH_TEGRA_PINMUX_H
19
20 #if defined(CONFIG_ARCH_TEGRA_2x_SOC)
21 #include "pinmux-t2.h"
22 #elif defined(CONFIG_ARCH_TEGRA_3x_SOC)
23 #include "pinmux-t3.h"
24 #else
25 #error "Undefined Tegra architecture"
26 #endif
27
28 enum tegra_mux_func {
29         TEGRA_MUX_RSVD = 0x8000,
30         TEGRA_MUX_RSVD0 = TEGRA_MUX_RSVD,
31         TEGRA_MUX_RSVD1 = 0x8000,
32         TEGRA_MUX_RSVD2 = 0x8001,
33         TEGRA_MUX_RSVD3 = 0x8002,
34         TEGRA_MUX_RSVD4 = 0x8003,
35         TEGRA_MUX_NONE = 0,
36         TEGRA_MUX_AHB_CLK,
37         TEGRA_MUX_APB_CLK,
38         TEGRA_MUX_AUDIO_SYNC,
39         TEGRA_MUX_CRT,
40         TEGRA_MUX_DAP1,
41         TEGRA_MUX_DAP2,
42         TEGRA_MUX_DAP3,
43         TEGRA_MUX_DAP4,
44         TEGRA_MUX_DAP5,
45         TEGRA_MUX_DISPLAYA,
46         TEGRA_MUX_DISPLAYB,
47         TEGRA_MUX_EMC_TEST0_DLL,
48         TEGRA_MUX_EMC_TEST1_DLL,
49         TEGRA_MUX_GMI,
50         TEGRA_MUX_GMI_INT,
51         TEGRA_MUX_HDMI,
52         TEGRA_MUX_I2C,
53         TEGRA_MUX_I2C1 = TEGRA_MUX_I2C,
54         TEGRA_MUX_I2C2,
55         TEGRA_MUX_I2C3,
56         TEGRA_MUX_IDE,
57         TEGRA_MUX_IRDA,
58         TEGRA_MUX_KBC,
59         TEGRA_MUX_MIO,
60         TEGRA_MUX_MIPI_HS,
61         TEGRA_MUX_NAND,
62         TEGRA_MUX_OSC,
63         TEGRA_MUX_OWR,
64         TEGRA_MUX_PCIE,
65         TEGRA_MUX_PLLA_OUT,
66         TEGRA_MUX_PLLC_OUT1,
67         TEGRA_MUX_PLLM_OUT1,
68         TEGRA_MUX_PLLP_OUT2,
69         TEGRA_MUX_PLLP_OUT3,
70         TEGRA_MUX_PLLP_OUT4,
71         TEGRA_MUX_PWM,
72         TEGRA_MUX_PWR_INTR,
73         TEGRA_MUX_PWR_ON,
74         TEGRA_MUX_RTCK,
75         TEGRA_MUX_SDIO1,
76         TEGRA_MUX_SDMMC1 = TEGRA_MUX_SDIO1,
77         TEGRA_MUX_SDIO2,
78         TEGRA_MUX_SDMMC2 = TEGRA_MUX_SDIO2,
79         TEGRA_MUX_SDIO3,
80         TEGRA_MUX_SDMMC3 = TEGRA_MUX_SDIO3,
81         TEGRA_MUX_SDIO4,
82         TEGRA_MUX_SDMMC4 = TEGRA_MUX_SDIO4,
83         TEGRA_MUX_SFLASH,
84         TEGRA_MUX_SPDIF,
85         TEGRA_MUX_SPI1,
86         TEGRA_MUX_SPI2,
87         TEGRA_MUX_SPI2_ALT,
88         TEGRA_MUX_SPI3,
89         TEGRA_MUX_SPI4,
90         TEGRA_MUX_TRACE,
91         TEGRA_MUX_TWC,
92         TEGRA_MUX_UARTA,
93         TEGRA_MUX_UARTB,
94         TEGRA_MUX_UARTC,
95         TEGRA_MUX_UARTD,
96         TEGRA_MUX_UARTE,
97         TEGRA_MUX_ULPI,
98         TEGRA_MUX_VI,
99         TEGRA_MUX_VI_SENSOR_CLK,
100         TEGRA_MUX_XIO,
101 #if defined(CONFIG_ARCH_TEGRA_3x_SOC)
102         TEGRA_MUX_BLINK,
103         TEGRA_MUX_CEC,
104         TEGRA_MUX_CLK12,
105         TEGRA_MUX_DAP,
106         TEGRA_MUX_DAPSDMMC2,
107         TEGRA_MUX_DDR,
108         TEGRA_MUX_DEV3,
109         TEGRA_MUX_DTV,
110         TEGRA_MUX_VI_ALT1,
111         TEGRA_MUX_VI_ALT2,
112         TEGRA_MUX_VI_ALT3,
113         TEGRA_MUX_EMC_DLL,
114         TEGRA_MUX_EXTPERIPH1,
115         TEGRA_MUX_EXTPERIPH2,
116         TEGRA_MUX_EXTPERIPH3,
117         TEGRA_MUX_GMI_ALT,
118         TEGRA_MUX_HDA,
119         TEGRA_MUX_HSI,
120         TEGRA_MUX_I2C4,
121         TEGRA_MUX_I2C5,
122         TEGRA_MUX_I2CPWR,
123         TEGRA_MUX_I2S0,
124         TEGRA_MUX_I2S1,
125         TEGRA_MUX_I2S2,
126         TEGRA_MUX_I2S3,
127         TEGRA_MUX_I2S4,
128         TEGRA_MUX_NAND_ALT,
129         TEGRA_MUX_POPSDIO4,
130         TEGRA_MUX_POPSDMMC4,
131         TEGRA_MUX_PWM0,
132         TEGRA_MUX_PWM1,
133         TEGRA_MUX_PWM2,
134         TEGRA_MUX_PWM3,
135         TEGRA_MUX_SATA,
136         TEGRA_MUX_SPI5,
137         TEGRA_MUX_SPI6,
138         TEGRA_MUX_SYSCLK,
139         TEGRA_MUX_VGP1,
140         TEGRA_MUX_VGP2,
141         TEGRA_MUX_VGP3,
142         TEGRA_MUX_VGP4,
143         TEGRA_MUX_VGP5,
144         TEGRA_MUX_VGP6,
145 #endif
146         TEGRA_MUX_SAFE,
147         TEGRA_MAX_MUX,
148 };
149
150 enum tegra_pullupdown {
151         TEGRA_PUPD_NORMAL = 0,
152         TEGRA_PUPD_PULL_DOWN,
153         TEGRA_PUPD_PULL_UP,
154 };
155
156 enum tegra_tristate {
157         TEGRA_TRI_NORMAL = 0,
158         TEGRA_TRI_TRISTATE = 1,
159 };
160
161 enum tegra_pin_io {
162         TEGRA_PIN_OUTPUT = 0,
163         TEGRA_PIN_INPUT = 1,
164 };
165
166 enum tegra_vddio {
167         TEGRA_VDDIO_BB = 0,
168         TEGRA_VDDIO_LCD,
169         TEGRA_VDDIO_VI,
170         TEGRA_VDDIO_UART,
171         TEGRA_VDDIO_DDR,
172         TEGRA_VDDIO_NAND,
173         TEGRA_VDDIO_SYS,
174         TEGRA_VDDIO_AUDIO,
175         TEGRA_VDDIO_SD,
176 #if defined(CONFIG_ARCH_TEGRA_3x_SOC)
177         TEGRA_VDDIO_CAM,
178         TEGRA_VDDIO_GMI,
179         TEGRA_VDDIO_PEXCTL,
180         TEGRA_VDDIO_SDMMC1,
181         TEGRA_VDDIO_SDMMC3,
182         TEGRA_VDDIO_SDMMC4,
183 #endif
184 };
185
186 struct tegra_pingroup_config {
187         enum tegra_pingroup     pingroup;
188         enum tegra_mux_func     func;
189         enum tegra_pullupdown   pupd;
190         enum tegra_tristate     tristate;
191         enum tegra_pin_io       io;
192 };
193
194 enum tegra_slew {
195         TEGRA_SLEW_FASTEST = 0,
196         TEGRA_SLEW_FAST,
197         TEGRA_SLEW_SLOW,
198         TEGRA_SLEW_SLOWEST,
199         TEGRA_MAX_SLEW,
200 };
201
202 enum tegra_pull_strength {
203         TEGRA_PULL_0 = 0,
204         TEGRA_PULL_1,
205         TEGRA_PULL_2,
206         TEGRA_PULL_3,
207         TEGRA_PULL_4,
208         TEGRA_PULL_5,
209         TEGRA_PULL_6,
210         TEGRA_PULL_7,
211         TEGRA_PULL_8,
212         TEGRA_PULL_9,
213         TEGRA_PULL_10,
214         TEGRA_PULL_11,
215         TEGRA_PULL_12,
216         TEGRA_PULL_13,
217         TEGRA_PULL_14,
218         TEGRA_PULL_15,
219         TEGRA_PULL_16,
220         TEGRA_PULL_17,
221         TEGRA_PULL_18,
222         TEGRA_PULL_19,
223         TEGRA_PULL_20,
224         TEGRA_PULL_21,
225         TEGRA_PULL_22,
226         TEGRA_PULL_23,
227         TEGRA_PULL_24,
228         TEGRA_PULL_25,
229         TEGRA_PULL_26,
230         TEGRA_PULL_27,
231         TEGRA_PULL_28,
232         TEGRA_PULL_29,
233         TEGRA_PULL_30,
234         TEGRA_PULL_31,
235         TEGRA_MAX_PULL,
236 };
237
238 enum tegra_drive {
239         TEGRA_DRIVE_DIV_8 = 0,
240         TEGRA_DRIVE_DIV_4,
241         TEGRA_DRIVE_DIV_2,
242         TEGRA_DRIVE_DIV_1,
243         TEGRA_MAX_DRIVE,
244 };
245
246 enum tegra_hsm {
247         TEGRA_HSM_DISABLE = 0,
248         TEGRA_HSM_ENABLE,
249 };
250
251 enum tegra_schmitt {
252         TEGRA_SCHMITT_DISABLE = 0,
253         TEGRA_SCHMITT_ENABLE,
254 };
255
256 struct tegra_drive_pingroup_config {
257         enum tegra_drive_pingroup pingroup;
258         enum tegra_hsm hsm;
259         enum tegra_schmitt schmitt;
260         enum tegra_drive drive;
261         enum tegra_pull_strength pull_down;
262         enum tegra_pull_strength pull_up;
263         enum tegra_slew slew_rising;
264         enum tegra_slew slew_falling;
265 };
266
267 struct tegra_drive_pingroup_desc {
268         const char *name;
269         s16 reg;
270 };
271
272 struct tegra_pingroup_desc {
273         const char *name;
274         int funcs[4];
275         int func_safe;
276         int vddio;
277         s16 tri_reg;    /* offset into the TRISTATE_REG_* register bank */
278         s16 mux_reg;    /* offset into the PIN_MUX_CTL_* register bank */
279         s16 pupd_reg;   /* offset into the PULL_UPDOWN_REG_* register bank */
280         s8 tri_bit;     /* offset into the TRISTATE_REG_* register bit */
281         s8 mux_bit;     /* offset into the PIN_MUX_CTL_* register bit */
282         s8 pupd_bit;    /* offset into the PULL_UPDOWN_REG_* register bit */
283         s8 io_default;
284 };
285
286 extern const struct tegra_pingroup_desc tegra_soc_pingroups[];
287 extern const struct tegra_drive_pingroup_desc tegra_soc_drive_pingroups[];
288
289 int tegra_pinmux_get_func(enum tegra_pingroup pg);
290 int tegra_pinmux_set_tristate(enum tegra_pingroup pg,
291         enum tegra_tristate tristate);
292 int tegra_pinmux_set_pullupdown(enum tegra_pingroup pg,
293         enum tegra_pullupdown pupd);
294
295 void tegra_pinmux_config_table(const struct tegra_pingroup_config *config,
296         int len);
297
298 void tegra_drive_pinmux_config_table(struct tegra_drive_pingroup_config *config,
299         int len);
300 void tegra_pinmux_set_safe_pinmux_table(const struct tegra_pingroup_config *config,
301         int len);
302 void tegra_pinmux_config_pinmux_table(const struct tegra_pingroup_config *config,
303         int len);
304 void tegra_pinmux_config_tristate_table(const struct tegra_pingroup_config *config,
305         int len, enum tegra_tristate tristate);
306 void tegra_pinmux_config_pullupdown_table(const struct tegra_pingroup_config *config,
307         int len, enum tegra_pullupdown pupd);
308
309 void tegra_init_pinmux(void);
310 #endif
311