1 /*
2  * Marvell PXA2xx family pin control
3  *
4  * Copyright (C) 2015 Robert Jarzmik
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; version 2 of the License.
9  *
10  */
11 
12 #ifndef __PINCTRL_PXA_H
13 #define __PINCTRL_PXA_H
14 
15 #define PXA_FUNCTION(_dir, _af, _name)				\
16 	{							\
17 		.name = _name,					\
18 		.muxval = (_dir | (_af << 1)),			\
19 	}
20 
21 #define PXA_PIN(_pin, funcs...)					\
22 	{							\
23 		.pin = _pin,					\
24 		.functions = (struct pxa_desc_function[]){	\
25 			funcs, { } },				\
26 	}
27 
28 #define PXA_GPIO_PIN(_pin, funcs...)				\
29 	{							\
30 		.pin = _pin,					\
31 		.functions = (struct pxa_desc_function[]){	\
32 			PXA_FUNCTION(0, 0, "gpio_in"),		\
33 			PXA_FUNCTION(1, 0, "gpio_out"),		\
34 			funcs, { } },				\
35 	}
36 
37 #define PXA_GPIO_ONLY_PIN(_pin)					\
38 	{							\
39 		.pin = _pin,					\
40 		.functions = (struct pxa_desc_function[]){	\
41 			PXA_FUNCTION(0, 0, "gpio_in"),		\
42 			PXA_FUNCTION(1, 0, "gpio_out"),		\
43 			{ } },					\
44 	}
45 
46 #define PXA_PINCTRL_PIN(pin)		\
47 	PINCTRL_PIN(pin, "P" #pin)
48 
49 struct pxa_desc_function {
50 	const char	*name;
51 	u8		muxval;
52 };
53 
54 struct pxa_desc_pin {
55 	struct pinctrl_pin_desc		pin;
56 	struct pxa_desc_function	*functions;
57 };
58 
59 struct pxa_pinctrl_group {
60 	const char	*name;
61 	unsigned	pin;
62 };
63 
64 struct pxa_pinctrl_function {
65 	const char	*name;
66 	const char	**groups;
67 	unsigned	ngroups;
68 };
69 
70 struct pxa_pinctrl {
71 	spinlock_t			lock;
72 	void __iomem			**base_gafr;
73 	void __iomem			**base_gpdr;
74 	void __iomem			**base_pgsr;
75 	struct device			*dev;
76 	struct pinctrl_desc		desc;
77 	struct pinctrl_dev		*pctl_dev;
78 	unsigned			npins;
79 	const struct pxa_desc_pin	*ppins;
80 	unsigned			ngroups;
81 	struct pxa_pinctrl_group	*groups;
82 	unsigned			nfuncs;
83 	struct pxa_pinctrl_function	*functions;
84 	char				*name;
85 };
86 
87 int pxa2xx_pinctrl_init(struct platform_device *pdev,
88 			const struct pxa_desc_pin *ppins, int npins,
89 			void __iomem *base_gafr[], void __iomem *base_gpdr[],
90 			void __iomem *base_gpsr[]);
91 
92 #endif /* __PINCTRL_PXA_H */
93