1*4882a593Smuzhiyun /* 2*4882a593Smuzhiyun * (C) Copyright 2010-2014 3*4882a593Smuzhiyun * NVIDIA Corporation <www.nvidia.com> 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * SPDX-License-Identifier: GPL-2.0+ 6*4882a593Smuzhiyun */ 7*4882a593Smuzhiyun 8*4882a593Smuzhiyun #ifndef _TEGRA_PINMUX_H_ 9*4882a593Smuzhiyun #define _TEGRA_PINMUX_H_ 10*4882a593Smuzhiyun 11*4882a593Smuzhiyun #include <linux/types.h> 12*4882a593Smuzhiyun 13*4882a593Smuzhiyun #include <asm/arch/tegra.h> 14*4882a593Smuzhiyun 15*4882a593Smuzhiyun /* The pullup/pulldown state of a pin group */ 16*4882a593Smuzhiyun enum pmux_pull { 17*4882a593Smuzhiyun PMUX_PULL_NORMAL = 0, 18*4882a593Smuzhiyun PMUX_PULL_DOWN, 19*4882a593Smuzhiyun PMUX_PULL_UP, 20*4882a593Smuzhiyun }; 21*4882a593Smuzhiyun 22*4882a593Smuzhiyun /* Defines whether a pin group is tristated or in normal operation */ 23*4882a593Smuzhiyun enum pmux_tristate { 24*4882a593Smuzhiyun PMUX_TRI_NORMAL = 0, 25*4882a593Smuzhiyun PMUX_TRI_TRISTATE = 1, 26*4882a593Smuzhiyun }; 27*4882a593Smuzhiyun 28*4882a593Smuzhiyun #ifdef TEGRA_PMX_PINS_HAVE_E_INPUT 29*4882a593Smuzhiyun enum pmux_pin_io { 30*4882a593Smuzhiyun PMUX_PIN_OUTPUT = 0, 31*4882a593Smuzhiyun PMUX_PIN_INPUT = 1, 32*4882a593Smuzhiyun PMUX_PIN_NONE, 33*4882a593Smuzhiyun }; 34*4882a593Smuzhiyun #endif 35*4882a593Smuzhiyun 36*4882a593Smuzhiyun #ifdef TEGRA_PMX_PINS_HAVE_LOCK 37*4882a593Smuzhiyun enum pmux_pin_lock { 38*4882a593Smuzhiyun PMUX_PIN_LOCK_DEFAULT = 0, 39*4882a593Smuzhiyun PMUX_PIN_LOCK_DISABLE, 40*4882a593Smuzhiyun PMUX_PIN_LOCK_ENABLE, 41*4882a593Smuzhiyun }; 42*4882a593Smuzhiyun #endif 43*4882a593Smuzhiyun 44*4882a593Smuzhiyun #ifdef TEGRA_PMX_PINS_HAVE_OD 45*4882a593Smuzhiyun enum pmux_pin_od { 46*4882a593Smuzhiyun PMUX_PIN_OD_DEFAULT = 0, 47*4882a593Smuzhiyun PMUX_PIN_OD_DISABLE, 48*4882a593Smuzhiyun PMUX_PIN_OD_ENABLE, 49*4882a593Smuzhiyun }; 50*4882a593Smuzhiyun #endif 51*4882a593Smuzhiyun 52*4882a593Smuzhiyun #ifdef TEGRA_PMX_PINS_HAVE_IO_RESET 53*4882a593Smuzhiyun enum pmux_pin_ioreset { 54*4882a593Smuzhiyun PMUX_PIN_IO_RESET_DEFAULT = 0, 55*4882a593Smuzhiyun PMUX_PIN_IO_RESET_DISABLE, 56*4882a593Smuzhiyun PMUX_PIN_IO_RESET_ENABLE, 57*4882a593Smuzhiyun }; 58*4882a593Smuzhiyun #endif 59*4882a593Smuzhiyun 60*4882a593Smuzhiyun #ifdef TEGRA_PMX_PINS_HAVE_RCV_SEL 61*4882a593Smuzhiyun enum pmux_pin_rcv_sel { 62*4882a593Smuzhiyun PMUX_PIN_RCV_SEL_DEFAULT = 0, 63*4882a593Smuzhiyun PMUX_PIN_RCV_SEL_NORMAL, 64*4882a593Smuzhiyun PMUX_PIN_RCV_SEL_HIGH, 65*4882a593Smuzhiyun }; 66*4882a593Smuzhiyun #endif 67*4882a593Smuzhiyun 68*4882a593Smuzhiyun #ifdef TEGRA_PMX_PINS_HAVE_E_IO_HV 69*4882a593Smuzhiyun enum pmux_pin_e_io_hv { 70*4882a593Smuzhiyun PMUX_PIN_E_IO_HV_DEFAULT = 0, 71*4882a593Smuzhiyun PMUX_PIN_E_IO_HV_NORMAL, 72*4882a593Smuzhiyun PMUX_PIN_E_IO_HV_HIGH, 73*4882a593Smuzhiyun }; 74*4882a593Smuzhiyun #endif 75*4882a593Smuzhiyun 76*4882a593Smuzhiyun #ifdef TEGRA_PMX_GRPS_HAVE_LPMD 77*4882a593Smuzhiyun /* Defines a pin group cfg's low-power mode select */ 78*4882a593Smuzhiyun enum pmux_lpmd { 79*4882a593Smuzhiyun PMUX_LPMD_X8 = 0, 80*4882a593Smuzhiyun PMUX_LPMD_X4, 81*4882a593Smuzhiyun PMUX_LPMD_X2, 82*4882a593Smuzhiyun PMUX_LPMD_X, 83*4882a593Smuzhiyun PMUX_LPMD_NONE = -1, 84*4882a593Smuzhiyun }; 85*4882a593Smuzhiyun #endif 86*4882a593Smuzhiyun 87*4882a593Smuzhiyun #if defined(TEGRA_PMX_PINS_HAVE_SCHMT) || defined(TEGRA_PMX_GRPS_HAVE_SCHMT) 88*4882a593Smuzhiyun /* Defines whether a pin group cfg's schmidt is enabled or not */ 89*4882a593Smuzhiyun enum pmux_schmt { 90*4882a593Smuzhiyun PMUX_SCHMT_DISABLE = 0, 91*4882a593Smuzhiyun PMUX_SCHMT_ENABLE = 1, 92*4882a593Smuzhiyun PMUX_SCHMT_NONE = -1, 93*4882a593Smuzhiyun }; 94*4882a593Smuzhiyun #endif 95*4882a593Smuzhiyun 96*4882a593Smuzhiyun #if defined(TEGRA_PMX_PINS_HAVE_HSM) || defined(TEGRA_PMX_GRPS_HAVE_HSM) 97*4882a593Smuzhiyun /* Defines whether a pin group cfg's high-speed mode is enabled or not */ 98*4882a593Smuzhiyun enum pmux_hsm { 99*4882a593Smuzhiyun PMUX_HSM_DISABLE = 0, 100*4882a593Smuzhiyun PMUX_HSM_ENABLE = 1, 101*4882a593Smuzhiyun PMUX_HSM_NONE = -1, 102*4882a593Smuzhiyun }; 103*4882a593Smuzhiyun #endif 104*4882a593Smuzhiyun 105*4882a593Smuzhiyun /* 106*4882a593Smuzhiyun * This defines the configuration for a pin, including the function assigned, 107*4882a593Smuzhiyun * pull up/down settings and tristate settings. Having set up one of these 108*4882a593Smuzhiyun * you can call pinmux_config_pingroup() to configure a pin in one step. Also 109*4882a593Smuzhiyun * available is pinmux_config_table() to configure a list of pins. 110*4882a593Smuzhiyun */ 111*4882a593Smuzhiyun struct pmux_pingrp_config { 112*4882a593Smuzhiyun u32 pingrp:16; /* pin group PMUX_PINGRP_... */ 113*4882a593Smuzhiyun u32 func:8; /* function to assign PMUX_FUNC_... */ 114*4882a593Smuzhiyun u32 pull:2; /* pull up/down/normal PMUX_PULL_...*/ 115*4882a593Smuzhiyun u32 tristate:2; /* tristate or normal PMUX_TRI_... */ 116*4882a593Smuzhiyun #ifdef TEGRA_PMX_PINS_HAVE_E_INPUT 117*4882a593Smuzhiyun u32 io:2; /* input or output PMUX_PIN_... */ 118*4882a593Smuzhiyun #endif 119*4882a593Smuzhiyun #ifdef TEGRA_PMX_PINS_HAVE_LOCK 120*4882a593Smuzhiyun u32 lock:2; /* lock enable/disable PMUX_PIN... */ 121*4882a593Smuzhiyun #endif 122*4882a593Smuzhiyun #ifdef TEGRA_PMX_PINS_HAVE_OD 123*4882a593Smuzhiyun u32 od:2; /* open-drain or push-pull driver */ 124*4882a593Smuzhiyun #endif 125*4882a593Smuzhiyun #ifdef TEGRA_PMX_PINS_HAVE_IO_RESET 126*4882a593Smuzhiyun u32 ioreset:2; /* input/output reset PMUX_PIN... */ 127*4882a593Smuzhiyun #endif 128*4882a593Smuzhiyun #ifdef TEGRA_PMX_PINS_HAVE_RCV_SEL 129*4882a593Smuzhiyun u32 rcv_sel:2; /* select between High and Normal */ 130*4882a593Smuzhiyun /* VIL/VIH receivers */ 131*4882a593Smuzhiyun #endif 132*4882a593Smuzhiyun #ifdef TEGRA_PMX_PINS_HAVE_E_IO_HV 133*4882a593Smuzhiyun u32 e_io_hv:2; /* select 3.3v tolerant receivers */ 134*4882a593Smuzhiyun #endif 135*4882a593Smuzhiyun #ifdef TEGRA_PMX_PINS_HAVE_SCHMT 136*4882a593Smuzhiyun u32 schmt:2; /* schmitt enable */ 137*4882a593Smuzhiyun #endif 138*4882a593Smuzhiyun #ifdef TEGRA_PMX_PINS_HAVE_HSM 139*4882a593Smuzhiyun u32 hsm:2; /* high-speed mode enable */ 140*4882a593Smuzhiyun #endif 141*4882a593Smuzhiyun }; 142*4882a593Smuzhiyun 143*4882a593Smuzhiyun #ifdef TEGRA_PMX_SOC_HAS_IO_CLAMPING 144*4882a593Smuzhiyun /* Set/clear the pinmux CLAMP_INPUTS_WHEN_TRISTATED bit */ 145*4882a593Smuzhiyun void pinmux_set_tristate_input_clamping(void); 146*4882a593Smuzhiyun void pinmux_clear_tristate_input_clamping(void); 147*4882a593Smuzhiyun #endif 148*4882a593Smuzhiyun 149*4882a593Smuzhiyun /* Set the mux function for a pin group */ 150*4882a593Smuzhiyun void pinmux_set_func(enum pmux_pingrp pin, enum pmux_func func); 151*4882a593Smuzhiyun 152*4882a593Smuzhiyun /* Set the pull up/down feature for a pin group */ 153*4882a593Smuzhiyun void pinmux_set_pullupdown(enum pmux_pingrp pin, enum pmux_pull pupd); 154*4882a593Smuzhiyun 155*4882a593Smuzhiyun /* Set a pin group to tristate */ 156*4882a593Smuzhiyun void pinmux_tristate_enable(enum pmux_pingrp pin); 157*4882a593Smuzhiyun 158*4882a593Smuzhiyun /* Set a pin group to normal (non tristate) */ 159*4882a593Smuzhiyun void pinmux_tristate_disable(enum pmux_pingrp pin); 160*4882a593Smuzhiyun 161*4882a593Smuzhiyun #ifdef TEGRA_PMX_PINS_HAVE_E_INPUT 162*4882a593Smuzhiyun /* Set a pin group as input or output */ 163*4882a593Smuzhiyun void pinmux_set_io(enum pmux_pingrp pin, enum pmux_pin_io io); 164*4882a593Smuzhiyun #endif 165*4882a593Smuzhiyun 166*4882a593Smuzhiyun /** 167*4882a593Smuzhiyun * Configure a list of pin groups 168*4882a593Smuzhiyun * 169*4882a593Smuzhiyun * @param config List of config items 170*4882a593Smuzhiyun * @param len Number of config items in list 171*4882a593Smuzhiyun */ 172*4882a593Smuzhiyun void pinmux_config_pingrp_table(const struct pmux_pingrp_config *config, 173*4882a593Smuzhiyun int len); 174*4882a593Smuzhiyun 175*4882a593Smuzhiyun struct pmux_pingrp_desc { 176*4882a593Smuzhiyun u8 funcs[4]; 177*4882a593Smuzhiyun #if defined(CONFIG_TEGRA20) 178*4882a593Smuzhiyun u8 ctl_id; 179*4882a593Smuzhiyun u8 pull_id; 180*4882a593Smuzhiyun #endif /* CONFIG_TEGRA20 */ 181*4882a593Smuzhiyun }; 182*4882a593Smuzhiyun 183*4882a593Smuzhiyun extern const struct pmux_pingrp_desc *tegra_soc_pingroups; 184*4882a593Smuzhiyun 185*4882a593Smuzhiyun #ifdef TEGRA_PMX_SOC_HAS_DRVGRPS 186*4882a593Smuzhiyun 187*4882a593Smuzhiyun #define PMUX_SLWF_MIN 0 188*4882a593Smuzhiyun #define PMUX_SLWF_MAX 3 189*4882a593Smuzhiyun #define PMUX_SLWF_NONE -1 190*4882a593Smuzhiyun 191*4882a593Smuzhiyun #define PMUX_SLWR_MIN 0 192*4882a593Smuzhiyun #define PMUX_SLWR_MAX 3 193*4882a593Smuzhiyun #define PMUX_SLWR_NONE -1 194*4882a593Smuzhiyun 195*4882a593Smuzhiyun #define PMUX_DRVUP_MIN 0 196*4882a593Smuzhiyun #define PMUX_DRVUP_MAX 127 197*4882a593Smuzhiyun #define PMUX_DRVUP_NONE -1 198*4882a593Smuzhiyun 199*4882a593Smuzhiyun #define PMUX_DRVDN_MIN 0 200*4882a593Smuzhiyun #define PMUX_DRVDN_MAX 127 201*4882a593Smuzhiyun #define PMUX_DRVDN_NONE -1 202*4882a593Smuzhiyun 203*4882a593Smuzhiyun /* 204*4882a593Smuzhiyun * This defines the configuration for a pin group's pad control config 205*4882a593Smuzhiyun */ 206*4882a593Smuzhiyun struct pmux_drvgrp_config { 207*4882a593Smuzhiyun u32 drvgrp:16; /* pin group PMUX_DRVGRP_x */ 208*4882a593Smuzhiyun u32 slwf:3; /* falling edge slew */ 209*4882a593Smuzhiyun u32 slwr:3; /* rising edge slew */ 210*4882a593Smuzhiyun u32 drvup:8; /* pull-up drive strength */ 211*4882a593Smuzhiyun u32 drvdn:8; /* pull-down drive strength */ 212*4882a593Smuzhiyun #ifdef TEGRA_PMX_GRPS_HAVE_LPMD 213*4882a593Smuzhiyun u32 lpmd:3; /* low-power mode selection */ 214*4882a593Smuzhiyun #endif 215*4882a593Smuzhiyun #ifdef TEGRA_PMX_GRPS_HAVE_SCHMT 216*4882a593Smuzhiyun u32 schmt:2; /* schmidt enable */ 217*4882a593Smuzhiyun #endif 218*4882a593Smuzhiyun #ifdef TEGRA_PMX_GRPS_HAVE_HSM 219*4882a593Smuzhiyun u32 hsm:2; /* high-speed mode enable */ 220*4882a593Smuzhiyun #endif 221*4882a593Smuzhiyun }; 222*4882a593Smuzhiyun 223*4882a593Smuzhiyun /** 224*4882a593Smuzhiyun * Set the GP pad configs 225*4882a593Smuzhiyun * 226*4882a593Smuzhiyun * @param config List of config items 227*4882a593Smuzhiyun * @param len Number of config items in list 228*4882a593Smuzhiyun */ 229*4882a593Smuzhiyun void pinmux_config_drvgrp_table(const struct pmux_drvgrp_config *config, 230*4882a593Smuzhiyun int len); 231*4882a593Smuzhiyun 232*4882a593Smuzhiyun #endif /* TEGRA_PMX_SOC_HAS_DRVGRPS */ 233*4882a593Smuzhiyun 234*4882a593Smuzhiyun #ifdef TEGRA_PMX_SOC_HAS_MIPI_PAD_CTRL_GRPS 235*4882a593Smuzhiyun struct pmux_mipipadctrlgrp_config { 236*4882a593Smuzhiyun u32 grp:16; /* pin group PMUX_MIPIPADCTRLGRP_x */ 237*4882a593Smuzhiyun u32 func:8; /* function to assign PMUX_FUNC_... */ 238*4882a593Smuzhiyun }; 239*4882a593Smuzhiyun 240*4882a593Smuzhiyun void pinmux_config_mipipadctrlgrp_table( 241*4882a593Smuzhiyun const struct pmux_mipipadctrlgrp_config *config, int len); 242*4882a593Smuzhiyun 243*4882a593Smuzhiyun struct pmux_mipipadctrlgrp_desc { 244*4882a593Smuzhiyun u8 funcs[2]; 245*4882a593Smuzhiyun }; 246*4882a593Smuzhiyun 247*4882a593Smuzhiyun extern const struct pmux_mipipadctrlgrp_desc *tegra_soc_mipipadctrl_groups; 248*4882a593Smuzhiyun #endif /* TEGRA_PMX_SOC_HAS_MIPI_PAD_CTRL_GRPS */ 249*4882a593Smuzhiyun 250*4882a593Smuzhiyun #endif /* _TEGRA_PINMUX_H_ */ 251