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__ */ |
97 | |