1 /* SPDX-License-Identifier: GPL-2.0+ */
2 /*
3  * Copyright 2012 Freescale Semiconductor, Inc.
4  */
5 
6 #ifndef __PINCTRL_MXS_H
7 #define __PINCTRL_MXS_H
8 
9 #include <linux/platform_device.h>
10 #include <linux/pinctrl/pinctrl.h>
11 
12 #define SET	0x4
13 #define CLR	0x8
14 #define TOG	0xc
15 
16 #define MXS_PINCTRL_PIN(pin)	PINCTRL_PIN(pin, #pin)
17 #define PINID(bank, pin)	((bank) * 32 + (pin))
18 
19 /*
20  * pinmux-id bit field definitions
21  *
22  * bank:	15..12	(4)
23  * pin:		11..4	(8)
24  * muxsel:	3..0	(4)
25  */
26 #define MUXID_TO_PINID(m)	PINID((m) >> 12 & 0xf, (m) >> 4 & 0xff)
27 #define MUXID_TO_MUXSEL(m)	((m) & 0xf)
28 
29 #define PINID_TO_BANK(p)	((p) >> 5)
30 #define PINID_TO_PIN(p)		((p) % 32)
31 
32 /*
33  * pin config bit field definitions
34  *
35  * pull-up:	6..5	(2)
36  * voltage:	4..3	(2)
37  * mA:		2..0	(3)
38  *
39  * MSB of each field is presence bit for the config.
40  */
41 #define PULL_PRESENT		(1 << 6)
42 #define PULL_SHIFT		5
43 #define VOL_PRESENT		(1 << 4)
44 #define VOL_SHIFT		3
45 #define MA_PRESENT		(1 << 2)
46 #define MA_SHIFT		0
47 #define PIN_CONFIG_TO_PULL(c)	((c) >> PULL_SHIFT & 0x1)
48 #define PIN_CONFIG_TO_VOL(c)	((c) >> VOL_SHIFT & 0x1)
49 #define PIN_CONFIG_TO_MA(c)	((c) >> MA_SHIFT & 0x3)
50 
51 struct mxs_function {
52 	const char *name;
53 	const char **groups;
54 	unsigned ngroups;
55 };
56 
57 struct mxs_group {
58 	const char *name;
59 	unsigned int *pins;
60 	unsigned npins;
61 	u8 *muxsel;
62 	u8 config;
63 };
64 
65 struct mxs_regs {
66 	u16 muxsel;
67 	u16 drive;
68 	u16 pull;
69 };
70 
71 struct mxs_pinctrl_soc_data {
72 	const struct mxs_regs *regs;
73 	const struct pinctrl_pin_desc *pins;
74 	unsigned npins;
75 	struct mxs_function *functions;
76 	unsigned nfunctions;
77 	struct mxs_group *groups;
78 	unsigned ngroups;
79 };
80 
81 int mxs_pinctrl_probe(struct platform_device *pdev,
82 		      struct mxs_pinctrl_soc_data *soc);
83 
84 #endif /* __PINCTRL_MXS_H */
85