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