unknown changes from android-tegra-nv-3.4
[linux-3.10.git] / arch / arm / mach-tegra / pinmux-tegra20-tables.c
1 /*
2  * linux/arch/arm/mach-tegra/pinmux-tegra20-tables.c
3  *
4  * Common pinmux configurations for Tegra20 SoCs
5  *
6  * Copyright (C) 2010 NVIDIA Corporation
7  *
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation; either version 2 of the License, or
11  * (at your option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful, but WITHOUT
14  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
15  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
16  * more details.
17  *
18  * You should have received a copy of the GNU General Public License along
19  * with this program; if not, write to the Free Software Foundation, Inc.,
20  * 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
21  */
22
23 #include <linux/kernel.h>
24 #include <linux/errno.h>
25 #include <linux/spinlock.h>
26 #include <linux/io.h>
27 #include <linux/init.h>
28 #include <linux/string.h>
29 #include <linux/syscore_ops.h>
30 #include <linux/bug.h>
31
32 #include <mach/pinmux.h>
33 #include <mach/pinmux-tegra20.h>
34
35 #include "gpio-names.h"
36 #include "iomap.h"
37
38 #define TRISTATE_REG_A          0x14
39 #define PIN_MUX_CTL_REG_A       0x80
40 #define PULLUPDOWN_REG_A        0xa0
41 #define PINGROUP_REG_A          0x868
42
43 #define SET_DRIVE_PINGROUP(pg_name, r, drv_down_offset, drv_down_mask, drv_up_offset, drv_up_mask)      \
44         [TEGRA_DRIVE_PINGROUP_ ## pg_name] = {                  \
45                 .name = #pg_name,                               \
46                 .reg_bank = 3,                                  \
47                 .reg = ((r) - PINGROUP_REG_A),                  \
48                 .drvup_offset = drv_up_offset,                  \
49                 .drvup_mask = drv_up_mask,                      \
50                 .drvdown_offset = drv_down_offset,              \
51                 .drvdown_mask = drv_down_mask,                  \
52                 .slewrise_offset = slew_rise_offset,    \
53                 .slewrise_mask = slew_rise_mask,        \
54                 .slewfall_offset = slew_fall_offset,    \
55                 .slewfall_mask = slew_fall_mask,        \
56         }
57
58 #define DEFAULT_DRIVE_PINGROUP(pg_name, r)              \
59         [TEGRA_DRIVE_PINGROUP_ ## pg_name] = {          \
60                 .name = #pg_name,                       \
61                 .reg_bank = 3,                          \
62                 .reg = ((r) - PINGROUP_REG_A),          \
63                 .drvup_offset = 20,                     \
64                 .drvup_mask = 0x1f,                     \
65                 .drvdown_offset = 12,                   \
66                 .drvdown_mask = 0x1f,                   \
67                 .slewrise_offset = 28,                  \
68                 .slewrise_mask = 0x3,                   \
69                 .slewfall_offset = 30,                  \
70                 .slewfall_mask = 0x3,                   \
71         }
72
73 const struct tegra_drive_pingroup_desc tegra_soc_drive_pingroups[TEGRA_MAX_DRIVE_PINGROUP] = {
74         DEFAULT_DRIVE_PINGROUP(AO1,             0x868),
75         DEFAULT_DRIVE_PINGROUP(AO2,             0x86c),
76         DEFAULT_DRIVE_PINGROUP(AT1,             0x870),
77         DEFAULT_DRIVE_PINGROUP(AT2,             0x874),
78         DEFAULT_DRIVE_PINGROUP(CDEV1,           0x878),
79         DEFAULT_DRIVE_PINGROUP(CDEV2,           0x87c),
80         DEFAULT_DRIVE_PINGROUP(CSUS,            0x880),
81         DEFAULT_DRIVE_PINGROUP(DAP1,            0x884),
82         DEFAULT_DRIVE_PINGROUP(DAP2,            0x888),
83         DEFAULT_DRIVE_PINGROUP(DAP3,            0x88c),
84         DEFAULT_DRIVE_PINGROUP(DAP4,            0x890),
85         DEFAULT_DRIVE_PINGROUP(DBG,             0x894),
86         DEFAULT_DRIVE_PINGROUP(LCD1,            0x898),
87         DEFAULT_DRIVE_PINGROUP(LCD2,            0x89c),
88         DEFAULT_DRIVE_PINGROUP(SDMMC2,          0x8a0),
89         DEFAULT_DRIVE_PINGROUP(SDMMC3,          0x8a4),
90         DEFAULT_DRIVE_PINGROUP(SPI,             0x8a8),
91         DEFAULT_DRIVE_PINGROUP(UAA,             0x8ac),
92         DEFAULT_DRIVE_PINGROUP(UAB,             0x8b0),
93         DEFAULT_DRIVE_PINGROUP(UART2,           0x8b4),
94         DEFAULT_DRIVE_PINGROUP(UART3,           0x8b8),
95         DEFAULT_DRIVE_PINGROUP(VI1,             0x8bc),
96         DEFAULT_DRIVE_PINGROUP(VI2,             0x8c0),
97         DEFAULT_DRIVE_PINGROUP(XM2A,            0x8c4),
98         DEFAULT_DRIVE_PINGROUP(XM2C,            0x8c8),
99         DEFAULT_DRIVE_PINGROUP(XM2D,            0x8cc),
100         DEFAULT_DRIVE_PINGROUP(XM2CLK,          0x8d0),
101         DEFAULT_DRIVE_PINGROUP(MEMCOMP,         0x8d4),
102         DEFAULT_DRIVE_PINGROUP(SDIO1,           0x8e0),
103         DEFAULT_DRIVE_PINGROUP(CRT,             0x8ec),
104         DEFAULT_DRIVE_PINGROUP(DDC,             0x8f0),
105         DEFAULT_DRIVE_PINGROUP(GMA,             0x8f4),
106         DEFAULT_DRIVE_PINGROUP(GMB,             0x8f8),
107         DEFAULT_DRIVE_PINGROUP(GMC,             0x8fc),
108         DEFAULT_DRIVE_PINGROUP(GMD,             0x900),
109         DEFAULT_DRIVE_PINGROUP(GME,             0x904),
110         DEFAULT_DRIVE_PINGROUP(OWR,             0x908),
111         DEFAULT_DRIVE_PINGROUP(UAD,             0x90c),
112 };
113
114 #define PINGROUP(pg_name, gpio_nr, vdd, f0, f1, f2, f3, f_safe,         \
115                  tri_r, tri_b, mux_r, mux_b, pupd_r, pupd_b)    \
116         [TEGRA_PINGROUP_ ## pg_name] = {                        \
117                 .name = #pg_name,                               \
118                 .vddio = TEGRA_VDDIO_ ## vdd,                   \
119                 .funcs = {                                      \
120                         TEGRA_MUX_ ## f0,                       \
121                         TEGRA_MUX_ ## f1,                       \
122                         TEGRA_MUX_ ## f2,                       \
123                         TEGRA_MUX_ ## f3,                       \
124                 },                                                              \
125                 .gpionr =       TEGRA_GPIO_ ## gpio_nr,         \
126                 .func_safe = TEGRA_MUX_ ## f_safe,              \
127                 .tri_bank = 0,                                  \
128                 .tri_reg = ((tri_r) - TRISTATE_REG_A),          \
129                 .tri_bit = tri_b,                               \
130                 .mux_bank = 1,                                  \
131                 .mux_reg = ((mux_r) - PIN_MUX_CTL_REG_A),       \
132                 .mux_bit = mux_b,                               \
133                 .pupd_bank = 2,                         \
134                 .pupd_reg = ((pupd_r) - PULLUPDOWN_REG_A),      \
135                 .pupd_bit = pupd_b,                             \
136                 .lock_bit = -1,                                 \
137                 .od_bit = -1,                                   \
138                 .ioreset_bit = -1,                              \
139                 .io_default = -1,                               \
140         }
141
142 #define PINGROUPS       \
143         /*      pg_name,gpio_nr,        vdd,    f0,             f1,             f2,             f3,             f_safe,         tri_r,  tri_b,  mux_r,  mux_b,  pupd_r, pupd_b*/\
144         PINGROUP(ATA,   PI3,            NAND,   IDE,            NAND,           GMI,            RSVD,           IDE,            0x14,   0,      0x80,   24,     0xA0,   0),\
145         PINGROUP(ATB,   PI2,            NAND,   IDE,            NAND,           GMI,            SDIO4,          IDE,            0x14,   1,      0x80,   16,     0xA0,   2),\
146         PINGROUP(ATC,   PI5,            NAND,   IDE,            NAND,           GMI,            SDIO4,          IDE,            0x14,   2,      0x80,   22,     0xA0,   4),\
147         PINGROUP(ATD,   PH0,            NAND,   IDE,            NAND,           GMI,            SDIO4,          IDE,            0x14,   3,      0x80,   20,     0xA0,   6),\
148         PINGROUP(ATE,   PH4,            NAND,   IDE,            NAND,           GMI,            RSVD,           IDE,            0x18,   25,     0x80,   12,     0xA0,   8),\
149         PINGROUP(CDEV1, PW4,            AUDIO,  OSC,            PLLA_OUT,       PLLM_OUT1,      AUDIO_SYNC,     OSC,            0x14,   4,      0x88,   2,      0xA8,   0),\
150         PINGROUP(CDEV2, PW5,            AUDIO,  OSC,            AHB_CLK,        APB_CLK,        PLLP_OUT4,      OSC,            0x14,   5,      0x88,   4,      0xA8,   2),\
151         PINGROUP(CRTP,  INVALID,        LCD,    CRT,            RSVD,           RSVD,           RSVD,           RSVD,           0x20,   14,     0x98,   20,     0xA4,   24),\
152         PINGROUP(CSUS,  PT1,            VI,     PLLC_OUT1,      PLLP_OUT2,      PLLP_OUT3,      VI_SENSOR_CLK,  PLLC_OUT1,      0x14,   6,      0x88,   6,      0xAC,   24),\
153         PINGROUP(DAP1,  PN0,            AUDIO,  DAP1,           RSVD,           GMI,            SDIO2,          DAP1,           0x14,   7,      0x88,   20,     0xA0,   10),\
154         PINGROUP(DAP2,  PA2,            AUDIO,  DAP2,           TWC,            RSVD,           GMI,            DAP2,           0x14,   8,      0x88,   22,     0xA0,   12),\
155         PINGROUP(DAP3,  PP0,            BB,     DAP3,           RSVD,           RSVD,           RSVD,           DAP3,           0x14,   9,      0x88,   24,     0xA0,   14),\
156         PINGROUP(DAP4,  PP4,            UART,   DAP4,           RSVD,           GMI,            RSVD,           DAP4,           0x14,   10,     0x88,   26,     0xA0,   16),\
157         PINGROUP(DDC,   INVALID,        LCD,    I2C2,           RSVD,           RSVD,           RSVD,           RSVD,           0x18,   31,     0x88,   0,      0xB0,   28),\
158         PINGROUP(DTA,   PT4,            VI,     RSVD,           SDIO2,          VI,             RSVD,           RSVD4,          0x14,   11,     0x84,   20,     0xA0,   18),\
159         PINGROUP(DTB,   PT2,            VI,     RSVD,           RSVD,           VI,             SPI1,           RSVD1,          0x14,   12,     0x84,   22,     0xA0,   20),\
160         PINGROUP(DTC,   PD6,            VI,     RSVD,           RSVD,           VI,             RSVD,           RSVD1,          0x14,   13,     0x84,   26,     0xA0,   22),\
161         PINGROUP(DTD,   PT0,            VI,     RSVD,           SDIO2,          VI,             RSVD,           RSVD1,          0x14,   14,     0x84,   28,     0xA0,   24),\
162         PINGROUP(DTE,   PBB1,           VI,     RSVD,           RSVD,           VI,             SPI1,           RSVD1,          0x14,   15,     0x84,   30,     0xA0,   26),\
163         PINGROUP(DTF,   PBB2,           VI,     I2C3,           RSVD,           VI,             RSVD,           RSVD4,          0x20,   12,     0x98,   30,     0xA0,   28),\
164         PINGROUP(GMA,   PAA0,           NAND,   UARTE,          SPI3,           GMI,            SDIO4,          SPI3,           0x14,   28,     0x84,   0,      0xB0,   20),\
165         PINGROUP(GMB,   PC7,            NAND,   IDE,            NAND,           GMI,            GMI_INT,        GMI,            0x18,   29,     0x88,   28,     0xB0,   22),\
166         PINGROUP(GMC,   PJ7,            NAND,   UARTD,          SPI4,           GMI,            SFLASH,         SPI4,           0x14,   29,     0x84,   2,      0xB0,   24),\
167         PINGROUP(GMD,   PJ0,            NAND,   RSVD,           NAND,           GMI,            SFLASH,         GMI,            0x18,   30,     0x88,   30,     0xB0,   26),\
168         PINGROUP(GME,   PAA4,           NAND,   RSVD,           DAP5,           GMI,            SDIO4,          GMI,            0x18,   0,      0x8C,   0,      0xA8,   24),\
169         PINGROUP(GPU,   PU0,            UART,   PWM,            UARTA,          GMI,            RSVD,           RSVD4,          0x14,   16,     0x8C,   4,      0xA4,   20),\
170         PINGROUP(GPU7,  PU7,            SYS,    RTCK,           RSVD,           RSVD,           RSVD,           RTCK,           0x20,   11,     0x98,   28,     0xA4,   6),\
171         PINGROUP(GPV,   PV4,            SD,     PCIE,           RSVD,           RSVD,           RSVD,           PCIE,           0x14,   17,     0x8C,   2,      0xA0,   30),\
172         PINGROUP(HDINT, PN7,            LCD,    HDMI,           RSVD,           RSVD,           RSVD,           HDMI,           0x1C,   23,     0x84,   4,      0xAC,   22),\
173         PINGROUP(I2CP,  PZ6,            SYS,    I2C,            RSVD,           RSVD,           RSVD,           RSVD4,          0x14,   18,     0x88,   8,      0xA4,   2),\
174         PINGROUP(IRRX,  PJ6,            UART,   UARTA,          UARTB,          GMI,            SPI4,           UARTB,          0x14,   20,     0x88,   18,     0xA8,   22),\
175         PINGROUP(IRTX,  PJ5,            UART,   UARTA,          UARTB,          GMI,            SPI4,           UARTB,          0x14,   19,     0x88,   16,     0xA8,   20),\
176         PINGROUP(KBCA,  PR0,            SYS,    KBC,            NAND,           SDIO2,          EMC_TEST0_DLL,  KBC,            0x14,   22,     0x88,   10,     0xA4,   8),\
177         PINGROUP(KBCB,  PR7,            SYS,    KBC,            NAND,           SDIO2,          MIO,            KBC,            0x14,   21,     0x88,   12,     0xA4,   10),\
178         PINGROUP(KBCC,  PQ0,            SYS,    KBC,            NAND,           TRACE,          EMC_TEST1_DLL,  KBC,            0x18,   26,     0x88,   14,     0xA4,   12),\
179         PINGROUP(KBCD,  PR3,            SYS,    KBC,            NAND,           SDIO2,          MIO,            KBC,            0x20,   10,     0x98,   26,     0xA4,   14),\
180         PINGROUP(KBCE,  PQ7,            SYS,    KBC,            NAND,           OWR,            RSVD,           KBC,            0x14,   26,     0x80,   28,     0xB0,   2),\
181         PINGROUP(KBCF,  PQ2,            SYS,    KBC,            NAND,           TRACE,          MIO,            KBC,            0x14,   27,     0x80,   26,     0xB0,   0),\
182         PINGROUP(LCSN,  PN4,            LCD,    DISPLAYA,       DISPLAYB,       SPI3,           RSVD,           RSVD4,          0x1C,   31,     0x90,   12,     0xAC,   20),\
183         PINGROUP(LD0,   PE0,            LCD,    DISPLAYA,       DISPLAYB,       XIO,            RSVD,           RSVD4,          0x1C,   0,      0x94,   0,      0xAC,   12),\
184         PINGROUP(LD1,   PE1,            LCD,    DISPLAYA,       DISPLAYB,       XIO,            RSVD,           RSVD4,          0x1C,   1,      0x94,   2,      0xAC,   12),\
185         PINGROUP(LD10,  PF2,            LCD,    DISPLAYA,       DISPLAYB,       XIO,            RSVD,           RSVD4,          0x1C,   10,     0x94,   20,     0xAC,   12),\
186         PINGROUP(LD11,  PF3,            LCD,    DISPLAYA,       DISPLAYB,       XIO,            RSVD,           RSVD4,          0x1C,   11,     0x94,   22,     0xAC,   12),\
187         PINGROUP(LD12,  PF4,            LCD,    DISPLAYA,       DISPLAYB,       XIO,            RSVD,           RSVD4,          0x1C,   12,     0x94,   24,     0xAC,   12),\
188         PINGROUP(LD13,  PF5,            LCD,    DISPLAYA,       DISPLAYB,       XIO,            RSVD,           RSVD4,          0x1C,   13,     0x94,   26,     0xAC,   12),\
189         PINGROUP(LD14,  PF6,            LCD,    DISPLAYA,       DISPLAYB,       XIO,            RSVD,           RSVD4,          0x1C,   14,     0x94,   28,     0xAC,   12),\
190         PINGROUP(LD15,  PF7,            LCD,    DISPLAYA,       DISPLAYB,       XIO,            RSVD,           RSVD4,          0x1C,   15,     0x94,   30,     0xAC,   12),\
191         PINGROUP(LD16,  PM0,            LCD,    DISPLAYA,       DISPLAYB,       XIO,            RSVD,           RSVD4,          0x1C,   16,     0x98,   0,      0xAC,   12),\
192         PINGROUP(LD17,  PM1,            LCD,    DISPLAYA,       DISPLAYB,       RSVD,           RSVD,           RSVD4,          0x1C,   17,     0x98,   2,      0xAC,   12),\
193         PINGROUP(LD2,   PE2,            LCD,    DISPLAYA,       DISPLAYB,       XIO,            RSVD,           RSVD4,          0x1C,   2,      0x94,   4,      0xAC,   12),\
194         PINGROUP(LD3,   PE3,            LCD,    DISPLAYA,       DISPLAYB,       XIO,            RSVD,           RSVD4,          0x1C,   3,      0x94,   6,      0xAC,   12),\
195         PINGROUP(LD4,   PE4,            LCD,    DISPLAYA,       DISPLAYB,       XIO,            RSVD,           RSVD4,          0x1C,   4,      0x94,   8,      0xAC,   12),\
196         PINGROUP(LD5,   PE5,            LCD,    DISPLAYA,       DISPLAYB,       XIO,            RSVD,           RSVD4,          0x1C,   5,      0x94,   10,     0xAC,   12),\
197         PINGROUP(LD6,   PE6,            LCD,    DISPLAYA,       DISPLAYB,       XIO,            RSVD,           RSVD4,          0x1C,   6,      0x94,   12,     0xAC,   12),\
198         PINGROUP(LD7,   PE7,            LCD,    DISPLAYA,       DISPLAYB,       XIO,            RSVD,           RSVD4,          0x1C,   7,      0x94,   14,     0xAC,   12),\
199         PINGROUP(LD8,   PF0,            LCD,    DISPLAYA,       DISPLAYB,       XIO,            RSVD,           RSVD4,          0x1C,   8,      0x94,   16,     0xAC,   12),\
200         PINGROUP(LD9,   PF1,            LCD,    DISPLAYA,       DISPLAYB,       XIO,            RSVD,           RSVD4,          0x1C,   9,      0x94,   18,     0xAC,   12),\
201         PINGROUP(LDC,   PN6,            LCD,    DISPLAYA,       DISPLAYB,       RSVD,           RSVD,           RSVD4,          0x1C,   30,     0x90,   14,     0xAC,   20),\
202         PINGROUP(LDI,   PM6,            LCD,    DISPLAYA,       DISPLAYB,       RSVD,           RSVD,           RSVD4,          0x20,   6,      0x98,   16,     0xAC,   18),\
203         PINGROUP(LHP0,  PM5,            LCD,    DISPLAYA,       DISPLAYB,       RSVD,           RSVD,           RSVD4,          0x1C,   18,     0x98,   10,     0xAC,   16),\
204         PINGROUP(LHP1,  PM2,            LCD,    DISPLAYA,       DISPLAYB,       RSVD,           RSVD,           RSVD4,          0x1C,   19,     0x98,   4,      0xAC,   14),\
205         PINGROUP(LHP2,  PM3,            LCD,    DISPLAYA,       DISPLAYB,       RSVD,           RSVD,           RSVD4,          0x1C,   20,     0x98,   6,      0xAC,   14),\
206         PINGROUP(LHS,   PJ3,            LCD,    DISPLAYA,       DISPLAYB,       XIO,            RSVD,           RSVD4,          0x20,   7,      0x90,   22,     0xAC,   22),\
207         PINGROUP(LM0,   PW0,            LCD,    DISPLAYA,       DISPLAYB,       SPI3,           RSVD,           RSVD4,          0x1C,   24,     0x90,   26,     0xAC,   22),\
208         PINGROUP(LM1,   PW1,            LCD,    DISPLAYA,       DISPLAYB,       RSVD,           CRT,            RSVD3,          0x1C,   25,     0x90,   28,     0xAC,   22),\
209         PINGROUP(LPP,   PM7,            LCD,    DISPLAYA,       DISPLAYB,       RSVD,           RSVD,           RSVD4,          0x20,   8,      0x98,   14,     0xAC,   18),\
210         PINGROUP(LPW0,  PB2,            LCD,    DISPLAYA,       DISPLAYB,       SPI3,           HDMI,           DISPLAYB,       0x20,   3,      0x90,   0,      0xAC,   20),\
211         PINGROUP(LPW1,  PC1,            LCD,    DISPLAYA,       DISPLAYB,       RSVD,           RSVD,           RSVD4,          0x20,   4,      0x90,   2,      0xAC,   20),\
212         PINGROUP(LPW2,  PC6,            LCD,    DISPLAYA,       DISPLAYB,       SPI3,           HDMI,           DISPLAYB,       0x20,   5,      0x90,   4,      0xAC,   20),\
213         PINGROUP(LSC0,  PB3,            LCD,    DISPLAYA,       DISPLAYB,       XIO,            RSVD,           RSVD4,          0x1C,   27,     0x90,   18,     0xAC,   22),\
214         PINGROUP(LSC1,  PZ3,            LCD,    DISPLAYA,       DISPLAYB,       SPI3,           HDMI,           DISPLAYA,       0x1C,   28,     0x90,   20,     0xAC,   20),\
215         PINGROUP(LSCK,  PZ4,            LCD,    DISPLAYA,       DISPLAYB,       SPI3,           HDMI,           DISPLAYA,       0x1C,   29,     0x90,   16,     0xAC,   20),\
216         PINGROUP(LSDA,  PN5,            LCD,    DISPLAYA,       DISPLAYB,       SPI3,           HDMI,           DISPLAYA,       0x20,   1,      0x90,   8,      0xAC,   20),\
217         PINGROUP(LSDI,  PZ2,            LCD,    DISPLAYA,       DISPLAYB,       SPI3,           RSVD,           DISPLAYA,       0x20,   2,      0x90,   6,      0xAC,   20),\
218         PINGROUP(LSPI,  PJ1,            LCD,    DISPLAYA,       DISPLAYB,       XIO,            HDMI,           DISPLAYA,       0x20,   0,      0x90,   10,     0xAC,   22),\
219         PINGROUP(LVP0,  PV7,            LCD,    DISPLAYA,       DISPLAYB,       RSVD,           RSVD,           RSVD4,          0x1C,   21,     0x90,   30,     0xAC,   22),\
220         PINGROUP(LVP1,  PM4,            LCD,    DISPLAYA,       DISPLAYB,       RSVD,           RSVD,           RSVD4,          0x1C,   22,     0x98,   8,      0xAC,   16),\
221         PINGROUP(LVS,   PJ4,            LCD,    DISPLAYA,       DISPLAYB,       XIO,            RSVD,           RSVD4,          0x1C,   26,     0x90,   24,     0xAC,   22),\
222         PINGROUP(OWC,   INVALID,        SYS,    OWR,            RSVD,           RSVD,           RSVD,           OWR,            0x14,   31,     0x84,   8,      0xB0,   30),\
223         PINGROUP(PMC,   PBB0,           SYS,    PWR_ON,         PWR_INTR,       RSVD,           RSVD,           PWR_ON,         0x14,   23,     0x98,   18,     -1,     -1),\
224         PINGROUP(PTA,   PT5,            NAND,   I2C2,           HDMI,           GMI,            RSVD,           RSVD,           0x14,   24,     0x98,   22,     0xA4,   4),\
225         PINGROUP(RM,    PC5,            UART,   I2C,            RSVD,           RSVD,           RSVD,           RSVD4,          0x14,   25,     0x80,   14,     0xA4,   0),\
226         PINGROUP(SDB,   PA7,            SD,     UARTA,          PWM,            SDIO3,          SPI2,           PWM,            0x20,   15,     0x8C,   10,     -1,     -1),\
227         PINGROUP(SDC,   PB7,            SD,     PWM,            TWC,            SDIO3,          SPI3,           TWC,            0x18,   1,      0x8C,   12,     0xAC,   28),\
228         PINGROUP(SDD,   PA6,            SD,     UARTA,          PWM,            SDIO3,          SPI3,           PWM,            0x18,   2,      0x8C,   14,     0xAC,   30),\
229         PINGROUP(SDIO1, PZ0,            BB,     SDIO1,          RSVD,           UARTE,          UARTA,          RSVD2,          0x14,   30,     0x80,   30,     0xB0,   18),\
230         PINGROUP(SLXA,  PD1,            SD,     PCIE,           SPI4,           SDIO3,          SPI2,           PCIE,           0x18,   3,      0x84,   6,      0xA4,   22),\
231         PINGROUP(SLXC,  PD3,            SD,     SPDIF,          SPI4,           SDIO3,          SPI2,           SPI4,           0x18,   5,      0x84,   10,     0xA4,   26),\
232         PINGROUP(SLXD,  PD4,            SD,     SPDIF,          SPI4,           SDIO3,          SPI2,           SPI4,           0x18,   6,      0x84,   12,     0xA4,   28),\
233         PINGROUP(SLXK,  PD0,            SD,     PCIE,           SPI4,           SDIO3,          SPI2,           PCIE,           0x18,   7,      0x84,   14,     0xA4,   30),\
234         PINGROUP(SPDI,  PK6,            AUDIO,  SPDIF,          RSVD,           I2C,            SDIO2,          RSVD2,          0x18,   8,      0x8C,   8,      0xA4,   16),\
235         PINGROUP(SPDO,  PK5,            AUDIO,  SPDIF,          RSVD,           I2C,            SDIO2,          RSVD2,          0x18,   9,      0x8C,   6,      0xA4,   18),\
236         PINGROUP(SPIA,  PX0,            AUDIO,  SPI1,           SPI2,           SPI3,           GMI,            GMI,            0x18,   10,     0x8C,   30,     0xA8,   4),\
237         PINGROUP(SPIB,  PX1,            AUDIO,  SPI1,           SPI2,           SPI3,           GMI,            GMI,            0x18,   11,     0x8C,   28,     0xA8,   6),\
238         PINGROUP(SPIC,  PX2,            AUDIO,  SPI1,           SPI2,           SPI3,           GMI,            GMI,            0x18,   12,     0x8C,   26,     0xA8,   8),\
239         PINGROUP(SPID,  PX4,            AUDIO,  SPI2,           SPI1,           SPI2_ALT,       GMI,            GMI,            0x18,   13,     0x8C,   24,     0xA8,   10),\
240         PINGROUP(SPIE,  PX5,            AUDIO,  SPI2,           SPI1,           SPI2_ALT,       GMI,            GMI,            0x18,   14,     0x8C,   22,     0xA8,   12),\
241         PINGROUP(SPIF,  PX7,            AUDIO,  SPI3,           SPI1,           SPI2,           RSVD,           RSVD4,          0x18,   15,     0x8C,   20,     0xA8,   14),\
242         PINGROUP(SPIG,  PW2,            AUDIO,  SPI3,           SPI2,           SPI2_ALT,       I2C,            SPI2_ALT,       0x18,   16,     0x8C,   18,     0xA8,   16),\
243         PINGROUP(SPIH,  PW3,            AUDIO,  SPI3,           SPI2,           SPI2_ALT,       I2C,            SPI2_ALT,       0x18,   17,     0x8C,   16,     0xA8,   18),\
244         PINGROUP(UAA,   PO1,            BB,     SPI3,           MIPI_HS,        UARTA,          ULPI,           MIPI_HS,        0x18,   18,     0x80,   0,      0xAC,   0),\
245         PINGROUP(UAB,   PO5,            BB,     SPI2,           MIPI_HS,        UARTA,          ULPI,           MIPI_HS,        0x18,   19,     0x80,   2,      0xAC,   2),\
246         PINGROUP(UAC,   PV0,            BB,     OWR,            RSVD,           RSVD,           RSVD,           RSVD4,          0x18,   20,     0x80,   4,      0xAC,   4),\
247         PINGROUP(UAD,   PC2,            UART,   IRDA,           SPDIF,          UARTA,          SPI4,           SPDIF,          0x18,   21,     0x80,   6,      0xAC,   6),\
248         PINGROUP(UCA,   PW6,            UART,   UARTC,          RSVD,           GMI,            RSVD,           RSVD4,          0x18,   22,     0x84,   16,     0xAC,   8),\
249         PINGROUP(UCB,   PC0,            UART,   UARTC,          PWM,            GMI,            RSVD,           RSVD4,          0x18,   23,     0x84,   18,     0xAC,   10),\
250         PINGROUP(UDA,   PY0,            BB,     SPI1,           RSVD,           UARTD,          ULPI,           RSVD2,          0x20,   13,     0x80,   8,      0xB0,   16),\
251         /* these pin groups only have pullup and pull down control */\
252         PINGROUP(CK32,  INVALID,        SYS,    RSVD,           RSVD,           RSVD,           RSVD,           RSVD,           -1,     -1,     -1,     -1,     0xB0,   14),\
253         PINGROUP(DDRC,  INVALID,        DDR,    RSVD,           RSVD,           RSVD,           RSVD,           RSVD,           -1,     -1,     -1,     -1,     0xAC,   26),\
254         PINGROUP(PMCA,  INVALID,        SYS,    RSVD,           RSVD,           RSVD,           RSVD,           RSVD,           -1,     -1,     -1,     -1,     0xB0,   4),\
255         PINGROUP(PMCB,  INVALID,        SYS,    RSVD,           RSVD,           RSVD,           RSVD,           RSVD,           -1,     -1,     -1,     -1,     0xB0,   6),\
256         PINGROUP(PMCC,  INVALID,        SYS,    RSVD,           RSVD,           RSVD,           RSVD,           RSVD,           -1,     -1,     -1,     -1,     0xB0,   8),\
257         PINGROUP(PMCD,  INVALID,        SYS,    RSVD,           RSVD,           RSVD,           RSVD,           RSVD,           -1,     -1,     -1,     -1,     0xB0,   10),\
258         PINGROUP(PMCE,  INVALID,        SYS,    RSVD,           RSVD,           RSVD,           RSVD,           RSVD,           -1,     -1,     -1,     -1,     0xB0,   12),\
259         PINGROUP(XM2C,  INVALID,        DDR,    RSVD,           RSVD,           RSVD,           RSVD,           RSVD,           -1,     -1,     -1,     -1,     0xA8,   30),\
260         PINGROUP(XM2D,  INVALID,        DDR,    RSVD,           RSVD,           RSVD,           RSVD,           RSVD,           -1,     -1,     -1,     -1,     0xA8,   28),\
261         /* END OF LIST */
262
263 static const struct tegra_pingroup_desc tegra_soc_pingroups[TEGRA_MAX_PINGROUP] = {
264         PINGROUPS
265 };
266
267 #undef PINGROUP
268
269 #define PINGROUP(pg_name, gpio_nr, vdd, f0, f1, f2, f3, f_safe,         \
270                          tri_r, tri_b, mux_r, mux_b, pupd_r, pupd_b)    \
271         [TEGRA_GPIO_##gpio_nr] =  TEGRA_PINGROUP_ ##pg_name\
272
273 static const int gpio_to_pingroup[TEGRA_MAX_GPIO] = {
274         PINGROUPS
275 };
276
277 #ifdef CONFIG_PM_SLEEP
278 #define TRISTATE_REG_NUM        4
279 #define PIN_MUX_CTL_REG_NUM     8
280 #define PULLUPDOWN_REG_NUM      5
281
282 static u32 pinmux_reg[TRISTATE_REG_NUM + PIN_MUX_CTL_REG_NUM +
283                       PULLUPDOWN_REG_NUM +
284                       ARRAY_SIZE(tegra_soc_drive_pingroups)];
285
286 static int tegra20_pinmux_suspend(void)
287 {
288         unsigned int i;
289         u32 *ctx = pinmux_reg;
290
291         for (i = 0; i < PIN_MUX_CTL_REG_NUM; i++) {
292                 *ctx++ = pg_readl(tegra_soc_pingroups[i].mux_bank,
293                                 tegra_soc_pingroups[i].mux_reg);
294         }
295
296         for (i = 0; i < PULLUPDOWN_REG_NUM; i++) {
297                 *ctx++ = pg_readl(tegra_soc_pingroups[i].pupd_bank,
298                                 tegra_soc_pingroups[i].pupd_reg);
299         }
300
301         for (i = 0; i < TRISTATE_REG_NUM; i++) {
302                 *ctx++ = pg_readl(tegra_soc_pingroups[i].tri_bank,
303                                 tegra_soc_pingroups[i].tri_reg);
304         }
305
306         for (i = 0; i < ARRAY_SIZE(tegra_soc_drive_pingroups); i++) {
307                 *ctx++ = pg_readl(tegra_soc_drive_pingroups[i].reg_bank,
308                                 tegra_soc_drive_pingroups[i].reg);
309         }
310
311         return 0;
312 }
313
314 static void tegra20_pinmux_resume(void)
315 {
316         unsigned int i;
317         u32 *ctx = pinmux_reg;
318
319         for (i = 0; i < PIN_MUX_CTL_REG_NUM; i++) {
320                 pg_writel(*ctx++, tegra_soc_pingroups[i].mux_bank,
321                                 tegra_soc_pingroups[i].mux_reg);
322         }
323
324         for (i = 0; i < PULLUPDOWN_REG_NUM; i++) {
325                 pg_writel(*ctx++, tegra_soc_pingroups[i].pupd_bank,
326                                 tegra_soc_pingroups[i].pupd_reg);
327         }
328
329         for (i = 0; i < TRISTATE_REG_NUM; i++) {
330                 pg_writel(*ctx++, tegra_soc_pingroups[i].tri_bank,
331                                 tegra_soc_pingroups[i].tri_reg);
332         }
333
334         for (i = 0; i < ARRAY_SIZE(tegra_soc_drive_pingroups); i++) {
335                 pg_writel(*ctx++, tegra_soc_drive_pingroups[i].reg_bank,
336                         tegra_soc_drive_pingroups[i].reg);
337         }
338 }
339
340 static struct syscore_ops tegra20_pinmux_syscore_ops = {
341         .suspend = tegra20_pinmux_suspend,
342         .resume = tegra20_pinmux_resume,
343 };
344 #endif
345
346 void tegra20_pinmux_init(const struct tegra_pingroup_desc **pg,
347                 int *pg_max, const struct tegra_drive_pingroup_desc **pgdrive,
348                 int *pgdrive_max, const int **gpiomap, int *gpiomap_max)
349 {
350         *pg = tegra_soc_pingroups;
351         *pg_max = TEGRA_MAX_PINGROUP;
352         *pgdrive = tegra_soc_drive_pingroups;
353         *pgdrive_max = TEGRA_MAX_DRIVE_PINGROUP;
354         *gpiomap = gpio_to_pingroup;
355         *gpiomap_max = TEGRA_MAX_GPIO;
356
357 #ifdef CONFIG_PM_SLEEP
358         register_syscore_ops(&tegra20_pinmux_syscore_ops);
359 #endif
360 }
361