1*83d290c5STom Rini /* SPDX-License-Identifier: GPL-2.0+ */ 20cb3d82cSPeng Fan /* 30cb3d82cSPeng Fan * Based on Linux i.MX iomux-v3.h file: 40cb3d82cSPeng Fan * Copyright (C) 2009 by Jan Weitzel Phytec Messtechnik GmbH, 50cb3d82cSPeng Fan * <armlinux@phytec.de> 60cb3d82cSPeng Fan * 70cb3d82cSPeng Fan * Copyright (C) 2016 Freescale Semiconductor, Inc. 80cb3d82cSPeng Fan */ 90cb3d82cSPeng Fan 100cb3d82cSPeng Fan #ifndef __MACH_IOMUX_H__ 110cb3d82cSPeng Fan #define __MACH_IOMUX_H__ 120cb3d82cSPeng Fan 130cb3d82cSPeng Fan /* 140cb3d82cSPeng Fan * build IOMUX_PAD structure 150cb3d82cSPeng Fan * 160cb3d82cSPeng Fan * This iomux scheme is based around pads, which are the physical balls 170cb3d82cSPeng Fan * on the processor. 180cb3d82cSPeng Fan * 190cb3d82cSPeng Fan * - Each pad has a pad control register (IOMUXC_SW_PAD_CTRL_x) which controls 200cb3d82cSPeng Fan * things like driving strength and pullup/pulldown. 210cb3d82cSPeng Fan * - Each pad can have but not necessarily does have an output routing register 220cb3d82cSPeng Fan * (IOMUXC_SW_MUX_CTL_PAD_x). 230cb3d82cSPeng Fan * - Each pad can have but not necessarily does have an input routing register 240cb3d82cSPeng Fan * (IOMUXC_x_SELECT_INPUT) 250cb3d82cSPeng Fan * 260cb3d82cSPeng Fan * The three register sets do not have a fixed offset to each other, 270cb3d82cSPeng Fan * hence we order this table by pad control registers (which all pads 280cb3d82cSPeng Fan * have) and put the optional i/o routing registers into additional 290cb3d82cSPeng Fan * fields. 300cb3d82cSPeng Fan * 310cb3d82cSPeng Fan * The naming convention for the pad modes is SOC_PAD_<padname>__<padmode> 320cb3d82cSPeng Fan * If <padname> or <padmode> refers to a GPIO, it is named GPIO_<unit>_<num> 330cb3d82cSPeng Fan * 340cb3d82cSPeng Fan * IOMUX/PAD Bit field definitions 350cb3d82cSPeng Fan * 360cb3d82cSPeng Fan * MUX_CTRL_OFS: 0..15 (16) 370cb3d82cSPeng Fan * SEL_INPUT_OFS: 16..31 (16) 380cb3d82cSPeng Fan * MUX_MODE: 32..37 (6) 390cb3d82cSPeng Fan * SEL_INP: 38..41 (4) 400cb3d82cSPeng Fan * PAD_CTRL + NO_PAD_CTRL: 42..60 (19) 410cb3d82cSPeng Fan * reserved: 61-63 (3) 420cb3d82cSPeng Fan */ 430cb3d82cSPeng Fan 440cb3d82cSPeng Fan typedef u64 iomux_cfg_t; 450cb3d82cSPeng Fan 460cb3d82cSPeng Fan #define MUX_CTRL_OFS_SHIFT 0 470cb3d82cSPeng Fan #define MUX_CTRL_OFS_MASK ((iomux_cfg_t)0xffff << MUX_CTRL_OFS_SHIFT) 480cb3d82cSPeng Fan #define MUX_SEL_INPUT_OFS_SHIFT 16 490cb3d82cSPeng Fan #define MUX_SEL_INPUT_OFS_MASK ((iomux_cfg_t)0xffff << \ 500cb3d82cSPeng Fan MUX_SEL_INPUT_OFS_SHIFT) 510cb3d82cSPeng Fan 520cb3d82cSPeng Fan #define MUX_MODE_SHIFT 32 530cb3d82cSPeng Fan #define MUX_MODE_MASK ((iomux_cfg_t)0x3f << MUX_MODE_SHIFT) 540cb3d82cSPeng Fan #define MUX_SEL_INPUT_SHIFT 38 550cb3d82cSPeng Fan #define MUX_SEL_INPUT_MASK ((iomux_cfg_t)0xf << MUX_SEL_INPUT_SHIFT) 560cb3d82cSPeng Fan #define MUX_PAD_CTRL_SHIFT 42 570cb3d82cSPeng Fan #define MUX_PAD_CTRL_MASK ((iomux_cfg_t)0x7ffff << MUX_PAD_CTRL_SHIFT) 580cb3d82cSPeng Fan 590cb3d82cSPeng Fan #define MUX_PAD_CTRL(x) ((iomux_cfg_t)(x) << MUX_PAD_CTRL_SHIFT) 600cb3d82cSPeng Fan 610cb3d82cSPeng Fan #define IOMUX_PAD(pad_ctrl_ofs, mux_ctrl_ofs, mux_mode, sel_input_ofs, \ 620cb3d82cSPeng Fan sel_input, pad_ctrl) \ 630cb3d82cSPeng Fan (((iomux_cfg_t)(mux_ctrl_ofs) << MUX_CTRL_OFS_SHIFT) | \ 640cb3d82cSPeng Fan ((iomux_cfg_t)(mux_mode) << MUX_MODE_SHIFT) | \ 650cb3d82cSPeng Fan ((iomux_cfg_t)(pad_ctrl) << MUX_PAD_CTRL_SHIFT) | \ 660cb3d82cSPeng Fan ((iomux_cfg_t)(sel_input_ofs) << MUX_SEL_INPUT_OFS_SHIFT)| \ 670cb3d82cSPeng Fan ((iomux_cfg_t)(sel_input) << MUX_SEL_INPUT_SHIFT)) 680cb3d82cSPeng Fan 690cb3d82cSPeng Fan #define NEW_PAD_CTRL(cfg, pad) (((cfg) & ~MUX_PAD_CTRL_MASK) | \ 700cb3d82cSPeng Fan MUX_PAD_CTRL(pad)) 710cb3d82cSPeng Fan 720cb3d82cSPeng Fan 730cb3d82cSPeng Fan #define IOMUX_CONFIG_MPORTS 0x20 740cb3d82cSPeng Fan #define MUX_MODE_MPORTS ((iomux_v3_cfg_t)IOMUX_CONFIG_MPORTS << \ 750cb3d82cSPeng Fan MUX_MODE_SHIFT) 760cb3d82cSPeng Fan 770cb3d82cSPeng Fan /* Bit definition below needs to be fixed acccording to ulp rm */ 780cb3d82cSPeng Fan 790cb3d82cSPeng Fan #define NO_PAD_CTRL (1 << 18) 800cb3d82cSPeng Fan #define PAD_CTL_OBE_ENABLE (1 << 17) 810cb3d82cSPeng Fan #define PAD_CTL_IBE_ENABLE (1 << 16) 820cb3d82cSPeng Fan #define PAD_CTL_DSE (1 << 6) 830cb3d82cSPeng Fan #define PAD_CTL_ODE (1 << 5) 840cb3d82cSPeng Fan #define PAD_CTL_SRE_FAST (0 << 2) 850cb3d82cSPeng Fan #define PAD_CTL_SRE_SLOW (1 << 2) 860cb3d82cSPeng Fan #define PAD_CTL_PUE (1 << 1) 870cb3d82cSPeng Fan #define PAD_CTL_PUS_UP ((1 << 0) | PAD_CTL_PUE) 880cb3d82cSPeng Fan #define PAD_CTL_PUS_DOWN ((0 << 0) | PAD_CTL_PUE) 890cb3d82cSPeng Fan 900cb3d82cSPeng Fan 910cb3d82cSPeng Fan void mx7ulp_iomux_setup_pad(iomux_cfg_t pad); 920cb3d82cSPeng Fan void mx7ulp_iomux_setup_multiple_pads(iomux_cfg_t const *pad_list, 930cb3d82cSPeng Fan unsigned count); 940cb3d82cSPeng Fan #endif /* __MACH_IOMUX_H__*/ 95