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