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