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 57struct mxs_function { 58 const char *name; 59 const char **groups; 60 unsigned ngroups; 61}; 62 63struct mxs_group { 64 const char *name; 65 unsigned int *pins; 66 unsigned npins; 67 u8 *muxsel; 68 u8 config; 69}; 70 71struct mxs_regs { 72 u16 muxsel; 73 u16 drive; 74 u16 pull; 75}; 76 77struct 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 87int mxs_pinctrl_probe(struct platform_device *pdev, 88 struct mxs_pinctrl_soc_data *soc); 89int mxs_pinctrl_remove(struct platform_device *pdev); 90 91#endif /* __PINCTRL_MXS_H */ 92