| /* |
| * (C) Copyright 2010-2014 |
| * NVIDIA Corporation <www.nvidia.com> |
| * |
| * SPDX-License-Identifier: GPL-2.0+ |
| */ |
| |
| #ifndef _TEGRA_PINMUX_H_ |
| #define _TEGRA_PINMUX_H_ |
| |
| #include <linux/types.h> |
| |
| #include <asm/arch/tegra.h> |
| |
| /* The pullup/pulldown state of a pin group */ |
| enum pmux_pull { |
| PMUX_PULL_NORMAL = 0, |
| PMUX_PULL_DOWN, |
| PMUX_PULL_UP, |
| }; |
| |
| /* Defines whether a pin group is tristated or in normal operation */ |
| enum pmux_tristate { |
| PMUX_TRI_NORMAL = 0, |
| PMUX_TRI_TRISTATE = 1, |
| }; |
| |
| #ifdef TEGRA_PMX_PINS_HAVE_E_INPUT |
| enum pmux_pin_io { |
| PMUX_PIN_OUTPUT = 0, |
| PMUX_PIN_INPUT = 1, |
| PMUX_PIN_NONE, |
| }; |
| #endif |
| |
| #ifdef TEGRA_PMX_PINS_HAVE_LOCK |
| enum pmux_pin_lock { |
| PMUX_PIN_LOCK_DEFAULT = 0, |
| PMUX_PIN_LOCK_DISABLE, |
| PMUX_PIN_LOCK_ENABLE, |
| }; |
| #endif |
| |
| #ifdef TEGRA_PMX_PINS_HAVE_OD |
| enum pmux_pin_od { |
| PMUX_PIN_OD_DEFAULT = 0, |
| PMUX_PIN_OD_DISABLE, |
| PMUX_PIN_OD_ENABLE, |
| }; |
| #endif |
| |
| #ifdef TEGRA_PMX_PINS_HAVE_IO_RESET |
| enum pmux_pin_ioreset { |
| PMUX_PIN_IO_RESET_DEFAULT = 0, |
| PMUX_PIN_IO_RESET_DISABLE, |
| PMUX_PIN_IO_RESET_ENABLE, |
| }; |
| #endif |
| |
| #ifdef TEGRA_PMX_PINS_HAVE_RCV_SEL |
| enum pmux_pin_rcv_sel { |
| PMUX_PIN_RCV_SEL_DEFAULT = 0, |
| PMUX_PIN_RCV_SEL_NORMAL, |
| PMUX_PIN_RCV_SEL_HIGH, |
| }; |
| #endif |
| |
| #ifdef TEGRA_PMX_PINS_HAVE_E_IO_HV |
| enum pmux_pin_e_io_hv { |
| PMUX_PIN_E_IO_HV_DEFAULT = 0, |
| PMUX_PIN_E_IO_HV_NORMAL, |
| PMUX_PIN_E_IO_HV_HIGH, |
| }; |
| #endif |
| |
| #ifdef TEGRA_PMX_GRPS_HAVE_LPMD |
| /* Defines a pin group cfg's low-power mode select */ |
| enum pmux_lpmd { |
| PMUX_LPMD_X8 = 0, |
| PMUX_LPMD_X4, |
| PMUX_LPMD_X2, |
| PMUX_LPMD_X, |
| PMUX_LPMD_NONE = -1, |
| }; |
| #endif |
| |
| #if defined(TEGRA_PMX_PINS_HAVE_SCHMT) || defined(TEGRA_PMX_GRPS_HAVE_SCHMT) |
| /* Defines whether a pin group cfg's schmidt is enabled or not */ |
| enum pmux_schmt { |
| PMUX_SCHMT_DISABLE = 0, |
| PMUX_SCHMT_ENABLE = 1, |
| PMUX_SCHMT_NONE = -1, |
| }; |
| #endif |
| |
| #if defined(TEGRA_PMX_PINS_HAVE_HSM) || defined(TEGRA_PMX_GRPS_HAVE_HSM) |
| /* Defines whether a pin group cfg's high-speed mode is enabled or not */ |
| enum pmux_hsm { |
| PMUX_HSM_DISABLE = 0, |
| PMUX_HSM_ENABLE = 1, |
| PMUX_HSM_NONE = -1, |
| }; |
| #endif |
| |
| /* |
| * This defines the configuration for a pin, including the function assigned, |
| * pull up/down settings and tristate settings. Having set up one of these |
| * you can call pinmux_config_pingroup() to configure a pin in one step. Also |
| * available is pinmux_config_table() to configure a list of pins. |
| */ |
| struct pmux_pingrp_config { |
| u32 pingrp:16; /* pin group PMUX_PINGRP_... */ |
| u32 func:8; /* function to assign PMUX_FUNC_... */ |
| u32 pull:2; /* pull up/down/normal PMUX_PULL_...*/ |
| u32 tristate:2; /* tristate or normal PMUX_TRI_... */ |
| #ifdef TEGRA_PMX_PINS_HAVE_E_INPUT |
| u32 io:2; /* input or output PMUX_PIN_... */ |
| #endif |
| #ifdef TEGRA_PMX_PINS_HAVE_LOCK |
| u32 lock:2; /* lock enable/disable PMUX_PIN... */ |
| #endif |
| #ifdef TEGRA_PMX_PINS_HAVE_OD |
| u32 od:2; /* open-drain or push-pull driver */ |
| #endif |
| #ifdef TEGRA_PMX_PINS_HAVE_IO_RESET |
| u32 ioreset:2; /* input/output reset PMUX_PIN... */ |
| #endif |
| #ifdef TEGRA_PMX_PINS_HAVE_RCV_SEL |
| u32 rcv_sel:2; /* select between High and Normal */ |
| /* VIL/VIH receivers */ |
| #endif |
| #ifdef TEGRA_PMX_PINS_HAVE_E_IO_HV |
| u32 e_io_hv:2; /* select 3.3v tolerant receivers */ |
| #endif |
| #ifdef TEGRA_PMX_PINS_HAVE_SCHMT |
| u32 schmt:2; /* schmitt enable */ |
| #endif |
| #ifdef TEGRA_PMX_PINS_HAVE_HSM |
| u32 hsm:2; /* high-speed mode enable */ |
| #endif |
| }; |
| |
| #ifdef TEGRA_PMX_SOC_HAS_IO_CLAMPING |
| /* Set/clear the pinmux CLAMP_INPUTS_WHEN_TRISTATED bit */ |
| void pinmux_set_tristate_input_clamping(void); |
| void pinmux_clear_tristate_input_clamping(void); |
| #endif |
| |
| /* Set the mux function for a pin group */ |
| void pinmux_set_func(enum pmux_pingrp pin, enum pmux_func func); |
| |
| /* Set the pull up/down feature for a pin group */ |
| void pinmux_set_pullupdown(enum pmux_pingrp pin, enum pmux_pull pupd); |
| |
| /* Set a pin group to tristate */ |
| void pinmux_tristate_enable(enum pmux_pingrp pin); |
| |
| /* Set a pin group to normal (non tristate) */ |
| void pinmux_tristate_disable(enum pmux_pingrp pin); |
| |
| #ifdef TEGRA_PMX_PINS_HAVE_E_INPUT |
| /* Set a pin group as input or output */ |
| void pinmux_set_io(enum pmux_pingrp pin, enum pmux_pin_io io); |
| #endif |
| |
| /** |
| * Configure a list of pin groups |
| * |
| * @param config List of config items |
| * @param len Number of config items in list |
| */ |
| void pinmux_config_pingrp_table(const struct pmux_pingrp_config *config, |
| int len); |
| |
| struct pmux_pingrp_desc { |
| u8 funcs[4]; |
| #if defined(CONFIG_TEGRA20) |
| u8 ctl_id; |
| u8 pull_id; |
| #endif /* CONFIG_TEGRA20 */ |
| }; |
| |
| extern const struct pmux_pingrp_desc *tegra_soc_pingroups; |
| |
| #ifdef TEGRA_PMX_SOC_HAS_DRVGRPS |
| |
| #define PMUX_SLWF_MIN 0 |
| #define PMUX_SLWF_MAX 3 |
| #define PMUX_SLWF_NONE -1 |
| |
| #define PMUX_SLWR_MIN 0 |
| #define PMUX_SLWR_MAX 3 |
| #define PMUX_SLWR_NONE -1 |
| |
| #define PMUX_DRVUP_MIN 0 |
| #define PMUX_DRVUP_MAX 127 |
| #define PMUX_DRVUP_NONE -1 |
| |
| #define PMUX_DRVDN_MIN 0 |
| #define PMUX_DRVDN_MAX 127 |
| #define PMUX_DRVDN_NONE -1 |
| |
| /* |
| * This defines the configuration for a pin group's pad control config |
| */ |
| struct pmux_drvgrp_config { |
| u32 drvgrp:16; /* pin group PMUX_DRVGRP_x */ |
| u32 slwf:3; /* falling edge slew */ |
| u32 slwr:3; /* rising edge slew */ |
| u32 drvup:8; /* pull-up drive strength */ |
| u32 drvdn:8; /* pull-down drive strength */ |
| #ifdef TEGRA_PMX_GRPS_HAVE_LPMD |
| u32 lpmd:3; /* low-power mode selection */ |
| #endif |
| #ifdef TEGRA_PMX_GRPS_HAVE_SCHMT |
| u32 schmt:2; /* schmidt enable */ |
| #endif |
| #ifdef TEGRA_PMX_GRPS_HAVE_HSM |
| u32 hsm:2; /* high-speed mode enable */ |
| #endif |
| }; |
| |
| /** |
| * Set the GP pad configs |
| * |
| * @param config List of config items |
| * @param len Number of config items in list |
| */ |
| void pinmux_config_drvgrp_table(const struct pmux_drvgrp_config *config, |
| int len); |
| |
| #endif /* TEGRA_PMX_SOC_HAS_DRVGRPS */ |
| |
| #ifdef TEGRA_PMX_SOC_HAS_MIPI_PAD_CTRL_GRPS |
| struct pmux_mipipadctrlgrp_config { |
| u32 grp:16; /* pin group PMUX_MIPIPADCTRLGRP_x */ |
| u32 func:8; /* function to assign PMUX_FUNC_... */ |
| }; |
| |
| void pinmux_config_mipipadctrlgrp_table( |
| const struct pmux_mipipadctrlgrp_config *config, int len); |
| |
| struct pmux_mipipadctrlgrp_desc { |
| u8 funcs[2]; |
| }; |
| |
| extern const struct pmux_mipipadctrlgrp_desc *tegra_soc_mipipadctrl_groups; |
| #endif /* TEGRA_PMX_SOC_HAS_MIPI_PAD_CTRL_GRPS */ |
| |
| #endif /* _TEGRA_PINMUX_H_ */ |