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
45struct pxa_desc_function {
46	const char	*name;
47	u8		muxval;
48};
49
50struct pxa_desc_pin {
51	struct pinctrl_pin_desc		pin;
52	struct pxa_desc_function	*functions;
53};
54
55struct pxa_pinctrl_group {
56	const char	*name;
57	unsigned	pin;
58};
59
60struct pxa_pinctrl_function {
61	const char	*name;
62	const char	**groups;
63	unsigned	ngroups;
64};
65
66struct 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
83int 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