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