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