treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 441
[sfrench/cifs-2.6.git] / drivers / pinctrl / pxa / pinctrl-pxa2xx.h
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 */