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 11*35f590f4SThierry Reding #include <linux/types.h> 12*35f590f4SThierry Reding 13e2969957SStephen Warren #include <asm/arch/tegra.h> 14e2969957SStephen Warren 15e2969957SStephen Warren /* The pullup/pulldown state of a pin group */ 16e2969957SStephen Warren enum pmux_pull { 17e2969957SStephen Warren PMUX_PULL_NORMAL = 0, 18e2969957SStephen Warren PMUX_PULL_DOWN, 19e2969957SStephen Warren PMUX_PULL_UP, 20e2969957SStephen Warren }; 21e2969957SStephen Warren 22e2969957SStephen Warren /* Defines whether a pin group is tristated or in normal operation */ 23e2969957SStephen Warren enum pmux_tristate { 24e2969957SStephen Warren PMUX_TRI_NORMAL = 0, 25e2969957SStephen Warren PMUX_TRI_TRISTATE = 1, 26e2969957SStephen Warren }; 27e2969957SStephen Warren 287a28441fSStephen Warren #ifdef TEGRA_PMX_PINS_HAVE_E_INPUT 29e2969957SStephen Warren enum pmux_pin_io { 30e2969957SStephen Warren PMUX_PIN_OUTPUT = 0, 31e2969957SStephen Warren PMUX_PIN_INPUT = 1, 32e2969957SStephen Warren PMUX_PIN_NONE, 33e2969957SStephen Warren }; 347a28441fSStephen Warren #endif 35e2969957SStephen Warren 367a28441fSStephen Warren #ifdef TEGRA_PMX_PINS_HAVE_LOCK 37e2969957SStephen Warren enum pmux_pin_lock { 38e2969957SStephen Warren PMUX_PIN_LOCK_DEFAULT = 0, 39e2969957SStephen Warren PMUX_PIN_LOCK_DISABLE, 40e2969957SStephen Warren PMUX_PIN_LOCK_ENABLE, 41e2969957SStephen Warren }; 427a28441fSStephen Warren #endif 43e2969957SStephen Warren 447a28441fSStephen Warren #ifdef TEGRA_PMX_PINS_HAVE_OD 45e2969957SStephen Warren enum pmux_pin_od { 46e2969957SStephen Warren PMUX_PIN_OD_DEFAULT = 0, 47e2969957SStephen Warren PMUX_PIN_OD_DISABLE, 48e2969957SStephen Warren PMUX_PIN_OD_ENABLE, 49e2969957SStephen Warren }; 507a28441fSStephen Warren #endif 51e2969957SStephen Warren 527a28441fSStephen Warren #ifdef TEGRA_PMX_PINS_HAVE_IO_RESET 53e2969957SStephen Warren enum pmux_pin_ioreset { 54e2969957SStephen Warren PMUX_PIN_IO_RESET_DEFAULT = 0, 55e2969957SStephen Warren PMUX_PIN_IO_RESET_DISABLE, 56e2969957SStephen Warren PMUX_PIN_IO_RESET_ENABLE, 57e2969957SStephen Warren }; 587a28441fSStephen Warren #endif 59e2969957SStephen Warren 607a28441fSStephen Warren #ifdef TEGRA_PMX_PINS_HAVE_RCV_SEL 61e2969957SStephen Warren enum pmux_pin_rcv_sel { 62e2969957SStephen Warren PMUX_PIN_RCV_SEL_DEFAULT = 0, 63e2969957SStephen Warren PMUX_PIN_RCV_SEL_NORMAL, 64e2969957SStephen Warren PMUX_PIN_RCV_SEL_HIGH, 65e2969957SStephen Warren }; 667a28441fSStephen Warren #endif 67e2969957SStephen Warren 68f4d7c9ddSStephen Warren #ifdef TEGRA_PMX_PINS_HAVE_E_IO_HV 69f4d7c9ddSStephen Warren enum pmux_pin_e_io_hv { 70f4d7c9ddSStephen Warren PMUX_PIN_E_IO_HV_DEFAULT = 0, 71f4d7c9ddSStephen Warren PMUX_PIN_E_IO_HV_NORMAL, 72f4d7c9ddSStephen Warren PMUX_PIN_E_IO_HV_HIGH, 73f4d7c9ddSStephen Warren }; 74f4d7c9ddSStephen Warren #endif 75f4d7c9ddSStephen Warren 76bc134728SStephen Warren #ifdef TEGRA_PMX_GRPS_HAVE_LPMD 77bc134728SStephen Warren /* Defines a pin group cfg's low-power mode select */ 78bc134728SStephen Warren enum pmux_lpmd { 79bc134728SStephen Warren PMUX_LPMD_X8 = 0, 80bc134728SStephen Warren PMUX_LPMD_X4, 81bc134728SStephen Warren PMUX_LPMD_X2, 82bc134728SStephen Warren PMUX_LPMD_X, 83bc134728SStephen Warren PMUX_LPMD_NONE = -1, 84bc134728SStephen Warren }; 85bc134728SStephen Warren #endif 86bc134728SStephen Warren 87f2c60eedSStephen Warren #if defined(TEGRA_PMX_PINS_HAVE_SCHMT) || defined(TEGRA_PMX_GRPS_HAVE_SCHMT) 88bc134728SStephen Warren /* Defines whether a pin group cfg's schmidt is enabled or not */ 89bc134728SStephen Warren enum pmux_schmt { 90bc134728SStephen Warren PMUX_SCHMT_DISABLE = 0, 91bc134728SStephen Warren PMUX_SCHMT_ENABLE = 1, 92bc134728SStephen Warren PMUX_SCHMT_NONE = -1, 93bc134728SStephen Warren }; 94bc134728SStephen Warren #endif 95bc134728SStephen Warren 96f2c60eedSStephen Warren #if defined(TEGRA_PMX_PINS_HAVE_HSM) || defined(TEGRA_PMX_GRPS_HAVE_HSM) 97bc134728SStephen Warren /* Defines whether a pin group cfg's high-speed mode is enabled or not */ 98bc134728SStephen Warren enum pmux_hsm { 99bc134728SStephen Warren PMUX_HSM_DISABLE = 0, 100bc134728SStephen Warren PMUX_HSM_ENABLE = 1, 101bc134728SStephen Warren PMUX_HSM_NONE = -1, 102bc134728SStephen Warren }; 103bc134728SStephen Warren #endif 104bc134728SStephen Warren 105e2969957SStephen Warren /* 106e2969957SStephen Warren * This defines the configuration for a pin, including the function assigned, 107e2969957SStephen Warren * pull up/down settings and tristate settings. Having set up one of these 108e2969957SStephen Warren * you can call pinmux_config_pingroup() to configure a pin in one step. Also 109e2969957SStephen Warren * available is pinmux_config_table() to configure a list of pins. 110e2969957SStephen Warren */ 111dfb42fc9SStephen Warren struct pmux_pingrp_config { 112d381294aSStephen Warren u32 pingrp:16; /* pin group PMUX_PINGRP_... */ 113d381294aSStephen Warren u32 func:8; /* function to assign PMUX_FUNC_... */ 114d381294aSStephen Warren u32 pull:2; /* pull up/down/normal PMUX_PULL_...*/ 115d381294aSStephen Warren u32 tristate:2; /* tristate or normal PMUX_TRI_... */ 1167a28441fSStephen Warren #ifdef TEGRA_PMX_PINS_HAVE_E_INPUT 117d381294aSStephen Warren u32 io:2; /* input or output PMUX_PIN_... */ 1187a28441fSStephen Warren #endif 1197a28441fSStephen Warren #ifdef TEGRA_PMX_PINS_HAVE_LOCK 120d381294aSStephen Warren u32 lock:2; /* lock enable/disable PMUX_PIN... */ 1217a28441fSStephen Warren #endif 1227a28441fSStephen Warren #ifdef TEGRA_PMX_PINS_HAVE_OD 123d381294aSStephen Warren u32 od:2; /* open-drain or push-pull driver */ 1247a28441fSStephen Warren #endif 1257a28441fSStephen Warren #ifdef TEGRA_PMX_PINS_HAVE_IO_RESET 126d381294aSStephen Warren u32 ioreset:2; /* input/output reset PMUX_PIN... */ 1277a28441fSStephen Warren #endif 1287a28441fSStephen Warren #ifdef TEGRA_PMX_PINS_HAVE_RCV_SEL 129d381294aSStephen Warren u32 rcv_sel:2; /* select between High and Normal */ 130e2969957SStephen Warren /* VIL/VIH receivers */ 131e2969957SStephen Warren #endif 132f4d7c9ddSStephen Warren #ifdef TEGRA_PMX_PINS_HAVE_E_IO_HV 133f4d7c9ddSStephen Warren u32 e_io_hv:2; /* select 3.3v tolerant receivers */ 134f4d7c9ddSStephen Warren #endif 135f2c60eedSStephen Warren #ifdef TEGRA_PMX_PINS_HAVE_SCHMT 136f2c60eedSStephen Warren u32 schmt:2; /* schmitt enable */ 137f2c60eedSStephen Warren #endif 138f2c60eedSStephen Warren #ifdef TEGRA_PMX_PINS_HAVE_HSM 139f2c60eedSStephen Warren u32 hsm:2; /* high-speed mode enable */ 140f2c60eedSStephen Warren #endif 141e2969957SStephen Warren }; 142e2969957SStephen Warren 1437a28441fSStephen Warren #ifdef TEGRA_PMX_SOC_HAS_IO_CLAMPING 144f799b03fSStephen Warren /* Set/clear the pinmux CLAMP_INPUTS_WHEN_TRISTATED bit */ 145bb14469aSStephen Warren void pinmux_set_tristate_input_clamping(void); 146f799b03fSStephen Warren void pinmux_clear_tristate_input_clamping(void); 147bb14469aSStephen Warren #endif 148bb14469aSStephen Warren 149e2969957SStephen Warren /* Set the mux function for a pin group */ 150e2969957SStephen Warren void pinmux_set_func(enum pmux_pingrp pin, enum pmux_func func); 151e2969957SStephen Warren 152e2969957SStephen Warren /* Set the pull up/down feature for a pin group */ 153e2969957SStephen Warren void pinmux_set_pullupdown(enum pmux_pingrp pin, enum pmux_pull pupd); 154e2969957SStephen Warren 155e2969957SStephen Warren /* Set a pin group to tristate */ 156e2969957SStephen Warren void pinmux_tristate_enable(enum pmux_pingrp pin); 157e2969957SStephen Warren 158e2969957SStephen Warren /* Set a pin group to normal (non tristate) */ 159e2969957SStephen Warren void pinmux_tristate_disable(enum pmux_pingrp pin); 160e2969957SStephen Warren 1617a28441fSStephen Warren #ifdef TEGRA_PMX_PINS_HAVE_E_INPUT 162e2969957SStephen Warren /* Set a pin group as input or output */ 163e2969957SStephen Warren void pinmux_set_io(enum pmux_pingrp pin, enum pmux_pin_io io); 164e2969957SStephen Warren #endif 165e2969957SStephen Warren 166e2969957SStephen Warren /** 167e2969957SStephen Warren * Configure a list of pin groups 168e2969957SStephen Warren * 169e2969957SStephen Warren * @param config List of config items 170e2969957SStephen Warren * @param len Number of config items in list 171e2969957SStephen Warren */ 172dfb42fc9SStephen Warren void pinmux_config_pingrp_table(const struct pmux_pingrp_config *config, 173dfb42fc9SStephen Warren int len); 174e2969957SStephen Warren 175c21478bcSStephen Warren struct pmux_pingrp_desc { 176c21478bcSStephen Warren u8 funcs[4]; 177c21478bcSStephen Warren #if defined(CONFIG_TEGRA20) 178c21478bcSStephen Warren u8 ctl_id; 179c21478bcSStephen Warren u8 pull_id; 180c21478bcSStephen Warren #endif /* CONFIG_TEGRA20 */ 181c21478bcSStephen Warren }; 182c21478bcSStephen Warren 183c21478bcSStephen Warren extern const struct pmux_pingrp_desc *tegra_soc_pingroups; 184c21478bcSStephen Warren 1857a28441fSStephen Warren #ifdef TEGRA_PMX_SOC_HAS_DRVGRPS 186e2969957SStephen Warren 187dfb42fc9SStephen Warren #define PMUX_SLWF_MIN 0 188dfb42fc9SStephen Warren #define PMUX_SLWF_MAX 3 189dfb42fc9SStephen Warren #define PMUX_SLWF_NONE -1 190e2969957SStephen Warren 191dfb42fc9SStephen Warren #define PMUX_SLWR_MIN 0 192dfb42fc9SStephen Warren #define PMUX_SLWR_MAX 3 193dfb42fc9SStephen Warren #define PMUX_SLWR_NONE -1 194e2969957SStephen Warren 195dfb42fc9SStephen Warren #define PMUX_DRVUP_MIN 0 196dfb42fc9SStephen Warren #define PMUX_DRVUP_MAX 127 197dfb42fc9SStephen Warren #define PMUX_DRVUP_NONE -1 198e2969957SStephen Warren 199dfb42fc9SStephen Warren #define PMUX_DRVDN_MIN 0 200dfb42fc9SStephen Warren #define PMUX_DRVDN_MAX 127 201dfb42fc9SStephen Warren #define PMUX_DRVDN_NONE -1 202e2969957SStephen Warren 203e2969957SStephen Warren /* 204e2969957SStephen Warren * This defines the configuration for a pin group's pad control config 205e2969957SStephen Warren */ 206dfb42fc9SStephen Warren struct pmux_drvgrp_config { 207d381294aSStephen Warren u32 drvgrp:16; /* pin group PMUX_DRVGRP_x */ 208d381294aSStephen Warren u32 slwf:3; /* falling edge slew */ 209d381294aSStephen Warren u32 slwr:3; /* rising edge slew */ 210d381294aSStephen Warren u32 drvup:8; /* pull-up drive strength */ 211d381294aSStephen Warren u32 drvdn:8; /* pull-down drive strength */ 212439f5768SStephen Warren #ifdef TEGRA_PMX_GRPS_HAVE_LPMD 213d381294aSStephen Warren u32 lpmd:3; /* low-power mode selection */ 214439f5768SStephen Warren #endif 215439f5768SStephen Warren #ifdef TEGRA_PMX_GRPS_HAVE_SCHMT 216d381294aSStephen Warren u32 schmt:2; /* schmidt enable */ 217439f5768SStephen Warren #endif 218439f5768SStephen Warren #ifdef TEGRA_PMX_GRPS_HAVE_HSM 219d381294aSStephen Warren u32 hsm:2; /* high-speed mode enable */ 220439f5768SStephen Warren #endif 221e2969957SStephen Warren }; 222e2969957SStephen Warren 223e2969957SStephen Warren /** 224e2969957SStephen Warren * Set the GP pad configs 225e2969957SStephen Warren * 226e2969957SStephen Warren * @param config List of config items 227e2969957SStephen Warren * @param len Number of config items in list 228e2969957SStephen Warren */ 229dfb42fc9SStephen Warren void pinmux_config_drvgrp_table(const struct pmux_drvgrp_config *config, 230dfb42fc9SStephen Warren int len); 231e2969957SStephen Warren 2327a28441fSStephen Warren #endif /* TEGRA_PMX_SOC_HAS_DRVGRPS */ 233e2969957SStephen Warren 2345ee7ec7bSStephen Warren #ifdef TEGRA_PMX_SOC_HAS_MIPI_PAD_CTRL_GRPS 2355ee7ec7bSStephen Warren struct pmux_mipipadctrlgrp_config { 2365ee7ec7bSStephen Warren u32 grp:16; /* pin group PMUX_MIPIPADCTRLGRP_x */ 2375ee7ec7bSStephen Warren u32 func:8; /* function to assign PMUX_FUNC_... */ 2385ee7ec7bSStephen Warren }; 2395ee7ec7bSStephen Warren 2405ee7ec7bSStephen Warren void pinmux_config_mipipadctrlgrp_table( 2415ee7ec7bSStephen Warren const struct pmux_mipipadctrlgrp_config *config, int len); 2425ee7ec7bSStephen Warren 2435ee7ec7bSStephen Warren struct pmux_mipipadctrlgrp_desc { 2445ee7ec7bSStephen Warren u8 funcs[2]; 2455ee7ec7bSStephen Warren }; 2465ee7ec7bSStephen Warren 2475ee7ec7bSStephen Warren extern const struct pmux_mipipadctrlgrp_desc *tegra_soc_mipipadctrl_groups; 2485ee7ec7bSStephen Warren #endif /* TEGRA_PMX_SOC_HAS_MIPI_PAD_CTRL_GRPS */ 2495ee7ec7bSStephen Warren 250e2969957SStephen Warren #endif /* _TEGRA_PINMUX_H_ */ 251