18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci * Marvell PXA2xx family pin control
48c2ecf20Sopenharmony_ci *
58c2ecf20Sopenharmony_ci * Copyright (C) 2015 Robert Jarzmik
68c2ecf20Sopenharmony_ci */
78c2ecf20Sopenharmony_ci
88c2ecf20Sopenharmony_ci#ifndef __PINCTRL_PXA_H
98c2ecf20Sopenharmony_ci#define __PINCTRL_PXA_H
108c2ecf20Sopenharmony_ci
118c2ecf20Sopenharmony_ci#define PXA_FUNCTION(_dir, _af, _name)				\
128c2ecf20Sopenharmony_ci	{							\
138c2ecf20Sopenharmony_ci		.name = _name,					\
148c2ecf20Sopenharmony_ci		.muxval = (_dir | (_af << 1)),			\
158c2ecf20Sopenharmony_ci	}
168c2ecf20Sopenharmony_ci
178c2ecf20Sopenharmony_ci#define PXA_PIN(_pin, funcs...)					\
188c2ecf20Sopenharmony_ci	{							\
198c2ecf20Sopenharmony_ci		.pin = _pin,					\
208c2ecf20Sopenharmony_ci		.functions = (struct pxa_desc_function[]){	\
218c2ecf20Sopenharmony_ci			funcs, { } },				\
228c2ecf20Sopenharmony_ci	}
238c2ecf20Sopenharmony_ci
248c2ecf20Sopenharmony_ci#define PXA_GPIO_PIN(_pin, funcs...)				\
258c2ecf20Sopenharmony_ci	{							\
268c2ecf20Sopenharmony_ci		.pin = _pin,					\
278c2ecf20Sopenharmony_ci		.functions = (struct pxa_desc_function[]){	\
288c2ecf20Sopenharmony_ci			PXA_FUNCTION(0, 0, "gpio_in"),		\
298c2ecf20Sopenharmony_ci			PXA_FUNCTION(1, 0, "gpio_out"),		\
308c2ecf20Sopenharmony_ci			funcs, { } },				\
318c2ecf20Sopenharmony_ci	}
328c2ecf20Sopenharmony_ci
338c2ecf20Sopenharmony_ci#define PXA_GPIO_ONLY_PIN(_pin)					\
348c2ecf20Sopenharmony_ci	{							\
358c2ecf20Sopenharmony_ci		.pin = _pin,					\
368c2ecf20Sopenharmony_ci		.functions = (struct pxa_desc_function[]){	\
378c2ecf20Sopenharmony_ci			PXA_FUNCTION(0, 0, "gpio_in"),		\
388c2ecf20Sopenharmony_ci			PXA_FUNCTION(1, 0, "gpio_out"),		\
398c2ecf20Sopenharmony_ci			{ } },					\
408c2ecf20Sopenharmony_ci	}
418c2ecf20Sopenharmony_ci
428c2ecf20Sopenharmony_ci#define PXA_PINCTRL_PIN(pin)		\
438c2ecf20Sopenharmony_ci	PINCTRL_PIN(pin, "P" #pin)
448c2ecf20Sopenharmony_ci
458c2ecf20Sopenharmony_cistruct pxa_desc_function {
468c2ecf20Sopenharmony_ci	const char	*name;
478c2ecf20Sopenharmony_ci	u8		muxval;
488c2ecf20Sopenharmony_ci};
498c2ecf20Sopenharmony_ci
508c2ecf20Sopenharmony_cistruct pxa_desc_pin {
518c2ecf20Sopenharmony_ci	struct pinctrl_pin_desc		pin;
528c2ecf20Sopenharmony_ci	struct pxa_desc_function	*functions;
538c2ecf20Sopenharmony_ci};
548c2ecf20Sopenharmony_ci
558c2ecf20Sopenharmony_cistruct pxa_pinctrl_group {
568c2ecf20Sopenharmony_ci	const char	*name;
578c2ecf20Sopenharmony_ci	unsigned	pin;
588c2ecf20Sopenharmony_ci};
598c2ecf20Sopenharmony_ci
608c2ecf20Sopenharmony_cistruct pxa_pinctrl_function {
618c2ecf20Sopenharmony_ci	const char	*name;
628c2ecf20Sopenharmony_ci	const char	**groups;
638c2ecf20Sopenharmony_ci	unsigned	ngroups;
648c2ecf20Sopenharmony_ci};
658c2ecf20Sopenharmony_ci
668c2ecf20Sopenharmony_cistruct pxa_pinctrl {
678c2ecf20Sopenharmony_ci	spinlock_t			lock;
688c2ecf20Sopenharmony_ci	void __iomem			**base_gafr;
698c2ecf20Sopenharmony_ci	void __iomem			**base_gpdr;
708c2ecf20Sopenharmony_ci	void __iomem			**base_pgsr;
718c2ecf20Sopenharmony_ci	struct device			*dev;
728c2ecf20Sopenharmony_ci	struct pinctrl_desc		desc;
738c2ecf20Sopenharmony_ci	struct pinctrl_dev		*pctl_dev;
748c2ecf20Sopenharmony_ci	unsigned			npins;
758c2ecf20Sopenharmony_ci	const struct pxa_desc_pin	*ppins;
768c2ecf20Sopenharmony_ci	unsigned			ngroups;
778c2ecf20Sopenharmony_ci	struct pxa_pinctrl_group	*groups;
788c2ecf20Sopenharmony_ci	unsigned			nfuncs;
798c2ecf20Sopenharmony_ci	struct pxa_pinctrl_function	*functions;
808c2ecf20Sopenharmony_ci	char				*name;
818c2ecf20Sopenharmony_ci};
828c2ecf20Sopenharmony_ci
838c2ecf20Sopenharmony_ciint pxa2xx_pinctrl_init(struct platform_device *pdev,
848c2ecf20Sopenharmony_ci			const struct pxa_desc_pin *ppins, int npins,
858c2ecf20Sopenharmony_ci			void __iomem *base_gafr[], void __iomem *base_gpdr[],
868c2ecf20Sopenharmony_ci			void __iomem *base_gpsr[]);
878c2ecf20Sopenharmony_ci
888c2ecf20Sopenharmony_ci#endif /* __PINCTRL_PXA_H */
89