xref: /rk3399_rockchip-uboot/drivers/pinctrl/rockchip/pinctrl-rockchip.h (revision b653b9e8c171365ce437eb92a7c649c314d97973)
1f2e4e921SDavid Wu /* SPDX-License-Identifier: GPL-2.0+ */
2f2e4e921SDavid Wu /*
3f2e4e921SDavid Wu  * (C) Copyright 2019 Rockchip Electronics Co., Ltd
4f2e4e921SDavid Wu  */
5f2e4e921SDavid Wu 
6f2e4e921SDavid Wu #ifndef __DRIVERS_PINCTRL_ROCKCHIP_H
7f2e4e921SDavid Wu #define __DRIVERS_PINCTRL_ROCKCHIP_H
8f2e4e921SDavid Wu 
9b8d3e6ffSJianqun Xu #include <dt-bindings/pinctrl/rockchip.h>
10f2e4e921SDavid Wu #include <linux/types.h>
11f2e4e921SDavid Wu 
1236a14c2fSJianqun Xu #define RK_GPIO0_A0	0
1336a14c2fSJianqun Xu #define RK_GPIO0_A1	1
1436a14c2fSJianqun Xu #define RK_GPIO0_A2	2
1536a14c2fSJianqun Xu #define RK_GPIO0_A3	3
1636a14c2fSJianqun Xu #define RK_GPIO0_A4	4
1736a14c2fSJianqun Xu #define RK_GPIO0_A5	5
1836a14c2fSJianqun Xu #define RK_GPIO0_A6	6
1936a14c2fSJianqun Xu #define RK_GPIO0_A7	7
2036a14c2fSJianqun Xu #define RK_GPIO0_B0	8
2136a14c2fSJianqun Xu #define RK_GPIO0_B1	9
2236a14c2fSJianqun Xu #define RK_GPIO0_B2	10
2336a14c2fSJianqun Xu #define RK_GPIO0_B3	11
2436a14c2fSJianqun Xu #define RK_GPIO0_B4	12
2536a14c2fSJianqun Xu #define RK_GPIO0_B5	13
2636a14c2fSJianqun Xu #define RK_GPIO0_B6	14
2736a14c2fSJianqun Xu #define RK_GPIO0_B7	15
2836a14c2fSJianqun Xu #define RK_GPIO0_C0	16
2936a14c2fSJianqun Xu #define RK_GPIO0_C1	17
3036a14c2fSJianqun Xu #define RK_GPIO0_C2	18
3136a14c2fSJianqun Xu #define RK_GPIO0_C3	19
3236a14c2fSJianqun Xu #define RK_GPIO0_C4	20
3336a14c2fSJianqun Xu #define RK_GPIO0_C5	21
3436a14c2fSJianqun Xu #define RK_GPIO0_C6	22
3536a14c2fSJianqun Xu #define RK_GPIO0_C7	23
3636a14c2fSJianqun Xu #define RK_GPIO0_D0	24
3736a14c2fSJianqun Xu #define RK_GPIO0_D1	25
3836a14c2fSJianqun Xu #define RK_GPIO0_D2	26
3936a14c2fSJianqun Xu #define RK_GPIO0_D3	27
4036a14c2fSJianqun Xu #define RK_GPIO0_D4	28
4136a14c2fSJianqun Xu #define RK_GPIO0_D5	29
4236a14c2fSJianqun Xu #define RK_GPIO0_D6	30
4336a14c2fSJianqun Xu #define RK_GPIO0_D7	31
4436a14c2fSJianqun Xu 
4536a14c2fSJianqun Xu #define RK_GPIO1_A0	32
4636a14c2fSJianqun Xu #define RK_GPIO1_A1	33
4736a14c2fSJianqun Xu #define RK_GPIO1_A2	34
4836a14c2fSJianqun Xu #define RK_GPIO1_A3	35
4936a14c2fSJianqun Xu #define RK_GPIO1_A4	36
5036a14c2fSJianqun Xu #define RK_GPIO1_A5	37
5136a14c2fSJianqun Xu #define RK_GPIO1_A6	38
5236a14c2fSJianqun Xu #define RK_GPIO1_A7	39
5336a14c2fSJianqun Xu #define RK_GPIO1_B0	40
5436a14c2fSJianqun Xu #define RK_GPIO1_B1	41
5536a14c2fSJianqun Xu #define RK_GPIO1_B2	42
5636a14c2fSJianqun Xu #define RK_GPIO1_B3	43
5736a14c2fSJianqun Xu #define RK_GPIO1_B4	44
5836a14c2fSJianqun Xu #define RK_GPIO1_B5	45
5936a14c2fSJianqun Xu #define RK_GPIO1_B6	46
6036a14c2fSJianqun Xu #define RK_GPIO1_B7	47
6136a14c2fSJianqun Xu #define RK_GPIO1_C0	48
6236a14c2fSJianqun Xu #define RK_GPIO1_C1	49
6336a14c2fSJianqun Xu #define RK_GPIO1_C2	50
6436a14c2fSJianqun Xu #define RK_GPIO1_C3	51
6536a14c2fSJianqun Xu #define RK_GPIO1_C4	52
6636a14c2fSJianqun Xu #define RK_GPIO1_C5	53
6736a14c2fSJianqun Xu #define RK_GPIO1_C6	54
6836a14c2fSJianqun Xu #define RK_GPIO1_C7	55
6936a14c2fSJianqun Xu #define RK_GPIO1_D0	56
7036a14c2fSJianqun Xu #define RK_GPIO1_D1	57
7136a14c2fSJianqun Xu #define RK_GPIO1_D2	58
7236a14c2fSJianqun Xu #define RK_GPIO1_D3	59
7336a14c2fSJianqun Xu #define RK_GPIO1_D4	60
7436a14c2fSJianqun Xu #define RK_GPIO1_D5	61
7536a14c2fSJianqun Xu #define RK_GPIO1_D6	62
7636a14c2fSJianqun Xu #define RK_GPIO1_D7	63
7736a14c2fSJianqun Xu 
7836a14c2fSJianqun Xu #define RK_GPIO2_A0	64
7936a14c2fSJianqun Xu #define RK_GPIO2_A1	65
8036a14c2fSJianqun Xu #define RK_GPIO2_A2	66
8136a14c2fSJianqun Xu #define RK_GPIO2_A3	67
8236a14c2fSJianqun Xu #define RK_GPIO2_A4	68
8336a14c2fSJianqun Xu #define RK_GPIO2_A5	69
8436a14c2fSJianqun Xu #define RK_GPIO2_A6	70
8536a14c2fSJianqun Xu #define RK_GPIO2_A7	71
8636a14c2fSJianqun Xu #define RK_GPIO2_B0	72
8736a14c2fSJianqun Xu #define RK_GPIO2_B1	73
8836a14c2fSJianqun Xu #define RK_GPIO2_B2	74
8936a14c2fSJianqun Xu #define RK_GPIO2_B3	75
9036a14c2fSJianqun Xu #define RK_GPIO2_B4	76
9136a14c2fSJianqun Xu #define RK_GPIO2_B5	77
9236a14c2fSJianqun Xu #define RK_GPIO2_B6	78
9336a14c2fSJianqun Xu #define RK_GPIO2_B7	79
9436a14c2fSJianqun Xu #define RK_GPIO2_C0	80
9536a14c2fSJianqun Xu #define RK_GPIO2_C1	81
9636a14c2fSJianqun Xu #define RK_GPIO2_C2	82
9736a14c2fSJianqun Xu #define RK_GPIO2_C3	83
9836a14c2fSJianqun Xu #define RK_GPIO2_C4	84
9936a14c2fSJianqun Xu #define RK_GPIO2_C5	85
10036a14c2fSJianqun Xu #define RK_GPIO2_C6	86
10136a14c2fSJianqun Xu #define RK_GPIO2_C7	87
10236a14c2fSJianqun Xu #define RK_GPIO2_D0	88
10336a14c2fSJianqun Xu #define RK_GPIO2_D1	89
10436a14c2fSJianqun Xu #define RK_GPIO2_D2	90
10536a14c2fSJianqun Xu #define RK_GPIO2_D3	91
10636a14c2fSJianqun Xu #define RK_GPIO2_D4	92
10736a14c2fSJianqun Xu #define RK_GPIO2_D5	93
10836a14c2fSJianqun Xu #define RK_GPIO2_D6	94
10936a14c2fSJianqun Xu #define RK_GPIO2_D7	95
11036a14c2fSJianqun Xu 
11136a14c2fSJianqun Xu #define RK_GPIO3_A0	96
11236a14c2fSJianqun Xu #define RK_GPIO3_A1	97
11336a14c2fSJianqun Xu #define RK_GPIO3_A2	98
11436a14c2fSJianqun Xu #define RK_GPIO3_A3	99
11536a14c2fSJianqun Xu #define RK_GPIO3_A4	100
11636a14c2fSJianqun Xu #define RK_GPIO3_A5	101
11736a14c2fSJianqun Xu #define RK_GPIO3_A6	102
11836a14c2fSJianqun Xu #define RK_GPIO3_A7	103
11936a14c2fSJianqun Xu #define RK_GPIO3_B0	104
12036a14c2fSJianqun Xu #define RK_GPIO3_B1	105
12136a14c2fSJianqun Xu #define RK_GPIO3_B2	106
12236a14c2fSJianqun Xu #define RK_GPIO3_B3	107
12336a14c2fSJianqun Xu #define RK_GPIO3_B4	108
12436a14c2fSJianqun Xu #define RK_GPIO3_B5	109
12536a14c2fSJianqun Xu #define RK_GPIO3_B6	110
12636a14c2fSJianqun Xu #define RK_GPIO3_B7	111
12736a14c2fSJianqun Xu #define RK_GPIO3_C0	112
12836a14c2fSJianqun Xu #define RK_GPIO3_C1	113
12936a14c2fSJianqun Xu #define RK_GPIO3_C2	114
13036a14c2fSJianqun Xu #define RK_GPIO3_C3	115
13136a14c2fSJianqun Xu #define RK_GPIO3_C4	116
13236a14c2fSJianqun Xu #define RK_GPIO3_C5	117
13336a14c2fSJianqun Xu #define RK_GPIO3_C6	118
13436a14c2fSJianqun Xu #define RK_GPIO3_C7	119
13536a14c2fSJianqun Xu #define RK_GPIO3_D0	120
13636a14c2fSJianqun Xu #define RK_GPIO3_D1	121
13736a14c2fSJianqun Xu #define RK_GPIO3_D2	122
13836a14c2fSJianqun Xu #define RK_GPIO3_D3	123
13936a14c2fSJianqun Xu #define RK_GPIO3_D4	124
14036a14c2fSJianqun Xu #define RK_GPIO3_D5	125
14136a14c2fSJianqun Xu #define RK_GPIO3_D6	126
14236a14c2fSJianqun Xu #define RK_GPIO3_D7	127
14336a14c2fSJianqun Xu 
14436a14c2fSJianqun Xu #define RK_GPIO4_A0	128
14536a14c2fSJianqun Xu #define RK_GPIO4_A1	129
14636a14c2fSJianqun Xu #define RK_GPIO4_A2	130
14736a14c2fSJianqun Xu #define RK_GPIO4_A3	131
14836a14c2fSJianqun Xu #define RK_GPIO4_A4	132
14936a14c2fSJianqun Xu #define RK_GPIO4_A5	133
15036a14c2fSJianqun Xu #define RK_GPIO4_A6	134
15136a14c2fSJianqun Xu #define RK_GPIO4_A7	135
15236a14c2fSJianqun Xu #define RK_GPIO4_B0	136
15336a14c2fSJianqun Xu #define RK_GPIO4_B1	137
15436a14c2fSJianqun Xu #define RK_GPIO4_B2	138
15536a14c2fSJianqun Xu #define RK_GPIO4_B3	139
15636a14c2fSJianqun Xu #define RK_GPIO4_B4	140
15736a14c2fSJianqun Xu #define RK_GPIO4_B5	141
15836a14c2fSJianqun Xu #define RK_GPIO4_B6	142
15936a14c2fSJianqun Xu #define RK_GPIO4_B7	143
16036a14c2fSJianqun Xu #define RK_GPIO4_C0	144
16136a14c2fSJianqun Xu #define RK_GPIO4_C1	145
16236a14c2fSJianqun Xu #define RK_GPIO4_C2	146
16336a14c2fSJianqun Xu #define RK_GPIO4_C3	147
16436a14c2fSJianqun Xu #define RK_GPIO4_C4	148
16536a14c2fSJianqun Xu #define RK_GPIO4_C5	149
16636a14c2fSJianqun Xu #define RK_GPIO4_C6	150
16736a14c2fSJianqun Xu #define RK_GPIO4_C7	151
16836a14c2fSJianqun Xu #define RK_GPIO4_D0	152
16936a14c2fSJianqun Xu #define RK_GPIO4_D1	153
17036a14c2fSJianqun Xu #define RK_GPIO4_D2	154
17136a14c2fSJianqun Xu #define RK_GPIO4_D3	155
17236a14c2fSJianqun Xu #define RK_GPIO4_D4	156
17336a14c2fSJianqun Xu #define RK_GPIO4_D5	157
17436a14c2fSJianqun Xu #define RK_GPIO4_D6	158
17536a14c2fSJianqun Xu #define RK_GPIO4_D7	159
17636a14c2fSJianqun Xu 
177b8d3e6ffSJianqun Xu #define RK_GENMASK_VAL(h, l, v) \
178b8d3e6ffSJianqun Xu 	(GENMASK(((h) + 16), ((l) + 16)) | (((v) << (l)) & GENMASK((h), (l))))
179b8d3e6ffSJianqun Xu 
180f2e4e921SDavid Wu /**
181f2e4e921SDavid Wu  * Encode variants of iomux registers into a type variable
182f2e4e921SDavid Wu  */
183f2e4e921SDavid Wu #define IOMUX_GPIO_ONLY		BIT(0)
184f2e4e921SDavid Wu #define IOMUX_WIDTH_4BIT	BIT(1)
185f2e4e921SDavid Wu #define IOMUX_SOURCE_PMU	BIT(2)
186f2e4e921SDavid Wu #define IOMUX_UNROUTED		BIT(3)
187f2e4e921SDavid Wu #define IOMUX_WIDTH_3BIT	BIT(4)
188b8d3e6ffSJianqun Xu #define IOMUX_8WIDTH_2BIT	BIT(5)
189b8d3e6ffSJianqun Xu #define IOMUX_WRITABLE_32BIT	BIT(6)
190b8d3e6ffSJianqun Xu #define IOMUX_L_SOURCE_PMU	BIT(7)
191f2e4e921SDavid Wu 
192f2e4e921SDavid Wu /**
193f2e4e921SDavid Wu  * Defined some common pins constants
194f2e4e921SDavid Wu  */
195f2e4e921SDavid Wu #define ROCKCHIP_PULL_BITS_PER_PIN	2
196f2e4e921SDavid Wu #define ROCKCHIP_PULL_PINS_PER_REG	8
197f2e4e921SDavid Wu #define ROCKCHIP_PULL_BANK_STRIDE	16
198f2e4e921SDavid Wu #define ROCKCHIP_DRV_BITS_PER_PIN	2
199f2e4e921SDavid Wu #define ROCKCHIP_DRV_PINS_PER_REG	8
200f2e4e921SDavid Wu #define ROCKCHIP_DRV_BANK_STRIDE	16
201f2e4e921SDavid Wu #define ROCKCHIP_DRV_3BITS_PER_PIN	3
202f2e4e921SDavid Wu 
203f2e4e921SDavid Wu /**
204f2e4e921SDavid Wu  * @type: iomux variant using IOMUX_* constants
205f2e4e921SDavid Wu  * @offset: if initialized to -1 it will be autocalculated, by specifying
206f2e4e921SDavid Wu  *	    an initial offset value the relevant source offset can be reset
207f2e4e921SDavid Wu  *	    to a new value for autocalculating the following iomux registers.
208f2e4e921SDavid Wu  */
209f2e4e921SDavid Wu struct rockchip_iomux {
210f2e4e921SDavid Wu 	int				type;
211f2e4e921SDavid Wu 	int				offset;
212f2e4e921SDavid Wu };
213f2e4e921SDavid Wu 
21449b3d5d5SDavid Wu #define DRV_TYPE_IO_MASK		GENMASK(31, 16)
21549b3d5d5SDavid Wu #define DRV_TYPE_WRITABLE_32BIT		BIT(31)
21649b3d5d5SDavid Wu 
217f2e4e921SDavid Wu /**
218f2e4e921SDavid Wu  * enum type index corresponding to rockchip_perpin_drv_list arrays index.
219f2e4e921SDavid Wu  */
220f2e4e921SDavid Wu enum rockchip_pin_drv_type {
221f2e4e921SDavid Wu 	DRV_TYPE_IO_DEFAULT = 0,
222f2e4e921SDavid Wu 	DRV_TYPE_IO_1V8_OR_3V0,
223f2e4e921SDavid Wu 	DRV_TYPE_IO_1V8_ONLY,
224f2e4e921SDavid Wu 	DRV_TYPE_IO_1V8_3V0_AUTO,
225f2e4e921SDavid Wu 	DRV_TYPE_IO_3V3_ONLY,
226f2e4e921SDavid Wu 	DRV_TYPE_MAX
227f2e4e921SDavid Wu };
228f2e4e921SDavid Wu 
22949b3d5d5SDavid Wu #define PULL_TYPE_IO_MASK		GENMASK(31, 16)
23049b3d5d5SDavid Wu #define PULL_TYPE_WRITABLE_32BIT	BIT(31)
23149b3d5d5SDavid Wu 
232f2e4e921SDavid Wu /**
233f2e4e921SDavid Wu  * enum type index corresponding to rockchip_pull_list arrays index.
234f2e4e921SDavid Wu  */
235f2e4e921SDavid Wu enum rockchip_pin_pull_type {
236f2e4e921SDavid Wu 	PULL_TYPE_IO_DEFAULT = 0,
237f2e4e921SDavid Wu 	PULL_TYPE_IO_1V8_ONLY,
238f1155765SSteven Liu 	PULL_TYPE_IO_1 = 1,
239f2e4e921SDavid Wu 	PULL_TYPE_MAX
240f2e4e921SDavid Wu };
241f2e4e921SDavid Wu 
242f2e4e921SDavid Wu /**
243b8d3e6ffSJianqun Xu  * enum mux route register type, should be invalid/default/topgrf/pmugrf.
244b8d3e6ffSJianqun Xu  * INVALID: means do not need to set mux route
245b8d3e6ffSJianqun Xu  * DEFAULT: means same regmap as pin iomux
246b8d3e6ffSJianqun Xu  * TOPGRF: means mux route setting in topgrf
247b8d3e6ffSJianqun Xu  * PMUGRF: means mux route setting in pmugrf
248b8d3e6ffSJianqun Xu  */
249b8d3e6ffSJianqun Xu enum rockchip_pin_route_type {
250b8d3e6ffSJianqun Xu 	ROUTE_TYPE_DEFAULT = 0,
251b8d3e6ffSJianqun Xu 	ROUTE_TYPE_TOPGRF = 1,
252b8d3e6ffSJianqun Xu 	ROUTE_TYPE_PMUGRF = 2,
253b8d3e6ffSJianqun Xu 
254b8d3e6ffSJianqun Xu 	ROUTE_TYPE_INVALID = -1,
255b8d3e6ffSJianqun Xu };
256b8d3e6ffSJianqun Xu 
257b8d3e6ffSJianqun Xu /**
258f2e4e921SDavid Wu  * @drv_type: drive strength variant using rockchip_perpin_drv_type
259f2e4e921SDavid Wu  * @offset: if initialized to -1 it will be autocalculated, by specifying
260f2e4e921SDavid Wu  *	    an initial offset value the relevant source offset can be reset
261f2e4e921SDavid Wu  *	    to a new value for autocalculating the following drive strength
262f2e4e921SDavid Wu  *	    registers. if used chips own cal_drv func instead to calculate
263f2e4e921SDavid Wu  *	    registers offset, the variant could be ignored.
264f2e4e921SDavid Wu  */
265f2e4e921SDavid Wu struct rockchip_drv {
266f2e4e921SDavid Wu 	enum rockchip_pin_drv_type	drv_type;
267f2e4e921SDavid Wu 	int				offset;
268f2e4e921SDavid Wu };
269f2e4e921SDavid Wu 
270f2e4e921SDavid Wu /**
271f2e4e921SDavid Wu  * @priv: common pinctrl private basedata
272f2e4e921SDavid Wu  * @pin_base: first pin number
273f2e4e921SDavid Wu  * @nr_pins: number of pins in this bank
274f2e4e921SDavid Wu  * @name: name of the bank
275f2e4e921SDavid Wu  * @bank_num: number of the bank, to account for holes
276f2e4e921SDavid Wu  * @iomux: array describing the 4 iomux sources of the bank
277f2e4e921SDavid Wu  * @drv: array describing the 4 drive strength sources of the bank
278f2e4e921SDavid Wu  * @pull_type: array describing the 4 pull type sources of the bank
279f2e4e921SDavid Wu  * @recalced_mask: bits describing the mux recalced pins of per bank
280f2e4e921SDavid Wu  * @route_mask: bits describing the routing pins of per bank
281f2e4e921SDavid Wu  */
282f2e4e921SDavid Wu struct rockchip_pin_bank {
283f2e4e921SDavid Wu 	struct rockchip_pinctrl_priv	*priv;
284f2e4e921SDavid Wu 	u32				pin_base;
285f2e4e921SDavid Wu 	u8				nr_pins;
286f2e4e921SDavid Wu 	char				*name;
287f2e4e921SDavid Wu 	u8				bank_num;
288f2e4e921SDavid Wu 	struct rockchip_iomux		iomux[4];
289f2e4e921SDavid Wu 	struct rockchip_drv		drv[4];
290f2e4e921SDavid Wu 	enum rockchip_pin_pull_type	pull_type[4];
291f2e4e921SDavid Wu 	u32				recalced_mask;
292f2e4e921SDavid Wu 	u32				route_mask;
293f2e4e921SDavid Wu };
294f2e4e921SDavid Wu 
295f2e4e921SDavid Wu #define PIN_BANK(id, pins, label)			\
296f2e4e921SDavid Wu 	{						\
297f2e4e921SDavid Wu 		.bank_num	= id,			\
298f2e4e921SDavid Wu 		.nr_pins	= pins,			\
299f2e4e921SDavid Wu 		.name		= label,		\
300f2e4e921SDavid Wu 		.iomux		= {			\
301f2e4e921SDavid Wu 			{ .offset = -1 },		\
302f2e4e921SDavid Wu 			{ .offset = -1 },		\
303f2e4e921SDavid Wu 			{ .offset = -1 },		\
304f2e4e921SDavid Wu 			{ .offset = -1 },		\
305f2e4e921SDavid Wu 		},					\
306f2e4e921SDavid Wu 	}
307f2e4e921SDavid Wu 
308f2e4e921SDavid Wu #define PIN_BANK_IOMUX_FLAGS(id, pins, label, iom0, iom1, iom2, iom3)	\
309f2e4e921SDavid Wu 	{								\
310f2e4e921SDavid Wu 		.bank_num	= id,					\
311f2e4e921SDavid Wu 		.nr_pins	= pins,					\
312f2e4e921SDavid Wu 		.name		= label,				\
313f2e4e921SDavid Wu 		.iomux		= {					\
314f2e4e921SDavid Wu 			{ .type = iom0, .offset = -1 },			\
315f2e4e921SDavid Wu 			{ .type = iom1, .offset = -1 },			\
316f2e4e921SDavid Wu 			{ .type = iom2, .offset = -1 },			\
317f2e4e921SDavid Wu 			{ .type = iom3, .offset = -1 },			\
318f2e4e921SDavid Wu 		},							\
319f2e4e921SDavid Wu 	}
320f2e4e921SDavid Wu 
321b8d3e6ffSJianqun Xu #define PIN_BANK_IOMUX_FLAGS_OFFSET(id, pins, label, iom0, iom1, iom2,	\
322b8d3e6ffSJianqun Xu 				    iom3, offset0, offset1, offset2,	\
323b8d3e6ffSJianqun Xu 				    offset3)				\
324b8d3e6ffSJianqun Xu 	{								\
325b8d3e6ffSJianqun Xu 		.bank_num	= id,					\
326b8d3e6ffSJianqun Xu 		.nr_pins	= pins,					\
327b8d3e6ffSJianqun Xu 		.name		= label,				\
328b8d3e6ffSJianqun Xu 		.iomux		= {					\
329b8d3e6ffSJianqun Xu 			{ .type = iom0, .offset = offset0 },		\
330b8d3e6ffSJianqun Xu 			{ .type = iom1, .offset = offset1 },		\
331b8d3e6ffSJianqun Xu 			{ .type = iom2, .offset = offset2 },		\
332b8d3e6ffSJianqun Xu 			{ .type = iom3, .offset = offset3 },		\
333b8d3e6ffSJianqun Xu 		},							\
334b8d3e6ffSJianqun Xu 	}
335b8d3e6ffSJianqun Xu 
336f1155765SSteven Liu #define PIN_BANK_IOMUX_FLAGS_OFFSET_PULL_FLAGS(id, pins, label, iom0,	\
337f1155765SSteven Liu 					       iom1, iom2, iom3,	\
338f1155765SSteven Liu 					       offset0, offset1,	\
339f1155765SSteven Liu 					       offset2, offset3, pull0,	\
340f1155765SSteven Liu 					       pull1, pull2, pull3)	\
341f1155765SSteven Liu 	{								\
342f1155765SSteven Liu 		.bank_num	= id,					\
343f1155765SSteven Liu 		.nr_pins	= pins,					\
344f1155765SSteven Liu 		.name		= label,				\
345f1155765SSteven Liu 		.iomux		= {					\
346f1155765SSteven Liu 			{ .type = iom0, .offset = offset0 },		\
347f1155765SSteven Liu 			{ .type = iom1, .offset = offset1 },		\
348f1155765SSteven Liu 			{ .type = iom2, .offset = offset2 },		\
349f1155765SSteven Liu 			{ .type = iom3, .offset = offset3 },		\
350f1155765SSteven Liu 		},							\
351f1155765SSteven Liu 		.pull_type[0] = pull0,					\
352f1155765SSteven Liu 		.pull_type[1] = pull1,					\
353f1155765SSteven Liu 		.pull_type[2] = pull2,					\
354f1155765SSteven Liu 		.pull_type[3] = pull3,					\
355f1155765SSteven Liu 	}
356f1155765SSteven Liu 
357f2e4e921SDavid Wu #define PIN_BANK_DRV_FLAGS(id, pins, label, type0, type1, type2, type3) \
358f2e4e921SDavid Wu 	{								\
359f2e4e921SDavid Wu 		.bank_num	= id,					\
360f2e4e921SDavid Wu 		.nr_pins	= pins,					\
361f2e4e921SDavid Wu 		.name		= label,				\
362f2e4e921SDavid Wu 		.iomux		= {					\
363f2e4e921SDavid Wu 			{ .offset = -1 },				\
364f2e4e921SDavid Wu 			{ .offset = -1 },				\
365f2e4e921SDavid Wu 			{ .offset = -1 },				\
366f2e4e921SDavid Wu 			{ .offset = -1 },				\
367f2e4e921SDavid Wu 		},							\
368f2e4e921SDavid Wu 		.drv		= {					\
369f2e4e921SDavid Wu 			{ .drv_type = type0, .offset = -1 },		\
370f2e4e921SDavid Wu 			{ .drv_type = type1, .offset = -1 },		\
371f2e4e921SDavid Wu 			{ .drv_type = type2, .offset = -1 },		\
372f2e4e921SDavid Wu 			{ .drv_type = type3, .offset = -1 },		\
373f2e4e921SDavid Wu 		},							\
374f2e4e921SDavid Wu 	}
375f2e4e921SDavid Wu 
37636a14c2fSJianqun Xu #define PIN_BANK_IOMUX_FLAGS_PULL_FLAGS(id, pins, label, iom0, iom1,	\
37736a14c2fSJianqun Xu 					iom2, iom3, pull0, pull1,	\
37836a14c2fSJianqun Xu 					pull2, pull3)			\
37936a14c2fSJianqun Xu 	{								\
38036a14c2fSJianqun Xu 		.bank_num	= id,					\
38136a14c2fSJianqun Xu 		.nr_pins	= pins,					\
38236a14c2fSJianqun Xu 		.name		= label,				\
38336a14c2fSJianqun Xu 		.iomux		= {					\
38436a14c2fSJianqun Xu 			{ .type = iom0, .offset = -1 },			\
38536a14c2fSJianqun Xu 			{ .type = iom1, .offset = -1 },			\
38636a14c2fSJianqun Xu 			{ .type = iom2, .offset = -1 },			\
38736a14c2fSJianqun Xu 			{ .type = iom3, .offset = -1 },			\
38836a14c2fSJianqun Xu 		},							\
38936a14c2fSJianqun Xu 		.pull_type[0] = pull0,					\
39036a14c2fSJianqun Xu 		.pull_type[1] = pull1,					\
39136a14c2fSJianqun Xu 		.pull_type[2] = pull2,					\
39236a14c2fSJianqun Xu 		.pull_type[3] = pull3,					\
39336a14c2fSJianqun Xu 	}
39436a14c2fSJianqun Xu 
395f2e4e921SDavid Wu #define PIN_BANK_DRV_FLAGS_PULL_FLAGS(id, pins, label, drv0, drv1,	\
396f2e4e921SDavid Wu 				      drv2, drv3, pull0, pull1,		\
397f2e4e921SDavid Wu 				      pull2, pull3)			\
398f2e4e921SDavid Wu 	{								\
399f2e4e921SDavid Wu 		.bank_num	= id,					\
400f2e4e921SDavid Wu 		.nr_pins	= pins,					\
401f2e4e921SDavid Wu 		.name		= label,				\
402f2e4e921SDavid Wu 		.iomux		= {					\
403f2e4e921SDavid Wu 			{ .offset = -1 },				\
404f2e4e921SDavid Wu 			{ .offset = -1 },				\
405f2e4e921SDavid Wu 			{ .offset = -1 },				\
406f2e4e921SDavid Wu 			{ .offset = -1 },				\
407f2e4e921SDavid Wu 		},							\
408f2e4e921SDavid Wu 		.drv		= {					\
409f2e4e921SDavid Wu 			{ .drv_type = drv0, .offset = -1 },		\
410f2e4e921SDavid Wu 			{ .drv_type = drv1, .offset = -1 },		\
411f2e4e921SDavid Wu 			{ .drv_type = drv2, .offset = -1 },		\
412f2e4e921SDavid Wu 			{ .drv_type = drv3, .offset = -1 },		\
413f2e4e921SDavid Wu 		},							\
414f2e4e921SDavid Wu 		.pull_type[0] = pull0,					\
415f2e4e921SDavid Wu 		.pull_type[1] = pull1,					\
416f2e4e921SDavid Wu 		.pull_type[2] = pull2,					\
417f2e4e921SDavid Wu 		.pull_type[3] = pull3,					\
418f2e4e921SDavid Wu 	}
419f2e4e921SDavid Wu 
420f2e4e921SDavid Wu #define PIN_BANK_IOMUX_DRV_FLAGS_OFFSET(id, pins, label, iom0, iom1,	\
421f2e4e921SDavid Wu 					iom2, iom3, drv0, drv1, drv2,	\
422f2e4e921SDavid Wu 					drv3, offset0, offset1,		\
423f2e4e921SDavid Wu 					offset2, offset3)		\
424f2e4e921SDavid Wu 	{								\
425f2e4e921SDavid Wu 		.bank_num	= id,					\
426f2e4e921SDavid Wu 		.nr_pins	= pins,					\
427f2e4e921SDavid Wu 		.name		= label,				\
428f2e4e921SDavid Wu 		.iomux		= {					\
429f2e4e921SDavid Wu 			{ .type = iom0, .offset = -1 },			\
430f2e4e921SDavid Wu 			{ .type = iom1, .offset = -1 },			\
431f2e4e921SDavid Wu 			{ .type = iom2, .offset = -1 },			\
432f2e4e921SDavid Wu 			{ .type = iom3, .offset = -1 },			\
433f2e4e921SDavid Wu 		},							\
434f2e4e921SDavid Wu 		.drv		= {					\
435f2e4e921SDavid Wu 			{ .drv_type = drv0, .offset = offset0 },	\
436f2e4e921SDavid Wu 			{ .drv_type = drv1, .offset = offset1 },	\
437f2e4e921SDavid Wu 			{ .drv_type = drv2, .offset = offset2 },	\
438f2e4e921SDavid Wu 			{ .drv_type = drv3, .offset = offset3 },	\
439f2e4e921SDavid Wu 		},							\
440f2e4e921SDavid Wu 	}
441f2e4e921SDavid Wu 
44249b3d5d5SDavid Wu #define PIN_BANK_IOMUX_DRV_PULL_FLAGS(id, pins, label, iom0, iom1,	\
44349b3d5d5SDavid Wu 				      iom2, iom3, drv0, drv1, drv2,	\
44449b3d5d5SDavid Wu 				      drv3, pull0, pull1, pull2,	\
44549b3d5d5SDavid Wu 				      pull3)				\
44649b3d5d5SDavid Wu 	{								\
44749b3d5d5SDavid Wu 		.bank_num	= id,					\
44849b3d5d5SDavid Wu 		.nr_pins	= pins,					\
44949b3d5d5SDavid Wu 		.name		= label,				\
45049b3d5d5SDavid Wu 		.iomux		= {					\
45149b3d5d5SDavid Wu 			{ .type = iom0, .offset = -1 },			\
45249b3d5d5SDavid Wu 			{ .type = iom1, .offset = -1 },			\
45349b3d5d5SDavid Wu 			{ .type = iom2, .offset = -1 },			\
45449b3d5d5SDavid Wu 			{ .type = iom3, .offset = -1 },			\
45549b3d5d5SDavid Wu 		},							\
45649b3d5d5SDavid Wu 		.drv		= {					\
45749b3d5d5SDavid Wu 			{ .drv_type = drv0, .offset = -1 },		\
45849b3d5d5SDavid Wu 			{ .drv_type = drv1, .offset = -1 },		\
45949b3d5d5SDavid Wu 			{ .drv_type = drv2, .offset = -1 },		\
46049b3d5d5SDavid Wu 			{ .drv_type = drv3, .offset = -1 },		\
46149b3d5d5SDavid Wu 		},							\
46249b3d5d5SDavid Wu 		.pull_type[0] = pull0,					\
46349b3d5d5SDavid Wu 		.pull_type[1] = pull1,					\
46449b3d5d5SDavid Wu 		.pull_type[2] = pull2,					\
46549b3d5d5SDavid Wu 		.pull_type[3] = pull3,					\
46649b3d5d5SDavid Wu 	}
46749b3d5d5SDavid Wu 
468f2e4e921SDavid Wu #define PIN_BANK_IOMUX_FLAGS_DRV_FLAGS_OFFSET_PULL_FLAGS(id, pins,	\
469f2e4e921SDavid Wu 					      label, iom0, iom1, iom2,  \
470f2e4e921SDavid Wu 					      iom3, drv0, drv1, drv2,   \
471f2e4e921SDavid Wu 					      drv3, offset0, offset1,   \
472f2e4e921SDavid Wu 					      offset2, offset3, pull0,  \
473f2e4e921SDavid Wu 					      pull1, pull2, pull3)	\
474f2e4e921SDavid Wu 	{								\
475f2e4e921SDavid Wu 		.bank_num	= id,					\
476f2e4e921SDavid Wu 		.nr_pins	= pins,					\
477f2e4e921SDavid Wu 		.name		= label,				\
478f2e4e921SDavid Wu 		.iomux		= {					\
479f2e4e921SDavid Wu 			{ .type = iom0, .offset = -1 },			\
480f2e4e921SDavid Wu 			{ .type = iom1, .offset = -1 },			\
481f2e4e921SDavid Wu 			{ .type = iom2, .offset = -1 },			\
482f2e4e921SDavid Wu 			{ .type = iom3, .offset = -1 },			\
483f2e4e921SDavid Wu 		},							\
484f2e4e921SDavid Wu 		.drv		= {					\
485f2e4e921SDavid Wu 			{ .drv_type = drv0, .offset = offset0 },	\
486f2e4e921SDavid Wu 			{ .drv_type = drv1, .offset = offset1 },	\
487f2e4e921SDavid Wu 			{ .drv_type = drv2, .offset = offset2 },	\
488f2e4e921SDavid Wu 			{ .drv_type = drv3, .offset = offset3 },	\
489f2e4e921SDavid Wu 		},							\
490f2e4e921SDavid Wu 		.pull_type[0] = pull0,					\
491f2e4e921SDavid Wu 		.pull_type[1] = pull1,					\
492f2e4e921SDavid Wu 		.pull_type[2] = pull2,					\
493f2e4e921SDavid Wu 		.pull_type[3] = pull3,					\
494f2e4e921SDavid Wu 	}
495f2e4e921SDavid Wu 
496b8d3e6ffSJianqun Xu #define PIN_BANK_MUX_ROUTE_FLAGS(ID, PIN, FUNC, REG, VAL, FLAG)		\
497b8d3e6ffSJianqun Xu 	{								\
498b8d3e6ffSJianqun Xu 		.bank_num	= ID,					\
499b8d3e6ffSJianqun Xu 		.pin		= PIN,					\
500b8d3e6ffSJianqun Xu 		.func		= FUNC,					\
501b8d3e6ffSJianqun Xu 		.route_offset	= REG,					\
502b8d3e6ffSJianqun Xu 		.route_val	= VAL,					\
503b8d3e6ffSJianqun Xu 		.route_type	= FLAG,					\
504b8d3e6ffSJianqun Xu 	}
505b8d3e6ffSJianqun Xu 
506b8d3e6ffSJianqun Xu #define MR_DEFAULT(ID, PIN, FUNC, REG, VAL)	\
507b8d3e6ffSJianqun Xu 	PIN_BANK_MUX_ROUTE_FLAGS(ID, PIN, FUNC, REG, VAL, ROUTE_TYPE_DEFAULT)
508b8d3e6ffSJianqun Xu 
509b8d3e6ffSJianqun Xu #define MR_TOPGRF(ID, PIN, FUNC, REG, VAL)	\
510b8d3e6ffSJianqun Xu 	PIN_BANK_MUX_ROUTE_FLAGS(ID, PIN, FUNC, REG, VAL, ROUTE_TYPE_TOPGRF)
511b8d3e6ffSJianqun Xu 
512b8d3e6ffSJianqun Xu #define MR_PMUGRF(ID, PIN, FUNC, REG, VAL)	\
513b8d3e6ffSJianqun Xu 	PIN_BANK_MUX_ROUTE_FLAGS(ID, PIN, FUNC, REG, VAL, ROUTE_TYPE_PMUGRF)
514b8d3e6ffSJianqun Xu 
51536a14c2fSJianqun Xu #define RK3588_PIN_BANK_FLAGS(ID, PIN, LABEL, M, P)			\
51636a14c2fSJianqun Xu 	PIN_BANK_IOMUX_FLAGS_PULL_FLAGS(ID, PIN, LABEL, M, M, M, M, P, P, P, P)
51736a14c2fSJianqun Xu 
518*b653b9e8SYe Zhang #define PIN_BANK_IOMUX_4_OFFSET(id, pins, label, offset0, offset1,	\
519*b653b9e8SYe Zhang 				offset2, offset3)			\
520*b653b9e8SYe Zhang 	PIN_BANK_IOMUX_FLAGS_OFFSET(id, pins, label, IOMUX_WIDTH_4BIT,	\
521*b653b9e8SYe Zhang 				    IOMUX_WIDTH_4BIT, IOMUX_WIDTH_4BIT,	\
522*b653b9e8SYe Zhang 				    IOMUX_WIDTH_4BIT, offset0, offset1,	\
523*b653b9e8SYe Zhang 				    offset2, offset3)
524*b653b9e8SYe Zhang 
525f2e4e921SDavid Wu /**
526f2e4e921SDavid Wu  * struct rockchip_mux_recalced_data: recalculate a pin iomux data.
527f2e4e921SDavid Wu  * @num: bank number.
528f2e4e921SDavid Wu  * @pin: pin number.
529f2e4e921SDavid Wu  * @reg: register offset.
530f2e4e921SDavid Wu  * @bit: index at register.
531f2e4e921SDavid Wu  * @mask: mask bit
532f2e4e921SDavid Wu  */
533f2e4e921SDavid Wu struct rockchip_mux_recalced_data {
534f2e4e921SDavid Wu 	u8 num;
535f2e4e921SDavid Wu 	u8 pin;
536f2e4e921SDavid Wu 	u32 reg;
537f2e4e921SDavid Wu 	u8 bit;
538f2e4e921SDavid Wu 	u8 mask;
539f2e4e921SDavid Wu };
540f2e4e921SDavid Wu 
541f2e4e921SDavid Wu /**
542f2e4e921SDavid Wu  * struct rockchip_mux_route_data: route a pin iomux data.
543f2e4e921SDavid Wu  * @bank_num: bank number.
544f2e4e921SDavid Wu  * @pin: index at register or used to calc index.
545f2e4e921SDavid Wu  * @func: the min pin.
546b8d3e6ffSJianqun Xu  * @route_type: the register type.
547f2e4e921SDavid Wu  * @route_offset: the max pin.
548f2e4e921SDavid Wu  * @route_val: the register offset.
549f2e4e921SDavid Wu  */
550f2e4e921SDavid Wu struct rockchip_mux_route_data {
551f2e4e921SDavid Wu 	u8 bank_num;
552f2e4e921SDavid Wu 	u8 pin;
553f2e4e921SDavid Wu 	u8 func;
554b8d3e6ffSJianqun Xu 	enum rockchip_pin_route_type route_type : 8;
555f2e4e921SDavid Wu 	u32 route_offset;
556f2e4e921SDavid Wu 	u32 route_val;
557f2e4e921SDavid Wu };
558f2e4e921SDavid Wu 
559f2e4e921SDavid Wu /**
560f2e4e921SDavid Wu  */
561f2e4e921SDavid Wu struct rockchip_pin_ctrl {
562f2e4e921SDavid Wu 	struct rockchip_pin_bank	*pin_banks;
563f2e4e921SDavid Wu 	u32				nr_banks;
564f2e4e921SDavid Wu 	u32				nr_pins;
565f2e4e921SDavid Wu 	int				grf_mux_offset;
566f2e4e921SDavid Wu 	int				pmu_mux_offset;
567f2e4e921SDavid Wu 	int				grf_drv_offset;
568f2e4e921SDavid Wu 	int				pmu_drv_offset;
569f2e4e921SDavid Wu 	struct rockchip_mux_recalced_data *iomux_recalced;
570f2e4e921SDavid Wu 	u32				niomux_recalced;
571f2e4e921SDavid Wu 	struct rockchip_mux_route_data *iomux_routes;
572f2e4e921SDavid Wu 	u32				niomux_routes;
573f2e4e921SDavid Wu 
5745f55bbd7SDavid Wu 	int	(*set_mux)(struct rockchip_pin_bank *bank,
5755f55bbd7SDavid Wu 			   int pin, int mux);
57605a5688eSDavid Wu 	int	(*set_pull)(struct rockchip_pin_bank *bank,
57705a5688eSDavid Wu 			    int pin_num, int pull);
578681441e6SDavid Wu 	int	(*set_drive)(struct rockchip_pin_bank *bank,
579681441e6SDavid Wu 			     int pin_num, int strength);
5805635c457SDavid Wu 	int	(*set_schmitt)(struct rockchip_pin_bank *bank,
5815635c457SDavid Wu 			       int pin_num, int enable);
582f2e4e921SDavid Wu };
583f2e4e921SDavid Wu 
584f2e4e921SDavid Wu /**
585f2e4e921SDavid Wu  */
586f2e4e921SDavid Wu struct rockchip_pinctrl_priv {
587f2e4e921SDavid Wu 	struct rockchip_pin_ctrl	*ctrl;
588f2e4e921SDavid Wu 	struct regmap			*regmap_base;
589f2e4e921SDavid Wu 	struct regmap			*regmap_pmu;
5903fd22dcdSYe Zhang 	struct regmap			*regmap_ioc1;
5913fd22dcdSYe Zhang 	struct regmap			*regmap_rmio;
592f2e4e921SDavid Wu };
593f2e4e921SDavid Wu 
594f2e4e921SDavid Wu extern const struct pinctrl_ops rockchip_pinctrl_ops;
595f2e4e921SDavid Wu int rockchip_pinctrl_probe(struct udevice *dev);
5965f55bbd7SDavid Wu void rockchip_get_recalced_mux(struct rockchip_pin_bank *bank, int pin,
5975f55bbd7SDavid Wu 			       int *reg, u8 *bit, int *mask);
5985f55bbd7SDavid Wu int rockchip_get_mux_data(int mux_type, int pin, u8 *bit, int *mask);
599681441e6SDavid Wu int rockchip_translate_drive_value(int type, int strength);
60005a5688eSDavid Wu int rockchip_translate_pull_value(int type, int pull);
601f2e4e921SDavid Wu 
602f2e4e921SDavid Wu #endif /* __DRIVERS_PINCTRL_ROCKCHIP_H */
603