GNU Linux-libre 5.10.215-gnu1
[releases.git] / drivers / pinctrl / visconti / pinctrl-common.h
1 /* SPDX-License-Identifier: GPL-2.0 */
2 /*
3  * Copyright (c) 2020 TOSHIBA CORPORATION
4  * Copyright (c) 2020 Toshiba Electronic Devices & Storage Corporation
5  * Copyright (c) 2020 Nobuhiro Iwamatsu <nobuhiro1.iwamatsu@toshiba.co.jp>
6  */
7
8 #ifndef __VISCONTI_PINCTRL_COMMON_H__
9 #define __VISCONTI_PINCTRL_COMMON_H__
10
11 struct pinctrl_pin_desc;
12
13 /* PIN */
14 #define VISCONTI_PINS(pins_name, ...)  \
15         static const unsigned int pins_name ## _pins[] = { __VA_ARGS__ }
16
17 struct visconti_desc_pin {
18         struct pinctrl_pin_desc pin;
19         unsigned int dsel_offset;
20         unsigned int dsel_shift;
21         unsigned int pude_offset;
22         unsigned int pudsel_offset;
23         unsigned int pud_shift;
24 };
25
26 #define VISCONTI_PIN(_pin, dsel, d_sh, pude, pudsel, p_sh)      \
27 {                                                               \
28         .pin = _pin,                                            \
29         .dsel_offset = dsel,                                    \
30         .dsel_shift = d_sh,                                     \
31         .pude_offset = pude,                                    \
32         .pudsel_offset = pudsel,                                \
33         .pud_shift = p_sh,                                      \
34 }
35
36 /* Group */
37 #define VISCONTI_GROUPS(groups_name, ...)       \
38         static const char * const groups_name ## _grps[] = { __VA_ARGS__ }
39
40 struct visconti_mux {
41         unsigned int offset;
42         unsigned int mask;
43         unsigned int val;
44 };
45
46 struct visconti_pin_group {
47         const char *name;
48         const unsigned int *pins;
49         unsigned int nr_pins;
50         struct visconti_mux mux;
51 };
52
53 #define VISCONTI_PIN_GROUP(group_name, off, msk, v)     \
54 {                                                       \
55         .name = __stringify(group_name) "_grp",         \
56         .pins = group_name ## _pins,                    \
57         .nr_pins = ARRAY_SIZE(group_name ## _pins),     \
58         .mux = {                                        \
59                 .offset = off,                          \
60                 .mask = msk,                            \
61                 .val = v,                               \
62         }                                               \
63 }
64
65 /* MUX */
66 struct visconti_pin_function {
67         const char *name;
68         const char * const *groups;
69         unsigned int nr_groups;
70 };
71
72 #define VISCONTI_PIN_FUNCTION(func)             \
73 {                                               \
74         .name = #func,                          \
75         .groups = func ## _grps,                \
76         .nr_groups = ARRAY_SIZE(func ## _grps), \
77 }
78
79 /* chip dependent data */
80 struct visconti_pinctrl_devdata {
81         const struct visconti_desc_pin *pins;
82         unsigned int nr_pins;
83         const struct visconti_pin_group *groups;
84         unsigned int nr_groups;
85         const struct visconti_pin_function *functions;
86         unsigned int nr_functions;
87
88         const struct visconti_mux *gpio_mux;
89
90         void (*unlock)(void __iomem *base);
91 };
92
93 int visconti_pinctrl_probe(struct platform_device *pdev,
94                            const struct visconti_pinctrl_devdata *devdata);
95
96 #endif /* __VISCONTI_PINCTRL_COMMON_H__ */