162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Marvell PXA2xx family pin control
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * Copyright (C) 2015 Robert Jarzmik
662306a36Sopenharmony_ci */
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci#ifndef __PINCTRL_PXA_H
962306a36Sopenharmony_ci#define __PINCTRL_PXA_H
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_ci#define PXA_FUNCTION(_dir, _af, _name)				\
1262306a36Sopenharmony_ci	{							\
1362306a36Sopenharmony_ci		.name = _name,					\
1462306a36Sopenharmony_ci		.muxval = (_dir | (_af << 1)),			\
1562306a36Sopenharmony_ci	}
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_ci#define PXA_PIN(_pin, funcs...)					\
1862306a36Sopenharmony_ci	{							\
1962306a36Sopenharmony_ci		.pin = _pin,					\
2062306a36Sopenharmony_ci		.functions = (struct pxa_desc_function[]){	\
2162306a36Sopenharmony_ci			funcs, { } },				\
2262306a36Sopenharmony_ci	}
2362306a36Sopenharmony_ci
2462306a36Sopenharmony_ci#define PXA_GPIO_PIN(_pin, funcs...)				\
2562306a36Sopenharmony_ci	{							\
2662306a36Sopenharmony_ci		.pin = _pin,					\
2762306a36Sopenharmony_ci		.functions = (struct pxa_desc_function[]){	\
2862306a36Sopenharmony_ci			PXA_FUNCTION(0, 0, "gpio_in"),		\
2962306a36Sopenharmony_ci			PXA_FUNCTION(1, 0, "gpio_out"),		\
3062306a36Sopenharmony_ci			funcs, { } },				\
3162306a36Sopenharmony_ci	}
3262306a36Sopenharmony_ci
3362306a36Sopenharmony_ci#define PXA_GPIO_ONLY_PIN(_pin)					\
3462306a36Sopenharmony_ci	{							\
3562306a36Sopenharmony_ci		.pin = _pin,					\
3662306a36Sopenharmony_ci		.functions = (struct pxa_desc_function[]){	\
3762306a36Sopenharmony_ci			PXA_FUNCTION(0, 0, "gpio_in"),		\
3862306a36Sopenharmony_ci			PXA_FUNCTION(1, 0, "gpio_out"),		\
3962306a36Sopenharmony_ci			{ } },					\
4062306a36Sopenharmony_ci	}
4162306a36Sopenharmony_ci
4262306a36Sopenharmony_ci#define PXA_PINCTRL_PIN(pin)		\
4362306a36Sopenharmony_ci	PINCTRL_PIN(pin, "P" #pin)
4462306a36Sopenharmony_ci
4562306a36Sopenharmony_cistruct pxa_desc_function {
4662306a36Sopenharmony_ci	const char	*name;
4762306a36Sopenharmony_ci	u8		muxval;
4862306a36Sopenharmony_ci};
4962306a36Sopenharmony_ci
5062306a36Sopenharmony_cistruct pxa_desc_pin {
5162306a36Sopenharmony_ci	struct pinctrl_pin_desc		pin;
5262306a36Sopenharmony_ci	struct pxa_desc_function	*functions;
5362306a36Sopenharmony_ci};
5462306a36Sopenharmony_ci
5562306a36Sopenharmony_cistruct pxa_pinctrl_group {
5662306a36Sopenharmony_ci	const char	*name;
5762306a36Sopenharmony_ci	unsigned	pin;
5862306a36Sopenharmony_ci};
5962306a36Sopenharmony_ci
6062306a36Sopenharmony_cistruct pxa_pinctrl_function {
6162306a36Sopenharmony_ci	const char	*name;
6262306a36Sopenharmony_ci	const char	**groups;
6362306a36Sopenharmony_ci	unsigned	ngroups;
6462306a36Sopenharmony_ci};
6562306a36Sopenharmony_ci
6662306a36Sopenharmony_cistruct pxa_pinctrl {
6762306a36Sopenharmony_ci	spinlock_t			lock;
6862306a36Sopenharmony_ci	void __iomem			**base_gafr;
6962306a36Sopenharmony_ci	void __iomem			**base_gpdr;
7062306a36Sopenharmony_ci	void __iomem			**base_pgsr;
7162306a36Sopenharmony_ci	struct device			*dev;
7262306a36Sopenharmony_ci	struct pinctrl_desc		desc;
7362306a36Sopenharmony_ci	struct pinctrl_dev		*pctl_dev;
7462306a36Sopenharmony_ci	unsigned			npins;
7562306a36Sopenharmony_ci	const struct pxa_desc_pin	*ppins;
7662306a36Sopenharmony_ci	unsigned			ngroups;
7762306a36Sopenharmony_ci	struct pxa_pinctrl_group	*groups;
7862306a36Sopenharmony_ci	unsigned			nfuncs;
7962306a36Sopenharmony_ci	struct pxa_pinctrl_function	*functions;
8062306a36Sopenharmony_ci	char				*name;
8162306a36Sopenharmony_ci};
8262306a36Sopenharmony_ci
8362306a36Sopenharmony_ciint pxa2xx_pinctrl_init(struct platform_device *pdev,
8462306a36Sopenharmony_ci			const struct pxa_desc_pin *ppins, int npins,
8562306a36Sopenharmony_ci			void __iomem *base_gafr[], void __iomem *base_gpdr[],
8662306a36Sopenharmony_ci			void __iomem *base_gpsr[]);
8762306a36Sopenharmony_ci
8862306a36Sopenharmony_ci#endif /* __PINCTRL_PXA_H */
89