Merge tag 'io_uring-5.19-2022-07-08' of git://git.kernel.dk/linux-block
[linux-2.6-microblaze.git] / drivers / pinctrl / pinctrl-rockchip.h
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 /*
3  * Copyright (c) 2020-2021 Rockchip Electronics Co. Ltd.
4  *
5  * Copyright (c) 2013 MundoReader S.L.
6  * Author: Heiko Stuebner <heiko@sntech.de>
7  *
8  * With some ideas taken from pinctrl-samsung:
9  * Copyright (c) 2012 Samsung Electronics Co., Ltd.
10  *              http://www.samsung.com
11  * Copyright (c) 2012 Linaro Ltd
12  *              https://www.linaro.org
13  *
14  * and pinctrl-at91:
15  * Copyright (C) 2011-2012 Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>
16  */
17
18 #ifndef _PINCTRL_ROCKCHIP_H
19 #define _PINCTRL_ROCKCHIP_H
20
21 #define RK_GPIO0_A0     0
22 #define RK_GPIO0_A1     1
23 #define RK_GPIO0_A2     2
24 #define RK_GPIO0_A3     3
25 #define RK_GPIO0_A4     4
26 #define RK_GPIO0_A5     5
27 #define RK_GPIO0_A6     6
28 #define RK_GPIO0_A7     7
29 #define RK_GPIO0_B0     8
30 #define RK_GPIO0_B1     9
31 #define RK_GPIO0_B2     10
32 #define RK_GPIO0_B3     11
33 #define RK_GPIO0_B4     12
34 #define RK_GPIO0_B5     13
35 #define RK_GPIO0_B6     14
36 #define RK_GPIO0_B7     15
37 #define RK_GPIO0_C0     16
38 #define RK_GPIO0_C1     17
39 #define RK_GPIO0_C2     18
40 #define RK_GPIO0_C3     19
41 #define RK_GPIO0_C4     20
42 #define RK_GPIO0_C5     21
43 #define RK_GPIO0_C6     22
44 #define RK_GPIO0_C7     23
45 #define RK_GPIO0_D0     24
46 #define RK_GPIO0_D1     25
47 #define RK_GPIO0_D2     26
48 #define RK_GPIO0_D3     27
49 #define RK_GPIO0_D4     28
50 #define RK_GPIO0_D5     29
51 #define RK_GPIO0_D6     30
52 #define RK_GPIO0_D7     31
53
54 #define RK_GPIO1_A0     32
55 #define RK_GPIO1_A1     33
56 #define RK_GPIO1_A2     34
57 #define RK_GPIO1_A3     35
58 #define RK_GPIO1_A4     36
59 #define RK_GPIO1_A5     37
60 #define RK_GPIO1_A6     38
61 #define RK_GPIO1_A7     39
62 #define RK_GPIO1_B0     40
63 #define RK_GPIO1_B1     41
64 #define RK_GPIO1_B2     42
65 #define RK_GPIO1_B3     43
66 #define RK_GPIO1_B4     44
67 #define RK_GPIO1_B5     45
68 #define RK_GPIO1_B6     46
69 #define RK_GPIO1_B7     47
70 #define RK_GPIO1_C0     48
71 #define RK_GPIO1_C1     49
72 #define RK_GPIO1_C2     50
73 #define RK_GPIO1_C3     51
74 #define RK_GPIO1_C4     52
75 #define RK_GPIO1_C5     53
76 #define RK_GPIO1_C6     54
77 #define RK_GPIO1_C7     55
78 #define RK_GPIO1_D0     56
79 #define RK_GPIO1_D1     57
80 #define RK_GPIO1_D2     58
81 #define RK_GPIO1_D3     59
82 #define RK_GPIO1_D4     60
83 #define RK_GPIO1_D5     61
84 #define RK_GPIO1_D6     62
85 #define RK_GPIO1_D7     63
86
87 #define RK_GPIO2_A0     64
88 #define RK_GPIO2_A1     65
89 #define RK_GPIO2_A2     66
90 #define RK_GPIO2_A3     67
91 #define RK_GPIO2_A4     68
92 #define RK_GPIO2_A5     69
93 #define RK_GPIO2_A6     70
94 #define RK_GPIO2_A7     71
95 #define RK_GPIO2_B0     72
96 #define RK_GPIO2_B1     73
97 #define RK_GPIO2_B2     74
98 #define RK_GPIO2_B3     75
99 #define RK_GPIO2_B4     76
100 #define RK_GPIO2_B5     77
101 #define RK_GPIO2_B6     78
102 #define RK_GPIO2_B7     79
103 #define RK_GPIO2_C0     80
104 #define RK_GPIO2_C1     81
105 #define RK_GPIO2_C2     82
106 #define RK_GPIO2_C3     83
107 #define RK_GPIO2_C4     84
108 #define RK_GPIO2_C5     85
109 #define RK_GPIO2_C6     86
110 #define RK_GPIO2_C7     87
111 #define RK_GPIO2_D0     88
112 #define RK_GPIO2_D1     89
113 #define RK_GPIO2_D2     90
114 #define RK_GPIO2_D3     91
115 #define RK_GPIO2_D4     92
116 #define RK_GPIO2_D5     93
117 #define RK_GPIO2_D6     94
118 #define RK_GPIO2_D7     95
119
120 #define RK_GPIO3_A0     96
121 #define RK_GPIO3_A1     97
122 #define RK_GPIO3_A2     98
123 #define RK_GPIO3_A3     99
124 #define RK_GPIO3_A4     100
125 #define RK_GPIO3_A5     101
126 #define RK_GPIO3_A6     102
127 #define RK_GPIO3_A7     103
128 #define RK_GPIO3_B0     104
129 #define RK_GPIO3_B1     105
130 #define RK_GPIO3_B2     106
131 #define RK_GPIO3_B3     107
132 #define RK_GPIO3_B4     108
133 #define RK_GPIO3_B5     109
134 #define RK_GPIO3_B6     110
135 #define RK_GPIO3_B7     111
136 #define RK_GPIO3_C0     112
137 #define RK_GPIO3_C1     113
138 #define RK_GPIO3_C2     114
139 #define RK_GPIO3_C3     115
140 #define RK_GPIO3_C4     116
141 #define RK_GPIO3_C5     117
142 #define RK_GPIO3_C6     118
143 #define RK_GPIO3_C7     119
144 #define RK_GPIO3_D0     120
145 #define RK_GPIO3_D1     121
146 #define RK_GPIO3_D2     122
147 #define RK_GPIO3_D3     123
148 #define RK_GPIO3_D4     124
149 #define RK_GPIO3_D5     125
150 #define RK_GPIO3_D6     126
151 #define RK_GPIO3_D7     127
152
153 #define RK_GPIO4_A0     128
154 #define RK_GPIO4_A1     129
155 #define RK_GPIO4_A2     130
156 #define RK_GPIO4_A3     131
157 #define RK_GPIO4_A4     132
158 #define RK_GPIO4_A5     133
159 #define RK_GPIO4_A6     134
160 #define RK_GPIO4_A7     135
161 #define RK_GPIO4_B0     136
162 #define RK_GPIO4_B1     137
163 #define RK_GPIO4_B2     138
164 #define RK_GPIO4_B3     139
165 #define RK_GPIO4_B4     140
166 #define RK_GPIO4_B5     141
167 #define RK_GPIO4_B6     142
168 #define RK_GPIO4_B7     143
169 #define RK_GPIO4_C0     144
170 #define RK_GPIO4_C1     145
171 #define RK_GPIO4_C2     146
172 #define RK_GPIO4_C3     147
173 #define RK_GPIO4_C4     148
174 #define RK_GPIO4_C5     149
175 #define RK_GPIO4_C6     150
176 #define RK_GPIO4_C7     151
177 #define RK_GPIO4_D0     152
178 #define RK_GPIO4_D1     153
179 #define RK_GPIO4_D2     154
180 #define RK_GPIO4_D3     155
181 #define RK_GPIO4_D4     156
182 #define RK_GPIO4_D5     157
183 #define RK_GPIO4_D6     158
184 #define RK_GPIO4_D7     159
185
186 enum rockchip_pinctrl_type {
187         PX30,
188         RV1108,
189         RK2928,
190         RK3066B,
191         RK3128,
192         RK3188,
193         RK3288,
194         RK3308,
195         RK3368,
196         RK3399,
197         RK3568,
198         RK3588,
199 };
200
201 /**
202  * struct rockchip_gpio_regs
203  * @port_dr: data register
204  * @port_ddr: data direction register
205  * @int_en: interrupt enable
206  * @int_mask: interrupt mask
207  * @int_type: interrupt trigger type, such as high, low, edge trriger type.
208  * @int_polarity: interrupt polarity enable register
209  * @int_bothedge: interrupt bothedge enable register
210  * @int_status: interrupt status register
211  * @int_rawstatus: int_status = int_rawstatus & int_mask
212  * @debounce: enable debounce for interrupt signal
213  * @dbclk_div_en: enable divider for debounce clock
214  * @dbclk_div_con: setting for divider of debounce clock
215  * @port_eoi: end of interrupt of the port
216  * @ext_port: port data from external
217  * @version_id: controller version register
218  */
219 struct rockchip_gpio_regs {
220         u32 port_dr;
221         u32 port_ddr;
222         u32 int_en;
223         u32 int_mask;
224         u32 int_type;
225         u32 int_polarity;
226         u32 int_bothedge;
227         u32 int_status;
228         u32 int_rawstatus;
229         u32 debounce;
230         u32 dbclk_div_en;
231         u32 dbclk_div_con;
232         u32 port_eoi;
233         u32 ext_port;
234         u32 version_id;
235 };
236
237 /**
238  * struct rockchip_iomux
239  * @type: iomux variant using IOMUX_* constants
240  * @offset: if initialized to -1 it will be autocalculated, by specifying
241  *          an initial offset value the relevant source offset can be reset
242  *          to a new value for autocalculating the following iomux registers.
243  */
244 struct rockchip_iomux {
245         int type;
246         int offset;
247 };
248
249 /*
250  * enum type index corresponding to rockchip_perpin_drv_list arrays index.
251  */
252 enum rockchip_pin_drv_type {
253         DRV_TYPE_IO_DEFAULT = 0,
254         DRV_TYPE_IO_1V8_OR_3V0,
255         DRV_TYPE_IO_1V8_ONLY,
256         DRV_TYPE_IO_1V8_3V0_AUTO,
257         DRV_TYPE_IO_3V3_ONLY,
258         DRV_TYPE_MAX
259 };
260
261 /*
262  * enum type index corresponding to rockchip_pull_list arrays index.
263  */
264 enum rockchip_pin_pull_type {
265         PULL_TYPE_IO_DEFAULT = 0,
266         PULL_TYPE_IO_1V8_ONLY,
267         PULL_TYPE_MAX
268 };
269
270 /**
271  * struct rockchip_drv
272  * @drv_type: drive strength variant using rockchip_perpin_drv_type
273  * @offset: if initialized to -1 it will be autocalculated, by specifying
274  *          an initial offset value the relevant source offset can be reset
275  *          to a new value for autocalculating the following drive strength
276  *          registers. if used chips own cal_drv func instead to calculate
277  *          registers offset, the variant could be ignored.
278  */
279 struct rockchip_drv {
280         enum rockchip_pin_drv_type      drv_type;
281         int                             offset;
282 };
283
284 /**
285  * struct rockchip_pin_bank
286  * @dev: the pinctrl device bind to the bank
287  * @reg_base: register base of the gpio bank
288  * @regmap_pull: optional separate register for additional pull settings
289  * @clk: clock of the gpio bank
290  * @db_clk: clock of the gpio debounce
291  * @irq: interrupt of the gpio bank
292  * @saved_masks: Saved content of GPIO_INTEN at suspend time.
293  * @pin_base: first pin number
294  * @nr_pins: number of pins in this bank
295  * @name: name of the bank
296  * @bank_num: number of the bank, to account for holes
297  * @iomux: array describing the 4 iomux sources of the bank
298  * @drv: array describing the 4 drive strength sources of the bank
299  * @pull_type: array describing the 4 pull type sources of the bank
300  * @valid: is all necessary information present
301  * @of_node: dt node of this bank
302  * @drvdata: common pinctrl basedata
303  * @domain: irqdomain of the gpio bank
304  * @gpio_chip: gpiolib chip
305  * @grange: gpio range
306  * @slock: spinlock for the gpio bank
307  * @toggle_edge_mode: bit mask to toggle (falling/rising) edge mode
308  * @recalced_mask: bit mask to indicate a need to recalulate the mask
309  * @route_mask: bits describing the routing pins of per bank
310  * @deferred_output: gpio output settings to be done after gpio bank probed
311  * @deferred_lock: mutex for the deferred_output shared btw gpio and pinctrl
312  */
313 struct rockchip_pin_bank {
314         struct device                   *dev;
315         void __iomem                    *reg_base;
316         struct regmap                   *regmap_pull;
317         struct clk                      *clk;
318         struct clk                      *db_clk;
319         int                             irq;
320         u32                             saved_masks;
321         u32                             pin_base;
322         u8                              nr_pins;
323         char                            *name;
324         u8                              bank_num;
325         struct rockchip_iomux           iomux[4];
326         struct rockchip_drv             drv[4];
327         enum rockchip_pin_pull_type     pull_type[4];
328         bool                            valid;
329         struct device_node              *of_node;
330         struct rockchip_pinctrl         *drvdata;
331         struct irq_domain               *domain;
332         struct gpio_chip                gpio_chip;
333         struct pinctrl_gpio_range       grange;
334         raw_spinlock_t                  slock;
335         const struct rockchip_gpio_regs *gpio_regs;
336         u32                             gpio_type;
337         u32                             toggle_edge_mode;
338         u32                             recalced_mask;
339         u32                             route_mask;
340         struct list_head                deferred_pins;
341         struct mutex                    deferred_lock;
342 };
343
344 /**
345  * struct rockchip_mux_recalced_data: represent a pin iomux data.
346  * @num: bank number.
347  * @pin: pin number.
348  * @bit: index at register.
349  * @reg: register offset.
350  * @mask: mask bit
351  */
352 struct rockchip_mux_recalced_data {
353         u8 num;
354         u8 pin;
355         u32 reg;
356         u8 bit;
357         u8 mask;
358 };
359
360 enum rockchip_mux_route_location {
361         ROCKCHIP_ROUTE_SAME = 0,
362         ROCKCHIP_ROUTE_PMU,
363         ROCKCHIP_ROUTE_GRF,
364 };
365
366 /**
367  * struct rockchip_mux_recalced_data: represent a pin iomux data.
368  * @bank_num: bank number.
369  * @pin: index at register or used to calc index.
370  * @func: the min pin.
371  * @route_location: the mux route location (same, pmu, grf).
372  * @route_offset: the max pin.
373  * @route_val: the register offset.
374  */
375 struct rockchip_mux_route_data {
376         u8 bank_num;
377         u8 pin;
378         u8 func;
379         enum rockchip_mux_route_location route_location;
380         u32 route_offset;
381         u32 route_val;
382 };
383
384 struct rockchip_pin_ctrl {
385         struct rockchip_pin_bank        *pin_banks;
386         u32                             nr_banks;
387         u32                             nr_pins;
388         char                            *label;
389         enum rockchip_pinctrl_type      type;
390         int                             grf_mux_offset;
391         int                             pmu_mux_offset;
392         int                             grf_drv_offset;
393         int                             pmu_drv_offset;
394         struct rockchip_mux_recalced_data *iomux_recalced;
395         u32                             niomux_recalced;
396         struct rockchip_mux_route_data *iomux_routes;
397         u32                             niomux_routes;
398
399         int     (*pull_calc_reg)(struct rockchip_pin_bank *bank,
400                                     int pin_num, struct regmap **regmap,
401                                     int *reg, u8 *bit);
402         int     (*drv_calc_reg)(struct rockchip_pin_bank *bank,
403                                     int pin_num, struct regmap **regmap,
404                                     int *reg, u8 *bit);
405         int     (*schmitt_calc_reg)(struct rockchip_pin_bank *bank,
406                                     int pin_num, struct regmap **regmap,
407                                     int *reg, u8 *bit);
408 };
409
410 struct rockchip_pin_config {
411         unsigned int            func;
412         unsigned long           *configs;
413         unsigned int            nconfigs;
414 };
415
416 enum pin_config_param;
417
418 struct rockchip_pin_deferred {
419         struct list_head head;
420         unsigned int pin;
421         enum pin_config_param param;
422         u32 arg;
423 };
424
425 /**
426  * struct rockchip_pin_group: represent group of pins of a pinmux function.
427  * @name: name of the pin group, used to lookup the group.
428  * @pins: the pins included in this group.
429  * @npins: number of pins included in this group.
430  * @data: local pin configuration
431  */
432 struct rockchip_pin_group {
433         const char                      *name;
434         unsigned int                    npins;
435         unsigned int                    *pins;
436         struct rockchip_pin_config      *data;
437 };
438
439 /**
440  * struct rockchip_pmx_func: represent a pin function.
441  * @name: name of the pin function, used to lookup the function.
442  * @groups: one or more names of pin groups that provide this function.
443  * @ngroups: number of groups included in @groups.
444  */
445 struct rockchip_pmx_func {
446         const char              *name;
447         const char              **groups;
448         u8                      ngroups;
449 };
450
451 struct rockchip_pinctrl {
452         struct regmap                   *regmap_base;
453         int                             reg_size;
454         struct regmap                   *regmap_pull;
455         struct regmap                   *regmap_pmu;
456         struct device                   *dev;
457         struct rockchip_pin_ctrl        *ctrl;
458         struct pinctrl_desc             pctl;
459         struct pinctrl_dev              *pctl_dev;
460         struct rockchip_pin_group       *groups;
461         unsigned int                    ngroups;
462         struct rockchip_pmx_func        *functions;
463         unsigned int                    nfunctions;
464 };
465
466 #endif