1 /* 2 * Copyright 2012 Freescale Semiconductor, Inc. 3 * 4 * The code contained herein is licensed under the GNU General Public 5 * License. You may obtain a copy of the GNU General Public License 6 * Version 2 or later at the following locations: 7 * 8 * http://www.opensource.org/licenses/gpl-license.html 9 * http://www.gnu.org/copyleft/gpl.html 10 */ 11 12 #ifndef __PINCTRL_MXS_H 13 #define __PINCTRL_MXS_H 14 15 #include <linux/platform_device.h> 16 #include <linux/pinctrl/pinctrl.h> 17 18 #define SET 0x4 19 #define CLR 0x8 20 #define TOG 0xc 21 22 #define MXS_PINCTRL_PIN(pin) PINCTRL_PIN(pin, #pin) 23 #define PINID(bank, pin) ((bank) * 32 + (pin)) 24 25 /* 26 * pinmux-id bit field definitions 27 * 28 * bank: 15..12 (4) 29 * pin: 11..4 (8) 30 * muxsel: 3..0 (4) 31 */ 32 #define MUXID_TO_PINID(m) PINID((m) >> 12 & 0xf, (m) >> 4 & 0xff) 33 #define MUXID_TO_MUXSEL(m) ((m) & 0xf) 34 35 #define PINID_TO_BANK(p) ((p) >> 5) 36 #define PINID_TO_PIN(p) ((p) % 32) 37 38 /* 39 * pin config bit field definitions 40 * 41 * pull-up: 6..5 (2) 42 * voltage: 4..3 (2) 43 * mA: 2..0 (3) 44 * 45 * MSB of each field is presence bit for the config. 46 */ 47 #define PULL_PRESENT (1 << 6) 48 #define PULL_SHIFT 5 49 #define VOL_PRESENT (1 << 4) 50 #define VOL_SHIFT 3 51 #define MA_PRESENT (1 << 2) 52 #define MA_SHIFT 0 53 #define CONFIG_TO_PULL(c) ((c) >> PULL_SHIFT & 0x1) 54 #define CONFIG_TO_VOL(c) ((c) >> VOL_SHIFT & 0x1) 55 #define CONFIG_TO_MA(c) ((c) >> MA_SHIFT & 0x3) 56 57 struct mxs_function { 58 const char *name; 59 const char **groups; 60 unsigned ngroups; 61 }; 62 63 struct mxs_group { 64 const char *name; 65 unsigned int *pins; 66 unsigned npins; 67 u8 *muxsel; 68 u8 config; 69 }; 70 71 struct mxs_regs { 72 u16 muxsel; 73 u16 drive; 74 u16 pull; 75 }; 76 77 struct mxs_pinctrl_soc_data { 78 const struct mxs_regs *regs; 79 const struct pinctrl_pin_desc *pins; 80 unsigned npins; 81 struct mxs_function *functions; 82 unsigned nfunctions; 83 struct mxs_group *groups; 84 unsigned ngroups; 85 }; 86 87 int mxs_pinctrl_probe(struct platform_device *pdev, 88 struct mxs_pinctrl_soc_data *soc); 89 int mxs_pinctrl_remove(struct platform_device *pdev); 90 91 #endif /* __PINCTRL_MXS_H */ 92