1*552a848eSStefano Babic /* 2*552a848eSStefano Babic * Based on Linux i.MX iomux-v3.h file: 3*552a848eSStefano Babic * Copyright (C) 2009 by Jan Weitzel Phytec Messtechnik GmbH, 4*552a848eSStefano Babic * <armlinux@phytec.de> 5*552a848eSStefano Babic * 6*552a848eSStefano Babic * Copyright (C) 2011 Freescale Semiconductor, Inc. 7*552a848eSStefano Babic * 8*552a848eSStefano Babic * SPDX-License-Identifier: GPL-2.0+ 9*552a848eSStefano Babic */ 10*552a848eSStefano Babic 11*552a848eSStefano Babic #ifndef __MACH_IOMUX_V3_H__ 12*552a848eSStefano Babic #define __MACH_IOMUX_V3_H__ 13*552a848eSStefano Babic 14*552a848eSStefano Babic #include <common.h> 15*552a848eSStefano Babic 16*552a848eSStefano Babic /* 17*552a848eSStefano Babic * build IOMUX_PAD structure 18*552a848eSStefano Babic * 19*552a848eSStefano Babic * This iomux scheme is based around pads, which are the physical balls 20*552a848eSStefano Babic * on the processor. 21*552a848eSStefano Babic * 22*552a848eSStefano Babic * - Each pad has a pad control register (IOMUXC_SW_PAD_CTRL_x) which controls 23*552a848eSStefano Babic * things like driving strength and pullup/pulldown. 24*552a848eSStefano Babic * - Each pad can have but not necessarily does have an output routing register 25*552a848eSStefano Babic * (IOMUXC_SW_MUX_CTL_PAD_x). 26*552a848eSStefano Babic * - Each pad can have but not necessarily does have an input routing register 27*552a848eSStefano Babic * (IOMUXC_x_SELECT_INPUT) 28*552a848eSStefano Babic * 29*552a848eSStefano Babic * The three register sets do not have a fixed offset to each other, 30*552a848eSStefano Babic * hence we order this table by pad control registers (which all pads 31*552a848eSStefano Babic * have) and put the optional i/o routing registers into additional 32*552a848eSStefano Babic * fields. 33*552a848eSStefano Babic * 34*552a848eSStefano Babic * The naming convention for the pad modes is SOC_PAD_<padname>__<padmode> 35*552a848eSStefano Babic * If <padname> or <padmode> refers to a GPIO, it is named GPIO_<unit>_<num> 36*552a848eSStefano Babic * 37*552a848eSStefano Babic * IOMUX/PAD Bit field definitions 38*552a848eSStefano Babic * 39*552a848eSStefano Babic * MUX_CTRL_OFS: 0..11 (12) 40*552a848eSStefano Babic * PAD_CTRL_OFS: 12..23 (12) 41*552a848eSStefano Babic * SEL_INPUT_OFS: 24..35 (12) 42*552a848eSStefano Babic * MUX_MODE + SION + LPSR: 36..41 (6) 43*552a848eSStefano Babic * PAD_CTRL + NO_PAD_CTRL: 42..59 (18) 44*552a848eSStefano Babic * SEL_INP: 60..63 (4) 45*552a848eSStefano Babic */ 46*552a848eSStefano Babic 47*552a848eSStefano Babic typedef u64 iomux_v3_cfg_t; 48*552a848eSStefano Babic 49*552a848eSStefano Babic #define MUX_CTRL_OFS_SHIFT 0 50*552a848eSStefano Babic #define MUX_CTRL_OFS_MASK ((iomux_v3_cfg_t)0xfff << MUX_CTRL_OFS_SHIFT) 51*552a848eSStefano Babic #define MUX_PAD_CTRL_OFS_SHIFT 12 52*552a848eSStefano Babic #define MUX_PAD_CTRL_OFS_MASK ((iomux_v3_cfg_t)0xfff << \ 53*552a848eSStefano Babic MUX_PAD_CTRL_OFS_SHIFT) 54*552a848eSStefano Babic #define MUX_SEL_INPUT_OFS_SHIFT 24 55*552a848eSStefano Babic #define MUX_SEL_INPUT_OFS_MASK ((iomux_v3_cfg_t)0xfff << \ 56*552a848eSStefano Babic MUX_SEL_INPUT_OFS_SHIFT) 57*552a848eSStefano Babic 58*552a848eSStefano Babic #define MUX_MODE_SHIFT 36 59*552a848eSStefano Babic #define MUX_MODE_MASK ((iomux_v3_cfg_t)0x3f << MUX_MODE_SHIFT) 60*552a848eSStefano Babic #define MUX_PAD_CTRL_SHIFT 42 61*552a848eSStefano Babic #define MUX_PAD_CTRL_MASK ((iomux_v3_cfg_t)0x3ffff << MUX_PAD_CTRL_SHIFT) 62*552a848eSStefano Babic #define MUX_SEL_INPUT_SHIFT 60 63*552a848eSStefano Babic #define MUX_SEL_INPUT_MASK ((iomux_v3_cfg_t)0xf << MUX_SEL_INPUT_SHIFT) 64*552a848eSStefano Babic 65*552a848eSStefano Babic #define MUX_MODE_SION ((iomux_v3_cfg_t)IOMUX_CONFIG_SION << \ 66*552a848eSStefano Babic MUX_MODE_SHIFT) 67*552a848eSStefano Babic #define MUX_PAD_CTRL(x) ((iomux_v3_cfg_t)(x) << MUX_PAD_CTRL_SHIFT) 68*552a848eSStefano Babic 69*552a848eSStefano Babic #define IOMUX_PAD(pad_ctrl_ofs, mux_ctrl_ofs, mux_mode, sel_input_ofs, \ 70*552a848eSStefano Babic sel_input, pad_ctrl) \ 71*552a848eSStefano Babic (((iomux_v3_cfg_t)(mux_ctrl_ofs) << MUX_CTRL_OFS_SHIFT) | \ 72*552a848eSStefano Babic ((iomux_v3_cfg_t)(mux_mode) << MUX_MODE_SHIFT) | \ 73*552a848eSStefano Babic ((iomux_v3_cfg_t)(pad_ctrl_ofs) << MUX_PAD_CTRL_OFS_SHIFT) | \ 74*552a848eSStefano Babic ((iomux_v3_cfg_t)(pad_ctrl) << MUX_PAD_CTRL_SHIFT) | \ 75*552a848eSStefano Babic ((iomux_v3_cfg_t)(sel_input_ofs) << MUX_SEL_INPUT_OFS_SHIFT)| \ 76*552a848eSStefano Babic ((iomux_v3_cfg_t)(sel_input) << MUX_SEL_INPUT_SHIFT)) 77*552a848eSStefano Babic 78*552a848eSStefano Babic #define NEW_PAD_CTRL(cfg, pad) (((cfg) & ~MUX_PAD_CTRL_MASK) | \ 79*552a848eSStefano Babic MUX_PAD_CTRL(pad)) 80*552a848eSStefano Babic 81*552a848eSStefano Babic #define __NA_ 0x000 82*552a848eSStefano Babic #define NO_MUX_I 0 83*552a848eSStefano Babic #define NO_PAD_I 0 84*552a848eSStefano Babic 85*552a848eSStefano Babic #define NO_PAD_CTRL (1 << 17) 86*552a848eSStefano Babic 87*552a848eSStefano Babic #define IOMUX_CONFIG_LPSR 0x20 88*552a848eSStefano Babic #define MUX_MODE_LPSR ((iomux_v3_cfg_t)IOMUX_CONFIG_LPSR << \ 89*552a848eSStefano Babic MUX_MODE_SHIFT) 90*552a848eSStefano Babic #ifdef CONFIG_MX7 91*552a848eSStefano Babic 92*552a848eSStefano Babic #define IOMUX_LPSR_SEL_INPUT_OFS 0x70000 93*552a848eSStefano Babic 94*552a848eSStefano Babic #define PAD_CTL_DSE_1P8V_140OHM (0x0<<0) 95*552a848eSStefano Babic #define PAD_CTL_DSE_1P8V_35OHM (0x1<<0) 96*552a848eSStefano Babic #define PAD_CTL_DSE_1P8V_70OHM (0x2<<0) 97*552a848eSStefano Babic #define PAD_CTL_DSE_1P8V_23OHM (0x3<<0) 98*552a848eSStefano Babic 99*552a848eSStefano Babic #define PAD_CTL_DSE_3P3V_196OHM (0x0<<0) 100*552a848eSStefano Babic #define PAD_CTL_DSE_3P3V_49OHM (0x1<<0) 101*552a848eSStefano Babic #define PAD_CTL_DSE_3P3V_98OHM (0x2<<0) 102*552a848eSStefano Babic #define PAD_CTL_DSE_3P3V_32OHM (0x3<<0) 103*552a848eSStefano Babic 104*552a848eSStefano Babic #define PAD_CTL_SRE_FAST (0 << 2) 105*552a848eSStefano Babic #define PAD_CTL_SRE_SLOW (0x1 << 2) 106*552a848eSStefano Babic 107*552a848eSStefano Babic #define PAD_CTL_HYS (0x1 << 3) 108*552a848eSStefano Babic #define PAD_CTL_PUE (0x1 << 4) 109*552a848eSStefano Babic 110*552a848eSStefano Babic #define PAD_CTL_PUS_PD100KOHM ((0x0 << 5) | PAD_CTL_PUE) 111*552a848eSStefano Babic #define PAD_CTL_PUS_PU5KOHM ((0x1 << 5) | PAD_CTL_PUE) 112*552a848eSStefano Babic #define PAD_CTL_PUS_PU47KOHM ((0x2 << 5) | PAD_CTL_PUE) 113*552a848eSStefano Babic #define PAD_CTL_PUS_PU100KOHM ((0x3 << 5) | PAD_CTL_PUE) 114*552a848eSStefano Babic 115*552a848eSStefano Babic #else 116*552a848eSStefano Babic 117*552a848eSStefano Babic #ifdef CONFIG_MX6 118*552a848eSStefano Babic 119*552a848eSStefano Babic #define PAD_CTL_HYS (1 << 16) 120*552a848eSStefano Babic 121*552a848eSStefano Babic #define PAD_CTL_PUS_100K_DOWN (0 << 14 | PAD_CTL_PUE) 122*552a848eSStefano Babic #define PAD_CTL_PUS_47K_UP (1 << 14 | PAD_CTL_PUE) 123*552a848eSStefano Babic #define PAD_CTL_PUS_100K_UP (2 << 14 | PAD_CTL_PUE) 124*552a848eSStefano Babic #define PAD_CTL_PUS_22K_UP (3 << 14 | PAD_CTL_PUE) 125*552a848eSStefano Babic #define PAD_CTL_PUE (1 << 13 | PAD_CTL_PKE) 126*552a848eSStefano Babic #define PAD_CTL_PKE (1 << 12) 127*552a848eSStefano Babic 128*552a848eSStefano Babic #define PAD_CTL_ODE (1 << 11) 129*552a848eSStefano Babic 130*552a848eSStefano Babic #if defined(CONFIG_MX6SX) || defined(CONFIG_MX6UL) 131*552a848eSStefano Babic #define PAD_CTL_SPEED_LOW (0 << 6) 132*552a848eSStefano Babic #else 133*552a848eSStefano Babic #define PAD_CTL_SPEED_LOW (1 << 6) 134*552a848eSStefano Babic #endif 135*552a848eSStefano Babic #define PAD_CTL_SPEED_MED (2 << 6) 136*552a848eSStefano Babic #define PAD_CTL_SPEED_HIGH (3 << 6) 137*552a848eSStefano Babic 138*552a848eSStefano Babic #define PAD_CTL_DSE_DISABLE (0 << 3) 139*552a848eSStefano Babic #define PAD_CTL_DSE_240ohm (1 << 3) 140*552a848eSStefano Babic #define PAD_CTL_DSE_120ohm (2 << 3) 141*552a848eSStefano Babic #define PAD_CTL_DSE_80ohm (3 << 3) 142*552a848eSStefano Babic #define PAD_CTL_DSE_60ohm (4 << 3) 143*552a848eSStefano Babic #define PAD_CTL_DSE_48ohm (5 << 3) 144*552a848eSStefano Babic #define PAD_CTL_DSE_40ohm (6 << 3) 145*552a848eSStefano Babic #define PAD_CTL_DSE_34ohm (7 << 3) 146*552a848eSStefano Babic 147*552a848eSStefano Babic /* i.MX6SL/SLL */ 148*552a848eSStefano Babic #define PAD_CTL_LVE (1 << 1) 149*552a848eSStefano Babic #define PAD_CTL_LVE_BIT (1 << 22) 150*552a848eSStefano Babic 151*552a848eSStefano Babic /* i.MX6SLL */ 152*552a848eSStefano Babic #define PAD_CTL_IPD_BIT (1 << 27) 153*552a848eSStefano Babic 154*552a848eSStefano Babic #elif defined(CONFIG_VF610) 155*552a848eSStefano Babic 156*552a848eSStefano Babic #define PAD_MUX_MODE_SHIFT 20 157*552a848eSStefano Babic 158*552a848eSStefano Babic #define PAD_CTL_INPUT_DIFFERENTIAL (1 << 16) 159*552a848eSStefano Babic 160*552a848eSStefano Babic #define PAD_CTL_SPEED_MED (1 << 12) 161*552a848eSStefano Babic #define PAD_CTL_SPEED_HIGH (3 << 12) 162*552a848eSStefano Babic 163*552a848eSStefano Babic #define PAD_CTL_SRE (1 << 11) 164*552a848eSStefano Babic 165*552a848eSStefano Babic #define PAD_CTL_ODE (1 << 10) 166*552a848eSStefano Babic 167*552a848eSStefano Babic #define PAD_CTL_DSE_150ohm (1 << 6) 168*552a848eSStefano Babic #define PAD_CTL_DSE_75ohm (2 << 6) 169*552a848eSStefano Babic #define PAD_CTL_DSE_50ohm (3 << 6) 170*552a848eSStefano Babic #define PAD_CTL_DSE_37ohm (4 << 6) 171*552a848eSStefano Babic #define PAD_CTL_DSE_30ohm (5 << 6) 172*552a848eSStefano Babic #define PAD_CTL_DSE_25ohm (6 << 6) 173*552a848eSStefano Babic #define PAD_CTL_DSE_20ohm (7 << 6) 174*552a848eSStefano Babic 175*552a848eSStefano Babic #define PAD_CTL_PUS_47K_UP (1 << 4 | PAD_CTL_PUE) 176*552a848eSStefano Babic #define PAD_CTL_PUS_100K_UP (2 << 4 | PAD_CTL_PUE) 177*552a848eSStefano Babic #define PAD_CTL_PUS_22K_UP (3 << 4 | PAD_CTL_PUE) 178*552a848eSStefano Babic #define PAD_CTL_PKE (1 << 3) 179*552a848eSStefano Babic #define PAD_CTL_PUE (1 << 2 | PAD_CTL_PKE) 180*552a848eSStefano Babic 181*552a848eSStefano Babic #define PAD_CTL_OBE_IBE_ENABLE (3 << 0) 182*552a848eSStefano Babic #define PAD_CTL_OBE_ENABLE (1 << 1) 183*552a848eSStefano Babic #define PAD_CTL_IBE_ENABLE (1 << 0) 184*552a848eSStefano Babic 185*552a848eSStefano Babic #else 186*552a848eSStefano Babic 187*552a848eSStefano Babic #define PAD_CTL_DVS (1 << 13) 188*552a848eSStefano Babic #define PAD_CTL_INPUT_DDR (1 << 9) 189*552a848eSStefano Babic #define PAD_CTL_HYS (1 << 8) 190*552a848eSStefano Babic 191*552a848eSStefano Babic #define PAD_CTL_PKE (1 << 7) 192*552a848eSStefano Babic #define PAD_CTL_PUE (1 << 6 | PAD_CTL_PKE) 193*552a848eSStefano Babic #define PAD_CTL_PUS_100K_DOWN (0 << 4 | PAD_CTL_PUE) 194*552a848eSStefano Babic #define PAD_CTL_PUS_47K_UP (1 << 4 | PAD_CTL_PUE) 195*552a848eSStefano Babic #define PAD_CTL_PUS_100K_UP (2 << 4 | PAD_CTL_PUE) 196*552a848eSStefano Babic #define PAD_CTL_PUS_22K_UP (3 << 4 | PAD_CTL_PUE) 197*552a848eSStefano Babic 198*552a848eSStefano Babic #define PAD_CTL_ODE (1 << 3) 199*552a848eSStefano Babic 200*552a848eSStefano Babic #define PAD_CTL_DSE_LOW (0 << 1) 201*552a848eSStefano Babic #define PAD_CTL_DSE_MED (1 << 1) 202*552a848eSStefano Babic #define PAD_CTL_DSE_HIGH (2 << 1) 203*552a848eSStefano Babic #define PAD_CTL_DSE_MAX (3 << 1) 204*552a848eSStefano Babic 205*552a848eSStefano Babic #endif 206*552a848eSStefano Babic 207*552a848eSStefano Babic #define PAD_CTL_SRE_SLOW (0 << 0) 208*552a848eSStefano Babic #define PAD_CTL_SRE_FAST (1 << 0) 209*552a848eSStefano Babic 210*552a848eSStefano Babic #endif 211*552a848eSStefano Babic 212*552a848eSStefano Babic #define IOMUX_CONFIG_SION 0x10 213*552a848eSStefano Babic 214*552a848eSStefano Babic #define GPIO_PIN_MASK 0x1f 215*552a848eSStefano Babic #define GPIO_PORT_SHIFT 5 216*552a848eSStefano Babic #define GPIO_PORT_MASK (0x7 << GPIO_PORT_SHIFT) 217*552a848eSStefano Babic #define GPIO_PORTA (0 << GPIO_PORT_SHIFT) 218*552a848eSStefano Babic #define GPIO_PORTB (1 << GPIO_PORT_SHIFT) 219*552a848eSStefano Babic #define GPIO_PORTC (2 << GPIO_PORT_SHIFT) 220*552a848eSStefano Babic #define GPIO_PORTD (3 << GPIO_PORT_SHIFT) 221*552a848eSStefano Babic #define GPIO_PORTE (4 << GPIO_PORT_SHIFT) 222*552a848eSStefano Babic #define GPIO_PORTF (5 << GPIO_PORT_SHIFT) 223*552a848eSStefano Babic 224*552a848eSStefano Babic void imx_iomux_v3_setup_pad(iomux_v3_cfg_t pad); 225*552a848eSStefano Babic void imx_iomux_v3_setup_multiple_pads(iomux_v3_cfg_t const *pad_list, 226*552a848eSStefano Babic unsigned count); 227*552a848eSStefano Babic /* 228*552a848eSStefano Babic * Set bits for general purpose registers 229*552a848eSStefano Babic */ 230*552a848eSStefano Babic void imx_iomux_set_gpr_register(int group, int start_bit, 231*552a848eSStefano Babic int num_bits, int value); 232*552a848eSStefano Babic #ifdef CONFIG_IOMUX_SHARE_CONF_REG 233*552a848eSStefano Babic void imx_iomux_gpio_set_direction(unsigned int gpio, 234*552a848eSStefano Babic unsigned int direction); 235*552a848eSStefano Babic void imx_iomux_gpio_get_function(unsigned int gpio, 236*552a848eSStefano Babic u32 *gpio_state); 237*552a848eSStefano Babic #endif 238*552a848eSStefano Babic 239*552a848eSStefano Babic /* macros for declaring and using pinmux array */ 240*552a848eSStefano Babic #if defined(CONFIG_MX6QDL) 241*552a848eSStefano Babic #define IOMUX_PADS(x) (MX6Q_##x), (MX6DL_##x) 242*552a848eSStefano Babic #define SETUP_IOMUX_PAD(def) \ 243*552a848eSStefano Babic if (is_cpu_type(MXC_CPU_MX6Q) || is_cpu_type(MXC_CPU_MX6D)) { \ 244*552a848eSStefano Babic imx_iomux_v3_setup_pad(MX6Q_##def); \ 245*552a848eSStefano Babic } else { \ 246*552a848eSStefano Babic imx_iomux_v3_setup_pad(MX6DL_##def); \ 247*552a848eSStefano Babic } 248*552a848eSStefano Babic #define SETUP_IOMUX_PADS(x) \ 249*552a848eSStefano Babic imx_iomux_v3_setup_multiple_pads(x, ARRAY_SIZE(x)/2) 250*552a848eSStefano Babic #elif defined(CONFIG_MX6Q) || defined(CONFIG_MX6D) 251*552a848eSStefano Babic #define IOMUX_PADS(x) MX6Q_##x 252*552a848eSStefano Babic #define SETUP_IOMUX_PAD(def) \ 253*552a848eSStefano Babic imx_iomux_v3_setup_pad(MX6Q_##def); 254*552a848eSStefano Babic #define SETUP_IOMUX_PADS(x) \ 255*552a848eSStefano Babic imx_iomux_v3_setup_multiple_pads(x, ARRAY_SIZE(x)) 256*552a848eSStefano Babic #elif defined(CONFIG_MX6UL) 257*552a848eSStefano Babic #define IOMUX_PADS(x) MX6_##x 258*552a848eSStefano Babic #define SETUP_IOMUX_PAD(def) \ 259*552a848eSStefano Babic imx_iomux_v3_setup_pad(MX6_##def); 260*552a848eSStefano Babic #define SETUP_IOMUX_PADS(x) \ 261*552a848eSStefano Babic imx_iomux_v3_setup_multiple_pads(x, ARRAY_SIZE(x)) 262*552a848eSStefano Babic #else 263*552a848eSStefano Babic #define IOMUX_PADS(x) MX6DL_##x 264*552a848eSStefano Babic #define SETUP_IOMUX_PAD(def) \ 265*552a848eSStefano Babic imx_iomux_v3_setup_pad(MX6DL_##def); 266*552a848eSStefano Babic #define SETUP_IOMUX_PADS(x) \ 267*552a848eSStefano Babic imx_iomux_v3_setup_multiple_pads(x, ARRAY_SIZE(x)) 268*552a848eSStefano Babic #endif 269*552a848eSStefano Babic 270*552a848eSStefano Babic #endif /* __MACH_IOMUX_V3_H__*/ 271