xref: /rk3399_rockchip-uboot/drivers/pinctrl/pinctrl-rockchip.c (revision c066e3f7f0f76ed4f86b6bbf6647ad6b9c754eb3)
149c55878SDavid Wu /*
249c55878SDavid Wu  * (C) Copyright 2018 Rockchip Electronics Co., Ltd
349c55878SDavid Wu  *
449c55878SDavid Wu  * SPDX-License-Identifier:     GPL-2.0+
549c55878SDavid Wu  */
649c55878SDavid Wu 
749c55878SDavid Wu #include <common.h>
849c55878SDavid Wu #include <dm.h>
949c55878SDavid Wu #include <dm/pinctrl.h>
102208cfa9SKever Yang #include <dm/ofnode.h>
11d499d466SJianqun Xu #include <linux/bitops.h>
1249c55878SDavid Wu #include <regmap.h>
1349c55878SDavid Wu #include <syscon.h>
14d5517017SDavid Wu #include <asm/arch/cpu.h>
15d499d466SJianqun Xu #include <dt-bindings/pinctrl/rockchip.h>
1649c55878SDavid Wu 
1749c55878SDavid Wu #define MAX_ROCKCHIP_GPIO_PER_BANK	32
1849c55878SDavid Wu #define RK_FUNC_GPIO			0
1987f0ac57SDavid Wu #define MAX_ROCKCHIP_PINS_ENTRIES	30
2049c55878SDavid Wu 
2149c55878SDavid Wu enum rockchip_pinctrl_type {
2249c55878SDavid Wu 	PX30,
2349c55878SDavid Wu 	RV1108,
24cf04a17bSJianqun Xu 	RV1126,
25a2a3fc8fSJianqun Xu 	RK1808,
2649c55878SDavid Wu 	RK2928,
2749c55878SDavid Wu 	RK3066B,
2849c55878SDavid Wu 	RK3128,
2949c55878SDavid Wu 	RK3188,
3049c55878SDavid Wu 	RK3288,
31b3077611SDavid Wu 	RK3308,
3249c55878SDavid Wu 	RK3368,
3349c55878SDavid Wu 	RK3399,
3449c55878SDavid Wu };
3549c55878SDavid Wu 
36cef897f0SJianqun Xu #define RK_GENMASK_VAL(h, l, v) \
37cef897f0SJianqun Xu 	(GENMASK(((h) + 16), ((l) + 16)) | (((v) << (l)) & GENMASK((h), (l))))
38d499d466SJianqun Xu 
3949c55878SDavid Wu /**
4049c55878SDavid Wu  * Encode variants of iomux registers into a type variable
4149c55878SDavid Wu  */
4249c55878SDavid Wu #define IOMUX_GPIO_ONLY		BIT(0)
4349c55878SDavid Wu #define IOMUX_WIDTH_4BIT	BIT(1)
4449c55878SDavid Wu #define IOMUX_SOURCE_PMU	BIT(2)
4549c55878SDavid Wu #define IOMUX_UNROUTED		BIT(3)
4649c55878SDavid Wu #define IOMUX_WIDTH_3BIT	BIT(4)
47b3077611SDavid Wu #define IOMUX_8WIDTH_2BIT	BIT(5)
484bafc2daSDavid Wu #define IOMUX_WRITABLE_32BIT	BIT(6)
49cf04a17bSJianqun Xu #define IOMUX_L_SOURCE_PMU	BIT(7)
5049c55878SDavid Wu 
5149c55878SDavid Wu /**
5249c55878SDavid Wu  * @type: iomux variant using IOMUX_* constants
5349c55878SDavid Wu  * @offset: if initialized to -1 it will be autocalculated, by specifying
5449c55878SDavid Wu  *	    an initial offset value the relevant source offset can be reset
5549c55878SDavid Wu  *	    to a new value for autocalculating the following iomux registers.
5649c55878SDavid Wu  */
5749c55878SDavid Wu struct rockchip_iomux {
5849c55878SDavid Wu 	int				type;
5949c55878SDavid Wu 	int				offset;
6049c55878SDavid Wu };
6149c55878SDavid Wu 
6255a89bc6SDavid Wu #define DRV_TYPE_IO_MASK		GENMASK(31, 16)
6355a89bc6SDavid Wu #define DRV_TYPE_WRITABLE_32BIT		BIT(31)
6455a89bc6SDavid Wu 
6549c55878SDavid Wu /**
6649c55878SDavid Wu  * enum type index corresponding to rockchip_perpin_drv_list arrays index.
6749c55878SDavid Wu  */
6849c55878SDavid Wu enum rockchip_pin_drv_type {
6949c55878SDavid Wu 	DRV_TYPE_IO_DEFAULT = 0,
7049c55878SDavid Wu 	DRV_TYPE_IO_1V8_OR_3V0,
7149c55878SDavid Wu 	DRV_TYPE_IO_1V8_ONLY,
7249c55878SDavid Wu 	DRV_TYPE_IO_1V8_3V0_AUTO,
7349c55878SDavid Wu 	DRV_TYPE_IO_3V3_ONLY,
74*c066e3f7SJianqun Xu 	DRV_TYPE_IO_SMIC,
7549c55878SDavid Wu 	DRV_TYPE_MAX
7649c55878SDavid Wu };
7749c55878SDavid Wu 
7855a89bc6SDavid Wu #define PULL_TYPE_IO_MASK		GENMASK(31, 16)
7955a89bc6SDavid Wu #define PULL_TYPE_WRITABLE_32BIT	BIT(31)
8055a89bc6SDavid Wu 
8149c55878SDavid Wu /**
8249c55878SDavid Wu  * enum type index corresponding to rockchip_pull_list arrays index.
8349c55878SDavid Wu  */
8449c55878SDavid Wu enum rockchip_pin_pull_type {
8549c55878SDavid Wu 	PULL_TYPE_IO_DEFAULT = 0,
8649c55878SDavid Wu 	PULL_TYPE_IO_1V8_ONLY,
8749c55878SDavid Wu 	PULL_TYPE_MAX
8849c55878SDavid Wu };
8949c55878SDavid Wu 
9049c55878SDavid Wu /**
9149e04eddSJianqun Xu  * enum mux route register type, should be invalid/default/topgrf/pmugrf.
9249e04eddSJianqun Xu  * INVALID: means do not need to set mux route
9349e04eddSJianqun Xu  * DEFAULT: means same regmap as pin iomux
9449e04eddSJianqun Xu  * TOPGRF: means mux route setting in topgrf
9549e04eddSJianqun Xu  * PMUGRF: means mux route setting in pmugrf
9649e04eddSJianqun Xu  */
9749e04eddSJianqun Xu enum rockchip_pin_route_type {
9849e04eddSJianqun Xu 	ROUTE_TYPE_DEFAULT = 0,
9949e04eddSJianqun Xu 	ROUTE_TYPE_TOPGRF = 1,
10049e04eddSJianqun Xu 	ROUTE_TYPE_PMUGRF = 2,
10149e04eddSJianqun Xu 
10249e04eddSJianqun Xu 	ROUTE_TYPE_INVALID = -1,
10349e04eddSJianqun Xu };
10449e04eddSJianqun Xu 
10549e04eddSJianqun Xu /**
10649c55878SDavid Wu  * @drv_type: drive strength variant using rockchip_perpin_drv_type
10749c55878SDavid Wu  * @offset: if initialized to -1 it will be autocalculated, by specifying
10849c55878SDavid Wu  *	    an initial offset value the relevant source offset can be reset
10949c55878SDavid Wu  *	    to a new value for autocalculating the following drive strength
11049c55878SDavid Wu  *	    registers. if used chips own cal_drv func instead to calculate
11149c55878SDavid Wu  *	    registers offset, the variant could be ignored.
11249c55878SDavid Wu  */
11349c55878SDavid Wu struct rockchip_drv {
11449c55878SDavid Wu 	enum rockchip_pin_drv_type	drv_type;
11549c55878SDavid Wu 	int				offset;
11649c55878SDavid Wu };
11749c55878SDavid Wu 
11849c55878SDavid Wu /**
11949c55878SDavid Wu  * @priv: common pinctrl private basedata
12049c55878SDavid Wu  * @pin_base: first pin number
12149c55878SDavid Wu  * @nr_pins: number of pins in this bank
12249c55878SDavid Wu  * @name: name of the bank
12349c55878SDavid Wu  * @bank_num: number of the bank, to account for holes
12449c55878SDavid Wu  * @iomux: array describing the 4 iomux sources of the bank
12549c55878SDavid Wu  * @drv: array describing the 4 drive strength sources of the bank
12649c55878SDavid Wu  * @pull_type: array describing the 4 pull type sources of the bank
12749c55878SDavid Wu  * @recalced_mask: bits describing the mux recalced pins of per bank
12849c55878SDavid Wu  * @route_mask: bits describing the routing pins of per bank
12949c55878SDavid Wu  */
13049c55878SDavid Wu struct rockchip_pin_bank {
13149c55878SDavid Wu 	struct rockchip_pinctrl_priv	*priv;
13249c55878SDavid Wu 	u32				pin_base;
13349c55878SDavid Wu 	u8				nr_pins;
13449c55878SDavid Wu 	char				*name;
13549c55878SDavid Wu 	u8				bank_num;
13649c55878SDavid Wu 	struct rockchip_iomux		iomux[4];
13749c55878SDavid Wu 	struct rockchip_drv		drv[4];
13849c55878SDavid Wu 	enum rockchip_pin_pull_type	pull_type[4];
13949c55878SDavid Wu 	u32				recalced_mask;
14049c55878SDavid Wu 	u32				route_mask;
14149c55878SDavid Wu };
14249c55878SDavid Wu 
14349c55878SDavid Wu #define PIN_BANK(id, pins, label)			\
14449c55878SDavid Wu 	{						\
14549c55878SDavid Wu 		.bank_num	= id,			\
14649c55878SDavid Wu 		.nr_pins	= pins,			\
14749c55878SDavid Wu 		.name		= label,		\
14849c55878SDavid Wu 		.iomux		= {			\
14949c55878SDavid Wu 			{ .offset = -1 },		\
15049c55878SDavid Wu 			{ .offset = -1 },		\
15149c55878SDavid Wu 			{ .offset = -1 },		\
15249c55878SDavid Wu 			{ .offset = -1 },		\
15349c55878SDavid Wu 		},					\
15449c55878SDavid Wu 	}
15549c55878SDavid Wu 
15649c55878SDavid Wu #define PIN_BANK_IOMUX_FLAGS(id, pins, label, iom0, iom1, iom2, iom3)	\
15749c55878SDavid Wu 	{								\
15849c55878SDavid Wu 		.bank_num	= id,					\
15949c55878SDavid Wu 		.nr_pins	= pins,					\
16049c55878SDavid Wu 		.name		= label,				\
16149c55878SDavid Wu 		.iomux		= {					\
16249c55878SDavid Wu 			{ .type = iom0, .offset = -1 },			\
16349c55878SDavid Wu 			{ .type = iom1, .offset = -1 },			\
16449c55878SDavid Wu 			{ .type = iom2, .offset = -1 },			\
16549c55878SDavid Wu 			{ .type = iom3, .offset = -1 },			\
16649c55878SDavid Wu 		},							\
16749c55878SDavid Wu 	}
16849c55878SDavid Wu 
169d499d466SJianqun Xu #define PIN_BANK_IOMUX_FLAGS_OFFSET(id, pins, label, iom0, iom1, iom2,	\
170d499d466SJianqun Xu 				    iom3, offset0, offset1, offset2,	\
171d499d466SJianqun Xu 				    offset3)				\
172d499d466SJianqun Xu 	{								\
173d499d466SJianqun Xu 		.bank_num	= id,					\
174d499d466SJianqun Xu 		.nr_pins	= pins,					\
175d499d466SJianqun Xu 		.name		= label,				\
176d499d466SJianqun Xu 		.iomux		= {					\
177d499d466SJianqun Xu 			{ .type = iom0, .offset = offset0 },		\
178d499d466SJianqun Xu 			{ .type = iom1, .offset = offset1 },		\
179d499d466SJianqun Xu 			{ .type = iom2, .offset = offset2 },		\
180d499d466SJianqun Xu 			{ .type = iom3, .offset = offset3 },		\
181d499d466SJianqun Xu 		},							\
182d499d466SJianqun Xu 	}
183d499d466SJianqun Xu 
18449c55878SDavid Wu #define PIN_BANK_DRV_FLAGS(id, pins, label, type0, type1, type2, type3) \
18549c55878SDavid Wu 	{								\
18649c55878SDavid Wu 		.bank_num	= id,					\
18749c55878SDavid Wu 		.nr_pins	= pins,					\
18849c55878SDavid Wu 		.name		= label,				\
18949c55878SDavid Wu 		.iomux		= {					\
19049c55878SDavid Wu 			{ .offset = -1 },				\
19149c55878SDavid Wu 			{ .offset = -1 },				\
19249c55878SDavid Wu 			{ .offset = -1 },				\
19349c55878SDavid Wu 			{ .offset = -1 },				\
19449c55878SDavid Wu 		},							\
19549c55878SDavid Wu 		.drv		= {					\
19649c55878SDavid Wu 			{ .drv_type = type0, .offset = -1 },		\
19749c55878SDavid Wu 			{ .drv_type = type1, .offset = -1 },		\
19849c55878SDavid Wu 			{ .drv_type = type2, .offset = -1 },		\
19949c55878SDavid Wu 			{ .drv_type = type3, .offset = -1 },		\
20049c55878SDavid Wu 		},							\
20149c55878SDavid Wu 	}
20249c55878SDavid Wu 
20349c55878SDavid Wu #define PIN_BANK_DRV_FLAGS_PULL_FLAGS(id, pins, label, drv0, drv1,	\
20449c55878SDavid Wu 				      drv2, drv3, pull0, pull1,		\
20549c55878SDavid Wu 				      pull2, pull3)			\
20649c55878SDavid Wu 	{								\
20749c55878SDavid Wu 		.bank_num	= id,					\
20849c55878SDavid Wu 		.nr_pins	= pins,					\
20949c55878SDavid Wu 		.name		= label,				\
21049c55878SDavid Wu 		.iomux		= {					\
21149c55878SDavid Wu 			{ .offset = -1 },				\
21249c55878SDavid Wu 			{ .offset = -1 },				\
21349c55878SDavid Wu 			{ .offset = -1 },				\
21449c55878SDavid Wu 			{ .offset = -1 },				\
21549c55878SDavid Wu 		},							\
21649c55878SDavid Wu 		.drv		= {					\
21749c55878SDavid Wu 			{ .drv_type = drv0, .offset = -1 },		\
21849c55878SDavid Wu 			{ .drv_type = drv1, .offset = -1 },		\
21949c55878SDavid Wu 			{ .drv_type = drv2, .offset = -1 },		\
22049c55878SDavid Wu 			{ .drv_type = drv3, .offset = -1 },		\
22149c55878SDavid Wu 		},							\
22249c55878SDavid Wu 		.pull_type[0] = pull0,					\
22349c55878SDavid Wu 		.pull_type[1] = pull1,					\
22449c55878SDavid Wu 		.pull_type[2] = pull2,					\
22549c55878SDavid Wu 		.pull_type[3] = pull3,					\
22649c55878SDavid Wu 	}
22749c55878SDavid Wu 
22849c55878SDavid Wu #define PIN_BANK_IOMUX_DRV_FLAGS_OFFSET(id, pins, label, iom0, iom1,	\
22949c55878SDavid Wu 					iom2, iom3, drv0, drv1, drv2,	\
23049c55878SDavid Wu 					drv3, offset0, offset1,		\
23149c55878SDavid Wu 					offset2, offset3)		\
23249c55878SDavid Wu 	{								\
23349c55878SDavid Wu 		.bank_num	= id,					\
23449c55878SDavid Wu 		.nr_pins	= pins,					\
23549c55878SDavid Wu 		.name		= label,				\
23649c55878SDavid Wu 		.iomux		= {					\
23749c55878SDavid Wu 			{ .type = iom0, .offset = -1 },			\
23849c55878SDavid Wu 			{ .type = iom1, .offset = -1 },			\
23949c55878SDavid Wu 			{ .type = iom2, .offset = -1 },			\
24049c55878SDavid Wu 			{ .type = iom3, .offset = -1 },			\
24149c55878SDavid Wu 		},							\
24249c55878SDavid Wu 		.drv		= {					\
24349c55878SDavid Wu 			{ .drv_type = drv0, .offset = offset0 },	\
24449c55878SDavid Wu 			{ .drv_type = drv1, .offset = offset1 },	\
24549c55878SDavid Wu 			{ .drv_type = drv2, .offset = offset2 },	\
24649c55878SDavid Wu 			{ .drv_type = drv3, .offset = offset3 },	\
24749c55878SDavid Wu 		},							\
24849c55878SDavid Wu 	}
24949c55878SDavid Wu 
25055a89bc6SDavid Wu #define PIN_BANK_IOMUX_DRV_PULL_FLAGS(id, pins, label, iom0, iom1,	\
25155a89bc6SDavid Wu 				      iom2, iom3, drv0, drv1, drv2,	\
25255a89bc6SDavid Wu 				      drv3, pull0, pull1, pull2,	\
25355a89bc6SDavid Wu 				      pull3)				\
25455a89bc6SDavid Wu 	{								\
25555a89bc6SDavid Wu 		.bank_num	= id,					\
25655a89bc6SDavid Wu 		.nr_pins	= pins,					\
25755a89bc6SDavid Wu 		.name		= label,				\
25855a89bc6SDavid Wu 		.iomux		= {					\
25955a89bc6SDavid Wu 			{ .type = iom0, .offset = -1 },			\
26055a89bc6SDavid Wu 			{ .type = iom1, .offset = -1 },			\
26155a89bc6SDavid Wu 			{ .type = iom2, .offset = -1 },			\
26255a89bc6SDavid Wu 			{ .type = iom3, .offset = -1 },			\
26355a89bc6SDavid Wu 		},							\
26455a89bc6SDavid Wu 		.drv		= {					\
26555a89bc6SDavid Wu 			{ .drv_type = drv0, .offset = -1 },		\
26655a89bc6SDavid Wu 			{ .drv_type = drv1, .offset = -1 },		\
26755a89bc6SDavid Wu 			{ .drv_type = drv2, .offset = -1 },		\
26855a89bc6SDavid Wu 			{ .drv_type = drv3, .offset = -1 },		\
26955a89bc6SDavid Wu 		},							\
27055a89bc6SDavid Wu 		.pull_type[0] = pull0,					\
27155a89bc6SDavid Wu 		.pull_type[1] = pull1,					\
27255a89bc6SDavid Wu 		.pull_type[2] = pull2,					\
27355a89bc6SDavid Wu 		.pull_type[3] = pull3,					\
27455a89bc6SDavid Wu 	}
27555a89bc6SDavid Wu 
27649c55878SDavid Wu #define PIN_BANK_IOMUX_FLAGS_DRV_FLAGS_OFFSET_PULL_FLAGS(id, pins,	\
27749c55878SDavid Wu 					      label, iom0, iom1, iom2,  \
27849c55878SDavid Wu 					      iom3, drv0, drv1, drv2,   \
27949c55878SDavid Wu 					      drv3, offset0, offset1,   \
28049c55878SDavid Wu 					      offset2, offset3, pull0,  \
28149c55878SDavid Wu 					      pull1, pull2, pull3)	\
28249c55878SDavid Wu 	{								\
28349c55878SDavid Wu 		.bank_num	= id,					\
28449c55878SDavid Wu 		.nr_pins	= pins,					\
28549c55878SDavid Wu 		.name		= label,				\
28649c55878SDavid Wu 		.iomux		= {					\
28749c55878SDavid Wu 			{ .type = iom0, .offset = -1 },			\
28849c55878SDavid Wu 			{ .type = iom1, .offset = -1 },			\
28949c55878SDavid Wu 			{ .type = iom2, .offset = -1 },			\
29049c55878SDavid Wu 			{ .type = iom3, .offset = -1 },			\
29149c55878SDavid Wu 		},							\
29249c55878SDavid Wu 		.drv		= {					\
29349c55878SDavid Wu 			{ .drv_type = drv0, .offset = offset0 },	\
29449c55878SDavid Wu 			{ .drv_type = drv1, .offset = offset1 },	\
29549c55878SDavid Wu 			{ .drv_type = drv2, .offset = offset2 },	\
29649c55878SDavid Wu 			{ .drv_type = drv3, .offset = offset3 },	\
29749c55878SDavid Wu 		},							\
29849c55878SDavid Wu 		.pull_type[0] = pull0,					\
29949c55878SDavid Wu 		.pull_type[1] = pull1,					\
30049c55878SDavid Wu 		.pull_type[2] = pull2,					\
30149c55878SDavid Wu 		.pull_type[3] = pull3,					\
30249c55878SDavid Wu 	}
30349c55878SDavid Wu 
30449e04eddSJianqun Xu #define PIN_BANK_MUX_ROUTE_FLAGS(ID, PIN, FUNC, REG, VAL, FLAG)		\
305d499d466SJianqun Xu 	{								\
306d499d466SJianqun Xu 		.bank_num	= ID,					\
307d499d466SJianqun Xu 		.pin		= PIN,					\
308d499d466SJianqun Xu 		.func		= FUNC,					\
309d499d466SJianqun Xu 		.route_offset	= REG,					\
310d499d466SJianqun Xu 		.route_val	= VAL,					\
31149e04eddSJianqun Xu 		.route_type	= FLAG,					\
312d499d466SJianqun Xu 	}
313d499d466SJianqun Xu 
31449e04eddSJianqun Xu #define MR_DEFAULT(ID, PIN, FUNC, REG, VAL)	\
31549e04eddSJianqun Xu 	PIN_BANK_MUX_ROUTE_FLAGS(ID, PIN, FUNC, REG, VAL, ROUTE_TYPE_DEFAULT)
31649e04eddSJianqun Xu 
31749e04eddSJianqun Xu #define MR_TOPGRF(ID, PIN, FUNC, REG, VAL)	\
31849e04eddSJianqun Xu 	PIN_BANK_MUX_ROUTE_FLAGS(ID, PIN, FUNC, REG, VAL, ROUTE_TYPE_TOPGRF)
31949e04eddSJianqun Xu 
32049e04eddSJianqun Xu #define MR_PMUGRF(ID, PIN, FUNC, REG, VAL)	\
32149e04eddSJianqun Xu 	PIN_BANK_MUX_ROUTE_FLAGS(ID, PIN, FUNC, REG, VAL, ROUTE_TYPE_PMUGRF)
32249e04eddSJianqun Xu 
32349c55878SDavid Wu /**
32449c55878SDavid Wu  * struct rockchip_mux_recalced_data: represent a pin iomux data.
32549c55878SDavid Wu  * @num: bank number.
32649c55878SDavid Wu  * @pin: pin number.
32749c55878SDavid Wu  * @bit: index at register.
32849c55878SDavid Wu  * @reg: register offset.
32949c55878SDavid Wu  * @mask: mask bit
33049c55878SDavid Wu  */
33149c55878SDavid Wu struct rockchip_mux_recalced_data {
33249c55878SDavid Wu 	u8 num;
33349c55878SDavid Wu 	u8 pin;
33449c55878SDavid Wu 	u32 reg;
33549c55878SDavid Wu 	u8 bit;
33649c55878SDavid Wu 	u8 mask;
33749c55878SDavid Wu };
33849c55878SDavid Wu 
33949c55878SDavid Wu /**
34049c55878SDavid Wu  * struct rockchip_mux_recalced_data: represent a pin iomux data.
34149c55878SDavid Wu  * @bank_num: bank number.
34249c55878SDavid Wu  * @pin: index at register or used to calc index.
34349c55878SDavid Wu  * @func: the min pin.
34449e04eddSJianqun Xu  * @route_type: the register type.
34549c55878SDavid Wu  * @route_offset: the max pin.
34649c55878SDavid Wu  * @route_val: the register offset.
34749c55878SDavid Wu  */
34849c55878SDavid Wu struct rockchip_mux_route_data {
34949c55878SDavid Wu 	u8 bank_num;
35049c55878SDavid Wu 	u8 pin;
35149c55878SDavid Wu 	u8 func;
35249e04eddSJianqun Xu 	enum rockchip_pin_route_type route_type : 8;
35349c55878SDavid Wu 	u32 route_offset;
35449c55878SDavid Wu 	u32 route_val;
35549c55878SDavid Wu };
35649c55878SDavid Wu 
35749c55878SDavid Wu /**
35849c55878SDavid Wu  */
35949c55878SDavid Wu struct rockchip_pin_ctrl {
36049c55878SDavid Wu 	struct rockchip_pin_bank	*pin_banks;
36149c55878SDavid Wu 	u32				nr_banks;
36249c55878SDavid Wu 	u32				nr_pins;
36349c55878SDavid Wu 	char				*label;
36449c55878SDavid Wu 	enum rockchip_pinctrl_type	type;
36549c55878SDavid Wu 	int				grf_mux_offset;
36649c55878SDavid Wu 	int				pmu_mux_offset;
36749c55878SDavid Wu 	int				grf_drv_offset;
36849c55878SDavid Wu 	int				pmu_drv_offset;
36949c55878SDavid Wu 	struct rockchip_mux_recalced_data *iomux_recalced;
37049c55878SDavid Wu 	u32				niomux_recalced;
37149c55878SDavid Wu 	struct rockchip_mux_route_data *iomux_routes;
37249c55878SDavid Wu 	u32				niomux_routes;
37349c55878SDavid Wu 
37413c03cb6SJianqun Xu 	int	(*ctrl_data_re_init)(const struct rockchip_pin_ctrl *ctrl);
375d5517017SDavid Wu 
376d5517017SDavid Wu 	int	(*soc_data_init)(struct rockchip_pinctrl_priv *info);
377d5517017SDavid Wu 
37849c55878SDavid Wu 	void	(*pull_calc_reg)(struct rockchip_pin_bank *bank,
37949c55878SDavid Wu 				 int pin_num, struct regmap **regmap,
38049c55878SDavid Wu 				 int *reg, u8 *bit);
38149c55878SDavid Wu 	void	(*drv_calc_reg)(struct rockchip_pin_bank *bank,
38249c55878SDavid Wu 				int pin_num, struct regmap **regmap,
38349c55878SDavid Wu 				int *reg, u8 *bit);
38449c55878SDavid Wu 	int	(*schmitt_calc_reg)(struct rockchip_pin_bank *bank,
38549c55878SDavid Wu 				    int pin_num, struct regmap **regmap,
38649c55878SDavid Wu 				    int *reg, u8 *bit);
38732c25d1fSDavid Wu 	int	(*slew_rate_calc_reg)(struct rockchip_pin_bank *bank,
38832c25d1fSDavid Wu 				      int pin_num, struct regmap **regmap,
38932c25d1fSDavid Wu 				      int *reg, u8 *bit);
39049c55878SDavid Wu };
39149c55878SDavid Wu 
39249c55878SDavid Wu /**
39349c55878SDavid Wu  */
39449c55878SDavid Wu struct rockchip_pinctrl_priv {
39549c55878SDavid Wu 	struct rockchip_pin_ctrl	*ctrl;
39649c55878SDavid Wu 	struct regmap			*regmap_base;
39749c55878SDavid Wu 	struct regmap			*regmap_pmu;
39849c55878SDavid Wu 
39949c55878SDavid Wu };
40049c55878SDavid Wu 
40149c55878SDavid Wu static int rockchip_verify_config(struct udevice *dev, u32 bank, u32 pin)
40249c55878SDavid Wu {
40349c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = dev_get_priv(dev);
40449c55878SDavid Wu 	struct rockchip_pin_ctrl *ctrl = priv->ctrl;
40549c55878SDavid Wu 
40649c55878SDavid Wu 	if (bank >= ctrl->nr_banks) {
40749c55878SDavid Wu 		debug("pin conf bank %d >= nbanks %d\n", bank, ctrl->nr_banks);
40849c55878SDavid Wu 		return -EINVAL;
40949c55878SDavid Wu 	}
41049c55878SDavid Wu 
41149c55878SDavid Wu 	if (pin >= MAX_ROCKCHIP_GPIO_PER_BANK) {
41249c55878SDavid Wu 		debug("pin conf pin %d >= %d\n", pin,
41349c55878SDavid Wu 		      MAX_ROCKCHIP_GPIO_PER_BANK);
41449c55878SDavid Wu 		return -EINVAL;
41549c55878SDavid Wu 	}
41649c55878SDavid Wu 
41749c55878SDavid Wu 	return 0;
41849c55878SDavid Wu }
41949c55878SDavid Wu 
42049c55878SDavid Wu static struct rockchip_mux_recalced_data rv1108_mux_recalced_data[] = {
42149c55878SDavid Wu 	{
42249c55878SDavid Wu 		.num = 1,
42349c55878SDavid Wu 		.pin = 0,
42449c55878SDavid Wu 		.reg = 0x418,
42549c55878SDavid Wu 		.bit = 0,
42649c55878SDavid Wu 		.mask = 0x3
42749c55878SDavid Wu 	}, {
42849c55878SDavid Wu 		.num = 1,
42949c55878SDavid Wu 		.pin = 1,
43049c55878SDavid Wu 		.reg = 0x418,
43149c55878SDavid Wu 		.bit = 2,
43249c55878SDavid Wu 		.mask = 0x3
43349c55878SDavid Wu 	}, {
43449c55878SDavid Wu 		.num = 1,
43549c55878SDavid Wu 		.pin = 2,
43649c55878SDavid Wu 		.reg = 0x418,
43749c55878SDavid Wu 		.bit = 4,
43849c55878SDavid Wu 		.mask = 0x3
43949c55878SDavid Wu 	}, {
44049c55878SDavid Wu 		.num = 1,
44149c55878SDavid Wu 		.pin = 3,
44249c55878SDavid Wu 		.reg = 0x418,
44349c55878SDavid Wu 		.bit = 6,
44449c55878SDavid Wu 		.mask = 0x3
44549c55878SDavid Wu 	}, {
44649c55878SDavid Wu 		.num = 1,
44749c55878SDavid Wu 		.pin = 4,
44849c55878SDavid Wu 		.reg = 0x418,
44949c55878SDavid Wu 		.bit = 8,
45049c55878SDavid Wu 		.mask = 0x3
45149c55878SDavid Wu 	}, {
45249c55878SDavid Wu 		.num = 1,
45349c55878SDavid Wu 		.pin = 5,
45449c55878SDavid Wu 		.reg = 0x418,
45549c55878SDavid Wu 		.bit = 10,
45649c55878SDavid Wu 		.mask = 0x3
45749c55878SDavid Wu 	}, {
45849c55878SDavid Wu 		.num = 1,
45949c55878SDavid Wu 		.pin = 6,
46049c55878SDavid Wu 		.reg = 0x418,
46149c55878SDavid Wu 		.bit = 12,
46249c55878SDavid Wu 		.mask = 0x3
46349c55878SDavid Wu 	}, {
46449c55878SDavid Wu 		.num = 1,
46549c55878SDavid Wu 		.pin = 7,
46649c55878SDavid Wu 		.reg = 0x418,
46749c55878SDavid Wu 		.bit = 14,
46849c55878SDavid Wu 		.mask = 0x3
46949c55878SDavid Wu 	}, {
47049c55878SDavid Wu 		.num = 1,
47149c55878SDavid Wu 		.pin = 8,
47249c55878SDavid Wu 		.reg = 0x41c,
47349c55878SDavid Wu 		.bit = 0,
47449c55878SDavid Wu 		.mask = 0x3
47549c55878SDavid Wu 	}, {
47649c55878SDavid Wu 		.num = 1,
47749c55878SDavid Wu 		.pin = 9,
47849c55878SDavid Wu 		.reg = 0x41c,
47949c55878SDavid Wu 		.bit = 2,
48049c55878SDavid Wu 		.mask = 0x3
48149c55878SDavid Wu 	},
48249c55878SDavid Wu };
48349c55878SDavid Wu 
484cf04a17bSJianqun Xu static struct rockchip_mux_recalced_data rv1126_mux_recalced_data[] = {
485cf04a17bSJianqun Xu 	{
486cf04a17bSJianqun Xu 		.num = 0,
487cf04a17bSJianqun Xu 		.pin = 20,
488cf04a17bSJianqun Xu 		.reg = 0x10000,
489cf04a17bSJianqun Xu 		.bit = 0,
490cf04a17bSJianqun Xu 		.mask = 0xf
491cf04a17bSJianqun Xu 	},
492cf04a17bSJianqun Xu 	{
493cf04a17bSJianqun Xu 		.num = 0,
494cf04a17bSJianqun Xu 		.pin = 21,
495cf04a17bSJianqun Xu 		.reg = 0x10000,
496cf04a17bSJianqun Xu 		.bit = 4,
497cf04a17bSJianqun Xu 		.mask = 0xf
498cf04a17bSJianqun Xu 	},
499cf04a17bSJianqun Xu 	{
500cf04a17bSJianqun Xu 		.num = 0,
501cf04a17bSJianqun Xu 		.pin = 22,
502cf04a17bSJianqun Xu 		.reg = 0x10000,
503cf04a17bSJianqun Xu 		.bit = 8,
504cf04a17bSJianqun Xu 		.mask = 0xf
505cf04a17bSJianqun Xu 	},
506cf04a17bSJianqun Xu 	{
507cf04a17bSJianqun Xu 		.num = 0,
508cf04a17bSJianqun Xu 		.pin = 23,
509cf04a17bSJianqun Xu 		.reg = 0x10000,
510cf04a17bSJianqun Xu 		.bit = 12,
511cf04a17bSJianqun Xu 		.mask = 0xf
512cf04a17bSJianqun Xu 	},
513cf04a17bSJianqun Xu };
514cf04a17bSJianqun Xu 
51549c55878SDavid Wu static  struct rockchip_mux_recalced_data rk3128_mux_recalced_data[] = {
51649c55878SDavid Wu 	{
51749c55878SDavid Wu 		.num = 2,
51849c55878SDavid Wu 		.pin = 20,
51949c55878SDavid Wu 		.reg = 0xe8,
52049c55878SDavid Wu 		.bit = 0,
52149c55878SDavid Wu 		.mask = 0x7
52249c55878SDavid Wu 	}, {
52349c55878SDavid Wu 		.num = 2,
52449c55878SDavid Wu 		.pin = 21,
52549c55878SDavid Wu 		.reg = 0xe8,
52649c55878SDavid Wu 		.bit = 4,
52749c55878SDavid Wu 		.mask = 0x7
52849c55878SDavid Wu 	}, {
52949c55878SDavid Wu 		.num = 2,
53049c55878SDavid Wu 		.pin = 22,
53149c55878SDavid Wu 		.reg = 0xe8,
53249c55878SDavid Wu 		.bit = 8,
53349c55878SDavid Wu 		.mask = 0x7
53449c55878SDavid Wu 	}, {
53549c55878SDavid Wu 		.num = 2,
53649c55878SDavid Wu 		.pin = 23,
53749c55878SDavid Wu 		.reg = 0xe8,
53849c55878SDavid Wu 		.bit = 12,
53949c55878SDavid Wu 		.mask = 0x7
54049c55878SDavid Wu 	}, {
54149c55878SDavid Wu 		.num = 2,
54249c55878SDavid Wu 		.pin = 24,
54349c55878SDavid Wu 		.reg = 0xd4,
54449c55878SDavid Wu 		.bit = 12,
54549c55878SDavid Wu 		.mask = 0x7
54649c55878SDavid Wu 	},
54749c55878SDavid Wu };
54849c55878SDavid Wu 
549b3077611SDavid Wu static struct rockchip_mux_recalced_data rk3308_mux_recalced_data[] = {
550b3077611SDavid Wu 	{
551b3077611SDavid Wu 		.num = 1,
552b3077611SDavid Wu 		.pin = 14,
553b3077611SDavid Wu 		.reg = 0x28,
554b3077611SDavid Wu 		.bit = 12,
555b3077611SDavid Wu 		.mask = 0x7
556b3077611SDavid Wu 	}, {
557b3077611SDavid Wu 		.num = 1,
558b3077611SDavid Wu 		.pin = 15,
559b3077611SDavid Wu 		.reg = 0x2c,
560b3077611SDavid Wu 		.bit = 0,
561b3077611SDavid Wu 		.mask = 0x3
562b3077611SDavid Wu 	}, {
563b3077611SDavid Wu 		.num = 1,
564b3077611SDavid Wu 		.pin = 18,
565b3077611SDavid Wu 		.reg = 0x30,
566b3077611SDavid Wu 		.bit = 4,
567b3077611SDavid Wu 		.mask = 0x7
568b3077611SDavid Wu 	}, {
569b3077611SDavid Wu 		.num = 1,
570b3077611SDavid Wu 		.pin = 19,
571b3077611SDavid Wu 		.reg = 0x30,
572b3077611SDavid Wu 		.bit = 8,
573b3077611SDavid Wu 		.mask = 0x7
574b3077611SDavid Wu 	}, {
575b3077611SDavid Wu 		.num = 1,
576b3077611SDavid Wu 		.pin = 20,
577b3077611SDavid Wu 		.reg = 0x30,
578b3077611SDavid Wu 		.bit = 12,
579b3077611SDavid Wu 		.mask = 0x7
580b3077611SDavid Wu 	}, {
581b3077611SDavid Wu 		.num = 1,
582b3077611SDavid Wu 		.pin = 21,
583b3077611SDavid Wu 		.reg = 0x34,
584b3077611SDavid Wu 		.bit = 0,
585b3077611SDavid Wu 		.mask = 0x7
586b3077611SDavid Wu 	}, {
587b3077611SDavid Wu 		.num = 1,
588b3077611SDavid Wu 		.pin = 22,
589b3077611SDavid Wu 		.reg = 0x34,
590b3077611SDavid Wu 		.bit = 4,
591b3077611SDavid Wu 		.mask = 0x7
592b3077611SDavid Wu 	}, {
593b3077611SDavid Wu 		.num = 1,
594b3077611SDavid Wu 		.pin = 23,
595b3077611SDavid Wu 		.reg = 0x34,
596b3077611SDavid Wu 		.bit = 8,
597b3077611SDavid Wu 		.mask = 0x7
598b3077611SDavid Wu 	}, {
599b3077611SDavid Wu 		.num = 3,
600b3077611SDavid Wu 		.pin = 12,
601b3077611SDavid Wu 		.reg = 0x68,
602b3077611SDavid Wu 		.bit = 8,
603b3077611SDavid Wu 		.mask = 0x7
604b3077611SDavid Wu 	}, {
605b3077611SDavid Wu 		.num = 3,
606b3077611SDavid Wu 		.pin = 13,
607b3077611SDavid Wu 		.reg = 0x68,
608b3077611SDavid Wu 		.bit = 12,
609b3077611SDavid Wu 		.mask = 0x7
610b3077611SDavid Wu 	},
611b3077611SDavid Wu };
612b3077611SDavid Wu 
613d5517017SDavid Wu static struct rockchip_mux_recalced_data rk3308b_mux_recalced_data[] = {
614d5517017SDavid Wu 	{
615d5517017SDavid Wu 		.num = 1,
616d5517017SDavid Wu 		.pin = 14,
617d5517017SDavid Wu 		.reg = 0x28,
618d5517017SDavid Wu 		.bit = 12,
619d5517017SDavid Wu 		.mask = 0xf
620d5517017SDavid Wu 	}, {
621d5517017SDavid Wu 		.num = 1,
622d5517017SDavid Wu 		.pin = 15,
623d5517017SDavid Wu 		.reg = 0x2c,
624d5517017SDavid Wu 		.bit = 0,
625d5517017SDavid Wu 		.mask = 0x3
626d5517017SDavid Wu 	}, {
627d5517017SDavid Wu 		.num = 1,
628d5517017SDavid Wu 		.pin = 18,
629d5517017SDavid Wu 		.reg = 0x30,
630d5517017SDavid Wu 		.bit = 4,
631d5517017SDavid Wu 		.mask = 0xf
632d5517017SDavid Wu 	}, {
633d5517017SDavid Wu 		.num = 1,
634d5517017SDavid Wu 		.pin = 19,
635d5517017SDavid Wu 		.reg = 0x30,
636d5517017SDavid Wu 		.bit = 8,
637d5517017SDavid Wu 		.mask = 0xf
638d5517017SDavid Wu 	}, {
639d5517017SDavid Wu 		.num = 1,
640d5517017SDavid Wu 		.pin = 20,
641d5517017SDavid Wu 		.reg = 0x30,
642d5517017SDavid Wu 		.bit = 12,
643d5517017SDavid Wu 		.mask = 0xf
644d5517017SDavid Wu 	}, {
645d5517017SDavid Wu 		.num = 1,
646d5517017SDavid Wu 		.pin = 21,
647d5517017SDavid Wu 		.reg = 0x34,
648d5517017SDavid Wu 		.bit = 0,
649d5517017SDavid Wu 		.mask = 0xf
650d5517017SDavid Wu 	}, {
651d5517017SDavid Wu 		.num = 1,
652d5517017SDavid Wu 		.pin = 22,
653d5517017SDavid Wu 		.reg = 0x34,
654d5517017SDavid Wu 		.bit = 4,
655d5517017SDavid Wu 		.mask = 0xf
656d5517017SDavid Wu 	}, {
657d5517017SDavid Wu 		.num = 1,
658d5517017SDavid Wu 		.pin = 23,
659d5517017SDavid Wu 		.reg = 0x34,
660d5517017SDavid Wu 		.bit = 8,
661d5517017SDavid Wu 		.mask = 0xf
662d5517017SDavid Wu 	}, {
663d5517017SDavid Wu 		.num = 3,
664752032c9SDavid.Wu 		.pin = 12,
665752032c9SDavid.Wu 		.reg = 0x68,
666752032c9SDavid.Wu 		.bit = 8,
667752032c9SDavid.Wu 		.mask = 0xf
668752032c9SDavid.Wu 	}, {
669752032c9SDavid.Wu 		.num = 3,
670d5517017SDavid Wu 		.pin = 13,
671d5517017SDavid Wu 		.reg = 0x68,
672d5517017SDavid Wu 		.bit = 12,
673d5517017SDavid Wu 		.mask = 0xf
674d5517017SDavid Wu 	}, {
675d5517017SDavid Wu 		.num = 2,
676d5517017SDavid Wu 		.pin = 2,
677d5517017SDavid Wu 		.reg = 0x608,
678d5517017SDavid Wu 		.bit = 0,
679d5517017SDavid Wu 		.mask = 0x7
680d5517017SDavid Wu 	}, {
681d5517017SDavid Wu 		.num = 2,
682d5517017SDavid Wu 		.pin = 3,
683d5517017SDavid Wu 		.reg = 0x608,
684d5517017SDavid Wu 		.bit = 4,
685d5517017SDavid Wu 		.mask = 0x7
686d5517017SDavid Wu 	}, {
687d5517017SDavid Wu 		.num = 2,
688d5517017SDavid Wu 		.pin = 16,
689d5517017SDavid Wu 		.reg = 0x610,
690d5517017SDavid Wu 		.bit = 8,
691d5517017SDavid Wu 		.mask = 0x7
692d5517017SDavid Wu 	}, {
693d5517017SDavid Wu 		.num = 3,
694d5517017SDavid Wu 		.pin = 10,
695d5517017SDavid Wu 		.reg = 0x610,
696d5517017SDavid Wu 		.bit = 0,
697d5517017SDavid Wu 		.mask = 0x7
698d5517017SDavid Wu 	}, {
699d5517017SDavid Wu 		.num = 3,
700d5517017SDavid Wu 		.pin = 11,
701d5517017SDavid Wu 		.reg = 0x610,
702d5517017SDavid Wu 		.bit = 4,
703d5517017SDavid Wu 		.mask = 0x7
704d5517017SDavid Wu 	},
705d5517017SDavid Wu };
706d5517017SDavid Wu 
70749c55878SDavid Wu static struct rockchip_mux_recalced_data rk3328_mux_recalced_data[] = {
70849c55878SDavid Wu 	{
70949c55878SDavid Wu 		.num = 2,
71049c55878SDavid Wu 		.pin = 12,
71149c55878SDavid Wu 		.reg = 0x24,
71249c55878SDavid Wu 		.bit = 8,
71349c55878SDavid Wu 		.mask = 0x3
71449c55878SDavid Wu 	}, {
71549c55878SDavid Wu 		.num = 2,
71649c55878SDavid Wu 		.pin = 15,
71749c55878SDavid Wu 		.reg = 0x28,
71849c55878SDavid Wu 		.bit = 0,
71949c55878SDavid Wu 		.mask = 0x7
72049c55878SDavid Wu 	}, {
72149c55878SDavid Wu 		.num = 2,
72249c55878SDavid Wu 		.pin = 23,
72349c55878SDavid Wu 		.reg = 0x30,
72449c55878SDavid Wu 		.bit = 14,
72549c55878SDavid Wu 		.mask = 0x3
72649c55878SDavid Wu 	},
72749c55878SDavid Wu };
72849c55878SDavid Wu 
729d499d466SJianqun Xu static struct rockchip_mux_route_data rv1126_mux_route_data[] = {
73049e04eddSJianqun Xu 	MR_TOPGRF(RK_GPIO3, RK_PD2, RK_FUNC_1, 0x10260, RK_GENMASK_VAL(0, 0, 0)), /* I2S0_MCLK_M0 */
73149e04eddSJianqun Xu 	MR_TOPGRF(RK_GPIO3, RK_PB0, RK_FUNC_3, 0x10260, RK_GENMASK_VAL(0, 0, 1)), /* I2S0_MCLK_M1 */
732d499d466SJianqun Xu 
733d2f01304SJianqun Xu 	MR_TOPGRF(RK_GPIO0, RK_PD4, RK_FUNC_4, 0x10260, RK_GENMASK_VAL(3, 2, 0)), /* I2S1_MCLK_M0 */
734d2f01304SJianqun Xu 	MR_TOPGRF(RK_GPIO1, RK_PD5, RK_FUNC_2, 0x10260, RK_GENMASK_VAL(3, 2, 1)), /* I2S1_MCLK_M1 */
735d2f01304SJianqun Xu 	MR_TOPGRF(RK_GPIO2, RK_PC7, RK_FUNC_6, 0x10260, RK_GENMASK_VAL(3, 2, 2)), /* I2S1_MCLK_M2 */
736d499d466SJianqun Xu 
73749e04eddSJianqun Xu 	MR_TOPGRF(RK_GPIO1, RK_PD0, RK_FUNC_1, 0x10260, RK_GENMASK_VAL(4, 4, 0)), /* I2S2_MCLK_M0 */
73849e04eddSJianqun Xu 	MR_TOPGRF(RK_GPIO2, RK_PB3, RK_FUNC_2, 0x10260, RK_GENMASK_VAL(4, 4, 1)), /* I2S2_MCLK_M1 */
739d499d466SJianqun Xu 
74049e04eddSJianqun Xu 	MR_TOPGRF(RK_GPIO3, RK_PD4, RK_FUNC_2, 0x10260, RK_GENMASK_VAL(12, 12, 0)), /* PDM_CLK0_M0 */
74149e04eddSJianqun Xu 	MR_TOPGRF(RK_GPIO3, RK_PC0, RK_FUNC_3, 0x10260, RK_GENMASK_VAL(12, 12, 1)), /* PDM_CLK0_M1 */
742d499d466SJianqun Xu 
74349e04eddSJianqun Xu 	MR_TOPGRF(RK_GPIO3, RK_PC6, RK_FUNC_1, 0x10264, RK_GENMASK_VAL(0, 0, 0)), /* CIF_CLKOUT_M0 */
74449e04eddSJianqun Xu 	MR_TOPGRF(RK_GPIO2, RK_PD1, RK_FUNC_3, 0x10264, RK_GENMASK_VAL(0, 0, 1)), /* CIF_CLKOUT_M1 */
745d499d466SJianqun Xu 
746d2f01304SJianqun Xu 	MR_TOPGRF(RK_GPIO3, RK_PA4, RK_FUNC_5, 0x10264, RK_GENMASK_VAL(5, 4, 0)), /* I2C3_SCL_M0 */
747d2f01304SJianqun Xu 	MR_TOPGRF(RK_GPIO2, RK_PD4, RK_FUNC_7, 0x10264, RK_GENMASK_VAL(5, 4, 1)), /* I2C3_SCL_M1 */
748d2f01304SJianqun Xu 	MR_TOPGRF(RK_GPIO1, RK_PD6, RK_FUNC_3, 0x10264, RK_GENMASK_VAL(5, 4, 2)), /* I2C3_SCL_M2 */
749d499d466SJianqun Xu 
75049e04eddSJianqun Xu 	MR_TOPGRF(RK_GPIO3, RK_PA0, RK_FUNC_7, 0x10264, RK_GENMASK_VAL(6, 6, 0)), /* I2C4_SCL_M0 */
75149e04eddSJianqun Xu 	MR_TOPGRF(RK_GPIO4, RK_PA0, RK_FUNC_4, 0x10264, RK_GENMASK_VAL(6, 6, 1)), /* I2C4_SCL_M1 */
752d499d466SJianqun Xu 
753d2f01304SJianqun Xu 	MR_TOPGRF(RK_GPIO2, RK_PA5, RK_FUNC_7, 0x10264, RK_GENMASK_VAL(9, 8, 0)), /* I2C5_SCL_M0 */
754d2f01304SJianqun Xu 	MR_TOPGRF(RK_GPIO3, RK_PB0, RK_FUNC_5, 0x10264, RK_GENMASK_VAL(9, 8, 1)), /* I2C5_SCL_M1 */
755d2f01304SJianqun Xu 	MR_TOPGRF(RK_GPIO1, RK_PD0, RK_FUNC_4, 0x10264, RK_GENMASK_VAL(9, 8, 2)), /* I2C5_SCL_M2 */
756d499d466SJianqun Xu 
757d2f01304SJianqun Xu 	MR_TOPGRF(RK_GPIO3, RK_PC0, RK_FUNC_5, 0x10264, RK_GENMASK_VAL(11, 10, 0)), /* SPI1_CLK_M0 */
758d2f01304SJianqun Xu 	MR_TOPGRF(RK_GPIO1, RK_PC6, RK_FUNC_3, 0x10264, RK_GENMASK_VAL(11, 10, 1)), /* SPI1_CLK_M1 */
759d2f01304SJianqun Xu 	MR_TOPGRF(RK_GPIO2, RK_PD5, RK_FUNC_6, 0x10264, RK_GENMASK_VAL(11, 10, 2)), /* SPI1_CLK_M2 */
760d499d466SJianqun Xu 
76149e04eddSJianqun Xu 	MR_TOPGRF(RK_GPIO3, RK_PC0, RK_FUNC_2, 0x10264, RK_GENMASK_VAL(12, 12, 0)), /* RGMII_CLK_M0 */
76249e04eddSJianqun Xu 	MR_TOPGRF(RK_GPIO2, RK_PB7, RK_FUNC_2, 0x10264, RK_GENMASK_VAL(12, 12, 1)), /* RGMII_CLK_M1 */
763d499d466SJianqun Xu 
76449e04eddSJianqun Xu 	MR_TOPGRF(RK_GPIO3, RK_PA1, RK_FUNC_3, 0x10264, RK_GENMASK_VAL(13, 13, 0)), /* CAN_TXD_M0 */
76549e04eddSJianqun Xu 	MR_TOPGRF(RK_GPIO3, RK_PA7, RK_FUNC_5, 0x10264, RK_GENMASK_VAL(13, 13, 1)), /* CAN_TXD_M1 */
766d499d466SJianqun Xu 
76749e04eddSJianqun Xu 	MR_TOPGRF(RK_GPIO3, RK_PA4, RK_FUNC_6, 0x10268, RK_GENMASK_VAL(0, 0, 0)), /* PWM8_M0 */
76849e04eddSJianqun Xu 	MR_TOPGRF(RK_GPIO2, RK_PD7, RK_FUNC_5, 0x10268, RK_GENMASK_VAL(0, 0, 1)), /* PWM8_M1 */
769d499d466SJianqun Xu 
77049e04eddSJianqun Xu 	MR_TOPGRF(RK_GPIO3, RK_PA5, RK_FUNC_6, 0x10268, RK_GENMASK_VAL(2, 2, 0)), /* PWM9_M0 */
77149e04eddSJianqun Xu 	MR_TOPGRF(RK_GPIO2, RK_PD6, RK_FUNC_5, 0x10268, RK_GENMASK_VAL(2, 2, 1)), /* PWM9_M1 */
772d499d466SJianqun Xu 
77349e04eddSJianqun Xu 	MR_TOPGRF(RK_GPIO3, RK_PA6, RK_FUNC_6, 0x10268, RK_GENMASK_VAL(4, 4, 0)), /* PWM10_M0 */
77449e04eddSJianqun Xu 	MR_TOPGRF(RK_GPIO2, RK_PD5, RK_FUNC_5, 0x10268, RK_GENMASK_VAL(4, 4, 1)), /* PWM10_M1 */
775d499d466SJianqun Xu 
77649e04eddSJianqun Xu 	MR_TOPGRF(RK_GPIO3, RK_PA7, RK_FUNC_6, 0x10268, RK_GENMASK_VAL(6, 6, 0)), /* PWM11_IR_M0 */
77749e04eddSJianqun Xu 	MR_TOPGRF(RK_GPIO3, RK_PA1, RK_FUNC_5, 0x10268, RK_GENMASK_VAL(6, 6, 1)), /* PWM11_IR_M1 */
778d499d466SJianqun Xu 
77949e04eddSJianqun Xu 	MR_TOPGRF(RK_GPIO1, RK_PA5, RK_FUNC_3, 0x10268, RK_GENMASK_VAL(8, 8, 0)), /* UART2_TX_M0 */
78049e04eddSJianqun Xu 	MR_TOPGRF(RK_GPIO3, RK_PA2, RK_FUNC_1, 0x10268, RK_GENMASK_VAL(8, 8, 1)), /* UART2_TX_M1 */
781d499d466SJianqun Xu 
782d2f01304SJianqun Xu 	MR_TOPGRF(RK_GPIO3, RK_PC6, RK_FUNC_3, 0x10268, RK_GENMASK_VAL(11, 10, 0)), /* UART3_TX_M0 */
783d2f01304SJianqun Xu 	MR_TOPGRF(RK_GPIO1, RK_PA7, RK_FUNC_2, 0x10268, RK_GENMASK_VAL(11, 10, 1)), /* UART3_TX_M1 */
784d2f01304SJianqun Xu 	MR_TOPGRF(RK_GPIO3, RK_PA0, RK_FUNC_4, 0x10268, RK_GENMASK_VAL(11, 10, 2)), /* UART3_TX_M2 */
785d499d466SJianqun Xu 
786d2f01304SJianqun Xu 	MR_TOPGRF(RK_GPIO3, RK_PA4, RK_FUNC_4, 0x10268, RK_GENMASK_VAL(13, 12, 0)), /* UART4_TX_M0 */
787d2f01304SJianqun Xu 	MR_TOPGRF(RK_GPIO2, RK_PA6, RK_FUNC_4, 0x10268, RK_GENMASK_VAL(13, 12, 1)), /* UART4_TX_M1 */
788d2f01304SJianqun Xu 	MR_TOPGRF(RK_GPIO1, RK_PD5, RK_FUNC_3, 0x10268, RK_GENMASK_VAL(13, 12, 2)), /* UART4_TX_M2 */
789d499d466SJianqun Xu 
790d2f01304SJianqun Xu 	MR_TOPGRF(RK_GPIO3, RK_PA6, RK_FUNC_4, 0x10268, RK_GENMASK_VAL(15, 14, 0)), /* UART5_TX_M0 */
791d2f01304SJianqun Xu 	MR_TOPGRF(RK_GPIO2, RK_PB0, RK_FUNC_4, 0x10268, RK_GENMASK_VAL(15, 14, 1)), /* UART5_TX_M1 */
792d2f01304SJianqun Xu 	MR_TOPGRF(RK_GPIO2, RK_PA0, RK_FUNC_3, 0x10268, RK_GENMASK_VAL(15, 14, 2)), /* UART5_TX_M2 */
79349e04eddSJianqun Xu 
79449e04eddSJianqun Xu 	MR_PMUGRF(RK_GPIO0, RK_PB6, RK_FUNC_3, 0x0114, RK_GENMASK_VAL(0, 0, 0)), /* PWM0_M0 */
79549e04eddSJianqun Xu 	MR_PMUGRF(RK_GPIO2, RK_PB3, RK_FUNC_5, 0x0114, RK_GENMASK_VAL(0, 0, 1)), /* PWM0_M1 */
79649e04eddSJianqun Xu 
79749e04eddSJianqun Xu 	MR_PMUGRF(RK_GPIO0, RK_PB7, RK_FUNC_3, 0x0114, RK_GENMASK_VAL(2, 2, 0)), /* PWM1_M0 */
79849e04eddSJianqun Xu 	MR_PMUGRF(RK_GPIO2, RK_PB2, RK_FUNC_5, 0x0114, RK_GENMASK_VAL(2, 2, 1)), /* PWM1_M1 */
79949e04eddSJianqun Xu 
80049e04eddSJianqun Xu 	MR_PMUGRF(RK_GPIO0, RK_PC0, RK_FUNC_3, 0x0114, RK_GENMASK_VAL(4, 4, 0)), /* PWM2_M0 */
80149e04eddSJianqun Xu 	MR_PMUGRF(RK_GPIO2, RK_PB1, RK_FUNC_5, 0x0114, RK_GENMASK_VAL(4, 4, 1)), /* PWM2_M1 */
80249e04eddSJianqun Xu 
80349e04eddSJianqun Xu 	MR_PMUGRF(RK_GPIO0, RK_PC1, RK_FUNC_3, 0x0114, RK_GENMASK_VAL(6, 6, 0)), /* PWM3_IR_M0 */
80449e04eddSJianqun Xu 	MR_PMUGRF(RK_GPIO2, RK_PB0, RK_FUNC_5, 0x0114, RK_GENMASK_VAL(6, 6, 1)), /* PWM3_IR_M1 */
80549e04eddSJianqun Xu 
80649e04eddSJianqun Xu 	MR_PMUGRF(RK_GPIO0, RK_PC2, RK_FUNC_3, 0x0114, RK_GENMASK_VAL(8, 8, 0)), /* PWM4_M0 */
80749e04eddSJianqun Xu 	MR_PMUGRF(RK_GPIO2, RK_PA7, RK_FUNC_5, 0x0114, RK_GENMASK_VAL(8, 8, 1)), /* PWM4_M1 */
80849e04eddSJianqun Xu 
80949e04eddSJianqun Xu 	MR_PMUGRF(RK_GPIO0, RK_PC3, RK_FUNC_3, 0x0114, RK_GENMASK_VAL(10, 10, 0)), /* PWM5_M0 */
81049e04eddSJianqun Xu 	MR_PMUGRF(RK_GPIO2, RK_PA6, RK_FUNC_5, 0x0114, RK_GENMASK_VAL(10, 10, 1)), /* PWM5_M1 */
81149e04eddSJianqun Xu 
81249e04eddSJianqun Xu 	MR_PMUGRF(RK_GPIO0, RK_PB2, RK_FUNC_3, 0x0114, RK_GENMASK_VAL(12, 12, 0)), /* PWM6_M0 */
81349e04eddSJianqun Xu 	MR_PMUGRF(RK_GPIO2, RK_PD4, RK_FUNC_5, 0x0114, RK_GENMASK_VAL(12, 12, 1)), /* PWM6_M1 */
81449e04eddSJianqun Xu 
81549e04eddSJianqun Xu 	MR_PMUGRF(RK_GPIO0, RK_PB1, RK_FUNC_3, 0x0114, RK_GENMASK_VAL(14, 14, 0)), /* PWM7_IR_M0 */
81649e04eddSJianqun Xu 	MR_PMUGRF(RK_GPIO3, RK_PA0, RK_FUNC_5, 0x0114, RK_GENMASK_VAL(14, 14, 1)), /* PWM7_IR_M1 */
81749e04eddSJianqun Xu 
818d2f01304SJianqun Xu 	MR_PMUGRF(RK_GPIO0, RK_PB0, RK_FUNC_1, 0x0118, RK_GENMASK_VAL(1, 0, 0)), /* SPI0_CLK_M0 */
819d2f01304SJianqun Xu 	MR_PMUGRF(RK_GPIO2, RK_PA1, RK_FUNC_1, 0x0118, RK_GENMASK_VAL(1, 0, 1)), /* SPI0_CLK_M1 */
820d2f01304SJianqun Xu 	MR_PMUGRF(RK_GPIO2, RK_PB2, RK_FUNC_6, 0x0118, RK_GENMASK_VAL(1, 0, 2)), /* SPI0_CLK_M2 */
82149e04eddSJianqun Xu 
82249e04eddSJianqun Xu 	MR_PMUGRF(RK_GPIO0, RK_PB6, RK_FUNC_2, 0x0118, RK_GENMASK_VAL(2, 2, 0)), /* UART1_TX_M0 */
82349e04eddSJianqun Xu 	MR_PMUGRF(RK_GPIO1, RK_PD0, RK_FUNC_5, 0x0118, RK_GENMASK_VAL(2, 2, 1)), /* UART1_TX_M1 */
824d2f01304SJianqun Xu 	MR_PMUGRF(RK_GPIO0, RK_PC3, RK_FUNC_1, 0x0118, RK_GENMASK_VAL(4, 4, 1)), /* I2C2 */
825d499d466SJianqun Xu };
826d499d466SJianqun Xu 
82749c55878SDavid Wu static void rockchip_get_recalced_mux(struct rockchip_pin_bank *bank, int pin,
82849c55878SDavid Wu 				      int *reg, u8 *bit, int *mask)
82949c55878SDavid Wu {
83049c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
83149c55878SDavid Wu 	struct rockchip_pin_ctrl *ctrl = priv->ctrl;
83249c55878SDavid Wu 	struct rockchip_mux_recalced_data *data;
83349c55878SDavid Wu 	int i;
83449c55878SDavid Wu 
83549c55878SDavid Wu 	for (i = 0; i < ctrl->niomux_recalced; i++) {
83649c55878SDavid Wu 		data = &ctrl->iomux_recalced[i];
83749c55878SDavid Wu 		if (data->num == bank->bank_num &&
83849c55878SDavid Wu 		    data->pin == pin)
83949c55878SDavid Wu 			break;
84049c55878SDavid Wu 	}
84149c55878SDavid Wu 
84249c55878SDavid Wu 	if (i >= ctrl->niomux_recalced)
84349c55878SDavid Wu 		return;
84449c55878SDavid Wu 
84549c55878SDavid Wu 	*reg = data->reg;
84649c55878SDavid Wu 	*mask = data->mask;
84749c55878SDavid Wu 	*bit = data->bit;
84849c55878SDavid Wu }
84949c55878SDavid Wu 
85049c55878SDavid Wu static struct rockchip_mux_route_data px30_mux_route_data[] = {
85149c55878SDavid Wu 	{
85249c55878SDavid Wu 		/* cif-d2m0 */
85349c55878SDavid Wu 		.bank_num = 2,
85449c55878SDavid Wu 		.pin = 0,
85549c55878SDavid Wu 		.func = 1,
85649c55878SDavid Wu 		.route_offset = 0x184,
85749c55878SDavid Wu 		.route_val = BIT(16 + 7),
85849c55878SDavid Wu 	}, {
85949c55878SDavid Wu 		/* cif-d2m1 */
86049c55878SDavid Wu 		.bank_num = 3,
86149c55878SDavid Wu 		.pin = 3,
86249c55878SDavid Wu 		.func = 3,
86349c55878SDavid Wu 		.route_offset = 0x184,
86449c55878SDavid Wu 		.route_val = BIT(16 + 7) | BIT(7),
86549c55878SDavid Wu 	}, {
86649c55878SDavid Wu 		/* pdm-m0 */
86749c55878SDavid Wu 		.bank_num = 3,
86849c55878SDavid Wu 		.pin = 22,
86949c55878SDavid Wu 		.func = 2,
87049c55878SDavid Wu 		.route_offset = 0x184,
87149c55878SDavid Wu 		.route_val = BIT(16 + 8),
87249c55878SDavid Wu 	}, {
87349c55878SDavid Wu 		/* pdm-m1 */
87449c55878SDavid Wu 		.bank_num = 2,
87549c55878SDavid Wu 		.pin = 22,
87649c55878SDavid Wu 		.func = 1,
87749c55878SDavid Wu 		.route_offset = 0x184,
87849c55878SDavid Wu 		.route_val = BIT(16 + 8) | BIT(8),
87949c55878SDavid Wu 	}, {
88049c55878SDavid Wu 		/* uart2-rxm0 */
88149c55878SDavid Wu 		.bank_num = 1,
882793770dfSDavid Wu 		.pin = 27,
88349c55878SDavid Wu 		.func = 2,
88449c55878SDavid Wu 		.route_offset = 0x184,
885793770dfSDavid Wu 		.route_val = BIT(16 + 10),
88649c55878SDavid Wu 	}, {
88749c55878SDavid Wu 		/* uart2-rxm1 */
88849c55878SDavid Wu 		.bank_num = 2,
88949c55878SDavid Wu 		.pin = 14,
89049c55878SDavid Wu 		.func = 2,
89149c55878SDavid Wu 		.route_offset = 0x184,
892793770dfSDavid Wu 		.route_val = BIT(16 + 10) | BIT(10),
89349c55878SDavid Wu 	}, {
89449c55878SDavid Wu 		/* uart3-rxm0 */
89549c55878SDavid Wu 		.bank_num = 0,
89649c55878SDavid Wu 		.pin = 17,
89749c55878SDavid Wu 		.func = 2,
89849c55878SDavid Wu 		.route_offset = 0x184,
899793770dfSDavid Wu 		.route_val = BIT(16 + 9),
90049c55878SDavid Wu 	}, {
90149c55878SDavid Wu 		/* uart3-rxm1 */
90249c55878SDavid Wu 		.bank_num = 1,
903793770dfSDavid Wu 		.pin = 15,
90449c55878SDavid Wu 		.func = 2,
90549c55878SDavid Wu 		.route_offset = 0x184,
906793770dfSDavid Wu 		.route_val = BIT(16 + 9) | BIT(9),
90749c55878SDavid Wu 	},
90849c55878SDavid Wu };
90949c55878SDavid Wu 
910a2a3fc8fSJianqun Xu static struct rockchip_mux_route_data rk1808_mux_route_data[] = {
911a2a3fc8fSJianqun Xu 	{
912a2a3fc8fSJianqun Xu 		/* i2c2m0_sda */
913a2a3fc8fSJianqun Xu 		.bank_num = 3,
914a2a3fc8fSJianqun Xu 		.pin = 12,
915a2a3fc8fSJianqun Xu 		.func = 2,
916a2a3fc8fSJianqun Xu 		.route_offset = 0x190,
917a2a3fc8fSJianqun Xu 		.route_val = BIT(16 + 3),
918a2a3fc8fSJianqun Xu 	}, {
919a2a3fc8fSJianqun Xu 		/* i2c2m1_sda */
920a2a3fc8fSJianqun Xu 		.bank_num = 1,
921a2a3fc8fSJianqun Xu 		.pin = 13,
922a2a3fc8fSJianqun Xu 		.func = 2,
923a2a3fc8fSJianqun Xu 		.route_offset = 0x190,
924a2a3fc8fSJianqun Xu 		.route_val = BIT(16 + 3) | BIT(3),
925a2a3fc8fSJianqun Xu 	}, {
926a2a3fc8fSJianqun Xu 		/* uart2_rxm0 */
927a2a3fc8fSJianqun Xu 		.bank_num = 4,
928a2a3fc8fSJianqun Xu 		.pin = 3,
929a2a3fc8fSJianqun Xu 		.func = 2,
930a2a3fc8fSJianqun Xu 		.route_offset = 0x190,
931a2a3fc8fSJianqun Xu 		.route_val = BIT(16 + 14) | BIT(16 + 15),
932a2a3fc8fSJianqun Xu 	}, {
933a2a3fc8fSJianqun Xu 		/* uart2_rxm1 */
934a2a3fc8fSJianqun Xu 		.bank_num = 2,
935a2a3fc8fSJianqun Xu 		.pin = 25,
936a2a3fc8fSJianqun Xu 		.func = 2,
937a2a3fc8fSJianqun Xu 		.route_offset = 0x190,
938a2a3fc8fSJianqun Xu 		.route_val = BIT(16 + 14) | BIT(14) | BIT(16 + 15),
939a2a3fc8fSJianqun Xu 	}, {
940a2a3fc8fSJianqun Xu 		/* uart2_rxm2 */
941a2a3fc8fSJianqun Xu 		.bank_num = 3,
942a2a3fc8fSJianqun Xu 		.pin = 4,
943a2a3fc8fSJianqun Xu 		.func = 2,
944a2a3fc8fSJianqun Xu 		.route_offset = 0x190,
945a2a3fc8fSJianqun Xu 		.route_val = BIT(16 + 14) | BIT(16 + 15) | BIT(15),
946a2a3fc8fSJianqun Xu 	},
947a2a3fc8fSJianqun Xu };
948a2a3fc8fSJianqun Xu 
94949c55878SDavid Wu static struct rockchip_mux_route_data rk3128_mux_route_data[] = {
95049c55878SDavid Wu 	{
95149c55878SDavid Wu 		/* spi-0 */
95249c55878SDavid Wu 		.bank_num = 1,
95349c55878SDavid Wu 		.pin = 10,
95449c55878SDavid Wu 		.func = 1,
95549c55878SDavid Wu 		.route_offset = 0x144,
95649c55878SDavid Wu 		.route_val = BIT(16 + 3) | BIT(16 + 4),
95749c55878SDavid Wu 	}, {
95849c55878SDavid Wu 		/* spi-1 */
95949c55878SDavid Wu 		.bank_num = 1,
96049c55878SDavid Wu 		.pin = 27,
96149c55878SDavid Wu 		.func = 3,
96249c55878SDavid Wu 		.route_offset = 0x144,
96349c55878SDavid Wu 		.route_val = BIT(16 + 3) | BIT(16 + 4) | BIT(3),
96449c55878SDavid Wu 	}, {
96549c55878SDavid Wu 		/* spi-2 */
96649c55878SDavid Wu 		.bank_num = 0,
96749c55878SDavid Wu 		.pin = 13,
96849c55878SDavid Wu 		.func = 2,
96949c55878SDavid Wu 		.route_offset = 0x144,
97049c55878SDavid Wu 		.route_val = BIT(16 + 3) | BIT(16 + 4) | BIT(4),
97149c55878SDavid Wu 	}, {
97249c55878SDavid Wu 		/* i2s-0 */
97349c55878SDavid Wu 		.bank_num = 1,
97449c55878SDavid Wu 		.pin = 5,
97549c55878SDavid Wu 		.func = 1,
97649c55878SDavid Wu 		.route_offset = 0x144,
97749c55878SDavid Wu 		.route_val = BIT(16 + 5),
97849c55878SDavid Wu 	}, {
97949c55878SDavid Wu 		/* i2s-1 */
98049c55878SDavid Wu 		.bank_num = 0,
98149c55878SDavid Wu 		.pin = 14,
98249c55878SDavid Wu 		.func = 1,
98349c55878SDavid Wu 		.route_offset = 0x144,
98449c55878SDavid Wu 		.route_val = BIT(16 + 5) | BIT(5),
98549c55878SDavid Wu 	}, {
98649c55878SDavid Wu 		/* emmc-0 */
98749c55878SDavid Wu 		.bank_num = 1,
98849c55878SDavid Wu 		.pin = 22,
98949c55878SDavid Wu 		.func = 2,
99049c55878SDavid Wu 		.route_offset = 0x144,
99149c55878SDavid Wu 		.route_val = BIT(16 + 6),
99249c55878SDavid Wu 	}, {
99349c55878SDavid Wu 		/* emmc-1 */
99449c55878SDavid Wu 		.bank_num = 2,
99549c55878SDavid Wu 		.pin = 4,
99649c55878SDavid Wu 		.func = 2,
99749c55878SDavid Wu 		.route_offset = 0x144,
99849c55878SDavid Wu 		.route_val = BIT(16 + 6) | BIT(6),
99949c55878SDavid Wu 	},
100049c55878SDavid Wu };
100149c55878SDavid Wu 
100249c55878SDavid Wu static struct rockchip_mux_route_data rk3228_mux_route_data[] = {
100349c55878SDavid Wu 	{
100449c55878SDavid Wu 		/* pwm0-0 */
100549c55878SDavid Wu 		.bank_num = 0,
100649c55878SDavid Wu 		.pin = 26,
100749c55878SDavid Wu 		.func = 1,
100849c55878SDavid Wu 		.route_offset = 0x50,
100949c55878SDavid Wu 		.route_val = BIT(16),
101049c55878SDavid Wu 	}, {
101149c55878SDavid Wu 		/* pwm0-1 */
101249c55878SDavid Wu 		.bank_num = 3,
101349c55878SDavid Wu 		.pin = 21,
101449c55878SDavid Wu 		.func = 1,
101549c55878SDavid Wu 		.route_offset = 0x50,
101649c55878SDavid Wu 		.route_val = BIT(16) | BIT(0),
101749c55878SDavid Wu 	}, {
101849c55878SDavid Wu 		/* pwm1-0 */
101949c55878SDavid Wu 		.bank_num = 0,
102049c55878SDavid Wu 		.pin = 27,
102149c55878SDavid Wu 		.func = 1,
102249c55878SDavid Wu 		.route_offset = 0x50,
102349c55878SDavid Wu 		.route_val = BIT(16 + 1),
102449c55878SDavid Wu 	}, {
102549c55878SDavid Wu 		/* pwm1-1 */
102649c55878SDavid Wu 		.bank_num = 0,
102749c55878SDavid Wu 		.pin = 30,
102849c55878SDavid Wu 		.func = 2,
102949c55878SDavid Wu 		.route_offset = 0x50,
103049c55878SDavid Wu 		.route_val = BIT(16 + 1) | BIT(1),
103149c55878SDavid Wu 	}, {
103249c55878SDavid Wu 		/* pwm2-0 */
103349c55878SDavid Wu 		.bank_num = 0,
103449c55878SDavid Wu 		.pin = 28,
103549c55878SDavid Wu 		.func = 1,
103649c55878SDavid Wu 		.route_offset = 0x50,
103749c55878SDavid Wu 		.route_val = BIT(16 + 2),
103849c55878SDavid Wu 	}, {
103949c55878SDavid Wu 		/* pwm2-1 */
104049c55878SDavid Wu 		.bank_num = 1,
104149c55878SDavid Wu 		.pin = 12,
104249c55878SDavid Wu 		.func = 2,
104349c55878SDavid Wu 		.route_offset = 0x50,
104449c55878SDavid Wu 		.route_val = BIT(16 + 2) | BIT(2),
104549c55878SDavid Wu 	}, {
104649c55878SDavid Wu 		/* pwm3-0 */
104749c55878SDavid Wu 		.bank_num = 3,
104849c55878SDavid Wu 		.pin = 26,
104949c55878SDavid Wu 		.func = 1,
105049c55878SDavid Wu 		.route_offset = 0x50,
105149c55878SDavid Wu 		.route_val = BIT(16 + 3),
105249c55878SDavid Wu 	}, {
105349c55878SDavid Wu 		/* pwm3-1 */
105449c55878SDavid Wu 		.bank_num = 1,
105549c55878SDavid Wu 		.pin = 11,
105649c55878SDavid Wu 		.func = 2,
105749c55878SDavid Wu 		.route_offset = 0x50,
105849c55878SDavid Wu 		.route_val = BIT(16 + 3) | BIT(3),
105949c55878SDavid Wu 	}, {
106049c55878SDavid Wu 		/* sdio-0_d0 */
106149c55878SDavid Wu 		.bank_num = 1,
106249c55878SDavid Wu 		.pin = 1,
106349c55878SDavid Wu 		.func = 1,
106449c55878SDavid Wu 		.route_offset = 0x50,
106549c55878SDavid Wu 		.route_val = BIT(16 + 4),
106649c55878SDavid Wu 	}, {
106749c55878SDavid Wu 		/* sdio-1_d0 */
106849c55878SDavid Wu 		.bank_num = 3,
106949c55878SDavid Wu 		.pin = 2,
107049c55878SDavid Wu 		.func = 1,
107149c55878SDavid Wu 		.route_offset = 0x50,
107249c55878SDavid Wu 		.route_val = BIT(16 + 4) | BIT(4),
107349c55878SDavid Wu 	}, {
107449c55878SDavid Wu 		/* spi-0_rx */
107549c55878SDavid Wu 		.bank_num = 0,
107649c55878SDavid Wu 		.pin = 13,
107749c55878SDavid Wu 		.func = 2,
107849c55878SDavid Wu 		.route_offset = 0x50,
107949c55878SDavid Wu 		.route_val = BIT(16 + 5),
108049c55878SDavid Wu 	}, {
108149c55878SDavid Wu 		/* spi-1_rx */
108249c55878SDavid Wu 		.bank_num = 2,
108349c55878SDavid Wu 		.pin = 0,
108449c55878SDavid Wu 		.func = 2,
108549c55878SDavid Wu 		.route_offset = 0x50,
108649c55878SDavid Wu 		.route_val = BIT(16 + 5) | BIT(5),
108749c55878SDavid Wu 	}, {
108849c55878SDavid Wu 		/* emmc-0_cmd */
108949c55878SDavid Wu 		.bank_num = 1,
109049c55878SDavid Wu 		.pin = 22,
109149c55878SDavid Wu 		.func = 2,
109249c55878SDavid Wu 		.route_offset = 0x50,
109349c55878SDavid Wu 		.route_val = BIT(16 + 7),
109449c55878SDavid Wu 	}, {
109549c55878SDavid Wu 		/* emmc-1_cmd */
109649c55878SDavid Wu 		.bank_num = 2,
109749c55878SDavid Wu 		.pin = 4,
109849c55878SDavid Wu 		.func = 2,
109949c55878SDavid Wu 		.route_offset = 0x50,
110049c55878SDavid Wu 		.route_val = BIT(16 + 7) | BIT(7),
110149c55878SDavid Wu 	}, {
110249c55878SDavid Wu 		/* uart2-0_rx */
110349c55878SDavid Wu 		.bank_num = 1,
110449c55878SDavid Wu 		.pin = 19,
110549c55878SDavid Wu 		.func = 2,
110649c55878SDavid Wu 		.route_offset = 0x50,
110749c55878SDavid Wu 		.route_val = BIT(16 + 8),
110849c55878SDavid Wu 	}, {
110949c55878SDavid Wu 		/* uart2-1_rx */
111049c55878SDavid Wu 		.bank_num = 1,
111149c55878SDavid Wu 		.pin = 10,
111249c55878SDavid Wu 		.func = 2,
111349c55878SDavid Wu 		.route_offset = 0x50,
111449c55878SDavid Wu 		.route_val = BIT(16 + 8) | BIT(8),
111549c55878SDavid Wu 	}, {
111649c55878SDavid Wu 		/* uart1-0_rx */
111749c55878SDavid Wu 		.bank_num = 1,
111849c55878SDavid Wu 		.pin = 10,
111949c55878SDavid Wu 		.func = 1,
112049c55878SDavid Wu 		.route_offset = 0x50,
112149c55878SDavid Wu 		.route_val = BIT(16 + 11),
112249c55878SDavid Wu 	}, {
112349c55878SDavid Wu 		/* uart1-1_rx */
112449c55878SDavid Wu 		.bank_num = 3,
112549c55878SDavid Wu 		.pin = 13,
112649c55878SDavid Wu 		.func = 1,
112749c55878SDavid Wu 		.route_offset = 0x50,
112849c55878SDavid Wu 		.route_val = BIT(16 + 11) | BIT(11),
112949c55878SDavid Wu 	},
113049c55878SDavid Wu };
113149c55878SDavid Wu 
113249c55878SDavid Wu static struct rockchip_mux_route_data rk3288_mux_route_data[] = {
113349c55878SDavid Wu 	{
113449c55878SDavid Wu 		/* edphdmi_cecinoutt1 */
113549c55878SDavid Wu 		.bank_num = 7,
113649c55878SDavid Wu 		.pin = 16,
113749c55878SDavid Wu 		.func = 2,
113849c55878SDavid Wu 		.route_offset = 0x264,
113949c55878SDavid Wu 		.route_val = BIT(16 + 12) | BIT(12),
114049c55878SDavid Wu 	}, {
114149c55878SDavid Wu 		/* edphdmi_cecinout */
114249c55878SDavid Wu 		.bank_num = 7,
114349c55878SDavid Wu 		.pin = 23,
114449c55878SDavid Wu 		.func = 4,
114549c55878SDavid Wu 		.route_offset = 0x264,
114649c55878SDavid Wu 		.route_val = BIT(16 + 12),
114749c55878SDavid Wu 	},
114849c55878SDavid Wu };
114949c55878SDavid Wu 
1150b3077611SDavid Wu static struct rockchip_mux_route_data rk3308_mux_route_data[] = {
1151b3077611SDavid Wu 	{
1152d5517017SDavid Wu 		/* rtc_clk */
1153d5517017SDavid Wu 		.bank_num = 0,
1154d5517017SDavid Wu 		.pin = 19,
1155d5517017SDavid Wu 		.func = 1,
1156d5517017SDavid Wu 		.route_offset = 0x314,
1157d5517017SDavid Wu 		.route_val = BIT(16 + 0) | BIT(0),
1158d5517017SDavid Wu 	}, {
1159b3077611SDavid Wu 		/* uart2_rxm0 */
1160b3077611SDavid Wu 		.bank_num = 1,
1161b3077611SDavid Wu 		.pin = 22,
1162b3077611SDavid Wu 		.func = 2,
1163b3077611SDavid Wu 		.route_offset = 0x314,
1164b3077611SDavid Wu 		.route_val = BIT(16 + 2) | BIT(16 + 3),
1165b3077611SDavid Wu 	}, {
1166b3077611SDavid Wu 		/* uart2_rxm1 */
1167b3077611SDavid Wu 		.bank_num = 4,
1168b3077611SDavid Wu 		.pin = 26,
1169b3077611SDavid Wu 		.func = 2,
1170b3077611SDavid Wu 		.route_offset = 0x314,
1171b3077611SDavid Wu 		.route_val = BIT(16 + 2) | BIT(16 + 3) | BIT(2),
1172b3077611SDavid Wu 	}, {
1173b3077611SDavid Wu 		/* i2c3_sdam0 */
1174b3077611SDavid Wu 		.bank_num = 0,
1175b3077611SDavid Wu 		.pin = 23,
1176b3077611SDavid Wu 		.func = 2,
1177b3077611SDavid Wu 		.route_offset = 0x314,
1178b3077611SDavid Wu 		.route_val = BIT(16 + 4),
1179b3077611SDavid Wu 	}, {
1180b3077611SDavid Wu 		/* i2c3_sdam1 */
1181b3077611SDavid Wu 		.bank_num = 3,
1182b3077611SDavid Wu 		.pin = 12,
1183b3077611SDavid Wu 		.func = 2,
1184b3077611SDavid Wu 		.route_offset = 0x314,
1185b3077611SDavid Wu 		.route_val = BIT(16 + 4) | BIT(4),
1186d5517017SDavid Wu 	}, {
1187d5517017SDavid Wu 		/* i2s-8ch-1-sclktxm0 */
1188d5517017SDavid Wu 		.bank_num = 1,
1189d5517017SDavid Wu 		.pin = 3,
1190d5517017SDavid Wu 		.func = 2,
1191d5517017SDavid Wu 		.route_offset = 0x308,
1192d5517017SDavid Wu 		.route_val = BIT(16 + 3),
1193d5517017SDavid Wu 	}, {
1194d5517017SDavid Wu 		/* i2s-8ch-1-sclkrxm0 */
1195d5517017SDavid Wu 		.bank_num = 1,
1196d5517017SDavid Wu 		.pin = 4,
1197d5517017SDavid Wu 		.func = 2,
1198d5517017SDavid Wu 		.route_offset = 0x308,
1199d5517017SDavid Wu 		.route_val = BIT(16 + 3),
1200d5517017SDavid Wu 	}, {
1201d5517017SDavid Wu 		/* i2s-8ch-1-sclktxm1 */
1202d5517017SDavid Wu 		.bank_num = 1,
1203d5517017SDavid Wu 		.pin = 13,
1204d5517017SDavid Wu 		.func = 2,
1205d5517017SDavid Wu 		.route_offset = 0x308,
1206d5517017SDavid Wu 		.route_val = BIT(16 + 3) | BIT(3),
1207d5517017SDavid Wu 	}, {
1208d5517017SDavid Wu 		/* i2s-8ch-1-sclkrxm1 */
1209d5517017SDavid Wu 		.bank_num = 1,
1210d5517017SDavid Wu 		.pin = 14,
1211d5517017SDavid Wu 		.func = 2,
1212d5517017SDavid Wu 		.route_offset = 0x308,
1213d5517017SDavid Wu 		.route_val = BIT(16 + 3) | BIT(3),
1214d5517017SDavid Wu 	}, {
1215d5517017SDavid Wu 		/* pdm-clkm0 */
1216d5517017SDavid Wu 		.bank_num = 1,
1217d5517017SDavid Wu 		.pin = 4,
1218d5517017SDavid Wu 		.func = 3,
1219d5517017SDavid Wu 		.route_offset = 0x308,
1220d5517017SDavid Wu 		.route_val = BIT(16 + 12) | BIT(16 + 13),
1221d5517017SDavid Wu 	}, {
1222d5517017SDavid Wu 		/* pdm-clkm1 */
1223d5517017SDavid Wu 		.bank_num = 1,
1224d5517017SDavid Wu 		.pin = 14,
1225d5517017SDavid Wu 		.func = 4,
1226d5517017SDavid Wu 		.route_offset = 0x308,
1227d5517017SDavid Wu 		.route_val = BIT(16 + 12) | BIT(16 + 13) | BIT(12),
1228d5517017SDavid Wu 	}, {
1229d5517017SDavid Wu 		/* pdm-clkm2 */
1230d5517017SDavid Wu 		.bank_num = 2,
1231d5517017SDavid Wu 		.pin = 6,
1232d5517017SDavid Wu 		.func = 2,
1233d5517017SDavid Wu 		.route_offset = 0x308,
1234d5517017SDavid Wu 		.route_val = BIT(16 + 12) | BIT(16 + 13) | BIT(13),
1235d5517017SDavid Wu 	}, {
1236d5517017SDavid Wu 		/* pdm-clkm-m2 */
1237d5517017SDavid Wu 		.bank_num = 2,
1238d5517017SDavid Wu 		.pin = 4,
1239d5517017SDavid Wu 		.func = 3,
1240d5517017SDavid Wu 		.route_offset = 0x600,
1241d5517017SDavid Wu 		.route_val = BIT(16 + 2) | BIT(2),
1242d5517017SDavid Wu 	},
1243d5517017SDavid Wu };
1244d5517017SDavid Wu 
1245d5517017SDavid Wu static struct rockchip_mux_route_data rk3308b_mux_route_data[] = {
1246d5517017SDavid Wu 	{
1247d5517017SDavid Wu 		/* rtc_clk */
1248d5517017SDavid Wu 		.bank_num = 0,
1249d5517017SDavid Wu 		.pin = 19,
1250d5517017SDavid Wu 		.func = 1,
1251d5517017SDavid Wu 		.route_offset = 0x314,
1252d5517017SDavid Wu 		.route_val = BIT(16 + 0) | BIT(0),
1253d5517017SDavid Wu 	}, {
1254d5517017SDavid Wu 		/* uart2_rxm0 */
1255d5517017SDavid Wu 		.bank_num = 1,
1256d5517017SDavid Wu 		.pin = 22,
1257d5517017SDavid Wu 		.func = 2,
1258d5517017SDavid Wu 		.route_offset = 0x314,
1259d5517017SDavid Wu 		.route_val = BIT(16 + 2) | BIT(16 + 3),
1260d5517017SDavid Wu 	}, {
1261d5517017SDavid Wu 		/* uart2_rxm1 */
1262d5517017SDavid Wu 		.bank_num = 4,
1263d5517017SDavid Wu 		.pin = 26,
1264d5517017SDavid Wu 		.func = 2,
1265d5517017SDavid Wu 		.route_offset = 0x314,
1266d5517017SDavid Wu 		.route_val = BIT(16 + 2) | BIT(16 + 3) | BIT(2),
1267d5517017SDavid Wu 	}, {
1268d5517017SDavid Wu 		/* i2c3_sdam0 */
1269d5517017SDavid Wu 		.bank_num = 0,
1270d5517017SDavid Wu 		.pin = 15,
1271d5517017SDavid Wu 		.func = 2,
1272d5517017SDavid Wu 		.route_offset = 0x608,
1273d5517017SDavid Wu 		.route_val = BIT(16 + 8) | BIT(16 + 9),
1274d5517017SDavid Wu 	}, {
1275d5517017SDavid Wu 		/* i2c3_sdam1 */
1276d5517017SDavid Wu 		.bank_num = 3,
1277d5517017SDavid Wu 		.pin = 12,
1278d5517017SDavid Wu 		.func = 2,
1279d5517017SDavid Wu 		.route_offset = 0x608,
1280d5517017SDavid Wu 		.route_val = BIT(16 + 8) | BIT(16 + 9) | BIT(8),
1281d5517017SDavid Wu 	}, {
1282d5517017SDavid Wu 		/* i2c3_sdam2 */
1283d5517017SDavid Wu 		.bank_num = 2,
1284d5517017SDavid Wu 		.pin = 0,
1285d5517017SDavid Wu 		.func = 3,
1286d5517017SDavid Wu 		.route_offset = 0x608,
1287d5517017SDavid Wu 		.route_val = BIT(16 + 8) | BIT(16 + 9) | BIT(9),
1288d5517017SDavid Wu 	}, {
1289d5517017SDavid Wu 		/* i2s-8ch-1-sclktxm0 */
1290d5517017SDavid Wu 		.bank_num = 1,
1291d5517017SDavid Wu 		.pin = 3,
1292d5517017SDavid Wu 		.func = 2,
1293d5517017SDavid Wu 		.route_offset = 0x308,
1294d5517017SDavid Wu 		.route_val = BIT(16 + 3),
1295d5517017SDavid Wu 	}, {
1296d5517017SDavid Wu 		/* i2s-8ch-1-sclkrxm0 */
1297d5517017SDavid Wu 		.bank_num = 1,
1298d5517017SDavid Wu 		.pin = 4,
1299d5517017SDavid Wu 		.func = 2,
1300d5517017SDavid Wu 		.route_offset = 0x308,
1301d5517017SDavid Wu 		.route_val = BIT(16 + 3),
1302d5517017SDavid Wu 	}, {
1303d5517017SDavid Wu 		/* i2s-8ch-1-sclktxm1 */
1304d5517017SDavid Wu 		.bank_num = 1,
1305d5517017SDavid Wu 		.pin = 13,
1306d5517017SDavid Wu 		.func = 2,
1307d5517017SDavid Wu 		.route_offset = 0x308,
1308d5517017SDavid Wu 		.route_val = BIT(16 + 3) | BIT(3),
1309d5517017SDavid Wu 	}, {
1310d5517017SDavid Wu 		/* i2s-8ch-1-sclkrxm1 */
1311d5517017SDavid Wu 		.bank_num = 1,
1312d5517017SDavid Wu 		.pin = 14,
1313d5517017SDavid Wu 		.func = 2,
1314d5517017SDavid Wu 		.route_offset = 0x308,
1315d5517017SDavid Wu 		.route_val = BIT(16 + 3) | BIT(3),
1316d5517017SDavid Wu 	}, {
1317d5517017SDavid Wu 		/* pdm-clkm0 */
1318d5517017SDavid Wu 		.bank_num = 1,
1319d5517017SDavid Wu 		.pin = 4,
1320d5517017SDavid Wu 		.func = 3,
1321d5517017SDavid Wu 		.route_offset = 0x308,
1322d5517017SDavid Wu 		.route_val =  BIT(16 + 12) | BIT(16 + 13),
1323d5517017SDavid Wu 	}, {
1324d5517017SDavid Wu 		/* pdm-clkm1 */
1325d5517017SDavid Wu 		.bank_num = 1,
1326d5517017SDavid Wu 		.pin = 14,
1327d5517017SDavid Wu 		.func = 4,
1328d5517017SDavid Wu 		.route_offset = 0x308,
1329d5517017SDavid Wu 		.route_val = BIT(16 + 12) | BIT(16 + 13) | BIT(12),
1330d5517017SDavid Wu 	}, {
1331d5517017SDavid Wu 		/* pdm-clkm2 */
1332d5517017SDavid Wu 		.bank_num = 2,
1333d5517017SDavid Wu 		.pin = 6,
1334d5517017SDavid Wu 		.func = 2,
1335d5517017SDavid Wu 		.route_offset = 0x308,
1336d5517017SDavid Wu 		.route_val = BIT(16 + 12) | BIT(16 + 13) | BIT(13),
1337d5517017SDavid Wu 	}, {
1338d5517017SDavid Wu 		/* pdm-clkm-m2 */
1339d5517017SDavid Wu 		.bank_num = 2,
1340d5517017SDavid Wu 		.pin = 4,
1341d5517017SDavid Wu 		.func = 3,
1342d5517017SDavid Wu 		.route_offset = 0x600,
1343d5517017SDavid Wu 		.route_val = BIT(16 + 2) | BIT(2),
1344d5517017SDavid Wu 	}, {
1345d5517017SDavid Wu 		/* spi1_miso */
1346d5517017SDavid Wu 		.bank_num = 3,
1347d5517017SDavid Wu 		.pin = 10,
1348d5517017SDavid Wu 		.func = 3,
1349d5517017SDavid Wu 		.route_offset = 0x314,
1350d5517017SDavid Wu 		.route_val = BIT(16 + 9),
1351d5517017SDavid Wu 	}, {
1352d5517017SDavid Wu 		/* spi1_miso_m1 */
1353d5517017SDavid Wu 		.bank_num = 2,
1354d5517017SDavid Wu 		.pin = 4,
1355d5517017SDavid Wu 		.func = 2,
1356d5517017SDavid Wu 		.route_offset = 0x314,
1357d5517017SDavid Wu 		.route_val = BIT(16 + 9) | BIT(9),
1358d5517017SDavid Wu 	}, {
1359d5517017SDavid Wu 		/* owire_m0 */
1360d5517017SDavid Wu 		.bank_num = 0,
1361d5517017SDavid Wu 		.pin = 11,
1362d5517017SDavid Wu 		.func = 3,
1363d5517017SDavid Wu 		.route_offset = 0x314,
1364d5517017SDavid Wu 		.route_val = BIT(16 + 10) | BIT(16 + 11),
1365d5517017SDavid Wu 	}, {
1366d5517017SDavid Wu 		/* owire_m1 */
1367d5517017SDavid Wu 		.bank_num = 1,
1368d5517017SDavid Wu 		.pin = 22,
1369d5517017SDavid Wu 		.func = 7,
1370d5517017SDavid Wu 		.route_offset = 0x314,
1371d5517017SDavid Wu 		.route_val = BIT(16 + 10) | BIT(16 + 11) | BIT(10),
1372d5517017SDavid Wu 	}, {
1373d5517017SDavid Wu 		/* owire_m2 */
1374d5517017SDavid Wu 		.bank_num = 2,
1375d5517017SDavid Wu 		.pin = 2,
1376d5517017SDavid Wu 		.func = 5,
1377d5517017SDavid Wu 		.route_offset = 0x314,
1378d5517017SDavid Wu 		.route_val = BIT(16 + 10) | BIT(16 + 11) | BIT(11),
1379d5517017SDavid Wu 	}, {
1380d5517017SDavid Wu 		/* can_rxd_m0 */
1381d5517017SDavid Wu 		.bank_num = 0,
1382d5517017SDavid Wu 		.pin = 11,
1383d5517017SDavid Wu 		.func = 2,
1384d5517017SDavid Wu 		.route_offset = 0x314,
1385d5517017SDavid Wu 		.route_val = BIT(16 + 12) | BIT(16 + 13),
1386d5517017SDavid Wu 	}, {
1387d5517017SDavid Wu 		/* can_rxd_m1 */
1388d5517017SDavid Wu 		.bank_num = 1,
1389d5517017SDavid Wu 		.pin = 22,
1390d5517017SDavid Wu 		.func = 5,
1391d5517017SDavid Wu 		.route_offset = 0x314,
1392d5517017SDavid Wu 		.route_val = BIT(16 + 12) | BIT(16 + 13) | BIT(12),
1393d5517017SDavid Wu 	}, {
1394d5517017SDavid Wu 		/* can_rxd_m2 */
1395d5517017SDavid Wu 		.bank_num = 2,
1396d5517017SDavid Wu 		.pin = 2,
1397d5517017SDavid Wu 		.func = 4,
1398d5517017SDavid Wu 		.route_offset = 0x314,
1399d5517017SDavid Wu 		.route_val = BIT(16 + 12) | BIT(16 + 13) | BIT(13),
1400d5517017SDavid Wu 	}, {
1401d5517017SDavid Wu 		/* mac_rxd0_m0 */
1402d5517017SDavid Wu 		.bank_num = 1,
1403d5517017SDavid Wu 		.pin = 20,
1404d5517017SDavid Wu 		.func = 3,
1405d5517017SDavid Wu 		.route_offset = 0x314,
1406d5517017SDavid Wu 		.route_val = BIT(16 + 14),
1407d5517017SDavid Wu 	}, {
1408d5517017SDavid Wu 		/* mac_rxd0_m1 */
1409d5517017SDavid Wu 		.bank_num = 4,
1410d5517017SDavid Wu 		.pin = 2,
1411d5517017SDavid Wu 		.func = 2,
1412d5517017SDavid Wu 		.route_offset = 0x314,
1413d5517017SDavid Wu 		.route_val = BIT(16 + 14) | BIT(14),
1414d5517017SDavid Wu 	}, {
1415d5517017SDavid Wu 		/* uart3_rx */
1416d5517017SDavid Wu 		.bank_num = 3,
1417d5517017SDavid Wu 		.pin = 12,
1418d5517017SDavid Wu 		.func = 4,
1419d5517017SDavid Wu 		.route_offset = 0x314,
1420d5517017SDavid Wu 		.route_val = BIT(16 + 15),
1421d5517017SDavid Wu 	}, {
1422d5517017SDavid Wu 		/* uart3_rx_m1 */
1423d5517017SDavid Wu 		.bank_num = 0,
1424d5517017SDavid Wu 		.pin = 17,
1425d5517017SDavid Wu 		.func = 3,
1426d5517017SDavid Wu 		.route_offset = 0x314,
1427d5517017SDavid Wu 		.route_val = BIT(16 + 15) | BIT(15),
1428b3077611SDavid Wu 	},
1429b3077611SDavid Wu };
1430b3077611SDavid Wu 
143149c55878SDavid Wu static struct rockchip_mux_route_data rk3328_mux_route_data[] = {
143249c55878SDavid Wu 	{
143349c55878SDavid Wu 		/* uart2dbg_rxm0 */
143449c55878SDavid Wu 		.bank_num = 1,
143549c55878SDavid Wu 		.pin = 1,
143649c55878SDavid Wu 		.func = 2,
143749c55878SDavid Wu 		.route_offset = 0x50,
143849c55878SDavid Wu 		.route_val = BIT(16) | BIT(16 + 1),
143949c55878SDavid Wu 	}, {
144049c55878SDavid Wu 		/* uart2dbg_rxm1 */
144149c55878SDavid Wu 		.bank_num = 2,
144249c55878SDavid Wu 		.pin = 1,
144349c55878SDavid Wu 		.func = 1,
144449c55878SDavid Wu 		.route_offset = 0x50,
144549c55878SDavid Wu 		.route_val = BIT(16) | BIT(16 + 1) | BIT(0),
144649c55878SDavid Wu 	}, {
144749c55878SDavid Wu 		/* gmac-m1_rxd0 */
144849c55878SDavid Wu 		.bank_num = 1,
144949c55878SDavid Wu 		.pin = 11,
145049c55878SDavid Wu 		.func = 2,
145149c55878SDavid Wu 		.route_offset = 0x50,
145249c55878SDavid Wu 		.route_val = BIT(16 + 2) | BIT(2),
145349c55878SDavid Wu 	}, {
145449c55878SDavid Wu 		/* gmac-m1-optimized_rxd3 */
145549c55878SDavid Wu 		.bank_num = 1,
145649c55878SDavid Wu 		.pin = 14,
145749c55878SDavid Wu 		.func = 2,
145849c55878SDavid Wu 		.route_offset = 0x50,
145949c55878SDavid Wu 		.route_val = BIT(16 + 10) | BIT(10),
146049c55878SDavid Wu 	}, {
146149c55878SDavid Wu 		/* pdm_sdi0m0 */
146249c55878SDavid Wu 		.bank_num = 2,
146349c55878SDavid Wu 		.pin = 19,
146449c55878SDavid Wu 		.func = 2,
146549c55878SDavid Wu 		.route_offset = 0x50,
146649c55878SDavid Wu 		.route_val = BIT(16 + 3),
146749c55878SDavid Wu 	}, {
146849c55878SDavid Wu 		/* pdm_sdi0m1 */
146949c55878SDavid Wu 		.bank_num = 1,
147049c55878SDavid Wu 		.pin = 23,
147149c55878SDavid Wu 		.func = 3,
147249c55878SDavid Wu 		.route_offset = 0x50,
147349c55878SDavid Wu 		.route_val =  BIT(16 + 3) | BIT(3),
147449c55878SDavid Wu 	}, {
147549c55878SDavid Wu 		/* spi_rxdm2 */
147649c55878SDavid Wu 		.bank_num = 3,
147749c55878SDavid Wu 		.pin = 2,
147849c55878SDavid Wu 		.func = 4,
147949c55878SDavid Wu 		.route_offset = 0x50,
148049c55878SDavid Wu 		.route_val =  BIT(16 + 4) | BIT(16 + 5) | BIT(5),
148149c55878SDavid Wu 	}, {
148249c55878SDavid Wu 		/* i2s2_sdim0 */
148349c55878SDavid Wu 		.bank_num = 1,
148449c55878SDavid Wu 		.pin = 24,
148549c55878SDavid Wu 		.func = 1,
148649c55878SDavid Wu 		.route_offset = 0x50,
148749c55878SDavid Wu 		.route_val = BIT(16 + 6),
148849c55878SDavid Wu 	}, {
148949c55878SDavid Wu 		/* i2s2_sdim1 */
149049c55878SDavid Wu 		.bank_num = 3,
149149c55878SDavid Wu 		.pin = 2,
149249c55878SDavid Wu 		.func = 6,
149349c55878SDavid Wu 		.route_offset = 0x50,
149449c55878SDavid Wu 		.route_val =  BIT(16 + 6) | BIT(6),
149549c55878SDavid Wu 	}, {
149649c55878SDavid Wu 		/* card_iom1 */
149749c55878SDavid Wu 		.bank_num = 2,
149849c55878SDavid Wu 		.pin = 22,
149949c55878SDavid Wu 		.func = 3,
150049c55878SDavid Wu 		.route_offset = 0x50,
150149c55878SDavid Wu 		.route_val =  BIT(16 + 7) | BIT(7),
150249c55878SDavid Wu 	}, {
150349c55878SDavid Wu 		/* tsp_d5m1 */
150449c55878SDavid Wu 		.bank_num = 2,
150549c55878SDavid Wu 		.pin = 16,
150649c55878SDavid Wu 		.func = 3,
150749c55878SDavid Wu 		.route_offset = 0x50,
150849c55878SDavid Wu 		.route_val =  BIT(16 + 8) | BIT(8),
150949c55878SDavid Wu 	}, {
151049c55878SDavid Wu 		/* cif_data5m1 */
151149c55878SDavid Wu 		.bank_num = 2,
151249c55878SDavid Wu 		.pin = 16,
151349c55878SDavid Wu 		.func = 4,
151449c55878SDavid Wu 		.route_offset = 0x50,
151549c55878SDavid Wu 		.route_val =  BIT(16 + 9) | BIT(9),
151649c55878SDavid Wu 	},
151749c55878SDavid Wu };
151849c55878SDavid Wu 
151949c55878SDavid Wu static struct rockchip_mux_route_data rk3399_mux_route_data[] = {
152049c55878SDavid Wu 	{
152149c55878SDavid Wu 		/* uart2dbga_rx */
152249c55878SDavid Wu 		.bank_num = 4,
152349c55878SDavid Wu 		.pin = 8,
152449c55878SDavid Wu 		.func = 2,
152549c55878SDavid Wu 		.route_offset = 0xe21c,
152649c55878SDavid Wu 		.route_val = BIT(16 + 10) | BIT(16 + 11),
152749c55878SDavid Wu 	}, {
152849c55878SDavid Wu 		/* uart2dbgb_rx */
152949c55878SDavid Wu 		.bank_num = 4,
153049c55878SDavid Wu 		.pin = 16,
153149c55878SDavid Wu 		.func = 2,
153249c55878SDavid Wu 		.route_offset = 0xe21c,
153349c55878SDavid Wu 		.route_val = BIT(16 + 10) | BIT(16 + 11) | BIT(10),
153449c55878SDavid Wu 	}, {
153549c55878SDavid Wu 		/* uart2dbgc_rx */
153649c55878SDavid Wu 		.bank_num = 4,
153749c55878SDavid Wu 		.pin = 19,
153849c55878SDavid Wu 		.func = 1,
153949c55878SDavid Wu 		.route_offset = 0xe21c,
154049c55878SDavid Wu 		.route_val = BIT(16 + 10) | BIT(16 + 11) | BIT(11),
154149c55878SDavid Wu 	}, {
154249c55878SDavid Wu 		/* pcie_clkreqn */
154349c55878SDavid Wu 		.bank_num = 2,
154449c55878SDavid Wu 		.pin = 26,
154549c55878SDavid Wu 		.func = 2,
154649c55878SDavid Wu 		.route_offset = 0xe21c,
154749c55878SDavid Wu 		.route_val = BIT(16 + 14),
154849c55878SDavid Wu 	}, {
154949c55878SDavid Wu 		/* pcie_clkreqnb */
155049c55878SDavid Wu 		.bank_num = 4,
155149c55878SDavid Wu 		.pin = 24,
155249c55878SDavid Wu 		.func = 1,
155349c55878SDavid Wu 		.route_offset = 0xe21c,
155449c55878SDavid Wu 		.route_val = BIT(16 + 14) | BIT(14),
155549c55878SDavid Wu 	},
155649c55878SDavid Wu };
155749c55878SDavid Wu 
155849e04eddSJianqun Xu static enum rockchip_pin_route_type
155949e04eddSJianqun Xu rockchip_get_mux_route(struct rockchip_pin_bank *bank, int pin,
156049c55878SDavid Wu 		       int mux, u32 *reg, u32 *value)
156149c55878SDavid Wu {
156249c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
156349c55878SDavid Wu 	struct rockchip_pin_ctrl *ctrl = priv->ctrl;
156449c55878SDavid Wu 	struct rockchip_mux_route_data *data;
156549c55878SDavid Wu 	int i;
156649c55878SDavid Wu 
156749c55878SDavid Wu 	for (i = 0; i < ctrl->niomux_routes; i++) {
156849c55878SDavid Wu 		data = &ctrl->iomux_routes[i];
156949c55878SDavid Wu 		if ((data->bank_num == bank->bank_num) &&
157049c55878SDavid Wu 		    (data->pin == pin) && (data->func == mux))
157149c55878SDavid Wu 			break;
157249c55878SDavid Wu 	}
157349c55878SDavid Wu 
157449c55878SDavid Wu 	if (i >= ctrl->niomux_routes)
157549e04eddSJianqun Xu 		return ROUTE_TYPE_INVALID;
157649c55878SDavid Wu 
157749c55878SDavid Wu 	*reg = data->route_offset;
157849c55878SDavid Wu 	*value = data->route_val;
157949c55878SDavid Wu 
158049e04eddSJianqun Xu 	return data->route_type;
158149c55878SDavid Wu }
158249c55878SDavid Wu 
158349c55878SDavid Wu static int rockchip_get_mux(struct rockchip_pin_bank *bank, int pin)
158449c55878SDavid Wu {
158549c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
158649c55878SDavid Wu 	int iomux_num = (pin / 8);
158749c55878SDavid Wu 	struct regmap *regmap;
158849c55878SDavid Wu 	unsigned int val;
158949c55878SDavid Wu 	int reg, ret, mask, mux_type;
159049c55878SDavid Wu 	u8 bit;
159149c55878SDavid Wu 
159249c55878SDavid Wu 	if (iomux_num > 3)
159349c55878SDavid Wu 		return -EINVAL;
159449c55878SDavid Wu 
159549c55878SDavid Wu 	if (bank->iomux[iomux_num].type & IOMUX_UNROUTED) {
159649c55878SDavid Wu 		debug("pin %d is unrouted\n", pin);
159749c55878SDavid Wu 		return -EINVAL;
159849c55878SDavid Wu 	}
159949c55878SDavid Wu 
160049c55878SDavid Wu 	if (bank->iomux[iomux_num].type & IOMUX_GPIO_ONLY)
160149c55878SDavid Wu 		return RK_FUNC_GPIO;
160249c55878SDavid Wu 
1603cf04a17bSJianqun Xu 	if (bank->iomux[iomux_num].type & IOMUX_SOURCE_PMU)
1604cf04a17bSJianqun Xu 		regmap = priv->regmap_pmu;
1605cf04a17bSJianqun Xu 	else if (bank->iomux[iomux_num].type & IOMUX_L_SOURCE_PMU)
1606cf04a17bSJianqun Xu 		regmap = (pin % 8 < 4) ? priv->regmap_pmu : priv->regmap_base;
1607cf04a17bSJianqun Xu 	else
1608cf04a17bSJianqun Xu 		regmap = priv->regmap_base;
160949c55878SDavid Wu 
161049c55878SDavid Wu 	/* get basic quadrupel of mux registers and the correct reg inside */
161149c55878SDavid Wu 	mux_type = bank->iomux[iomux_num].type;
161249c55878SDavid Wu 	reg = bank->iomux[iomux_num].offset;
161349c55878SDavid Wu 	if (mux_type & IOMUX_WIDTH_4BIT) {
161449c55878SDavid Wu 		if ((pin % 8) >= 4)
161549c55878SDavid Wu 			reg += 0x4;
161649c55878SDavid Wu 		bit = (pin % 4) * 4;
161749c55878SDavid Wu 		mask = 0xf;
161849c55878SDavid Wu 	} else if (mux_type & IOMUX_WIDTH_3BIT) {
161949c55878SDavid Wu 		if ((pin % 8) >= 5)
162049c55878SDavid Wu 			reg += 0x4;
162149c55878SDavid Wu 		bit = (pin % 8 % 5) * 3;
162249c55878SDavid Wu 		mask = 0x7;
162349c55878SDavid Wu 	} else {
162449c55878SDavid Wu 		bit = (pin % 8) * 2;
162549c55878SDavid Wu 		mask = 0x3;
162649c55878SDavid Wu 	}
162749c55878SDavid Wu 
162849c55878SDavid Wu 	if (bank->recalced_mask & BIT(pin))
162949c55878SDavid Wu 		rockchip_get_recalced_mux(bank, pin, &reg, &bit, &mask);
163049c55878SDavid Wu 
163149c55878SDavid Wu 	ret = regmap_read(regmap, reg, &val);
163249c55878SDavid Wu 	if (ret)
163349c55878SDavid Wu 		return ret;
163449c55878SDavid Wu 
163549c55878SDavid Wu 	return ((val >> bit) & mask);
163649c55878SDavid Wu }
163749c55878SDavid Wu 
163849c55878SDavid Wu static int rockchip_pinctrl_get_gpio_mux(struct udevice *dev, int banknum,
163949c55878SDavid Wu 					 int index)
164049c55878SDavid Wu {	struct rockchip_pinctrl_priv *priv = dev_get_priv(dev);
164149c55878SDavid Wu 	struct rockchip_pin_ctrl *ctrl = priv->ctrl;
164249c55878SDavid Wu 
164349c55878SDavid Wu 	return rockchip_get_mux(&ctrl->pin_banks[banknum], index);
164449c55878SDavid Wu }
164549c55878SDavid Wu 
164649c55878SDavid Wu static int rockchip_verify_mux(struct rockchip_pin_bank *bank,
164749c55878SDavid Wu 			       int pin, int mux)
164849c55878SDavid Wu {
164949c55878SDavid Wu 	int iomux_num = (pin / 8);
165049c55878SDavid Wu 
165149c55878SDavid Wu 	if (iomux_num > 3)
165249c55878SDavid Wu 		return -EINVAL;
165349c55878SDavid Wu 
165449c55878SDavid Wu 	if (bank->iomux[iomux_num].type & IOMUX_UNROUTED) {
165549c55878SDavid Wu 		debug("pin %d is unrouted\n", pin);
165649c55878SDavid Wu 		return -EINVAL;
165749c55878SDavid Wu 	}
165849c55878SDavid Wu 
165949c55878SDavid Wu 	if (bank->iomux[iomux_num].type & IOMUX_GPIO_ONLY) {
166049c55878SDavid Wu 		if (mux != IOMUX_GPIO_ONLY) {
166149c55878SDavid Wu 			debug("pin %d only supports a gpio mux\n", pin);
166249c55878SDavid Wu 			return -ENOTSUPP;
166349c55878SDavid Wu 		}
166449c55878SDavid Wu 	}
166549c55878SDavid Wu 
166649c55878SDavid Wu 	return 0;
166749c55878SDavid Wu }
166849c55878SDavid Wu 
166949c55878SDavid Wu /*
167049c55878SDavid Wu  * Set a new mux function for a pin.
167149c55878SDavid Wu  *
167249c55878SDavid Wu  * The register is divided into the upper and lower 16 bit. When changing
167349c55878SDavid Wu  * a value, the previous register value is not read and changed. Instead
167449c55878SDavid Wu  * it seems the changed bits are marked in the upper 16 bit, while the
167549c55878SDavid Wu  * changed value gets set in the same offset in the lower 16 bit.
167649c55878SDavid Wu  * All pin settings seem to be 2 bit wide in both the upper and lower
167749c55878SDavid Wu  * parts.
167849c55878SDavid Wu  * @bank: pin bank to change
167949c55878SDavid Wu  * @pin: pin to change
168049c55878SDavid Wu  * @mux: new mux function to set
168149c55878SDavid Wu  */
168249c55878SDavid Wu static int rockchip_set_mux(struct rockchip_pin_bank *bank, int pin, int mux)
168349c55878SDavid Wu {
168449c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
168549c55878SDavid Wu 	int iomux_num = (pin / 8);
168649c55878SDavid Wu 	struct regmap *regmap;
168749c55878SDavid Wu 	int reg, ret, mask, mux_type;
168849c55878SDavid Wu 	u8 bit;
168949e04eddSJianqun Xu 	u32 data;
169049c55878SDavid Wu 
169149c55878SDavid Wu 	ret = rockchip_verify_mux(bank, pin, mux);
169249c55878SDavid Wu 	if (ret < 0)
169349c55878SDavid Wu 		return ret;
169449c55878SDavid Wu 
169549c55878SDavid Wu 	if (bank->iomux[iomux_num].type & IOMUX_GPIO_ONLY)
169649c55878SDavid Wu 		return 0;
169749c55878SDavid Wu 
169849c55878SDavid Wu 	debug("setting mux of GPIO%d-%d to %d\n", bank->bank_num, pin, mux);
169949c55878SDavid Wu 
1700cf04a17bSJianqun Xu 	if (bank->iomux[iomux_num].type & IOMUX_SOURCE_PMU)
1701cf04a17bSJianqun Xu 		regmap = priv->regmap_pmu;
1702cf04a17bSJianqun Xu 	else if (bank->iomux[iomux_num].type & IOMUX_L_SOURCE_PMU)
1703cf04a17bSJianqun Xu 		regmap = (pin % 8 < 4) ? priv->regmap_pmu : priv->regmap_base;
1704cf04a17bSJianqun Xu 	else
1705cf04a17bSJianqun Xu 		regmap = priv->regmap_base;
170649c55878SDavid Wu 
170749c55878SDavid Wu 	/* get basic quadrupel of mux registers and the correct reg inside */
170849c55878SDavid Wu 	mux_type = bank->iomux[iomux_num].type;
170949c55878SDavid Wu 	reg = bank->iomux[iomux_num].offset;
171049c55878SDavid Wu 	if (mux_type & IOMUX_WIDTH_4BIT) {
171149c55878SDavid Wu 		if ((pin % 8) >= 4)
171249c55878SDavid Wu 			reg += 0x4;
171349c55878SDavid Wu 		bit = (pin % 4) * 4;
171449c55878SDavid Wu 		mask = 0xf;
171549c55878SDavid Wu 	} else if (mux_type & IOMUX_WIDTH_3BIT) {
171649c55878SDavid Wu 		if ((pin % 8) >= 5)
171749c55878SDavid Wu 			reg += 0x4;
171849c55878SDavid Wu 		bit = (pin % 8 % 5) * 3;
171949c55878SDavid Wu 		mask = 0x7;
172049c55878SDavid Wu 	} else {
172149c55878SDavid Wu 		bit = (pin % 8) * 2;
172249c55878SDavid Wu 		mask = 0x3;
172349c55878SDavid Wu 	}
172449c55878SDavid Wu 
172549c55878SDavid Wu 	if (bank->recalced_mask & BIT(pin))
172649c55878SDavid Wu 		rockchip_get_recalced_mux(bank, pin, &reg, &bit, &mask);
172749c55878SDavid Wu 
172849c55878SDavid Wu 	if (bank->route_mask & BIT(pin)) {
172949e04eddSJianqun Xu 		u32 route_reg = 0, route_val = 0;
173049e04eddSJianqun Xu 
173149e04eddSJianqun Xu 		ret = rockchip_get_mux_route(bank, pin, mux,
173249e04eddSJianqun Xu 					     &route_reg, &route_val);
173349e04eddSJianqun Xu 		switch (ret) {
173449e04eddSJianqun Xu 		case ROUTE_TYPE_DEFAULT:
173549e04eddSJianqun Xu 			regmap_write(regmap, route_reg, route_val);
173649e04eddSJianqun Xu 			break;
173749e04eddSJianqun Xu 		case ROUTE_TYPE_TOPGRF:
173849e04eddSJianqun Xu 			regmap_write(priv->regmap_base, route_reg, route_val);
173949e04eddSJianqun Xu 			break;
174049e04eddSJianqun Xu 		case ROUTE_TYPE_PMUGRF:
174149e04eddSJianqun Xu 			regmap_write(priv->regmap_pmu, route_reg, route_val);
174249e04eddSJianqun Xu 			break;
174349e04eddSJianqun Xu 		case ROUTE_TYPE_INVALID: /* Fall through */
174449e04eddSJianqun Xu 		default:
174549e04eddSJianqun Xu 			break;
174649c55878SDavid Wu 		}
174749c55878SDavid Wu 	}
174849c55878SDavid Wu 
17494bafc2daSDavid Wu 	if (mux_type & IOMUX_WRITABLE_32BIT) {
17508bf1bc66SDavid Wu 		regmap_read(regmap, reg, &data);
17514bafc2daSDavid Wu 		data &= ~(mask << bit);
17524bafc2daSDavid Wu 	} else {
175349c55878SDavid Wu 		data = (mask << (bit + 16));
17544bafc2daSDavid Wu 	}
17558bf1bc66SDavid Wu 
175649c55878SDavid Wu 	data |= (mux & mask) << bit;
175749c55878SDavid Wu 	ret = regmap_write(regmap, reg, data);
175849c55878SDavid Wu 
175949c55878SDavid Wu 	return ret;
176049c55878SDavid Wu }
176149c55878SDavid Wu 
176249c55878SDavid Wu #define PX30_PULL_PMU_OFFSET		0x10
176349c55878SDavid Wu #define PX30_PULL_GRF_OFFSET		0x60
176449c55878SDavid Wu #define PX30_PULL_BITS_PER_PIN		2
176549c55878SDavid Wu #define PX30_PULL_PINS_PER_REG		8
176649c55878SDavid Wu #define PX30_PULL_BANK_STRIDE		16
176749c55878SDavid Wu 
176849c55878SDavid Wu static void px30_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
176949c55878SDavid Wu 				       int pin_num, struct regmap **regmap,
177049c55878SDavid Wu 				       int *reg, u8 *bit)
177149c55878SDavid Wu {
177249c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
177349c55878SDavid Wu 
177449c55878SDavid Wu 	/* The first 32 pins of the first bank are located in PMU */
177549c55878SDavid Wu 	if (bank->bank_num == 0) {
177649c55878SDavid Wu 		*regmap = priv->regmap_pmu;
177749c55878SDavid Wu 		*reg = PX30_PULL_PMU_OFFSET;
177849c55878SDavid Wu 	} else {
177949c55878SDavid Wu 		*regmap = priv->regmap_base;
178049c55878SDavid Wu 		*reg = PX30_PULL_GRF_OFFSET;
178149c55878SDavid Wu 
178249c55878SDavid Wu 		/* correct the offset, as we're starting with the 2nd bank */
178349c55878SDavid Wu 		*reg -= 0x10;
178449c55878SDavid Wu 		*reg += bank->bank_num * PX30_PULL_BANK_STRIDE;
178549c55878SDavid Wu 	}
178649c55878SDavid Wu 
178749c55878SDavid Wu 	*reg += ((pin_num / PX30_PULL_PINS_PER_REG) * 4);
178849c55878SDavid Wu 	*bit = (pin_num % PX30_PULL_PINS_PER_REG);
178949c55878SDavid Wu 	*bit *= PX30_PULL_BITS_PER_PIN;
179049c55878SDavid Wu }
179149c55878SDavid Wu 
179249c55878SDavid Wu #define PX30_DRV_PMU_OFFSET		0x20
179349c55878SDavid Wu #define PX30_DRV_GRF_OFFSET		0xf0
179449c55878SDavid Wu #define PX30_DRV_BITS_PER_PIN		2
179549c55878SDavid Wu #define PX30_DRV_PINS_PER_REG		8
179649c55878SDavid Wu #define PX30_DRV_BANK_STRIDE		16
179749c55878SDavid Wu 
179849c55878SDavid Wu static void px30_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
179949c55878SDavid Wu 				      int pin_num, struct regmap **regmap,
180049c55878SDavid Wu 				      int *reg, u8 *bit)
180149c55878SDavid Wu {
180249c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
180349c55878SDavid Wu 
180449c55878SDavid Wu 	/* The first 32 pins of the first bank are located in PMU */
180549c55878SDavid Wu 	if (bank->bank_num == 0) {
180649c55878SDavid Wu 		*regmap = priv->regmap_pmu;
180749c55878SDavid Wu 		*reg = PX30_DRV_PMU_OFFSET;
180849c55878SDavid Wu 	} else {
180949c55878SDavid Wu 		*regmap = priv->regmap_base;
181049c55878SDavid Wu 		*reg = PX30_DRV_GRF_OFFSET;
181149c55878SDavid Wu 
181249c55878SDavid Wu 		/* correct the offset, as we're starting with the 2nd bank */
181349c55878SDavid Wu 		*reg -= 0x10;
181449c55878SDavid Wu 		*reg += bank->bank_num * PX30_DRV_BANK_STRIDE;
181549c55878SDavid Wu 	}
181649c55878SDavid Wu 
181749c55878SDavid Wu 	*reg += ((pin_num / PX30_DRV_PINS_PER_REG) * 4);
181849c55878SDavid Wu 	*bit = (pin_num % PX30_DRV_PINS_PER_REG);
181949c55878SDavid Wu 	*bit *= PX30_DRV_BITS_PER_PIN;
182049c55878SDavid Wu }
182149c55878SDavid Wu 
182249c55878SDavid Wu #define PX30_SCHMITT_PMU_OFFSET			0x38
182349c55878SDavid Wu #define PX30_SCHMITT_GRF_OFFSET			0xc0
182449c55878SDavid Wu #define PX30_SCHMITT_PINS_PER_PMU_REG		16
182549c55878SDavid Wu #define PX30_SCHMITT_BANK_STRIDE		16
182649c55878SDavid Wu #define PX30_SCHMITT_PINS_PER_GRF_REG		8
182749c55878SDavid Wu 
182849c55878SDavid Wu static int px30_calc_schmitt_reg_and_bit(struct rockchip_pin_bank *bank,
182949c55878SDavid Wu 					 int pin_num,
183049c55878SDavid Wu 					 struct regmap **regmap,
183149c55878SDavid Wu 					 int *reg, u8 *bit)
183249c55878SDavid Wu {
183349c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
183449c55878SDavid Wu 	int pins_per_reg;
183549c55878SDavid Wu 
183649c55878SDavid Wu 	if (bank->bank_num == 0) {
183749c55878SDavid Wu 		*regmap = priv->regmap_pmu;
183849c55878SDavid Wu 		*reg = PX30_SCHMITT_PMU_OFFSET;
183949c55878SDavid Wu 		pins_per_reg = PX30_SCHMITT_PINS_PER_PMU_REG;
184049c55878SDavid Wu 	} else {
184149c55878SDavid Wu 		*regmap = priv->regmap_base;
184249c55878SDavid Wu 		*reg = PX30_SCHMITT_GRF_OFFSET;
184349c55878SDavid Wu 		pins_per_reg = PX30_SCHMITT_PINS_PER_GRF_REG;
184449c55878SDavid Wu 		*reg += (bank->bank_num - 1) * PX30_SCHMITT_BANK_STRIDE;
184549c55878SDavid Wu 	}
184649c55878SDavid Wu 	*reg += ((pin_num / pins_per_reg) * 4);
184749c55878SDavid Wu 	*bit = pin_num % pins_per_reg;
184849c55878SDavid Wu 
184949c55878SDavid Wu 	return 0;
185049c55878SDavid Wu }
185149c55878SDavid Wu 
185249c55878SDavid Wu #define RV1108_PULL_PMU_OFFSET		0x10
185349c55878SDavid Wu #define RV1108_PULL_OFFSET		0x110
185449c55878SDavid Wu #define RV1108_PULL_PINS_PER_REG	8
185549c55878SDavid Wu #define RV1108_PULL_BITS_PER_PIN	2
185649c55878SDavid Wu #define RV1108_PULL_BANK_STRIDE		16
185749c55878SDavid Wu 
185849c55878SDavid Wu static void rv1108_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
185949c55878SDavid Wu 					 int pin_num, struct regmap **regmap,
186049c55878SDavid Wu 					 int *reg, u8 *bit)
186149c55878SDavid Wu {
186249c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
186349c55878SDavid Wu 
186449c55878SDavid Wu 	/* The first 24 pins of the first bank are located in PMU */
186549c55878SDavid Wu 	if (bank->bank_num == 0) {
186649c55878SDavid Wu 		*regmap = priv->regmap_pmu;
186749c55878SDavid Wu 		*reg = RV1108_PULL_PMU_OFFSET;
186849c55878SDavid Wu 	} else {
186949c55878SDavid Wu 		*reg = RV1108_PULL_OFFSET;
187049c55878SDavid Wu 		*regmap = priv->regmap_base;
187149c55878SDavid Wu 		/* correct the offset, as we're starting with the 2nd bank */
187249c55878SDavid Wu 		*reg -= 0x10;
187349c55878SDavid Wu 		*reg += bank->bank_num * RV1108_PULL_BANK_STRIDE;
187449c55878SDavid Wu 	}
187549c55878SDavid Wu 
187649c55878SDavid Wu 	*reg += ((pin_num / RV1108_PULL_PINS_PER_REG) * 4);
187749c55878SDavid Wu 	*bit = (pin_num % RV1108_PULL_PINS_PER_REG);
187849c55878SDavid Wu 	*bit *= RV1108_PULL_BITS_PER_PIN;
187949c55878SDavid Wu }
188049c55878SDavid Wu 
188149c55878SDavid Wu #define RV1108_DRV_PMU_OFFSET		0x20
188249c55878SDavid Wu #define RV1108_DRV_GRF_OFFSET		0x210
188349c55878SDavid Wu #define RV1108_DRV_BITS_PER_PIN		2
188449c55878SDavid Wu #define RV1108_DRV_PINS_PER_REG		8
188549c55878SDavid Wu #define RV1108_DRV_BANK_STRIDE		16
188649c55878SDavid Wu 
188749c55878SDavid Wu static void rv1108_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
188849c55878SDavid Wu 					int pin_num, struct regmap **regmap,
188949c55878SDavid Wu 					int *reg, u8 *bit)
189049c55878SDavid Wu {
189149c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
189249c55878SDavid Wu 
189349c55878SDavid Wu 	/* The first 24 pins of the first bank are located in PMU */
189449c55878SDavid Wu 	if (bank->bank_num == 0) {
189549c55878SDavid Wu 		*regmap = priv->regmap_pmu;
189649c55878SDavid Wu 		*reg = RV1108_DRV_PMU_OFFSET;
189749c55878SDavid Wu 	} else {
189849c55878SDavid Wu 		*regmap = priv->regmap_base;
189949c55878SDavid Wu 		*reg = RV1108_DRV_GRF_OFFSET;
190049c55878SDavid Wu 
190149c55878SDavid Wu 		/* correct the offset, as we're starting with the 2nd bank */
190249c55878SDavid Wu 		*reg -= 0x10;
190349c55878SDavid Wu 		*reg += bank->bank_num * RV1108_DRV_BANK_STRIDE;
190449c55878SDavid Wu 	}
190549c55878SDavid Wu 
190649c55878SDavid Wu 	*reg += ((pin_num / RV1108_DRV_PINS_PER_REG) * 4);
190749c55878SDavid Wu 	*bit = pin_num % RV1108_DRV_PINS_PER_REG;
190849c55878SDavid Wu 	*bit *= RV1108_DRV_BITS_PER_PIN;
190949c55878SDavid Wu }
191049c55878SDavid Wu 
191149c55878SDavid Wu #define RV1108_SCHMITT_PMU_OFFSET		0x30
191249c55878SDavid Wu #define RV1108_SCHMITT_GRF_OFFSET		0x388
191349c55878SDavid Wu #define RV1108_SCHMITT_BANK_STRIDE		8
191449c55878SDavid Wu #define RV1108_SCHMITT_PINS_PER_GRF_REG		16
191549c55878SDavid Wu #define RV1108_SCHMITT_PINS_PER_PMU_REG		8
191649c55878SDavid Wu 
191749c55878SDavid Wu static int rv1108_calc_schmitt_reg_and_bit(struct rockchip_pin_bank *bank,
191849c55878SDavid Wu 					   int pin_num,
191949c55878SDavid Wu 					   struct regmap **regmap,
192049c55878SDavid Wu 					   int *reg, u8 *bit)
192149c55878SDavid Wu {
192249c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
192349c55878SDavid Wu 	int pins_per_reg;
192449c55878SDavid Wu 
192549c55878SDavid Wu 	if (bank->bank_num == 0) {
192649c55878SDavid Wu 		*regmap = priv->regmap_pmu;
192749c55878SDavid Wu 		*reg = RV1108_SCHMITT_PMU_OFFSET;
192849c55878SDavid Wu 		pins_per_reg = RV1108_SCHMITT_PINS_PER_PMU_REG;
192949c55878SDavid Wu 	} else {
193049c55878SDavid Wu 		*regmap = priv->regmap_base;
193149c55878SDavid Wu 		*reg = RV1108_SCHMITT_GRF_OFFSET;
193249c55878SDavid Wu 		pins_per_reg = RV1108_SCHMITT_PINS_PER_GRF_REG;
193349c55878SDavid Wu 		*reg += (bank->bank_num  - 1) * RV1108_SCHMITT_BANK_STRIDE;
193449c55878SDavid Wu 	}
193549c55878SDavid Wu 	*reg += ((pin_num / pins_per_reg) * 4);
193649c55878SDavid Wu 	*bit = pin_num % pins_per_reg;
193749c55878SDavid Wu 
193849c55878SDavid Wu 	return 0;
193949c55878SDavid Wu }
194049c55878SDavid Wu 
1941cf04a17bSJianqun Xu #define RV1126_PULL_PMU_OFFSET		0x40
1942cf04a17bSJianqun Xu #define RV1126_PULL_GRF_GPIO1A0_OFFSET		0x10108
1943cf04a17bSJianqun Xu #define RV1126_PULL_PINS_PER_REG	8
1944cf04a17bSJianqun Xu #define RV1126_PULL_BITS_PER_PIN	2
1945cf04a17bSJianqun Xu #define RV1126_PULL_BANK_STRIDE		16
1946cf04a17bSJianqun Xu #define RV1126_GPIO_C4_D7(p)	(p >= 20 && p <= 31) /* GPIO0_C4 ~ GPIO0_D7 */
1947cf04a17bSJianqun Xu 
1948cf04a17bSJianqun Xu static void rv1126_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
1949cf04a17bSJianqun Xu 					 int pin_num, struct regmap **regmap,
1950cf04a17bSJianqun Xu 					 int *reg, u8 *bit)
1951cf04a17bSJianqun Xu {
1952cf04a17bSJianqun Xu 	struct rockchip_pinctrl_priv *priv = bank->priv;
1953cf04a17bSJianqun Xu 
1954cf04a17bSJianqun Xu 	/* The first 24 pins of the first bank are located in PMU */
1955cf04a17bSJianqun Xu 	if (bank->bank_num == 0) {
1956cf04a17bSJianqun Xu 		if (RV1126_GPIO_C4_D7(pin_num)) {
1957cf04a17bSJianqun Xu 			*regmap = priv->regmap_base;
1958cf04a17bSJianqun Xu 			*reg = RV1126_PULL_GRF_GPIO1A0_OFFSET;
1959cf04a17bSJianqun Xu 			*reg -= (((31 - pin_num) / RV1126_PULL_PINS_PER_REG + 1) * 4);
1960cf04a17bSJianqun Xu 			*bit = pin_num % RV1126_PULL_PINS_PER_REG;
1961cf04a17bSJianqun Xu 			*bit *= RV1126_PULL_BITS_PER_PIN;
1962cf04a17bSJianqun Xu 			return;
1963cf04a17bSJianqun Xu 		}
1964cf04a17bSJianqun Xu 		*regmap = priv->regmap_pmu;
1965cf04a17bSJianqun Xu 		*reg = RV1126_PULL_PMU_OFFSET;
1966cf04a17bSJianqun Xu 	} else {
1967cf04a17bSJianqun Xu 		*reg = RV1126_PULL_GRF_GPIO1A0_OFFSET;
1968cf04a17bSJianqun Xu 		*regmap = priv->regmap_base;
1969d499d466SJianqun Xu 		*reg += (bank->bank_num - 1) * RV1126_PULL_BANK_STRIDE;
1970cf04a17bSJianqun Xu 	}
1971cf04a17bSJianqun Xu 
1972cf04a17bSJianqun Xu 	*reg += ((pin_num / RV1126_PULL_PINS_PER_REG) * 4);
1973cf04a17bSJianqun Xu 	*bit = (pin_num % RV1126_PULL_PINS_PER_REG);
1974cf04a17bSJianqun Xu 	*bit *= RV1126_PULL_BITS_PER_PIN;
1975cf04a17bSJianqun Xu }
1976cf04a17bSJianqun Xu 
1977cf04a17bSJianqun Xu #define RV1126_DRV_PMU_OFFSET		0x20
1978cf04a17bSJianqun Xu #define RV1126_DRV_GRF_GPIO1A0_OFFSET		0x10090
1979cf04a17bSJianqun Xu #define RV1126_DRV_BITS_PER_PIN		4
1980cf04a17bSJianqun Xu #define RV1126_DRV_PINS_PER_REG		4
1981cf04a17bSJianqun Xu #define RV1126_DRV_BANK_STRIDE		32
1982cf04a17bSJianqun Xu 
1983cf04a17bSJianqun Xu static void rv1126_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
1984cf04a17bSJianqun Xu 					int pin_num, struct regmap **regmap,
1985cf04a17bSJianqun Xu 					int *reg, u8 *bit)
1986cf04a17bSJianqun Xu {
1987cf04a17bSJianqun Xu 	struct rockchip_pinctrl_priv *priv = bank->priv;
1988cf04a17bSJianqun Xu 
1989cf04a17bSJianqun Xu 	/* The first 24 pins of the first bank are located in PMU */
1990cf04a17bSJianqun Xu 	if (bank->bank_num == 0) {
1991cf04a17bSJianqun Xu 		if (RV1126_GPIO_C4_D7(pin_num)) {
1992cf04a17bSJianqun Xu 			*regmap = priv->regmap_base;
1993cf04a17bSJianqun Xu 			*reg = RV1126_DRV_GRF_GPIO1A0_OFFSET;
1994cf04a17bSJianqun Xu 			*reg -= (((31 - pin_num) / RV1126_DRV_PINS_PER_REG + 1) * 4);
1995d499d466SJianqun Xu 			*reg -= 0x4;
1996cf04a17bSJianqun Xu 			*bit = pin_num % RV1126_DRV_PINS_PER_REG;
1997cf04a17bSJianqun Xu 			*bit *= RV1126_DRV_BITS_PER_PIN;
1998cf04a17bSJianqun Xu 			return;
1999cf04a17bSJianqun Xu 		}
2000cf04a17bSJianqun Xu 		*regmap = priv->regmap_pmu;
2001cf04a17bSJianqun Xu 		*reg = RV1126_DRV_PMU_OFFSET;
2002cf04a17bSJianqun Xu 	} else {
2003cf04a17bSJianqun Xu 		*regmap = priv->regmap_base;
2004cf04a17bSJianqun Xu 		*reg = RV1126_DRV_GRF_GPIO1A0_OFFSET;
2005d499d466SJianqun Xu 		*reg += (bank->bank_num - 1) * RV1126_DRV_BANK_STRIDE;
2006cf04a17bSJianqun Xu 	}
2007cf04a17bSJianqun Xu 
2008cf04a17bSJianqun Xu 	*reg += ((pin_num / RV1126_DRV_PINS_PER_REG) * 4);
2009cf04a17bSJianqun Xu 	*bit = pin_num % RV1126_DRV_PINS_PER_REG;
2010cf04a17bSJianqun Xu 	*bit *= RV1126_DRV_BITS_PER_PIN;
2011cf04a17bSJianqun Xu }
2012cf04a17bSJianqun Xu 
2013cf04a17bSJianqun Xu #define RV1126_SCHMITT_PMU_OFFSET		0x60
2014cf04a17bSJianqun Xu #define RV1126_SCHMITT_GRF_GPIO1A0_OFFSET		0x10188
2015cf04a17bSJianqun Xu #define RV1126_SCHMITT_BANK_STRIDE		16
2016cf04a17bSJianqun Xu #define RV1126_SCHMITT_PINS_PER_GRF_REG		8
2017cf04a17bSJianqun Xu #define RV1126_SCHMITT_PINS_PER_PMU_REG		8
2018cf04a17bSJianqun Xu 
2019cf04a17bSJianqun Xu static int rv1126_calc_schmitt_reg_and_bit(struct rockchip_pin_bank *bank,
2020cf04a17bSJianqun Xu 					   int pin_num,
2021cf04a17bSJianqun Xu 					   struct regmap **regmap,
2022cf04a17bSJianqun Xu 					   int *reg, u8 *bit)
2023cf04a17bSJianqun Xu {
2024cf04a17bSJianqun Xu 	struct rockchip_pinctrl_priv *priv = bank->priv;
2025cf04a17bSJianqun Xu 	int pins_per_reg;
2026cf04a17bSJianqun Xu 
2027cf04a17bSJianqun Xu 	if (bank->bank_num == 0) {
2028cf04a17bSJianqun Xu 		if (RV1126_GPIO_C4_D7(pin_num)) {
2029cf04a17bSJianqun Xu 			*regmap = priv->regmap_base;
2030cf04a17bSJianqun Xu 			*reg = RV1126_SCHMITT_GRF_GPIO1A0_OFFSET;
2031cf04a17bSJianqun Xu 			*reg -= (((31 - pin_num) / RV1126_SCHMITT_PINS_PER_GRF_REG + 1) * 4);
2032cf04a17bSJianqun Xu 			*bit = pin_num % RV1126_SCHMITT_PINS_PER_GRF_REG;
2033cf04a17bSJianqun Xu 			return 0;
2034cf04a17bSJianqun Xu 		}
2035cf04a17bSJianqun Xu 		*regmap = priv->regmap_pmu;
2036cf04a17bSJianqun Xu 		*reg = RV1126_SCHMITT_PMU_OFFSET;
2037cf04a17bSJianqun Xu 		pins_per_reg = RV1126_SCHMITT_PINS_PER_PMU_REG;
2038cf04a17bSJianqun Xu 	} else {
2039cf04a17bSJianqun Xu 		*regmap = priv->regmap_base;
2040cf04a17bSJianqun Xu 		*reg = RV1126_SCHMITT_GRF_GPIO1A0_OFFSET;
2041cf04a17bSJianqun Xu 		pins_per_reg = RV1126_SCHMITT_PINS_PER_GRF_REG;
2042d499d466SJianqun Xu 		*reg += (bank->bank_num - 1) * RV1126_SCHMITT_BANK_STRIDE;
2043cf04a17bSJianqun Xu 	}
2044cf04a17bSJianqun Xu 	*reg += ((pin_num / pins_per_reg) * 4);
2045cf04a17bSJianqun Xu 	*bit = pin_num % pins_per_reg;
2046cf04a17bSJianqun Xu 
2047cf04a17bSJianqun Xu 	return 0;
2048cf04a17bSJianqun Xu }
2049cf04a17bSJianqun Xu 
2050a2a3fc8fSJianqun Xu #define RK1808_PULL_PMU_OFFSET		0x10
2051a2a3fc8fSJianqun Xu #define RK1808_PULL_GRF_OFFSET		0x80
2052a2a3fc8fSJianqun Xu #define RK1808_PULL_PINS_PER_REG	8
2053a2a3fc8fSJianqun Xu #define RK1808_PULL_BITS_PER_PIN	2
2054a2a3fc8fSJianqun Xu #define RK1808_PULL_BANK_STRIDE		16
2055a2a3fc8fSJianqun Xu 
2056a2a3fc8fSJianqun Xu static void rk1808_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
2057a2a3fc8fSJianqun Xu 					 int pin_num,
2058a2a3fc8fSJianqun Xu 					 struct regmap **regmap,
2059a2a3fc8fSJianqun Xu 					 int *reg, u8 *bit)
2060a2a3fc8fSJianqun Xu {
2061a2a3fc8fSJianqun Xu 	struct rockchip_pinctrl_priv *priv = bank->priv;
2062a2a3fc8fSJianqun Xu 
2063a2a3fc8fSJianqun Xu 	if (bank->bank_num == 0) {
2064a2a3fc8fSJianqun Xu 		*regmap = priv->regmap_pmu;
2065a2a3fc8fSJianqun Xu 		*reg = RK1808_PULL_PMU_OFFSET;
2066a2a3fc8fSJianqun Xu 	} else {
2067a2a3fc8fSJianqun Xu 		*reg = RK1808_PULL_GRF_OFFSET;
2068a2a3fc8fSJianqun Xu 		*regmap = priv->regmap_base;
2069a2a3fc8fSJianqun Xu 	}
2070a2a3fc8fSJianqun Xu 
2071a2a3fc8fSJianqun Xu 	*reg += ((pin_num / RK1808_PULL_PINS_PER_REG) * 4);
2072a2a3fc8fSJianqun Xu 	*bit = (pin_num % RK1808_PULL_PINS_PER_REG);
2073a2a3fc8fSJianqun Xu 	*bit *= RK1808_PULL_BITS_PER_PIN;
2074a2a3fc8fSJianqun Xu }
2075a2a3fc8fSJianqun Xu 
2076a2a3fc8fSJianqun Xu #define RK1808_DRV_PMU_OFFSET		0x20
2077a2a3fc8fSJianqun Xu #define RK1808_DRV_GRF_OFFSET		0x140
2078a2a3fc8fSJianqun Xu #define RK1808_DRV_BITS_PER_PIN		2
2079a2a3fc8fSJianqun Xu #define RK1808_DRV_PINS_PER_REG		8
2080a2a3fc8fSJianqun Xu #define RK1808_DRV_BANK_STRIDE		16
2081a2a3fc8fSJianqun Xu 
2082a2a3fc8fSJianqun Xu static void rk1808_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
2083a2a3fc8fSJianqun Xu 					int pin_num,
2084a2a3fc8fSJianqun Xu 					struct regmap **regmap,
2085a2a3fc8fSJianqun Xu 					int *reg, u8 *bit)
2086a2a3fc8fSJianqun Xu {
2087a2a3fc8fSJianqun Xu 	struct rockchip_pinctrl_priv *priv = bank->priv;
2088a2a3fc8fSJianqun Xu 
2089a2a3fc8fSJianqun Xu 	if (bank->bank_num == 0) {
2090a2a3fc8fSJianqun Xu 		*regmap = priv->regmap_pmu;
2091a2a3fc8fSJianqun Xu 		*reg = RK1808_DRV_PMU_OFFSET;
2092a2a3fc8fSJianqun Xu 	} else {
2093a2a3fc8fSJianqun Xu 		*regmap = priv->regmap_base;
2094a2a3fc8fSJianqun Xu 		*reg = RK1808_DRV_GRF_OFFSET;
2095a2a3fc8fSJianqun Xu 	}
2096a2a3fc8fSJianqun Xu 
2097a2a3fc8fSJianqun Xu 	*reg += ((pin_num / RK1808_DRV_PINS_PER_REG) * 4);
2098a2a3fc8fSJianqun Xu 	*bit = pin_num % RK1808_DRV_PINS_PER_REG;
2099a2a3fc8fSJianqun Xu 	*bit *= RK1808_DRV_BITS_PER_PIN;
2100a2a3fc8fSJianqun Xu }
2101a2a3fc8fSJianqun Xu 
2102a2a3fc8fSJianqun Xu #define RK1808_SCHMITT_PMU_OFFSET		0x0040
2103a2a3fc8fSJianqun Xu #define RK1808_SCHMITT_GRF_OFFSET		0x0100
2104a2a3fc8fSJianqun Xu #define RK1808_SCHMITT_BANK_STRIDE		16
2105a2a3fc8fSJianqun Xu #define RK1808_SCHMITT_PINS_PER_REG		8
2106a2a3fc8fSJianqun Xu 
2107a2a3fc8fSJianqun Xu static int rk1808_calc_schmitt_reg_and_bit(struct rockchip_pin_bank *bank,
2108a2a3fc8fSJianqun Xu 					   int pin_num,
2109a2a3fc8fSJianqun Xu 					   struct regmap **regmap,
2110a2a3fc8fSJianqun Xu 					   int *reg, u8 *bit)
2111a2a3fc8fSJianqun Xu {
2112a2a3fc8fSJianqun Xu 	struct rockchip_pinctrl_priv *priv = bank->priv;
2113a2a3fc8fSJianqun Xu 
2114a2a3fc8fSJianqun Xu 	if (bank->bank_num == 0) {
2115a2a3fc8fSJianqun Xu 		*regmap = priv->regmap_pmu;
2116a2a3fc8fSJianqun Xu 		*reg = RK1808_SCHMITT_PMU_OFFSET;
2117a2a3fc8fSJianqun Xu 	} else {
2118a2a3fc8fSJianqun Xu 		*regmap = priv->regmap_base;
2119a2a3fc8fSJianqun Xu 		*reg = RK1808_SCHMITT_GRF_OFFSET;
2120a2a3fc8fSJianqun Xu 		*reg += (bank->bank_num  - 1) * RK1808_SCHMITT_BANK_STRIDE;
2121a2a3fc8fSJianqun Xu 	}
2122a2a3fc8fSJianqun Xu 	*reg += ((pin_num / RK1808_SCHMITT_PINS_PER_REG) * 4);
2123a2a3fc8fSJianqun Xu 	*bit = pin_num % RK1808_SCHMITT_PINS_PER_REG;
2124a2a3fc8fSJianqun Xu 
2125a2a3fc8fSJianqun Xu 	return 0;
2126a2a3fc8fSJianqun Xu }
2127a2a3fc8fSJianqun Xu 
212849c55878SDavid Wu #define RK2928_PULL_OFFSET		0x118
212949c55878SDavid Wu #define RK2928_PULL_PINS_PER_REG	16
213049c55878SDavid Wu #define RK2928_PULL_BANK_STRIDE		8
213149c55878SDavid Wu 
213249c55878SDavid Wu static void rk2928_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
213349c55878SDavid Wu 					 int pin_num, struct regmap **regmap,
213449c55878SDavid Wu 					 int *reg, u8 *bit)
213549c55878SDavid Wu {
213649c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
213749c55878SDavid Wu 
213849c55878SDavid Wu 	*regmap = priv->regmap_base;
213949c55878SDavid Wu 	*reg = RK2928_PULL_OFFSET;
214049c55878SDavid Wu 	*reg += bank->bank_num * RK2928_PULL_BANK_STRIDE;
214149c55878SDavid Wu 	*reg += (pin_num / RK2928_PULL_PINS_PER_REG) * 4;
214249c55878SDavid Wu 
214349c55878SDavid Wu 	*bit = pin_num % RK2928_PULL_PINS_PER_REG;
214449c55878SDavid Wu };
214549c55878SDavid Wu 
214649c55878SDavid Wu #define RK3128_PULL_OFFSET	0x118
214749c55878SDavid Wu 
214849c55878SDavid Wu static void rk3128_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
214949c55878SDavid Wu 					 int pin_num, struct regmap **regmap,
215049c55878SDavid Wu 					 int *reg, u8 *bit)
215149c55878SDavid Wu {
215249c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
215349c55878SDavid Wu 
215449c55878SDavid Wu 	*regmap = priv->regmap_base;
215549c55878SDavid Wu 	*reg = RK3128_PULL_OFFSET;
215649c55878SDavid Wu 	*reg += bank->bank_num * RK2928_PULL_BANK_STRIDE;
215749c55878SDavid Wu 	*reg += ((pin_num / RK2928_PULL_PINS_PER_REG) * 4);
215849c55878SDavid Wu 
215949c55878SDavid Wu 	*bit = pin_num % RK2928_PULL_PINS_PER_REG;
216049c55878SDavid Wu }
216149c55878SDavid Wu 
216249c55878SDavid Wu #define RK3188_PULL_OFFSET		0x164
216349c55878SDavid Wu #define RK3188_PULL_BITS_PER_PIN	2
216449c55878SDavid Wu #define RK3188_PULL_PINS_PER_REG	8
216549c55878SDavid Wu #define RK3188_PULL_BANK_STRIDE		16
216649c55878SDavid Wu #define RK3188_PULL_PMU_OFFSET		0x64
216749c55878SDavid Wu 
216849c55878SDavid Wu static void rk3188_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
216949c55878SDavid Wu 					 int pin_num, struct regmap **regmap,
217049c55878SDavid Wu 					 int *reg, u8 *bit)
217149c55878SDavid Wu {
217249c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
217349c55878SDavid Wu 
217449c55878SDavid Wu 	/* The first 12 pins of the first bank are located elsewhere */
217549c55878SDavid Wu 	if (bank->bank_num == 0 && pin_num < 12) {
217649c55878SDavid Wu 		*regmap = priv->regmap_pmu;
217749c55878SDavid Wu 		*reg = RK3188_PULL_PMU_OFFSET;
217849c55878SDavid Wu 
217949c55878SDavid Wu 		*reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4);
218049c55878SDavid Wu 		*bit = pin_num % RK3188_PULL_PINS_PER_REG;
218149c55878SDavid Wu 		*bit *= RK3188_PULL_BITS_PER_PIN;
218249c55878SDavid Wu 	} else {
218349c55878SDavid Wu 		*regmap = priv->regmap_base;
218449c55878SDavid Wu 		*reg = RK3188_PULL_OFFSET;
218549c55878SDavid Wu 
218649c55878SDavid Wu 		/* correct the offset, as it is the 2nd pull register */
218749c55878SDavid Wu 		*reg -= 4;
218849c55878SDavid Wu 		*reg += bank->bank_num * RK3188_PULL_BANK_STRIDE;
218949c55878SDavid Wu 		*reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4);
219049c55878SDavid Wu 
219149c55878SDavid Wu 		/*
219249c55878SDavid Wu 		 * The bits in these registers have an inverse ordering
219349c55878SDavid Wu 		 * with the lowest pin being in bits 15:14 and the highest
219449c55878SDavid Wu 		 * pin in bits 1:0
219549c55878SDavid Wu 		 */
219649c55878SDavid Wu 		*bit = 7 - (pin_num % RK3188_PULL_PINS_PER_REG);
219749c55878SDavid Wu 		*bit *= RK3188_PULL_BITS_PER_PIN;
219849c55878SDavid Wu 	}
219949c55878SDavid Wu }
220049c55878SDavid Wu 
220149c55878SDavid Wu #define RK3288_PULL_OFFSET		0x140
220249c55878SDavid Wu static void rk3288_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
220349c55878SDavid Wu 					 int pin_num, struct regmap **regmap,
220449c55878SDavid Wu 					 int *reg, u8 *bit)
220549c55878SDavid Wu {
220649c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
220749c55878SDavid Wu 
220849c55878SDavid Wu 	/* The first 24 pins of the first bank are located in PMU */
220949c55878SDavid Wu 	if (bank->bank_num == 0) {
221049c55878SDavid Wu 		*regmap = priv->regmap_pmu;
221149c55878SDavid Wu 		*reg = RK3188_PULL_PMU_OFFSET;
221249c55878SDavid Wu 
221349c55878SDavid Wu 		*reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4);
221449c55878SDavid Wu 		*bit = pin_num % RK3188_PULL_PINS_PER_REG;
221549c55878SDavid Wu 		*bit *= RK3188_PULL_BITS_PER_PIN;
221649c55878SDavid Wu 	} else {
221749c55878SDavid Wu 		*regmap = priv->regmap_base;
221849c55878SDavid Wu 		*reg = RK3288_PULL_OFFSET;
221949c55878SDavid Wu 
222049c55878SDavid Wu 		/* correct the offset, as we're starting with the 2nd bank */
222149c55878SDavid Wu 		*reg -= 0x10;
222249c55878SDavid Wu 		*reg += bank->bank_num * RK3188_PULL_BANK_STRIDE;
222349c55878SDavid Wu 		*reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4);
222449c55878SDavid Wu 
222549c55878SDavid Wu 		*bit = (pin_num % RK3188_PULL_PINS_PER_REG);
222649c55878SDavid Wu 		*bit *= RK3188_PULL_BITS_PER_PIN;
222749c55878SDavid Wu 	}
222849c55878SDavid Wu }
222949c55878SDavid Wu 
223049c55878SDavid Wu #define RK3288_DRV_PMU_OFFSET		0x70
223149c55878SDavid Wu #define RK3288_DRV_GRF_OFFSET		0x1c0
223249c55878SDavid Wu #define RK3288_DRV_BITS_PER_PIN		2
223349c55878SDavid Wu #define RK3288_DRV_PINS_PER_REG		8
223449c55878SDavid Wu #define RK3288_DRV_BANK_STRIDE		16
223549c55878SDavid Wu 
223649c55878SDavid Wu static void rk3288_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
223749c55878SDavid Wu 					int pin_num, struct regmap **regmap,
223849c55878SDavid Wu 					int *reg, u8 *bit)
223949c55878SDavid Wu {
224049c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
224149c55878SDavid Wu 
224249c55878SDavid Wu 	/* The first 24 pins of the first bank are located in PMU */
224349c55878SDavid Wu 	if (bank->bank_num == 0) {
224449c55878SDavid Wu 		*regmap = priv->regmap_pmu;
224549c55878SDavid Wu 		*reg = RK3288_DRV_PMU_OFFSET;
224649c55878SDavid Wu 
224749c55878SDavid Wu 		*reg += ((pin_num / RK3288_DRV_PINS_PER_REG) * 4);
224849c55878SDavid Wu 		*bit = pin_num % RK3288_DRV_PINS_PER_REG;
224949c55878SDavid Wu 		*bit *= RK3288_DRV_BITS_PER_PIN;
225049c55878SDavid Wu 	} else {
225149c55878SDavid Wu 		*regmap = priv->regmap_base;
225249c55878SDavid Wu 		*reg = RK3288_DRV_GRF_OFFSET;
225349c55878SDavid Wu 
225449c55878SDavid Wu 		/* correct the offset, as we're starting with the 2nd bank */
225549c55878SDavid Wu 		*reg -= 0x10;
225649c55878SDavid Wu 		*reg += bank->bank_num * RK3288_DRV_BANK_STRIDE;
225749c55878SDavid Wu 		*reg += ((pin_num / RK3288_DRV_PINS_PER_REG) * 4);
225849c55878SDavid Wu 
225949c55878SDavid Wu 		*bit = (pin_num % RK3288_DRV_PINS_PER_REG);
226049c55878SDavid Wu 		*bit *= RK3288_DRV_BITS_PER_PIN;
226149c55878SDavid Wu 	}
226249c55878SDavid Wu }
226349c55878SDavid Wu 
226449c55878SDavid Wu #define RK3228_PULL_OFFSET		0x100
226549c55878SDavid Wu 
226649c55878SDavid Wu static void rk3228_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
226749c55878SDavid Wu 					 int pin_num, struct regmap **regmap,
226849c55878SDavid Wu 					 int *reg, u8 *bit)
226949c55878SDavid Wu {
227049c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
227149c55878SDavid Wu 
227249c55878SDavid Wu 	*regmap = priv->regmap_base;
227349c55878SDavid Wu 	*reg = RK3228_PULL_OFFSET;
227449c55878SDavid Wu 	*reg += bank->bank_num * RK3188_PULL_BANK_STRIDE;
227549c55878SDavid Wu 	*reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4);
227649c55878SDavid Wu 
227749c55878SDavid Wu 	*bit = (pin_num % RK3188_PULL_PINS_PER_REG);
227849c55878SDavid Wu 	*bit *= RK3188_PULL_BITS_PER_PIN;
227949c55878SDavid Wu }
228049c55878SDavid Wu 
228149c55878SDavid Wu #define RK3228_DRV_GRF_OFFSET		0x200
228249c55878SDavid Wu 
228349c55878SDavid Wu static void rk3228_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
228449c55878SDavid Wu 					int pin_num, struct regmap **regmap,
228549c55878SDavid Wu 					int *reg, u8 *bit)
228649c55878SDavid Wu {
228749c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
228849c55878SDavid Wu 
228949c55878SDavid Wu 	*regmap = priv->regmap_base;
229049c55878SDavid Wu 	*reg = RK3228_DRV_GRF_OFFSET;
229149c55878SDavid Wu 	*reg += bank->bank_num * RK3288_DRV_BANK_STRIDE;
229249c55878SDavid Wu 	*reg += ((pin_num / RK3288_DRV_PINS_PER_REG) * 4);
229349c55878SDavid Wu 
229449c55878SDavid Wu 	*bit = (pin_num % RK3288_DRV_PINS_PER_REG);
229549c55878SDavid Wu 	*bit *= RK3288_DRV_BITS_PER_PIN;
229649c55878SDavid Wu }
229749c55878SDavid Wu 
2298b3077611SDavid Wu #define RK3308_PULL_OFFSET		0xa0
2299b3077611SDavid Wu 
2300b3077611SDavid Wu static void rk3308_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
2301b3077611SDavid Wu 					 int pin_num, struct regmap **regmap,
2302b3077611SDavid Wu 					 int *reg, u8 *bit)
2303b3077611SDavid Wu {
2304b3077611SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
2305b3077611SDavid Wu 
2306b3077611SDavid Wu 	*regmap = priv->regmap_base;
2307b3077611SDavid Wu 	*reg = RK3308_PULL_OFFSET;
2308b3077611SDavid Wu 	*reg += bank->bank_num * RK3188_PULL_BANK_STRIDE;
2309b3077611SDavid Wu 	*reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4);
2310b3077611SDavid Wu 
2311b3077611SDavid Wu 	*bit = (pin_num % RK3188_PULL_PINS_PER_REG);
2312b3077611SDavid Wu 	*bit *= RK3188_PULL_BITS_PER_PIN;
2313b3077611SDavid Wu }
2314b3077611SDavid Wu 
2315b3077611SDavid Wu #define RK3308_DRV_GRF_OFFSET		0x100
2316b3077611SDavid Wu 
2317b3077611SDavid Wu static void rk3308_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
2318b3077611SDavid Wu 					int pin_num, struct regmap **regmap,
2319b3077611SDavid Wu 					int *reg, u8 *bit)
2320b3077611SDavid Wu {
2321b3077611SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
2322b3077611SDavid Wu 
2323b3077611SDavid Wu 	*regmap = priv->regmap_base;
2324b3077611SDavid Wu 	*reg = RK3308_DRV_GRF_OFFSET;
2325b3077611SDavid Wu 	*reg += bank->bank_num * RK3288_DRV_BANK_STRIDE;
2326b3077611SDavid Wu 	*reg += ((pin_num / RK3288_DRV_PINS_PER_REG) * 4);
2327b3077611SDavid Wu 
2328b3077611SDavid Wu 	*bit = (pin_num % RK3288_DRV_PINS_PER_REG);
2329b3077611SDavid Wu 	*bit *= RK3288_DRV_BITS_PER_PIN;
2330b3077611SDavid Wu }
2331b3077611SDavid Wu 
2332b3077611SDavid Wu #define RK3308_SCHMITT_PINS_PER_REG	8
2333b3077611SDavid Wu #define RK3308_SCHMITT_BANK_STRIDE	16
2334b3077611SDavid Wu #define RK3308_SCHMITT_GRF_OFFSET	0x1a0
2335b3077611SDavid Wu 
2336b3077611SDavid Wu static int rk3308_calc_schmitt_reg_and_bit(struct rockchip_pin_bank *bank,
2337b3077611SDavid Wu 					   int pin_num,
2338b3077611SDavid Wu 					   struct regmap **regmap,
2339b3077611SDavid Wu 					   int *reg, u8 *bit)
2340b3077611SDavid Wu {
2341b3077611SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
2342b3077611SDavid Wu 
2343b3077611SDavid Wu 	*regmap = priv->regmap_base;
2344b3077611SDavid Wu 	*reg = RK3308_SCHMITT_GRF_OFFSET;
2345b3077611SDavid Wu 
2346b3077611SDavid Wu 	*reg += bank->bank_num * RK3308_SCHMITT_BANK_STRIDE;
2347b3077611SDavid Wu 	*reg += ((pin_num / RK3308_SCHMITT_PINS_PER_REG) * 4);
2348b3077611SDavid Wu 	*bit = pin_num % RK3308_SCHMITT_PINS_PER_REG;
2349b3077611SDavid Wu 
2350b3077611SDavid Wu 	return 0;
2351b3077611SDavid Wu }
2352b3077611SDavid Wu 
235349c55878SDavid Wu #define RK3368_PULL_GRF_OFFSET		0x100
235449c55878SDavid Wu #define RK3368_PULL_PMU_OFFSET		0x10
235549c55878SDavid Wu 
235649c55878SDavid Wu static void rk3368_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
235749c55878SDavid Wu 					 int pin_num, struct regmap **regmap,
235849c55878SDavid Wu 					 int *reg, u8 *bit)
235949c55878SDavid Wu {
236049c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
236149c55878SDavid Wu 
236249c55878SDavid Wu 	/* The first 32 pins of the first bank are located in PMU */
236349c55878SDavid Wu 	if (bank->bank_num == 0) {
236449c55878SDavid Wu 		*regmap = priv->regmap_pmu;
236549c55878SDavid Wu 		*reg = RK3368_PULL_PMU_OFFSET;
236649c55878SDavid Wu 
236749c55878SDavid Wu 		*reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4);
236849c55878SDavid Wu 		*bit = pin_num % RK3188_PULL_PINS_PER_REG;
236949c55878SDavid Wu 		*bit *= RK3188_PULL_BITS_PER_PIN;
237049c55878SDavid Wu 	} else {
237149c55878SDavid Wu 		*regmap = priv->regmap_base;
237249c55878SDavid Wu 		*reg = RK3368_PULL_GRF_OFFSET;
237349c55878SDavid Wu 
237449c55878SDavid Wu 		/* correct the offset, as we're starting with the 2nd bank */
237549c55878SDavid Wu 		*reg -= 0x10;
237649c55878SDavid Wu 		*reg += bank->bank_num * RK3188_PULL_BANK_STRIDE;
237749c55878SDavid Wu 		*reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4);
237849c55878SDavid Wu 
237949c55878SDavid Wu 		*bit = (pin_num % RK3188_PULL_PINS_PER_REG);
238049c55878SDavid Wu 		*bit *= RK3188_PULL_BITS_PER_PIN;
238149c55878SDavid Wu 	}
238249c55878SDavid Wu }
238349c55878SDavid Wu 
238449c55878SDavid Wu #define RK3368_DRV_PMU_OFFSET		0x20
238549c55878SDavid Wu #define RK3368_DRV_GRF_OFFSET		0x200
238649c55878SDavid Wu 
238749c55878SDavid Wu static void rk3368_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
238849c55878SDavid Wu 					int pin_num, struct regmap **regmap,
238949c55878SDavid Wu 					int *reg, u8 *bit)
239049c55878SDavid Wu {
239149c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
239249c55878SDavid Wu 
239349c55878SDavid Wu 	/* The first 32 pins of the first bank are located in PMU */
239449c55878SDavid Wu 	if (bank->bank_num == 0) {
239549c55878SDavid Wu 		*regmap = priv->regmap_pmu;
239649c55878SDavid Wu 		*reg = RK3368_DRV_PMU_OFFSET;
239749c55878SDavid Wu 
239849c55878SDavid Wu 		*reg += ((pin_num / RK3288_DRV_PINS_PER_REG) * 4);
239949c55878SDavid Wu 		*bit = pin_num % RK3288_DRV_PINS_PER_REG;
240049c55878SDavid Wu 		*bit *= RK3288_DRV_BITS_PER_PIN;
240149c55878SDavid Wu 	} else {
240249c55878SDavid Wu 		*regmap = priv->regmap_base;
240349c55878SDavid Wu 		*reg = RK3368_DRV_GRF_OFFSET;
240449c55878SDavid Wu 
240549c55878SDavid Wu 		/* correct the offset, as we're starting with the 2nd bank */
240649c55878SDavid Wu 		*reg -= 0x10;
240749c55878SDavid Wu 		*reg += bank->bank_num * RK3288_DRV_BANK_STRIDE;
240849c55878SDavid Wu 		*reg += ((pin_num / RK3288_DRV_PINS_PER_REG) * 4);
240949c55878SDavid Wu 
241049c55878SDavid Wu 		*bit = (pin_num % RK3288_DRV_PINS_PER_REG);
241149c55878SDavid Wu 		*bit *= RK3288_DRV_BITS_PER_PIN;
241249c55878SDavid Wu 	}
241349c55878SDavid Wu }
241449c55878SDavid Wu 
241549c55878SDavid Wu #define RK3399_PULL_GRF_OFFSET		0xe040
241649c55878SDavid Wu #define RK3399_PULL_PMU_OFFSET		0x40
241749c55878SDavid Wu #define RK3399_DRV_3BITS_PER_PIN	3
241849c55878SDavid Wu 
241949c55878SDavid Wu static void rk3399_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
242049c55878SDavid Wu 					 int pin_num, struct regmap **regmap,
242149c55878SDavid Wu 					 int *reg, u8 *bit)
242249c55878SDavid Wu {
242349c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
242449c55878SDavid Wu 
242549c55878SDavid Wu 	/* The bank0:16 and bank1:32 pins are located in PMU */
242649c55878SDavid Wu 	if ((bank->bank_num == 0) || (bank->bank_num == 1)) {
242749c55878SDavid Wu 		*regmap = priv->regmap_pmu;
242849c55878SDavid Wu 		*reg = RK3399_PULL_PMU_OFFSET;
242949c55878SDavid Wu 
243049c55878SDavid Wu 		*reg += bank->bank_num * RK3188_PULL_BANK_STRIDE;
243149c55878SDavid Wu 
243249c55878SDavid Wu 		*reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4);
243349c55878SDavid Wu 		*bit = pin_num % RK3188_PULL_PINS_PER_REG;
243449c55878SDavid Wu 		*bit *= RK3188_PULL_BITS_PER_PIN;
243549c55878SDavid Wu 	} else {
243649c55878SDavid Wu 		*regmap = priv->regmap_base;
243749c55878SDavid Wu 		*reg = RK3399_PULL_GRF_OFFSET;
243849c55878SDavid Wu 
243949c55878SDavid Wu 		/* correct the offset, as we're starting with the 3rd bank */
244049c55878SDavid Wu 		*reg -= 0x20;
244149c55878SDavid Wu 		*reg += bank->bank_num * RK3188_PULL_BANK_STRIDE;
244249c55878SDavid Wu 		*reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4);
244349c55878SDavid Wu 
244449c55878SDavid Wu 		*bit = (pin_num % RK3188_PULL_PINS_PER_REG);
244549c55878SDavid Wu 		*bit *= RK3188_PULL_BITS_PER_PIN;
244649c55878SDavid Wu 	}
244749c55878SDavid Wu }
244849c55878SDavid Wu 
244949c55878SDavid Wu static void rk3399_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
245049c55878SDavid Wu 					int pin_num, struct regmap **regmap,
245149c55878SDavid Wu 					int *reg, u8 *bit)
245249c55878SDavid Wu {
245349c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
245449c55878SDavid Wu 	int drv_num = (pin_num / 8);
245549c55878SDavid Wu 
245649c55878SDavid Wu 	/*  The bank0:16 and bank1:32 pins are located in PMU */
245749c55878SDavid Wu 	if ((bank->bank_num == 0) || (bank->bank_num == 1))
245849c55878SDavid Wu 		*regmap = priv->regmap_pmu;
245949c55878SDavid Wu 	else
246049c55878SDavid Wu 		*regmap = priv->regmap_base;
246149c55878SDavid Wu 
246249c55878SDavid Wu 	*reg = bank->drv[drv_num].offset;
246349c55878SDavid Wu 	if ((bank->drv[drv_num].drv_type == DRV_TYPE_IO_1V8_3V0_AUTO) ||
246449c55878SDavid Wu 	    (bank->drv[drv_num].drv_type == DRV_TYPE_IO_3V3_ONLY))
246549c55878SDavid Wu 		*bit = (pin_num % 8) * 3;
246649c55878SDavid Wu 	else
246749c55878SDavid Wu 		*bit = (pin_num % 8) * 2;
246849c55878SDavid Wu }
246949c55878SDavid Wu 
2470*c066e3f7SJianqun Xu #define RK3308_SLEW_RATE_GRF_OFFSET		0x150
2471*c066e3f7SJianqun Xu #define RK3308_SLEW_RATE_BANK_STRIDE		16
2472*c066e3f7SJianqun Xu #define RK3308_SLEW_RATE_PINS_PER_GRF_REG	8
2473*c066e3f7SJianqun Xu 
2474*c066e3f7SJianqun Xu static void rk3308_calc_slew_rate_reg_and_bit(struct rockchip_pin_bank *bank,
2475*c066e3f7SJianqun Xu 					      int pin_num,
2476*c066e3f7SJianqun Xu 					      struct regmap **regmap,
2477*c066e3f7SJianqun Xu 					      int *reg, u8 *bit)
2478*c066e3f7SJianqun Xu {
2479*c066e3f7SJianqun Xu 	struct rockchip_pinctrl_priv *priv = bank->priv;
2480*c066e3f7SJianqun Xu 	int pins_per_reg;
2481*c066e3f7SJianqun Xu 
2482*c066e3f7SJianqun Xu 	*regmap = priv->regmap_base;
2483*c066e3f7SJianqun Xu 	*reg = RK3308_SLEW_RATE_GRF_OFFSET;
2484*c066e3f7SJianqun Xu 	*reg += (bank->bank_num) * RK3308_SLEW_RATE_BANK_STRIDE;
2485*c066e3f7SJianqun Xu 	pins_per_reg = RK3308_SLEW_RATE_PINS_PER_GRF_REG;
2486*c066e3f7SJianqun Xu 
2487*c066e3f7SJianqun Xu 	*reg += ((pin_num / pins_per_reg) * 4);
2488*c066e3f7SJianqun Xu 	*bit = pin_num % pins_per_reg;
2489*c066e3f7SJianqun Xu }
2490*c066e3f7SJianqun Xu 
249149c55878SDavid Wu static int rockchip_perpin_drv_list[DRV_TYPE_MAX][8] = {
249249c55878SDavid Wu 	{ 2, 4, 8, 12, -1, -1, -1, -1 },
249349c55878SDavid Wu 	{ 3, 6, 9, 12, -1, -1, -1, -1 },
249449c55878SDavid Wu 	{ 5, 10, 15, 20, -1, -1, -1, -1 },
249549c55878SDavid Wu 	{ 4, 6, 8, 10, 12, 14, 16, 18 },
2496*c066e3f7SJianqun Xu 	{ 4, 7, 10, 13, 16, 19, 22, 26 },
2497*c066e3f7SJianqun Xu 	{ 0, 2, 4, 6, 6, 8, 10, 12 }
249849c55878SDavid Wu };
249949c55878SDavid Wu 
250049c55878SDavid Wu static int rockchip_set_drive_perpin(struct rockchip_pin_bank *bank,
250149c55878SDavid Wu 				     int pin_num, int strength)
250249c55878SDavid Wu {
250349c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
250449c55878SDavid Wu 	struct rockchip_pin_ctrl *ctrl = priv->ctrl;
250549c55878SDavid Wu 	struct regmap *regmap;
250649c55878SDavid Wu 	int reg, ret, i;
250749c55878SDavid Wu 	u32 data, rmask_bits, temp;
250849c55878SDavid Wu 	u8 bit;
25092c16899dSDavid.Wu 	/* Where need to clean the special mask for rockchip_perpin_drv_list */
25102c16899dSDavid.Wu 	int drv_type = bank->drv[pin_num / 8].drv_type & (~DRV_TYPE_IO_MASK);
251149c55878SDavid Wu 
251249c55878SDavid Wu 	debug("setting drive of GPIO%d-%d to %d\n", bank->bank_num,
251349c55878SDavid Wu 	      pin_num, strength);
251449c55878SDavid Wu 
251549c55878SDavid Wu 	ctrl->drv_calc_reg(bank, pin_num, &regmap, &reg, &bit);
2516d499d466SJianqun Xu 	if (ctrl->type == RV1126) {
2517d499d466SJianqun Xu 		rmask_bits = RV1126_DRV_BITS_PER_PIN;
2518d499d466SJianqun Xu 		ret = strength;
2519d499d466SJianqun Xu 		goto config;
2520d499d466SJianqun Xu 	}
2521*c066e3f7SJianqun Xu 	if (soc_is_rk3308bs())
2522*c066e3f7SJianqun Xu 		drv_type = DRV_TYPE_IO_SMIC;
252349c55878SDavid Wu 
252449c55878SDavid Wu 	ret = -EINVAL;
252549c55878SDavid Wu 	for (i = 0; i < ARRAY_SIZE(rockchip_perpin_drv_list[drv_type]); i++) {
252649c55878SDavid Wu 		if (rockchip_perpin_drv_list[drv_type][i] == strength) {
252749c55878SDavid Wu 			ret = i;
252849c55878SDavid Wu 			break;
252949c55878SDavid Wu 		} else if (rockchip_perpin_drv_list[drv_type][i] < 0) {
253049c55878SDavid Wu 			ret = rockchip_perpin_drv_list[drv_type][i];
253149c55878SDavid Wu 			break;
253249c55878SDavid Wu 		}
253349c55878SDavid Wu 	}
253449c55878SDavid Wu 
253549c55878SDavid Wu 	if (ret < 0) {
253649c55878SDavid Wu 		debug("unsupported driver strength %d\n", strength);
253749c55878SDavid Wu 		return ret;
253849c55878SDavid Wu 	}
253949c55878SDavid Wu 
254049c55878SDavid Wu 	switch (drv_type) {
2541*c066e3f7SJianqun Xu 	case DRV_TYPE_IO_SMIC:
2542*c066e3f7SJianqun Xu 		if (ctrl->type == RK3308) { /* RK3308B-S */
2543*c066e3f7SJianqun Xu 			int regval = ret;
2544*c066e3f7SJianqun Xu 
2545*c066e3f7SJianqun Xu 			data = 0x3 << (bit + 16);
2546*c066e3f7SJianqun Xu 			data |= ((regval & 0x3) << bit);
2547*c066e3f7SJianqun Xu 
2548*c066e3f7SJianqun Xu 			ret = regmap_write(regmap, reg, data);
2549*c066e3f7SJianqun Xu 			if (ret < 0)
2550*c066e3f7SJianqun Xu 				return ret;
2551*c066e3f7SJianqun Xu 
2552*c066e3f7SJianqun Xu 			rk3308_calc_slew_rate_reg_and_bit(bank, pin_num, &regmap, &reg, &bit);
2553*c066e3f7SJianqun Xu 			data = BIT(bit + 16) | (((regval > 3) ? 1 : 0) << bit);
2554*c066e3f7SJianqun Xu 
2555*c066e3f7SJianqun Xu 			return regmap_write(regmap, reg, data);
2556*c066e3f7SJianqun Xu 		}
2557*c066e3f7SJianqun Xu 
2558*c066e3f7SJianqun Xu 		dev_err(info->dev, "unsupported type DRV_TYPE_IO_SMIC\n");
2559*c066e3f7SJianqun Xu 		return -EINVAL;
256049c55878SDavid Wu 	case DRV_TYPE_IO_1V8_3V0_AUTO:
256149c55878SDavid Wu 	case DRV_TYPE_IO_3V3_ONLY:
256249c55878SDavid Wu 		rmask_bits = RK3399_DRV_3BITS_PER_PIN;
256349c55878SDavid Wu 		switch (bit) {
256449c55878SDavid Wu 		case 0 ... 12:
256549c55878SDavid Wu 			/* regular case, nothing to do */
256649c55878SDavid Wu 			break;
256749c55878SDavid Wu 		case 15:
256849c55878SDavid Wu 			/*
256949c55878SDavid Wu 			 * drive-strength offset is special, as it is spread
257049c55878SDavid Wu 			 * over 2 registers, the bit data[15] contains bit 0
257149c55878SDavid Wu 			 * of the value while temp[1:0] contains bits 2 and 1
257249c55878SDavid Wu 			 */
257349c55878SDavid Wu 			data = (ret & 0x1) << 15;
257449c55878SDavid Wu 			temp = (ret >> 0x1) & 0x3;
257549c55878SDavid Wu 
257649c55878SDavid Wu 			data |= BIT(31);
257749c55878SDavid Wu 			ret = regmap_write(regmap, reg, data);
257849c55878SDavid Wu 			if (ret)
257949c55878SDavid Wu 				return ret;
258049c55878SDavid Wu 
258149c55878SDavid Wu 			temp |= (0x3 << 16);
258249c55878SDavid Wu 			reg += 0x4;
258349c55878SDavid Wu 			ret = regmap_write(regmap, reg, temp);
258449c55878SDavid Wu 
258549c55878SDavid Wu 			return ret;
258649c55878SDavid Wu 		case 18 ... 21:
258749c55878SDavid Wu 			/* setting fully enclosed in the second register */
258849c55878SDavid Wu 			reg += 4;
258949c55878SDavid Wu 			bit -= 16;
259049c55878SDavid Wu 			break;
259149c55878SDavid Wu 		default:
259249c55878SDavid Wu 			debug("unsupported bit: %d for pinctrl drive type: %d\n",
259349c55878SDavid Wu 			      bit, drv_type);
259449c55878SDavid Wu 			return -EINVAL;
259549c55878SDavid Wu 		}
259649c55878SDavid Wu 		break;
259749c55878SDavid Wu 	case DRV_TYPE_IO_DEFAULT:
259849c55878SDavid Wu 	case DRV_TYPE_IO_1V8_OR_3V0:
259949c55878SDavid Wu 	case DRV_TYPE_IO_1V8_ONLY:
260049c55878SDavid Wu 		rmask_bits = RK3288_DRV_BITS_PER_PIN;
260149c55878SDavid Wu 		break;
260249c55878SDavid Wu 	default:
260349c55878SDavid Wu 		debug("unsupported pinctrl drive type: %d\n",
260449c55878SDavid Wu 		      drv_type);
260549c55878SDavid Wu 		return -EINVAL;
260649c55878SDavid Wu 	}
260749c55878SDavid Wu 
2608d499d466SJianqun Xu config:
260955a89bc6SDavid Wu 	if (bank->drv[pin_num / 8].drv_type & DRV_TYPE_WRITABLE_32BIT) {
261055a89bc6SDavid Wu 		regmap_read(regmap, reg, &data);
261155a89bc6SDavid Wu 		data &= ~(((1 << rmask_bits) - 1) << bit);
261255a89bc6SDavid Wu 	} else {
261349c55878SDavid Wu 		/* enable the write to the equivalent lower bits */
261449c55878SDavid Wu 		data = ((1 << rmask_bits) - 1) << (bit + 16);
261555a89bc6SDavid Wu 	}
261649c55878SDavid Wu 
261755a89bc6SDavid Wu 	data |= (ret << bit);
261849c55878SDavid Wu 	ret = regmap_write(regmap, reg, data);
261949c55878SDavid Wu 	return ret;
262049c55878SDavid Wu }
262149c55878SDavid Wu 
262249c55878SDavid Wu static int rockchip_pull_list[PULL_TYPE_MAX][4] = {
262349c55878SDavid Wu 	{
262449c55878SDavid Wu 		PIN_CONFIG_BIAS_DISABLE,
262549c55878SDavid Wu 		PIN_CONFIG_BIAS_PULL_UP,
262649c55878SDavid Wu 		PIN_CONFIG_BIAS_PULL_DOWN,
262749c55878SDavid Wu 		PIN_CONFIG_BIAS_BUS_HOLD
262849c55878SDavid Wu 	},
262949c55878SDavid Wu 	{
263049c55878SDavid Wu 		PIN_CONFIG_BIAS_DISABLE,
263149c55878SDavid Wu 		PIN_CONFIG_BIAS_PULL_DOWN,
263249c55878SDavid Wu 		PIN_CONFIG_BIAS_DISABLE,
263349c55878SDavid Wu 		PIN_CONFIG_BIAS_PULL_UP
263449c55878SDavid Wu 	},
263549c55878SDavid Wu };
263649c55878SDavid Wu 
263749c55878SDavid Wu static int rockchip_set_pull(struct rockchip_pin_bank *bank,
263849c55878SDavid Wu 			     int pin_num, int pull)
263949c55878SDavid Wu {
264049c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
264149c55878SDavid Wu 	struct rockchip_pin_ctrl *ctrl = priv->ctrl;
264249c55878SDavid Wu 	struct regmap *regmap;
264349c55878SDavid Wu 	int reg, ret, i, pull_type;
264449c55878SDavid Wu 	u8 bit;
264549c55878SDavid Wu 	u32 data;
264649c55878SDavid Wu 
264749c55878SDavid Wu 	debug("setting pull of GPIO%d-%d to %d\n", bank->bank_num,
264849c55878SDavid Wu 	      pin_num, pull);
264949c55878SDavid Wu 
265049c55878SDavid Wu 	/* rk3066b does support any pulls */
265149c55878SDavid Wu 	if (ctrl->type == RK3066B)
265249c55878SDavid Wu 		return pull ? -EINVAL : 0;
265349c55878SDavid Wu 
265449c55878SDavid Wu 	ctrl->pull_calc_reg(bank, pin_num, &regmap, &reg, &bit);
265549c55878SDavid Wu 
265649c55878SDavid Wu 	switch (ctrl->type) {
265749c55878SDavid Wu 	case RK2928:
265849c55878SDavid Wu 	case RK3128:
265949c55878SDavid Wu 		data = BIT(bit + 16);
266049c55878SDavid Wu 		if (pull == PIN_CONFIG_BIAS_DISABLE)
266149c55878SDavid Wu 			data |= BIT(bit);
266249c55878SDavid Wu 		ret = regmap_write(regmap, reg, data);
266349c55878SDavid Wu 		break;
266449c55878SDavid Wu 	case PX30:
266549c55878SDavid Wu 	case RV1108:
2666cf04a17bSJianqun Xu 	case RV1126:
2667a2a3fc8fSJianqun Xu 	case RK1808:
266849c55878SDavid Wu 	case RK3188:
266949c55878SDavid Wu 	case RK3288:
2670b3077611SDavid Wu 	case RK3308:
267149c55878SDavid Wu 	case RK3368:
267249c55878SDavid Wu 	case RK3399:
26732c16899dSDavid.Wu 		/*
26742c16899dSDavid.Wu 		 * Where need to clean the special mask for
26752c16899dSDavid.Wu 		 * rockchip_pull_list.
26762c16899dSDavid.Wu 		 */
26772c16899dSDavid.Wu 		pull_type = bank->pull_type[pin_num / 8] & (~PULL_TYPE_IO_MASK);
267849c55878SDavid Wu 		ret = -EINVAL;
267949c55878SDavid Wu 		for (i = 0; i < ARRAY_SIZE(rockchip_pull_list[pull_type]);
268049c55878SDavid Wu 			i++) {
268149c55878SDavid Wu 			if (rockchip_pull_list[pull_type][i] == pull) {
268249c55878SDavid Wu 				ret = i;
268349c55878SDavid Wu 				break;
268449c55878SDavid Wu 			}
268549c55878SDavid Wu 		}
268649c55878SDavid Wu 
268749c55878SDavid Wu 		if (ret < 0) {
268849c55878SDavid Wu 			debug("unsupported pull setting %d\n", pull);
268949c55878SDavid Wu 			return ret;
269049c55878SDavid Wu 		}
269149c55878SDavid Wu 
269255a89bc6SDavid Wu 		if (bank->pull_type[pin_num / 8] & PULL_TYPE_WRITABLE_32BIT) {
269355a89bc6SDavid Wu 			regmap_read(regmap, reg, &data);
269455a89bc6SDavid Wu 			data &= ~(((1 << RK3188_PULL_BITS_PER_PIN) - 1) << bit);
269555a89bc6SDavid Wu 		} else {
269649c55878SDavid Wu 			/* enable the write to the equivalent lower bits */
269749c55878SDavid Wu 			data = ((1 << RK3188_PULL_BITS_PER_PIN) - 1) << (bit + 16);
269855a89bc6SDavid Wu 		}
269949c55878SDavid Wu 
270055a89bc6SDavid Wu 		data |= (ret << bit);
270149c55878SDavid Wu 		ret = regmap_write(regmap, reg, data);
270249c55878SDavid Wu 		break;
270349c55878SDavid Wu 	default:
270449c55878SDavid Wu 		debug("unsupported pinctrl type\n");
270549c55878SDavid Wu 		return -EINVAL;
270649c55878SDavid Wu 	}
270749c55878SDavid Wu 
270849c55878SDavid Wu 	return ret;
270949c55878SDavid Wu }
271049c55878SDavid Wu 
271149c55878SDavid Wu #define RK3328_SCHMITT_BITS_PER_PIN		1
271249c55878SDavid Wu #define RK3328_SCHMITT_PINS_PER_REG		16
271349c55878SDavid Wu #define RK3328_SCHMITT_BANK_STRIDE		8
271449c55878SDavid Wu #define RK3328_SCHMITT_GRF_OFFSET		0x380
271549c55878SDavid Wu 
271649c55878SDavid Wu static int rk3328_calc_schmitt_reg_and_bit(struct rockchip_pin_bank *bank,
271749c55878SDavid Wu 					   int pin_num,
271849c55878SDavid Wu 					   struct regmap **regmap,
271949c55878SDavid Wu 					   int *reg, u8 *bit)
272049c55878SDavid Wu {
272149c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
272249c55878SDavid Wu 
272349c55878SDavid Wu 	*regmap = priv->regmap_base;
272449c55878SDavid Wu 	*reg = RK3328_SCHMITT_GRF_OFFSET;
272549c55878SDavid Wu 
272649c55878SDavid Wu 	*reg += bank->bank_num * RK3328_SCHMITT_BANK_STRIDE;
272749c55878SDavid Wu 	*reg += ((pin_num / RK3328_SCHMITT_PINS_PER_REG) * 4);
272849c55878SDavid Wu 	*bit = pin_num % RK3328_SCHMITT_PINS_PER_REG;
272949c55878SDavid Wu 
273049c55878SDavid Wu 	return 0;
273149c55878SDavid Wu }
273249c55878SDavid Wu 
273349c55878SDavid Wu static int rockchip_set_schmitt(struct rockchip_pin_bank *bank,
273449c55878SDavid Wu 				int pin_num, int enable)
273549c55878SDavid Wu {
273649c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
273749c55878SDavid Wu 	struct rockchip_pin_ctrl *ctrl = priv->ctrl;
273849c55878SDavid Wu 	struct regmap *regmap;
273949c55878SDavid Wu 	int reg, ret;
274049c55878SDavid Wu 	u8 bit;
274149c55878SDavid Wu 	u32 data;
274249c55878SDavid Wu 
274349c55878SDavid Wu 	debug("setting input schmitt of GPIO%d-%d to %d\n", bank->bank_num,
274449c55878SDavid Wu 	      pin_num, enable);
274549c55878SDavid Wu 
274649c55878SDavid Wu 	ret = ctrl->schmitt_calc_reg(bank, pin_num, &regmap, &reg, &bit);
274749c55878SDavid Wu 	if (ret)
274849c55878SDavid Wu 		return ret;
274949c55878SDavid Wu 
275049c55878SDavid Wu 	/* enable the write to the equivalent lower bits */
275149c55878SDavid Wu 	data = BIT(bit + 16) | (enable << bit);
275249c55878SDavid Wu 
275349c55878SDavid Wu 	return regmap_write(regmap, reg, data);
275449c55878SDavid Wu }
275549c55878SDavid Wu 
275632c25d1fSDavid Wu #define PX30_SLEW_RATE_PMU_OFFSET		0x30
275732c25d1fSDavid Wu #define PX30_SLEW_RATE_GRF_OFFSET		0x90
275832c25d1fSDavid Wu #define PX30_SLEW_RATE_PINS_PER_PMU_REG		16
275932c25d1fSDavid Wu #define PX30_SLEW_RATE_BANK_STRIDE		16
276032c25d1fSDavid Wu #define PX30_SLEW_RATE_PINS_PER_GRF_REG		8
276132c25d1fSDavid Wu 
276232c25d1fSDavid Wu static int px30_calc_slew_rate_reg_and_bit(struct rockchip_pin_bank *bank,
276332c25d1fSDavid Wu 					   int pin_num,
276432c25d1fSDavid Wu 					   struct regmap **regmap,
276532c25d1fSDavid Wu 					   int *reg, u8 *bit)
276632c25d1fSDavid Wu {
276732c25d1fSDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
276832c25d1fSDavid Wu 	int pins_per_reg;
276932c25d1fSDavid Wu 
277032c25d1fSDavid Wu 	if (bank->bank_num == 0) {
277132c25d1fSDavid Wu 		*regmap = priv->regmap_pmu;
277232c25d1fSDavid Wu 		*reg = PX30_SLEW_RATE_PMU_OFFSET;
277332c25d1fSDavid Wu 		pins_per_reg = PX30_SCHMITT_PINS_PER_PMU_REG;
277432c25d1fSDavid Wu 	} else {
277532c25d1fSDavid Wu 		*regmap = priv->regmap_base;
277632c25d1fSDavid Wu 		*reg = PX30_SCHMITT_GRF_OFFSET;
277732c25d1fSDavid Wu 		pins_per_reg = PX30_SCHMITT_PINS_PER_GRF_REG;
277832c25d1fSDavid Wu 		*reg += (bank->bank_num  - 1) * PX30_SCHMITT_BANK_STRIDE;
277932c25d1fSDavid Wu 	}
278032c25d1fSDavid Wu 	*reg += ((pin_num / pins_per_reg) * 4);
278132c25d1fSDavid Wu 	*bit = pin_num % pins_per_reg;
278232c25d1fSDavid Wu 
278332c25d1fSDavid Wu 	return 0;
278432c25d1fSDavid Wu }
278532c25d1fSDavid Wu 
278632c25d1fSDavid Wu static int rockchip_set_slew_rate(struct rockchip_pin_bank *bank,
278732c25d1fSDavid Wu 				  int pin_num, int speed)
278832c25d1fSDavid Wu {
278932c25d1fSDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
279032c25d1fSDavid Wu 	struct rockchip_pin_ctrl *ctrl = priv->ctrl;
279132c25d1fSDavid Wu 	struct regmap *regmap;
279232c25d1fSDavid Wu 	int reg, ret;
279332c25d1fSDavid Wu 	u8 bit;
279432c25d1fSDavid Wu 	u32 data;
279532c25d1fSDavid Wu 
279632c25d1fSDavid Wu 	debug("setting slew rate of GPIO%d-%d to %d\n", bank->bank_num,
279732c25d1fSDavid Wu 	      pin_num, speed);
279832c25d1fSDavid Wu 
279932c25d1fSDavid Wu 	ret = ctrl->slew_rate_calc_reg(bank, pin_num, &regmap, &reg, &bit);
280032c25d1fSDavid Wu 	if (ret)
280132c25d1fSDavid Wu 		return ret;
280232c25d1fSDavid Wu 
280332c25d1fSDavid Wu 	/* enable the write to the equivalent lower bits */
280432c25d1fSDavid Wu 	data = BIT(bit + 16) | (speed << bit);
280532c25d1fSDavid Wu 
280632c25d1fSDavid Wu 	return regmap_write(regmap, reg, data);
280732c25d1fSDavid Wu }
280832c25d1fSDavid Wu 
280949c55878SDavid Wu /*
281049c55878SDavid Wu  * Pinconf_ops handling
281149c55878SDavid Wu  */
281249c55878SDavid Wu static bool rockchip_pinconf_pull_valid(struct rockchip_pin_ctrl *ctrl,
281349c55878SDavid Wu 					unsigned int pull)
281449c55878SDavid Wu {
281549c55878SDavid Wu 	switch (ctrl->type) {
281649c55878SDavid Wu 	case RK2928:
281749c55878SDavid Wu 	case RK3128:
281849c55878SDavid Wu 		return (pull == PIN_CONFIG_BIAS_PULL_PIN_DEFAULT ||
281949c55878SDavid Wu 			pull == PIN_CONFIG_BIAS_DISABLE);
282049c55878SDavid Wu 	case RK3066B:
282149c55878SDavid Wu 		return pull ? false : true;
282249c55878SDavid Wu 	case PX30:
282349c55878SDavid Wu 	case RV1108:
2824cf04a17bSJianqun Xu 	case RV1126:
2825a2a3fc8fSJianqun Xu 	case RK1808:
282649c55878SDavid Wu 	case RK3188:
282749c55878SDavid Wu 	case RK3288:
2828b3077611SDavid Wu 	case RK3308:
282949c55878SDavid Wu 	case RK3368:
283049c55878SDavid Wu 	case RK3399:
283149c55878SDavid Wu 		return (pull != PIN_CONFIG_BIAS_PULL_PIN_DEFAULT);
283249c55878SDavid Wu 	}
283349c55878SDavid Wu 
283449c55878SDavid Wu 	return false;
283549c55878SDavid Wu }
283649c55878SDavid Wu 
283749c55878SDavid Wu /* set the pin config settings for a specified pin */
283849c55878SDavid Wu static int rockchip_pinconf_set(struct rockchip_pin_bank *bank,
283949c55878SDavid Wu 				u32 pin, u32 param, u32 arg)
284049c55878SDavid Wu {
284149c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
284249c55878SDavid Wu 	struct rockchip_pin_ctrl *ctrl = priv->ctrl;
284349c55878SDavid Wu 	int rc;
284449c55878SDavid Wu 
284549c55878SDavid Wu 	switch (param) {
284649c55878SDavid Wu 	case PIN_CONFIG_BIAS_DISABLE:
284749c55878SDavid Wu 		rc =  rockchip_set_pull(bank, pin, param);
284849c55878SDavid Wu 		if (rc)
284949c55878SDavid Wu 			return rc;
285049c55878SDavid Wu 		break;
285149c55878SDavid Wu 
285249c55878SDavid Wu 	case PIN_CONFIG_BIAS_PULL_UP:
285349c55878SDavid Wu 	case PIN_CONFIG_BIAS_PULL_DOWN:
285449c55878SDavid Wu 	case PIN_CONFIG_BIAS_PULL_PIN_DEFAULT:
285549c55878SDavid Wu 	case PIN_CONFIG_BIAS_BUS_HOLD:
285649c55878SDavid Wu 		if (!rockchip_pinconf_pull_valid(ctrl, param))
285749c55878SDavid Wu 			return -ENOTSUPP;
285849c55878SDavid Wu 
285949c55878SDavid Wu 		if (!arg)
286049c55878SDavid Wu 			return -EINVAL;
286149c55878SDavid Wu 
286249c55878SDavid Wu 		rc = rockchip_set_pull(bank, pin, param);
286349c55878SDavid Wu 		if (rc)
286449c55878SDavid Wu 			return rc;
286549c55878SDavid Wu 		break;
286649c55878SDavid Wu 
286749c55878SDavid Wu 	case PIN_CONFIG_DRIVE_STRENGTH:
286849c55878SDavid Wu 		if (!ctrl->drv_calc_reg)
286949c55878SDavid Wu 			return -ENOTSUPP;
287049c55878SDavid Wu 
287149c55878SDavid Wu 		rc = rockchip_set_drive_perpin(bank, pin, arg);
287249c55878SDavid Wu 		if (rc < 0)
287349c55878SDavid Wu 			return rc;
287449c55878SDavid Wu 		break;
287549c55878SDavid Wu 
287649c55878SDavid Wu 	case PIN_CONFIG_INPUT_SCHMITT_ENABLE:
287749c55878SDavid Wu 		if (!ctrl->schmitt_calc_reg)
287849c55878SDavid Wu 			return -ENOTSUPP;
287949c55878SDavid Wu 
288049c55878SDavid Wu 		rc = rockchip_set_schmitt(bank, pin, arg);
288149c55878SDavid Wu 		if (rc < 0)
288249c55878SDavid Wu 			return rc;
288349c55878SDavid Wu 		break;
288449c55878SDavid Wu 
288532c25d1fSDavid Wu 	case PIN_CONFIG_SLEW_RATE:
288632c25d1fSDavid Wu 		if (!ctrl->slew_rate_calc_reg)
288732c25d1fSDavid Wu 			return -ENOTSUPP;
288832c25d1fSDavid Wu 
288932c25d1fSDavid Wu 		rc = rockchip_set_slew_rate(bank,
289032c25d1fSDavid Wu 					    pin - bank->pin_base, arg);
289132c25d1fSDavid Wu 		if (rc < 0)
289232c25d1fSDavid Wu 			return rc;
289332c25d1fSDavid Wu 		break;
289432c25d1fSDavid Wu 
289549c55878SDavid Wu 	default:
289649c55878SDavid Wu 		break;
289749c55878SDavid Wu 	}
289849c55878SDavid Wu 
289949c55878SDavid Wu 	return 0;
290049c55878SDavid Wu }
290149c55878SDavid Wu 
290249c55878SDavid Wu static const struct pinconf_param rockchip_conf_params[] = {
290349c55878SDavid Wu 	{ "bias-disable", PIN_CONFIG_BIAS_DISABLE, 0 },
290449c55878SDavid Wu 	{ "bias-bus-hold", PIN_CONFIG_BIAS_BUS_HOLD, 0 },
290549c55878SDavid Wu 	{ "bias-pull-up", PIN_CONFIG_BIAS_PULL_UP, 1 },
290649c55878SDavid Wu 	{ "bias-pull-down", PIN_CONFIG_BIAS_PULL_DOWN, 1 },
290749c55878SDavid Wu 	{ "drive-strength", PIN_CONFIG_DRIVE_STRENGTH, 0 },
290849c55878SDavid Wu 	{ "input-enable", PIN_CONFIG_INPUT_ENABLE, 1 },
290949c55878SDavid Wu 	{ "input-disable", PIN_CONFIG_INPUT_ENABLE, 0 },
291049c55878SDavid Wu 	{ "input-schmitt-disable", PIN_CONFIG_INPUT_SCHMITT_ENABLE, 0 },
291149c55878SDavid Wu 	{ "input-schmitt-enable", PIN_CONFIG_INPUT_SCHMITT_ENABLE, 1 },
291232c25d1fSDavid Wu 	{ "slew-rate", PIN_CONFIG_SLEW_RATE, 0 },
291349c55878SDavid Wu };
291449c55878SDavid Wu 
291549c55878SDavid Wu static int rockchip_pinconf_prop_name_to_param(const char *property,
291649c55878SDavid Wu 					       u32 *default_value)
291749c55878SDavid Wu {
291849c55878SDavid Wu 	const struct pinconf_param *p, *end;
291949c55878SDavid Wu 
292049c55878SDavid Wu 	p = rockchip_conf_params;
292149c55878SDavid Wu 	end = p + sizeof(rockchip_conf_params) / sizeof(struct pinconf_param);
292249c55878SDavid Wu 
292349c55878SDavid Wu 	/* See if this pctldev supports this parameter */
292449c55878SDavid Wu 	for (; p < end; p++) {
292549c55878SDavid Wu 		if (!strcmp(property, p->property)) {
292649c55878SDavid Wu 			*default_value = p->default_value;
292749c55878SDavid Wu 			return p->param;
292849c55878SDavid Wu 		}
292949c55878SDavid Wu 	}
293049c55878SDavid Wu 
293149c55878SDavid Wu 	*default_value = 0;
293249c55878SDavid Wu 	return -EPERM;
293349c55878SDavid Wu }
293449c55878SDavid Wu 
293549c55878SDavid Wu static int rockchip_pinctrl_set_state(struct udevice *dev,
293649c55878SDavid Wu 				      struct udevice *config)
293749c55878SDavid Wu {
293849c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = dev_get_priv(dev);
293949c55878SDavid Wu 	struct rockchip_pin_ctrl *ctrl = priv->ctrl;
294049c55878SDavid Wu 	u32 cells[MAX_ROCKCHIP_PINS_ENTRIES * 4];
294149c55878SDavid Wu 	u32 bank, pin, mux, conf, arg, default_val;
294249c55878SDavid Wu 	int ret, count, i;
294349c55878SDavid Wu 	const char *prop_name;
294449c55878SDavid Wu 	const void *value;
29452208cfa9SKever Yang 	int prop_len, param;
29462208cfa9SKever Yang 	const u32 *data;
29472208cfa9SKever Yang 	ofnode node;
2948d2e2dbd6SJason Zhu #if defined(CONFIG_OF_LIVE) && !defined(CONFIG_SPL_BUILD)
29492208cfa9SKever Yang 	const struct device_node *np;
29502208cfa9SKever Yang 	struct property *pp;
29512208cfa9SKever Yang #else
29522208cfa9SKever Yang 	int property_offset, pcfg_node;
29532208cfa9SKever Yang 	const void *blob = gd->fdt_blob;
29542208cfa9SKever Yang #endif
29552208cfa9SKever Yang 	data = dev_read_prop(config, "rockchip,pins", &count);
295649c55878SDavid Wu 	if (count < 0) {
295787f0ac57SDavid Wu 		debug("%s: bad array size %d\n", __func__, count);
295849c55878SDavid Wu 		return -EINVAL;
295949c55878SDavid Wu 	}
296049c55878SDavid Wu 
296187f0ac57SDavid Wu 	count /= sizeof(u32);
296249c55878SDavid Wu 	if (count > MAX_ROCKCHIP_PINS_ENTRIES * 4) {
296349c55878SDavid Wu 		debug("%s: unsupported pins array count %d\n",
296449c55878SDavid Wu 		      __func__, count);
296549c55878SDavid Wu 		return -EINVAL;
296649c55878SDavid Wu 	}
296749c55878SDavid Wu 
296887f0ac57SDavid Wu 	for (i = 0; i < count; i++)
296987f0ac57SDavid Wu 		cells[i] = fdt32_to_cpu(data[i]);
297087f0ac57SDavid Wu 
297149c55878SDavid Wu 	for (i = 0; i < (count >> 2); i++) {
297249c55878SDavid Wu 		bank = cells[4 * i + 0];
297349c55878SDavid Wu 		pin = cells[4 * i + 1];
297449c55878SDavid Wu 		mux = cells[4 * i + 2];
297549c55878SDavid Wu 		conf = cells[4 * i + 3];
297649c55878SDavid Wu 
297749c55878SDavid Wu 		ret = rockchip_verify_config(dev, bank, pin);
297849c55878SDavid Wu 		if (ret)
297949c55878SDavid Wu 			return ret;
298049c55878SDavid Wu 
298149c55878SDavid Wu 		ret = rockchip_set_mux(&ctrl->pin_banks[bank], pin, mux);
298249c55878SDavid Wu 		if (ret)
298349c55878SDavid Wu 			return ret;
298449c55878SDavid Wu 
29852208cfa9SKever Yang 		node = ofnode_get_by_phandle(conf);
29862208cfa9SKever Yang 		if (!ofnode_valid(node))
298749c55878SDavid Wu 			return -ENODEV;
2988d2e2dbd6SJason Zhu #if defined(CONFIG_OF_LIVE) && !defined(CONFIG_SPL_BUILD)
29892208cfa9SKever Yang 		np = ofnode_to_np(node);
29902208cfa9SKever Yang 		for (pp = np->properties; pp; pp = pp->next) {
29912208cfa9SKever Yang 			prop_name = pp->name;
29922208cfa9SKever Yang 			prop_len = pp->length;
29932208cfa9SKever Yang 			value = pp->value;
29942208cfa9SKever Yang #else
29952208cfa9SKever Yang 		pcfg_node = ofnode_to_offset(node);
299649c55878SDavid Wu 		fdt_for_each_property_offset(property_offset, blob, pcfg_node) {
299749c55878SDavid Wu 			value = fdt_getprop_by_offset(blob, property_offset,
299849c55878SDavid Wu 						      &prop_name, &prop_len);
299949c55878SDavid Wu 			if (!value)
300049c55878SDavid Wu 				return -ENOENT;
30012208cfa9SKever Yang #endif
300249c55878SDavid Wu 			param = rockchip_pinconf_prop_name_to_param(prop_name,
300349c55878SDavid Wu 								    &default_val);
300449c55878SDavid Wu 			if (param < 0)
300549c55878SDavid Wu 				break;
300649c55878SDavid Wu 
300749c55878SDavid Wu 			if (prop_len >= sizeof(fdt32_t))
300849c55878SDavid Wu 				arg = fdt32_to_cpu(*(fdt32_t *)value);
300949c55878SDavid Wu 			else
301049c55878SDavid Wu 				arg = default_val;
301149c55878SDavid Wu 
301249c55878SDavid Wu 			ret = rockchip_pinconf_set(&ctrl->pin_banks[bank], pin,
301349c55878SDavid Wu 						   param, arg);
301449c55878SDavid Wu 			if (ret) {
301549c55878SDavid Wu 				debug("%s: rockchip_pinconf_set fail: %d\n",
301649c55878SDavid Wu 				      __func__, ret);
301749c55878SDavid Wu 				return ret;
301849c55878SDavid Wu 			}
301949c55878SDavid Wu 		}
302049c55878SDavid Wu 	}
302149c55878SDavid Wu 
302249c55878SDavid Wu 	return 0;
302349c55878SDavid Wu }
302449c55878SDavid Wu 
302509989a56SJianqun Xu static int rockchip_pinctrl_get_pins_count(struct udevice *dev)
302609989a56SJianqun Xu {
302709989a56SJianqun Xu 	struct rockchip_pinctrl_priv *priv = dev_get_priv(dev);
302809989a56SJianqun Xu 	struct rockchip_pin_ctrl *ctrl = priv->ctrl;
302909989a56SJianqun Xu 
303009989a56SJianqun Xu 	return ctrl->nr_pins;
303109989a56SJianqun Xu }
303209989a56SJianqun Xu 
303349c55878SDavid Wu static struct pinctrl_ops rockchip_pinctrl_ops = {
303409989a56SJianqun Xu 	.get_pins_count			= rockchip_pinctrl_get_pins_count,
303549c55878SDavid Wu 	.set_state			= rockchip_pinctrl_set_state,
303649c55878SDavid Wu 	.get_gpio_mux			= rockchip_pinctrl_get_gpio_mux,
303749c55878SDavid Wu };
303849c55878SDavid Wu 
303913c03cb6SJianqun Xu static const struct rockchip_pin_ctrl rk3308b_pin_ctrl;
3040d5517017SDavid Wu 
304149c55878SDavid Wu /* retrieve the soc specific data */
304213c03cb6SJianqun Xu static const struct rockchip_pin_ctrl *
304313c03cb6SJianqun Xu rockchip_pinctrl_get_soc_data(struct udevice *dev)
304449c55878SDavid Wu {
304549c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = dev_get_priv(dev);
304613c03cb6SJianqun Xu 	const struct rockchip_pin_ctrl *ctrl =
304713c03cb6SJianqun Xu 		(const struct rockchip_pin_ctrl *)dev_get_driver_data(dev);
304849c55878SDavid Wu 	struct rockchip_pin_bank *bank;
304949c55878SDavid Wu 	int grf_offs, pmu_offs, drv_grf_offs, drv_pmu_offs, i, j;
305013c03cb6SJianqun Xu 	u32 nr_pins;
305113c03cb6SJianqun Xu 
3052*c066e3f7SJianqun Xu 	if (soc_is_rk3308b() || soc_is_rk3308bs())
305313c03cb6SJianqun Xu 		ctrl = &rk3308b_pin_ctrl;
305449c55878SDavid Wu 
305549c55878SDavid Wu 	grf_offs = ctrl->grf_mux_offset;
305649c55878SDavid Wu 	pmu_offs = ctrl->pmu_mux_offset;
305749c55878SDavid Wu 	drv_pmu_offs = ctrl->pmu_drv_offset;
305849c55878SDavid Wu 	drv_grf_offs = ctrl->grf_drv_offset;
305949c55878SDavid Wu 	bank = ctrl->pin_banks;
306049c55878SDavid Wu 
3061d5517017SDavid Wu 	/* Ctrl data re-initialize for some Socs */
3062d5517017SDavid Wu 	if (ctrl->ctrl_data_re_init) {
3063d5517017SDavid Wu 		if (ctrl->ctrl_data_re_init(ctrl))
3064d5517017SDavid Wu 			return NULL;
3065d5517017SDavid Wu 	}
3066d5517017SDavid Wu 
306713c03cb6SJianqun Xu 	nr_pins = 0;
306849c55878SDavid Wu 	for (i = 0; i < ctrl->nr_banks; ++i, ++bank) {
306949c55878SDavid Wu 		int bank_pins = 0;
307049c55878SDavid Wu 
307149c55878SDavid Wu 		bank->priv = priv;
307213c03cb6SJianqun Xu 		bank->pin_base = nr_pins;
307313c03cb6SJianqun Xu 		nr_pins += bank->nr_pins;
307449c55878SDavid Wu 
307549c55878SDavid Wu 		/* calculate iomux and drv offsets */
307649c55878SDavid Wu 		for (j = 0; j < 4; j++) {
307749c55878SDavid Wu 			struct rockchip_iomux *iom = &bank->iomux[j];
307849c55878SDavid Wu 			struct rockchip_drv *drv = &bank->drv[j];
307949c55878SDavid Wu 			int inc;
308049c55878SDavid Wu 
308149c55878SDavid Wu 			if (bank_pins >= bank->nr_pins)
308249c55878SDavid Wu 				break;
308349c55878SDavid Wu 
308449c55878SDavid Wu 			/* preset iomux offset value, set new start value */
308549c55878SDavid Wu 			if (iom->offset >= 0) {
3086d499d466SJianqun Xu 				if ((iom->type & IOMUX_SOURCE_PMU) || (iom->type & IOMUX_L_SOURCE_PMU))
308749c55878SDavid Wu 					pmu_offs = iom->offset;
308849c55878SDavid Wu 				else
308949c55878SDavid Wu 					grf_offs = iom->offset;
309049c55878SDavid Wu 			} else { /* set current iomux offset */
3091d499d466SJianqun Xu 				iom->offset = ((iom->type & IOMUX_SOURCE_PMU) ||
3092d499d466SJianqun Xu 					       (iom->type & IOMUX_L_SOURCE_PMU)) ?
309349c55878SDavid Wu 							pmu_offs : grf_offs;
309449c55878SDavid Wu 			}
309549c55878SDavid Wu 
309649c55878SDavid Wu 			/* preset drv offset value, set new start value */
309749c55878SDavid Wu 			if (drv->offset >= 0) {
309849c55878SDavid Wu 				if (iom->type & IOMUX_SOURCE_PMU)
309949c55878SDavid Wu 					drv_pmu_offs = drv->offset;
310049c55878SDavid Wu 				else
310149c55878SDavid Wu 					drv_grf_offs = drv->offset;
310249c55878SDavid Wu 			} else { /* set current drv offset */
310349c55878SDavid Wu 				drv->offset = (iom->type & IOMUX_SOURCE_PMU) ?
310449c55878SDavid Wu 						drv_pmu_offs : drv_grf_offs;
310549c55878SDavid Wu 			}
310649c55878SDavid Wu 
310749c55878SDavid Wu 			debug("bank %d, iomux %d has iom_offset 0x%x drv_offset 0x%x\n",
310849c55878SDavid Wu 			      i, j, iom->offset, drv->offset);
310949c55878SDavid Wu 
311049c55878SDavid Wu 			/*
311149c55878SDavid Wu 			 * Increase offset according to iomux width.
311249c55878SDavid Wu 			 * 4bit iomux'es are spread over two registers.
311349c55878SDavid Wu 			 */
311449c55878SDavid Wu 			inc = (iom->type & (IOMUX_WIDTH_4BIT |
311588a1f7ffSDavid Wu 					    IOMUX_WIDTH_3BIT |
311688a1f7ffSDavid Wu 					    IOMUX_8WIDTH_2BIT)) ? 8 : 4;
3117d499d466SJianqun Xu 			if ((iom->type & IOMUX_SOURCE_PMU) || (iom->type & IOMUX_L_SOURCE_PMU))
311849c55878SDavid Wu 				pmu_offs += inc;
311949c55878SDavid Wu 			else
312049c55878SDavid Wu 				grf_offs += inc;
312149c55878SDavid Wu 
312249c55878SDavid Wu 			/*
312349c55878SDavid Wu 			 * Increase offset according to drv width.
312449c55878SDavid Wu 			 * 3bit drive-strenth'es are spread over two registers.
312549c55878SDavid Wu 			 */
312649c55878SDavid Wu 			if ((drv->drv_type == DRV_TYPE_IO_1V8_3V0_AUTO) ||
312749c55878SDavid Wu 			    (drv->drv_type == DRV_TYPE_IO_3V3_ONLY))
312849c55878SDavid Wu 				inc = 8;
312949c55878SDavid Wu 			else
313049c55878SDavid Wu 				inc = 4;
313149c55878SDavid Wu 
313249c55878SDavid Wu 			if (iom->type & IOMUX_SOURCE_PMU)
313349c55878SDavid Wu 				drv_pmu_offs += inc;
313449c55878SDavid Wu 			else
313549c55878SDavid Wu 				drv_grf_offs += inc;
313649c55878SDavid Wu 
313749c55878SDavid Wu 			bank_pins += 8;
313849c55878SDavid Wu 		}
313949c55878SDavid Wu 
314049c55878SDavid Wu 		/* calculate the per-bank recalced_mask */
314149c55878SDavid Wu 		for (j = 0; j < ctrl->niomux_recalced; j++) {
314249c55878SDavid Wu 			int pin = 0;
314349c55878SDavid Wu 
314449c55878SDavid Wu 			if (ctrl->iomux_recalced[j].num == bank->bank_num) {
314549c55878SDavid Wu 				pin = ctrl->iomux_recalced[j].pin;
314649c55878SDavid Wu 				bank->recalced_mask |= BIT(pin);
314749c55878SDavid Wu 			}
314849c55878SDavid Wu 		}
314949c55878SDavid Wu 
315049c55878SDavid Wu 		/* calculate the per-bank route_mask */
315149c55878SDavid Wu 		for (j = 0; j < ctrl->niomux_routes; j++) {
315249c55878SDavid Wu 			int pin = 0;
315349c55878SDavid Wu 
315449c55878SDavid Wu 			if (ctrl->iomux_routes[j].bank_num == bank->bank_num) {
315549c55878SDavid Wu 				pin = ctrl->iomux_routes[j].pin;
315649c55878SDavid Wu 				bank->route_mask |= BIT(pin);
315749c55878SDavid Wu 			}
315849c55878SDavid Wu 		}
315949c55878SDavid Wu 	}
316049c55878SDavid Wu 
316113c03cb6SJianqun Xu 	WARN_ON(nr_pins != ctrl->nr_pins);
316213c03cb6SJianqun Xu 
316349c55878SDavid Wu 	return ctrl;
316449c55878SDavid Wu }
316549c55878SDavid Wu 
3166d5517017SDavid Wu /* SoC data specially handle */
3167d5517017SDavid Wu 
3168d5517017SDavid Wu /* rk3308b SoC data initialize */
3169d5517017SDavid Wu #define RK3308B_GRF_SOC_CON13			0x608
3170d5517017SDavid Wu #define RK3308B_GRF_SOC_CON15			0x610
3171d5517017SDavid Wu 
3172d5517017SDavid Wu /* RK3308B_GRF_SOC_CON13 */
3173d5517017SDavid Wu #define RK3308B_GRF_I2C3_IOFUNC_SRC_CTRL	(BIT(16 + 10) | BIT(10))
3174d5517017SDavid Wu #define RK3308B_GRF_GPIO2A3_SEL_SRC_CTRL	(BIT(16 + 7)  | BIT(7))
3175d5517017SDavid Wu #define RK3308B_GRF_GPIO2A2_SEL_SRC_CTRL	(BIT(16 + 3)  | BIT(3))
3176d5517017SDavid Wu 
3177d5517017SDavid Wu /* RK3308B_GRF_SOC_CON15 */
3178d5517017SDavid Wu #define RK3308B_GRF_GPIO2C0_SEL_SRC_CTRL	(BIT(16 + 11) | BIT(11))
3179d5517017SDavid Wu #define RK3308B_GRF_GPIO3B3_SEL_SRC_CTRL	(BIT(16 + 7)  | BIT(7))
3180d5517017SDavid Wu #define RK3308B_GRF_GPIO3B2_SEL_SRC_CTRL	(BIT(16 + 3)  | BIT(3))
3181d5517017SDavid Wu 
3182d5517017SDavid Wu static int rk3308b_soc_data_init(struct rockchip_pinctrl_priv *priv)
3183d5517017SDavid Wu {
3184d5517017SDavid Wu 	int ret;
3185d5517017SDavid Wu 
3186d5517017SDavid Wu 	/*
3187d5517017SDavid Wu 	 * Enable the special ctrl  of selected sources.
3188d5517017SDavid Wu 	 */
3189d5517017SDavid Wu 	ret = regmap_write(priv->regmap_base, RK3308B_GRF_SOC_CON13,
3190d5517017SDavid Wu 			   RK3308B_GRF_I2C3_IOFUNC_SRC_CTRL |
3191d5517017SDavid Wu 			   RK3308B_GRF_GPIO2A3_SEL_SRC_CTRL |
3192d5517017SDavid Wu 			   RK3308B_GRF_GPIO2A2_SEL_SRC_CTRL);
3193d5517017SDavid Wu 	if (ret)
3194d5517017SDavid Wu 		return ret;
3195d5517017SDavid Wu 
3196d5517017SDavid Wu 	ret = regmap_write(priv->regmap_base, RK3308B_GRF_SOC_CON15,
3197d5517017SDavid Wu 			   RK3308B_GRF_GPIO2C0_SEL_SRC_CTRL |
3198d5517017SDavid Wu 			   RK3308B_GRF_GPIO3B3_SEL_SRC_CTRL |
3199d5517017SDavid Wu 			   RK3308B_GRF_GPIO3B2_SEL_SRC_CTRL);
3200d5517017SDavid Wu 	if (ret)
3201d5517017SDavid Wu 		return ret;
3202d5517017SDavid Wu 
3203d5517017SDavid Wu 	return 0;
3204d5517017SDavid Wu }
3205d5517017SDavid Wu 
320649c55878SDavid Wu static int rockchip_pinctrl_probe(struct udevice *dev)
320749c55878SDavid Wu {
320849c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = dev_get_priv(dev);
320913c03cb6SJianqun Xu 	const struct rockchip_pin_ctrl *ctrl;
321049c55878SDavid Wu 	struct udevice *syscon;
321149c55878SDavid Wu 	struct regmap *regmap;
321249c55878SDavid Wu 	int ret = 0;
321349c55878SDavid Wu 
321449c55878SDavid Wu 	/* get rockchip grf syscon phandle */
321549c55878SDavid Wu 	ret = uclass_get_device_by_phandle(UCLASS_SYSCON, dev, "rockchip,grf",
321649c55878SDavid Wu 					   &syscon);
321749c55878SDavid Wu 	if (ret) {
321849c55878SDavid Wu 		debug("unable to find rockchip,grf syscon device (%d)\n", ret);
321949c55878SDavid Wu 		return ret;
322049c55878SDavid Wu 	}
322149c55878SDavid Wu 
322249c55878SDavid Wu 	/* get grf-reg base address */
322349c55878SDavid Wu 	regmap = syscon_get_regmap(syscon);
322449c55878SDavid Wu 	if (!regmap) {
322549c55878SDavid Wu 		debug("unable to find rockchip grf regmap\n");
322649c55878SDavid Wu 		return -ENODEV;
322749c55878SDavid Wu 	}
322849c55878SDavid Wu 	priv->regmap_base = regmap;
322949c55878SDavid Wu 
323049c55878SDavid Wu 	/* option: get pmu-reg base address */
323149c55878SDavid Wu 	ret = uclass_get_device_by_phandle(UCLASS_SYSCON, dev, "rockchip,pmu",
323249c55878SDavid Wu 					   &syscon);
323349c55878SDavid Wu 	if (!ret) {
323449c55878SDavid Wu 		/* get pmugrf-reg base address */
323549c55878SDavid Wu 		regmap = syscon_get_regmap(syscon);
323649c55878SDavid Wu 		if (!regmap) {
323749c55878SDavid Wu 			debug("unable to find rockchip pmu regmap\n");
323849c55878SDavid Wu 			return -ENODEV;
323949c55878SDavid Wu 		}
324049c55878SDavid Wu 		priv->regmap_pmu = regmap;
324149c55878SDavid Wu 	}
324249c55878SDavid Wu 
324349c55878SDavid Wu 	ctrl = rockchip_pinctrl_get_soc_data(dev);
324449c55878SDavid Wu 	if (!ctrl) {
324549c55878SDavid Wu 		debug("driver data not available\n");
324649c55878SDavid Wu 		return -EINVAL;
324749c55878SDavid Wu 	}
324849c55878SDavid Wu 
3249d5517017SDavid Wu 	/* Special handle for some Socs */
3250d5517017SDavid Wu 	if (ctrl->soc_data_init) {
3251d5517017SDavid Wu 		ret = ctrl->soc_data_init(priv);
3252d5517017SDavid Wu 		if (ret)
3253d5517017SDavid Wu 			return ret;
3254d5517017SDavid Wu 	}
3255d5517017SDavid Wu 
325613c03cb6SJianqun Xu 	priv->ctrl = (struct rockchip_pin_ctrl *)ctrl;
325749c55878SDavid Wu 	return 0;
325849c55878SDavid Wu }
325949c55878SDavid Wu 
326049c55878SDavid Wu static struct rockchip_pin_bank px30_pin_banks[] = {
326149c55878SDavid Wu 	PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0", IOMUX_SOURCE_PMU,
326249c55878SDavid Wu 					     IOMUX_SOURCE_PMU,
326349c55878SDavid Wu 					     IOMUX_SOURCE_PMU,
326449c55878SDavid Wu 					     IOMUX_SOURCE_PMU
326549c55878SDavid Wu 			    ),
326649c55878SDavid Wu 	PIN_BANK_IOMUX_FLAGS(1, 32, "gpio1", IOMUX_WIDTH_4BIT,
326749c55878SDavid Wu 					     IOMUX_WIDTH_4BIT,
326849c55878SDavid Wu 					     IOMUX_WIDTH_4BIT,
326949c55878SDavid Wu 					     IOMUX_WIDTH_4BIT
327049c55878SDavid Wu 			    ),
327149c55878SDavid Wu 	PIN_BANK_IOMUX_FLAGS(2, 32, "gpio2", IOMUX_WIDTH_4BIT,
327249c55878SDavid Wu 					     IOMUX_WIDTH_4BIT,
327349c55878SDavid Wu 					     IOMUX_WIDTH_4BIT,
327449c55878SDavid Wu 					     IOMUX_WIDTH_4BIT
327549c55878SDavid Wu 			    ),
327649c55878SDavid Wu 	PIN_BANK_IOMUX_FLAGS(3, 32, "gpio3", IOMUX_WIDTH_4BIT,
327749c55878SDavid Wu 					     IOMUX_WIDTH_4BIT,
327849c55878SDavid Wu 					     IOMUX_WIDTH_4BIT,
327949c55878SDavid Wu 					     IOMUX_WIDTH_4BIT
328049c55878SDavid Wu 			    ),
328149c55878SDavid Wu };
328249c55878SDavid Wu 
328313c03cb6SJianqun Xu static const struct rockchip_pin_ctrl px30_pin_ctrl = {
328449c55878SDavid Wu 	.pin_banks		= px30_pin_banks,
328549c55878SDavid Wu 	.nr_banks		= ARRAY_SIZE(px30_pin_banks),
328613c03cb6SJianqun Xu 	.nr_pins		= 128,
328749c55878SDavid Wu 	.label			= "PX30-GPIO",
328849c55878SDavid Wu 	.type			= PX30,
328949c55878SDavid Wu 	.grf_mux_offset		= 0x0,
329049c55878SDavid Wu 	.pmu_mux_offset		= 0x0,
329149c55878SDavid Wu 	.iomux_routes		= px30_mux_route_data,
329249c55878SDavid Wu 	.niomux_routes		= ARRAY_SIZE(px30_mux_route_data),
329349c55878SDavid Wu 	.pull_calc_reg		= px30_calc_pull_reg_and_bit,
329449c55878SDavid Wu 	.drv_calc_reg		= px30_calc_drv_reg_and_bit,
329549c55878SDavid Wu 	.schmitt_calc_reg	= px30_calc_schmitt_reg_and_bit,
329632c25d1fSDavid Wu 	.slew_rate_calc_reg	= px30_calc_slew_rate_reg_and_bit,
329749c55878SDavid Wu };
329849c55878SDavid Wu 
329949c55878SDavid Wu static struct rockchip_pin_bank rv1108_pin_banks[] = {
330049c55878SDavid Wu 	PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0", IOMUX_SOURCE_PMU,
330149c55878SDavid Wu 					     IOMUX_SOURCE_PMU,
330249c55878SDavid Wu 					     IOMUX_SOURCE_PMU,
330349c55878SDavid Wu 					     IOMUX_SOURCE_PMU),
330449c55878SDavid Wu 	PIN_BANK_IOMUX_FLAGS(1, 32, "gpio1", 0, 0, 0, 0),
330549c55878SDavid Wu 	PIN_BANK_IOMUX_FLAGS(2, 32, "gpio2", 0, 0, 0, 0),
330649c55878SDavid Wu 	PIN_BANK_IOMUX_FLAGS(3, 32, "gpio3", 0, 0, 0, 0),
330749c55878SDavid Wu };
330849c55878SDavid Wu 
330913c03cb6SJianqun Xu static const struct rockchip_pin_ctrl rv1108_pin_ctrl = {
331049c55878SDavid Wu 	.pin_banks		= rv1108_pin_banks,
331149c55878SDavid Wu 	.nr_banks		= ARRAY_SIZE(rv1108_pin_banks),
331213c03cb6SJianqun Xu 	.nr_pins		= 128,
331349c55878SDavid Wu 	.label			= "RV1108-GPIO",
331449c55878SDavid Wu 	.type			= RV1108,
331549c55878SDavid Wu 	.grf_mux_offset		= 0x10,
331649c55878SDavid Wu 	.pmu_mux_offset		= 0x0,
331749c55878SDavid Wu 	.iomux_recalced		= rv1108_mux_recalced_data,
331849c55878SDavid Wu 	.niomux_recalced	= ARRAY_SIZE(rv1108_mux_recalced_data),
331949c55878SDavid Wu 	.pull_calc_reg		= rv1108_calc_pull_reg_and_bit,
332049c55878SDavid Wu 	.drv_calc_reg		= rv1108_calc_drv_reg_and_bit,
332149c55878SDavid Wu 	.schmitt_calc_reg	= rv1108_calc_schmitt_reg_and_bit,
332249c55878SDavid Wu };
332349c55878SDavid Wu 
3324cf04a17bSJianqun Xu static struct rockchip_pin_bank rv1126_pin_banks[] = {
3325cf04a17bSJianqun Xu 	PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0",
3326cf04a17bSJianqun Xu 			     IOMUX_WIDTH_4BIT | IOMUX_SOURCE_PMU,
3327cf04a17bSJianqun Xu 			     IOMUX_WIDTH_4BIT | IOMUX_SOURCE_PMU,
3328cf04a17bSJianqun Xu 			     IOMUX_WIDTH_4BIT | IOMUX_L_SOURCE_PMU,
3329cf04a17bSJianqun Xu 			     IOMUX_WIDTH_4BIT),
3330d499d466SJianqun Xu 	PIN_BANK_IOMUX_FLAGS_OFFSET(1, 32, "gpio1",
3331cf04a17bSJianqun Xu 			     IOMUX_WIDTH_4BIT,
3332cf04a17bSJianqun Xu 			     IOMUX_WIDTH_4BIT,
3333cf04a17bSJianqun Xu 			     IOMUX_WIDTH_4BIT,
3334d499d466SJianqun Xu 			     IOMUX_WIDTH_4BIT,
3335d499d466SJianqun Xu 			     0x10010, 0x10018, 0x10020, 0x10028),
3336cf04a17bSJianqun Xu 	PIN_BANK_IOMUX_FLAGS(2, 32, "gpio2",
3337cf04a17bSJianqun Xu 			     IOMUX_WIDTH_4BIT,
3338cf04a17bSJianqun Xu 			     IOMUX_WIDTH_4BIT,
3339cf04a17bSJianqun Xu 			     IOMUX_WIDTH_4BIT,
3340cf04a17bSJianqun Xu 			     IOMUX_WIDTH_4BIT),
3341cf04a17bSJianqun Xu 	PIN_BANK_IOMUX_FLAGS(3, 32, "gpio3",
3342cf04a17bSJianqun Xu 			     IOMUX_WIDTH_4BIT,
3343cf04a17bSJianqun Xu 			     IOMUX_WIDTH_4BIT,
3344cf04a17bSJianqun Xu 			     IOMUX_WIDTH_4BIT,
3345cf04a17bSJianqun Xu 			     IOMUX_WIDTH_4BIT),
3346cf04a17bSJianqun Xu 	PIN_BANK_IOMUX_FLAGS(4, 2, "gpio4",
3347cf04a17bSJianqun Xu 			     IOMUX_WIDTH_4BIT, 0, 0, 0),
3348cf04a17bSJianqun Xu };
3349cf04a17bSJianqun Xu 
335013c03cb6SJianqun Xu static const struct rockchip_pin_ctrl rv1126_pin_ctrl = {
3351cf04a17bSJianqun Xu 	.pin_banks		= rv1126_pin_banks,
3352cf04a17bSJianqun Xu 	.nr_banks		= ARRAY_SIZE(rv1126_pin_banks),
335313c03cb6SJianqun Xu 	.nr_pins		= 130,
3354cf04a17bSJianqun Xu 	.label			= "RV1126-GPIO",
3355cf04a17bSJianqun Xu 	.type			= RV1126,
3356cf04a17bSJianqun Xu 	.grf_mux_offset		= 0x10004, /* mux offset from GPIO0_D0 */
3357cf04a17bSJianqun Xu 	.pmu_mux_offset		= 0x0,
3358d499d466SJianqun Xu 	.iomux_routes		= rv1126_mux_route_data,
3359d499d466SJianqun Xu 	.niomux_routes		= ARRAY_SIZE(rv1126_mux_route_data),
3360cf04a17bSJianqun Xu 	.iomux_recalced		= rv1126_mux_recalced_data,
3361cf04a17bSJianqun Xu 	.niomux_recalced	= ARRAY_SIZE(rv1126_mux_recalced_data),
3362cf04a17bSJianqun Xu 	.pull_calc_reg		= rv1126_calc_pull_reg_and_bit,
3363cf04a17bSJianqun Xu 	.drv_calc_reg		= rv1126_calc_drv_reg_and_bit,
3364cf04a17bSJianqun Xu 	.schmitt_calc_reg	= rv1126_calc_schmitt_reg_and_bit,
3365cf04a17bSJianqun Xu };
3366cf04a17bSJianqun Xu 
3367a2a3fc8fSJianqun Xu static struct rockchip_pin_bank rk1808_pin_banks[] = {
3368a2a3fc8fSJianqun Xu 	PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0",
3369a2a3fc8fSJianqun Xu 			     IOMUX_SOURCE_PMU,
3370a2a3fc8fSJianqun Xu 			     IOMUX_SOURCE_PMU,
3371a2a3fc8fSJianqun Xu 			     IOMUX_SOURCE_PMU,
3372a2a3fc8fSJianqun Xu 			     IOMUX_SOURCE_PMU),
3373a2a3fc8fSJianqun Xu 	PIN_BANK_IOMUX_FLAGS(1, 32, "gpio1",
3374a2a3fc8fSJianqun Xu 			     IOMUX_WIDTH_4BIT,
3375a2a3fc8fSJianqun Xu 			     IOMUX_WIDTH_4BIT,
3376a2a3fc8fSJianqun Xu 			     IOMUX_WIDTH_4BIT,
3377a2a3fc8fSJianqun Xu 			     IOMUX_WIDTH_4BIT),
3378a2a3fc8fSJianqun Xu 	PIN_BANK_IOMUX_FLAGS(2, 32, "gpio2",
3379a2a3fc8fSJianqun Xu 			     IOMUX_WIDTH_4BIT,
3380a2a3fc8fSJianqun Xu 			     IOMUX_WIDTH_4BIT,
3381a2a3fc8fSJianqun Xu 			     IOMUX_WIDTH_4BIT,
3382a2a3fc8fSJianqun Xu 			     IOMUX_WIDTH_4BIT),
3383a2a3fc8fSJianqun Xu 	PIN_BANK_IOMUX_FLAGS(3, 32, "gpio3",
3384a2a3fc8fSJianqun Xu 			     IOMUX_WIDTH_4BIT,
3385a2a3fc8fSJianqun Xu 			     IOMUX_WIDTH_4BIT,
3386a2a3fc8fSJianqun Xu 			     IOMUX_WIDTH_4BIT,
3387a2a3fc8fSJianqun Xu 			     IOMUX_WIDTH_4BIT),
3388a2a3fc8fSJianqun Xu 	PIN_BANK_IOMUX_FLAGS(4, 32, "gpio4",
3389a2a3fc8fSJianqun Xu 			     IOMUX_WIDTH_4BIT,
3390a2a3fc8fSJianqun Xu 			     IOMUX_WIDTH_4BIT,
3391a2a3fc8fSJianqun Xu 			     IOMUX_WIDTH_4BIT,
3392a2a3fc8fSJianqun Xu 			     IOMUX_WIDTH_4BIT),
3393a2a3fc8fSJianqun Xu };
3394a2a3fc8fSJianqun Xu 
339513c03cb6SJianqun Xu static const struct rockchip_pin_ctrl rk1808_pin_ctrl = {
3396a2a3fc8fSJianqun Xu 	.pin_banks		= rk1808_pin_banks,
3397a2a3fc8fSJianqun Xu 	.nr_banks		= ARRAY_SIZE(rk1808_pin_banks),
339813c03cb6SJianqun Xu 	.nr_pins		= 160,
3399a2a3fc8fSJianqun Xu 	.label			= "RK1808-GPIO",
3400a2a3fc8fSJianqun Xu 	.type			= RK1808,
3401a2a3fc8fSJianqun Xu 	.iomux_routes		= rk1808_mux_route_data,
3402a2a3fc8fSJianqun Xu 	.niomux_routes		= ARRAY_SIZE(rk1808_mux_route_data),
3403a2a3fc8fSJianqun Xu 	.grf_mux_offset		= 0x0,
3404a2a3fc8fSJianqun Xu 	.pmu_mux_offset		= 0x0,
3405a2a3fc8fSJianqun Xu 	.pull_calc_reg		= rk1808_calc_pull_reg_and_bit,
3406a2a3fc8fSJianqun Xu 	.drv_calc_reg		= rk1808_calc_drv_reg_and_bit,
3407a2a3fc8fSJianqun Xu 	.schmitt_calc_reg	= rk1808_calc_schmitt_reg_and_bit,
3408a2a3fc8fSJianqun Xu };
3409a2a3fc8fSJianqun Xu 
341049c55878SDavid Wu static struct rockchip_pin_bank rk2928_pin_banks[] = {
341149c55878SDavid Wu 	PIN_BANK(0, 32, "gpio0"),
341249c55878SDavid Wu 	PIN_BANK(1, 32, "gpio1"),
341349c55878SDavid Wu 	PIN_BANK(2, 32, "gpio2"),
341449c55878SDavid Wu 	PIN_BANK(3, 32, "gpio3"),
341549c55878SDavid Wu };
341649c55878SDavid Wu 
341713c03cb6SJianqun Xu static const struct rockchip_pin_ctrl rk2928_pin_ctrl = {
341849c55878SDavid Wu 	.pin_banks		= rk2928_pin_banks,
341949c55878SDavid Wu 	.nr_banks		= ARRAY_SIZE(rk2928_pin_banks),
342013c03cb6SJianqun Xu 	.nr_pins		= 128,
342149c55878SDavid Wu 	.label			= "RK2928-GPIO",
342249c55878SDavid Wu 	.type			= RK2928,
342349c55878SDavid Wu 	.grf_mux_offset		= 0xa8,
342449c55878SDavid Wu 	.pull_calc_reg		= rk2928_calc_pull_reg_and_bit,
342549c55878SDavid Wu };
342649c55878SDavid Wu 
342749c55878SDavid Wu static struct rockchip_pin_bank rk3036_pin_banks[] = {
342849c55878SDavid Wu 	PIN_BANK(0, 32, "gpio0"),
342949c55878SDavid Wu 	PIN_BANK(1, 32, "gpio1"),
343049c55878SDavid Wu 	PIN_BANK(2, 32, "gpio2"),
343149c55878SDavid Wu };
343249c55878SDavid Wu 
343313c03cb6SJianqun Xu static const struct rockchip_pin_ctrl rk3036_pin_ctrl = {
343449c55878SDavid Wu 	.pin_banks		= rk3036_pin_banks,
343549c55878SDavid Wu 	.nr_banks		= ARRAY_SIZE(rk3036_pin_banks),
343613c03cb6SJianqun Xu 	.nr_pins		= 96,
343749c55878SDavid Wu 	.label			= "RK3036-GPIO",
343849c55878SDavid Wu 	.type			= RK2928,
343949c55878SDavid Wu 	.grf_mux_offset		= 0xa8,
344049c55878SDavid Wu 	.pull_calc_reg		= rk2928_calc_pull_reg_and_bit,
344149c55878SDavid Wu };
344249c55878SDavid Wu 
344349c55878SDavid Wu static struct rockchip_pin_bank rk3066a_pin_banks[] = {
344449c55878SDavid Wu 	PIN_BANK(0, 32, "gpio0"),
344549c55878SDavid Wu 	PIN_BANK(1, 32, "gpio1"),
344649c55878SDavid Wu 	PIN_BANK(2, 32, "gpio2"),
344749c55878SDavid Wu 	PIN_BANK(3, 32, "gpio3"),
344849c55878SDavid Wu 	PIN_BANK(4, 32, "gpio4"),
344949c55878SDavid Wu 	PIN_BANK(6, 16, "gpio6"),
345049c55878SDavid Wu };
345149c55878SDavid Wu 
345213c03cb6SJianqun Xu static const struct rockchip_pin_ctrl rk3066a_pin_ctrl = {
345349c55878SDavid Wu 	.pin_banks		= rk3066a_pin_banks,
345449c55878SDavid Wu 	.nr_banks		= ARRAY_SIZE(rk3066a_pin_banks),
345513c03cb6SJianqun Xu 	.nr_pins		= 176,
345649c55878SDavid Wu 	.label			= "RK3066a-GPIO",
345749c55878SDavid Wu 	.type			= RK2928,
345849c55878SDavid Wu 	.grf_mux_offset		= 0xa8,
345949c55878SDavid Wu 	.pull_calc_reg		= rk2928_calc_pull_reg_and_bit,
346049c55878SDavid Wu };
346149c55878SDavid Wu 
346249c55878SDavid Wu static struct rockchip_pin_bank rk3066b_pin_banks[] = {
346349c55878SDavid Wu 	PIN_BANK(0, 32, "gpio0"),
346449c55878SDavid Wu 	PIN_BANK(1, 32, "gpio1"),
346549c55878SDavid Wu 	PIN_BANK(2, 32, "gpio2"),
346649c55878SDavid Wu 	PIN_BANK(3, 32, "gpio3"),
346749c55878SDavid Wu };
346849c55878SDavid Wu 
346913c03cb6SJianqun Xu static const struct rockchip_pin_ctrl rk3066b_pin_ctrl = {
347049c55878SDavid Wu 	.pin_banks		= rk3066b_pin_banks,
347149c55878SDavid Wu 	.nr_banks		= ARRAY_SIZE(rk3066b_pin_banks),
347213c03cb6SJianqun Xu 	.nr_pins		= 128,
347349c55878SDavid Wu 	.label			= "RK3066b-GPIO",
347449c55878SDavid Wu 	.type			= RK3066B,
347549c55878SDavid Wu 	.grf_mux_offset		= 0x60,
347649c55878SDavid Wu };
347749c55878SDavid Wu 
347849c55878SDavid Wu static struct rockchip_pin_bank rk3128_pin_banks[] = {
347949c55878SDavid Wu 	PIN_BANK(0, 32, "gpio0"),
348049c55878SDavid Wu 	PIN_BANK(1, 32, "gpio1"),
348149c55878SDavid Wu 	PIN_BANK(2, 32, "gpio2"),
348249c55878SDavid Wu 	PIN_BANK(3, 32, "gpio3"),
348349c55878SDavid Wu };
348449c55878SDavid Wu 
348513c03cb6SJianqun Xu static const struct rockchip_pin_ctrl rk3128_pin_ctrl = {
348649c55878SDavid Wu 	.pin_banks		= rk3128_pin_banks,
348749c55878SDavid Wu 	.nr_banks		= ARRAY_SIZE(rk3128_pin_banks),
348813c03cb6SJianqun Xu 	.nr_pins		= 128,
348949c55878SDavid Wu 	.label			= "RK3128-GPIO",
349049c55878SDavid Wu 	.type			= RK3128,
349149c55878SDavid Wu 	.grf_mux_offset		= 0xa8,
349249c55878SDavid Wu 	.iomux_recalced		= rk3128_mux_recalced_data,
349349c55878SDavid Wu 	.niomux_recalced	= ARRAY_SIZE(rk3128_mux_recalced_data),
349449c55878SDavid Wu 	.iomux_routes		= rk3128_mux_route_data,
349549c55878SDavid Wu 	.niomux_routes		= ARRAY_SIZE(rk3128_mux_route_data),
349649c55878SDavid Wu 	.pull_calc_reg		= rk3128_calc_pull_reg_and_bit,
349749c55878SDavid Wu };
349849c55878SDavid Wu 
349949c55878SDavid Wu static struct rockchip_pin_bank rk3188_pin_banks[] = {
350049c55878SDavid Wu 	PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0", IOMUX_GPIO_ONLY, 0, 0, 0),
350149c55878SDavid Wu 	PIN_BANK(1, 32, "gpio1"),
350249c55878SDavid Wu 	PIN_BANK(2, 32, "gpio2"),
350349c55878SDavid Wu 	PIN_BANK(3, 32, "gpio3"),
350449c55878SDavid Wu };
350549c55878SDavid Wu 
350613c03cb6SJianqun Xu static const struct rockchip_pin_ctrl rk3188_pin_ctrl = {
350749c55878SDavid Wu 	.pin_banks		= rk3188_pin_banks,
350849c55878SDavid Wu 	.nr_banks		= ARRAY_SIZE(rk3188_pin_banks),
350913c03cb6SJianqun Xu 	.nr_pins		= 128,
351049c55878SDavid Wu 	.label			= "RK3188-GPIO",
351149c55878SDavid Wu 	.type			= RK3188,
351249c55878SDavid Wu 	.grf_mux_offset		= 0x60,
351349c55878SDavid Wu 	.pull_calc_reg		= rk3188_calc_pull_reg_and_bit,
351449c55878SDavid Wu };
351549c55878SDavid Wu 
351649c55878SDavid Wu static struct rockchip_pin_bank rk3228_pin_banks[] = {
351749c55878SDavid Wu 	PIN_BANK(0, 32, "gpio0"),
351849c55878SDavid Wu 	PIN_BANK(1, 32, "gpio1"),
351949c55878SDavid Wu 	PIN_BANK(2, 32, "gpio2"),
352049c55878SDavid Wu 	PIN_BANK(3, 32, "gpio3"),
352149c55878SDavid Wu };
352249c55878SDavid Wu 
352313c03cb6SJianqun Xu static const struct rockchip_pin_ctrl rk3228_pin_ctrl = {
352449c55878SDavid Wu 	.pin_banks		= rk3228_pin_banks,
352549c55878SDavid Wu 	.nr_banks		= ARRAY_SIZE(rk3228_pin_banks),
352613c03cb6SJianqun Xu 	.nr_pins		= 128,
352749c55878SDavid Wu 	.label			= "RK3228-GPIO",
352849c55878SDavid Wu 	.type			= RK3288,
352949c55878SDavid Wu 	.grf_mux_offset		= 0x0,
353049c55878SDavid Wu 	.iomux_routes		= rk3228_mux_route_data,
353149c55878SDavid Wu 	.niomux_routes		= ARRAY_SIZE(rk3228_mux_route_data),
353249c55878SDavid Wu 	.pull_calc_reg		= rk3228_calc_pull_reg_and_bit,
353349c55878SDavid Wu 	.drv_calc_reg		= rk3228_calc_drv_reg_and_bit,
353449c55878SDavid Wu };
353549c55878SDavid Wu 
353649c55878SDavid Wu static struct rockchip_pin_bank rk3288_pin_banks[] = {
353755a89bc6SDavid Wu 	PIN_BANK_IOMUX_DRV_PULL_FLAGS(0, 24, "gpio0",
35384bafc2daSDavid Wu 				      IOMUX_SOURCE_PMU | IOMUX_WRITABLE_32BIT,
35394bafc2daSDavid Wu 				      IOMUX_SOURCE_PMU | IOMUX_WRITABLE_32BIT,
354055a89bc6SDavid Wu 				      IOMUX_SOURCE_PMU | IOMUX_WRITABLE_32BIT,
354155a89bc6SDavid Wu 				      IOMUX_UNROUTED,
354255a89bc6SDavid Wu 				      DRV_TYPE_WRITABLE_32BIT,
354355a89bc6SDavid Wu 				      DRV_TYPE_WRITABLE_32BIT,
354455a89bc6SDavid Wu 				      DRV_TYPE_WRITABLE_32BIT,
354555a89bc6SDavid Wu 				      0,
354655a89bc6SDavid Wu 				      PULL_TYPE_WRITABLE_32BIT,
354755a89bc6SDavid Wu 				      PULL_TYPE_WRITABLE_32BIT,
354855a89bc6SDavid Wu 				      PULL_TYPE_WRITABLE_32BIT,
354955a89bc6SDavid Wu 				      0
355049c55878SDavid Wu 			    ),
355149c55878SDavid Wu 	PIN_BANK_IOMUX_FLAGS(1, 32, "gpio1", IOMUX_UNROUTED,
355249c55878SDavid Wu 					     IOMUX_UNROUTED,
355349c55878SDavid Wu 					     IOMUX_UNROUTED,
355449c55878SDavid Wu 					     0
355549c55878SDavid Wu 			    ),
355649c55878SDavid Wu 	PIN_BANK_IOMUX_FLAGS(2, 32, "gpio2", 0, 0, 0, IOMUX_UNROUTED),
355749c55878SDavid Wu 	PIN_BANK_IOMUX_FLAGS(3, 32, "gpio3", 0, 0, 0, IOMUX_WIDTH_4BIT),
355849c55878SDavid Wu 	PIN_BANK_IOMUX_FLAGS(4, 32, "gpio4", IOMUX_WIDTH_4BIT,
355949c55878SDavid Wu 					     IOMUX_WIDTH_4BIT,
356049c55878SDavid Wu 					     0,
356149c55878SDavid Wu 					     0
356249c55878SDavid Wu 			    ),
356349c55878SDavid Wu 	PIN_BANK_IOMUX_FLAGS(5, 32, "gpio5", IOMUX_UNROUTED,
356449c55878SDavid Wu 					     0,
356549c55878SDavid Wu 					     0,
356649c55878SDavid Wu 					     IOMUX_UNROUTED
356749c55878SDavid Wu 			    ),
356849c55878SDavid Wu 	PIN_BANK_IOMUX_FLAGS(6, 32, "gpio6", 0, 0, 0, IOMUX_UNROUTED),
356949c55878SDavid Wu 	PIN_BANK_IOMUX_FLAGS(7, 32, "gpio7", 0,
357049c55878SDavid Wu 					     0,
357149c55878SDavid Wu 					     IOMUX_WIDTH_4BIT,
357249c55878SDavid Wu 					     IOMUX_UNROUTED
357349c55878SDavid Wu 			    ),
357449c55878SDavid Wu 	PIN_BANK(8, 16, "gpio8"),
357549c55878SDavid Wu };
357649c55878SDavid Wu 
357713c03cb6SJianqun Xu static const struct rockchip_pin_ctrl rk3288_pin_ctrl = {
357849c55878SDavid Wu 	.pin_banks		= rk3288_pin_banks,
357949c55878SDavid Wu 	.nr_banks		= ARRAY_SIZE(rk3288_pin_banks),
35802f6aff58SJianqun Xu 	.nr_pins		= 264,
358149c55878SDavid Wu 	.label			= "RK3288-GPIO",
358249c55878SDavid Wu 	.type			= RK3288,
358349c55878SDavid Wu 	.grf_mux_offset		= 0x0,
358449c55878SDavid Wu 	.pmu_mux_offset		= 0x84,
358549c55878SDavid Wu 	.iomux_routes		= rk3288_mux_route_data,
358649c55878SDavid Wu 	.niomux_routes		= ARRAY_SIZE(rk3288_mux_route_data),
358749c55878SDavid Wu 	.pull_calc_reg		= rk3288_calc_pull_reg_and_bit,
358849c55878SDavid Wu 	.drv_calc_reg		= rk3288_calc_drv_reg_and_bit,
358949c55878SDavid Wu };
359049c55878SDavid Wu 
3591b3077611SDavid Wu static struct rockchip_pin_bank rk3308_pin_banks[] = {
3592b3077611SDavid Wu 	PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0", IOMUX_8WIDTH_2BIT,
3593b3077611SDavid Wu 					     IOMUX_8WIDTH_2BIT,
3594b3077611SDavid Wu 					     IOMUX_8WIDTH_2BIT,
3595b3077611SDavid Wu 					     IOMUX_8WIDTH_2BIT),
3596b3077611SDavid Wu 	PIN_BANK_IOMUX_FLAGS(1, 32, "gpio1", IOMUX_8WIDTH_2BIT,
3597b3077611SDavid Wu 					     IOMUX_8WIDTH_2BIT,
3598b3077611SDavid Wu 					     IOMUX_8WIDTH_2BIT,
3599b3077611SDavid Wu 					     IOMUX_8WIDTH_2BIT),
3600b3077611SDavid Wu 	PIN_BANK_IOMUX_FLAGS(2, 32, "gpio2", IOMUX_8WIDTH_2BIT,
3601b3077611SDavid Wu 					     IOMUX_8WIDTH_2BIT,
3602b3077611SDavid Wu 					     IOMUX_8WIDTH_2BIT,
3603b3077611SDavid Wu 					     IOMUX_8WIDTH_2BIT),
3604b3077611SDavid Wu 	PIN_BANK_IOMUX_FLAGS(3, 32, "gpio3", IOMUX_8WIDTH_2BIT,
3605b3077611SDavid Wu 					     IOMUX_8WIDTH_2BIT,
3606b3077611SDavid Wu 					     IOMUX_8WIDTH_2BIT,
3607b3077611SDavid Wu 					     IOMUX_8WIDTH_2BIT),
3608b3077611SDavid Wu 	PIN_BANK_IOMUX_FLAGS(4, 32, "gpio4", IOMUX_8WIDTH_2BIT,
3609b3077611SDavid Wu 					     IOMUX_8WIDTH_2BIT,
3610b3077611SDavid Wu 					     IOMUX_8WIDTH_2BIT,
3611b3077611SDavid Wu 					     IOMUX_8WIDTH_2BIT),
3612b3077611SDavid Wu };
3613b3077611SDavid Wu 
3614b3077611SDavid Wu static struct rockchip_pin_ctrl rk3308_pin_ctrl = {
3615b3077611SDavid Wu 		.pin_banks		= rk3308_pin_banks,
3616b3077611SDavid Wu 		.nr_banks		= ARRAY_SIZE(rk3308_pin_banks),
3617e21613fbSJianqun Xu 		.nr_pins		= 160,
3618b3077611SDavid Wu 		.label			= "RK3308-GPIO",
3619b3077611SDavid Wu 		.type			= RK3308,
3620b3077611SDavid Wu 		.grf_mux_offset		= 0x0,
3621b3077611SDavid Wu 		.iomux_recalced		= rk3308_mux_recalced_data,
3622b3077611SDavid Wu 		.niomux_recalced	= ARRAY_SIZE(rk3308_mux_recalced_data),
3623b3077611SDavid Wu 		.iomux_routes		= rk3308_mux_route_data,
3624b3077611SDavid Wu 		.niomux_routes		= ARRAY_SIZE(rk3308_mux_route_data),
362513c03cb6SJianqun Xu 		.pull_calc_reg		= rk3308_calc_pull_reg_and_bit,
362613c03cb6SJianqun Xu 		.drv_calc_reg		= rk3308_calc_drv_reg_and_bit,
362713c03cb6SJianqun Xu 		.schmitt_calc_reg	= rk3308_calc_schmitt_reg_and_bit,
362813c03cb6SJianqun Xu };
362913c03cb6SJianqun Xu 
363013c03cb6SJianqun Xu static const struct rockchip_pin_ctrl rk3308b_pin_ctrl = {
363113c03cb6SJianqun Xu 	.pin_banks		= rk3308_pin_banks,
363213c03cb6SJianqun Xu 	.nr_banks		= ARRAY_SIZE(rk3308_pin_banks),
363313c03cb6SJianqun Xu 	.nr_pins		= 160,
363413c03cb6SJianqun Xu 	.label			= "RK3308-GPIO",
363513c03cb6SJianqun Xu 	.type			= RK3308,
363613c03cb6SJianqun Xu 	.grf_mux_offset		= 0x0,
363713c03cb6SJianqun Xu 	.iomux_recalced		= rk3308b_mux_recalced_data,
363813c03cb6SJianqun Xu 	.niomux_recalced	= ARRAY_SIZE(rk3308b_mux_recalced_data),
363913c03cb6SJianqun Xu 	.iomux_routes		= rk3308b_mux_route_data,
364013c03cb6SJianqun Xu 	.niomux_routes		= ARRAY_SIZE(rk3308b_mux_route_data),
3641d5517017SDavid Wu 	.soc_data_init		= rk3308b_soc_data_init,
3642b3077611SDavid Wu 	.pull_calc_reg		= rk3308_calc_pull_reg_and_bit,
3643b3077611SDavid Wu 	.drv_calc_reg		= rk3308_calc_drv_reg_and_bit,
3644b3077611SDavid Wu 	.schmitt_calc_reg	= rk3308_calc_schmitt_reg_and_bit,
3645b3077611SDavid Wu };
3646b3077611SDavid Wu 
364749c55878SDavid Wu static struct rockchip_pin_bank rk3328_pin_banks[] = {
364849c55878SDavid Wu 	PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0", 0, 0, 0, 0),
364949c55878SDavid Wu 	PIN_BANK_IOMUX_FLAGS(1, 32, "gpio1", 0, 0, 0, 0),
365049c55878SDavid Wu 	PIN_BANK_IOMUX_FLAGS(2, 32, "gpio2", 0,
365149c55878SDavid Wu 			     IOMUX_WIDTH_3BIT,
365249c55878SDavid Wu 			     IOMUX_WIDTH_3BIT,
365349c55878SDavid Wu 			     0),
365449c55878SDavid Wu 	PIN_BANK_IOMUX_FLAGS(3, 32, "gpio3",
365549c55878SDavid Wu 			     IOMUX_WIDTH_3BIT,
365649c55878SDavid Wu 			     IOMUX_WIDTH_3BIT,
365749c55878SDavid Wu 			     0,
365849c55878SDavid Wu 			     0),
365949c55878SDavid Wu };
366049c55878SDavid Wu 
366113c03cb6SJianqun Xu static const struct rockchip_pin_ctrl rk3328_pin_ctrl = {
366249c55878SDavid Wu 	.pin_banks		= rk3328_pin_banks,
366349c55878SDavid Wu 	.nr_banks		= ARRAY_SIZE(rk3328_pin_banks),
366413c03cb6SJianqun Xu 	.nr_pins		= 128,
366549c55878SDavid Wu 	.label			= "RK3328-GPIO",
366649c55878SDavid Wu 	.type			= RK3288,
366749c55878SDavid Wu 	.grf_mux_offset		= 0x0,
366849c55878SDavid Wu 	.iomux_recalced		= rk3328_mux_recalced_data,
366949c55878SDavid Wu 	.niomux_recalced	= ARRAY_SIZE(rk3328_mux_recalced_data),
367049c55878SDavid Wu 	.iomux_routes		= rk3328_mux_route_data,
367149c55878SDavid Wu 	.niomux_routes		= ARRAY_SIZE(rk3328_mux_route_data),
367249c55878SDavid Wu 	.pull_calc_reg		= rk3228_calc_pull_reg_and_bit,
367349c55878SDavid Wu 	.drv_calc_reg		= rk3228_calc_drv_reg_and_bit,
367449c55878SDavid Wu 	.schmitt_calc_reg	= rk3328_calc_schmitt_reg_and_bit,
367549c55878SDavid Wu };
367649c55878SDavid Wu 
367749c55878SDavid Wu static struct rockchip_pin_bank rk3368_pin_banks[] = {
367849c55878SDavid Wu 	PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0", IOMUX_SOURCE_PMU,
367949c55878SDavid Wu 					     IOMUX_SOURCE_PMU,
368049c55878SDavid Wu 					     IOMUX_SOURCE_PMU,
368149c55878SDavid Wu 					     IOMUX_SOURCE_PMU
368249c55878SDavid Wu 			    ),
368349c55878SDavid Wu 	PIN_BANK(1, 32, "gpio1"),
368449c55878SDavid Wu 	PIN_BANK(2, 32, "gpio2"),
368549c55878SDavid Wu 	PIN_BANK(3, 32, "gpio3"),
368649c55878SDavid Wu };
368749c55878SDavid Wu 
368813c03cb6SJianqun Xu static const struct rockchip_pin_ctrl rk3368_pin_ctrl = {
368949c55878SDavid Wu 	.pin_banks		= rk3368_pin_banks,
369049c55878SDavid Wu 	.nr_banks		= ARRAY_SIZE(rk3368_pin_banks),
369113c03cb6SJianqun Xu 	.nr_pins		= 128,
369249c55878SDavid Wu 	.label			= "RK3368-GPIO",
369349c55878SDavid Wu 	.type			= RK3368,
369449c55878SDavid Wu 	.grf_mux_offset		= 0x0,
369549c55878SDavid Wu 	.pmu_mux_offset		= 0x0,
369649c55878SDavid Wu 	.pull_calc_reg		= rk3368_calc_pull_reg_and_bit,
369749c55878SDavid Wu 	.drv_calc_reg		= rk3368_calc_drv_reg_and_bit,
369849c55878SDavid Wu };
369949c55878SDavid Wu 
370049c55878SDavid Wu static struct rockchip_pin_bank rk3399_pin_banks[] = {
370149c55878SDavid Wu 	PIN_BANK_IOMUX_FLAGS_DRV_FLAGS_OFFSET_PULL_FLAGS(0, 32, "gpio0",
370249c55878SDavid Wu 							 IOMUX_SOURCE_PMU,
370349c55878SDavid Wu 							 IOMUX_SOURCE_PMU,
370449c55878SDavid Wu 							 IOMUX_SOURCE_PMU,
370549c55878SDavid Wu 							 IOMUX_SOURCE_PMU,
370649c55878SDavid Wu 							 DRV_TYPE_IO_1V8_ONLY,
370749c55878SDavid Wu 							 DRV_TYPE_IO_1V8_ONLY,
370849c55878SDavid Wu 							 DRV_TYPE_IO_DEFAULT,
370949c55878SDavid Wu 							 DRV_TYPE_IO_DEFAULT,
371049c55878SDavid Wu 							 0x80,
371149c55878SDavid Wu 							 0x88,
371249c55878SDavid Wu 							 -1,
371349c55878SDavid Wu 							 -1,
371449c55878SDavid Wu 							 PULL_TYPE_IO_1V8_ONLY,
371549c55878SDavid Wu 							 PULL_TYPE_IO_1V8_ONLY,
371649c55878SDavid Wu 							 PULL_TYPE_IO_DEFAULT,
371749c55878SDavid Wu 							 PULL_TYPE_IO_DEFAULT
371849c55878SDavid Wu 							),
371949c55878SDavid Wu 	PIN_BANK_IOMUX_DRV_FLAGS_OFFSET(1, 32, "gpio1", IOMUX_SOURCE_PMU,
372049c55878SDavid Wu 					IOMUX_SOURCE_PMU,
372149c55878SDavid Wu 					IOMUX_SOURCE_PMU,
372249c55878SDavid Wu 					IOMUX_SOURCE_PMU,
372349c55878SDavid Wu 					DRV_TYPE_IO_1V8_OR_3V0,
372449c55878SDavid Wu 					DRV_TYPE_IO_1V8_OR_3V0,
372549c55878SDavid Wu 					DRV_TYPE_IO_1V8_OR_3V0,
372649c55878SDavid Wu 					DRV_TYPE_IO_1V8_OR_3V0,
372749c55878SDavid Wu 					0xa0,
372849c55878SDavid Wu 					0xa8,
372949c55878SDavid Wu 					0xb0,
373049c55878SDavid Wu 					0xb8
373149c55878SDavid Wu 					),
373249c55878SDavid Wu 	PIN_BANK_DRV_FLAGS_PULL_FLAGS(2, 32, "gpio2", DRV_TYPE_IO_1V8_OR_3V0,
373349c55878SDavid Wu 				      DRV_TYPE_IO_1V8_OR_3V0,
373449c55878SDavid Wu 				      DRV_TYPE_IO_1V8_ONLY,
373549c55878SDavid Wu 				      DRV_TYPE_IO_1V8_ONLY,
373649c55878SDavid Wu 				      PULL_TYPE_IO_DEFAULT,
373749c55878SDavid Wu 				      PULL_TYPE_IO_DEFAULT,
373849c55878SDavid Wu 				      PULL_TYPE_IO_1V8_ONLY,
373949c55878SDavid Wu 				      PULL_TYPE_IO_1V8_ONLY
374049c55878SDavid Wu 				      ),
374149c55878SDavid Wu 	PIN_BANK_DRV_FLAGS(3, 32, "gpio3", DRV_TYPE_IO_3V3_ONLY,
374249c55878SDavid Wu 			   DRV_TYPE_IO_3V3_ONLY,
374349c55878SDavid Wu 			   DRV_TYPE_IO_3V3_ONLY,
374449c55878SDavid Wu 			   DRV_TYPE_IO_1V8_OR_3V0
374549c55878SDavid Wu 			   ),
374649c55878SDavid Wu 	PIN_BANK_DRV_FLAGS(4, 32, "gpio4", DRV_TYPE_IO_1V8_OR_3V0,
374749c55878SDavid Wu 			   DRV_TYPE_IO_1V8_3V0_AUTO,
374849c55878SDavid Wu 			   DRV_TYPE_IO_1V8_OR_3V0,
374949c55878SDavid Wu 			   DRV_TYPE_IO_1V8_OR_3V0
375049c55878SDavid Wu 			   ),
375149c55878SDavid Wu };
375249c55878SDavid Wu 
375313c03cb6SJianqun Xu static const struct rockchip_pin_ctrl rk3399_pin_ctrl = {
375449c55878SDavid Wu 	.pin_banks		= rk3399_pin_banks,
375549c55878SDavid Wu 	.nr_banks		= ARRAY_SIZE(rk3399_pin_banks),
375613c03cb6SJianqun Xu 	.nr_pins		= 160,
375749c55878SDavid Wu 	.label			= "RK3399-GPIO",
375849c55878SDavid Wu 	.type			= RK3399,
375949c55878SDavid Wu 	.grf_mux_offset		= 0xe000,
376049c55878SDavid Wu 	.pmu_mux_offset		= 0x0,
376149c55878SDavid Wu 	.grf_drv_offset		= 0xe100,
376249c55878SDavid Wu 	.pmu_drv_offset		= 0x80,
376349c55878SDavid Wu 	.iomux_routes		= rk3399_mux_route_data,
376449c55878SDavid Wu 	.niomux_routes		= ARRAY_SIZE(rk3399_mux_route_data),
376549c55878SDavid Wu 	.pull_calc_reg		= rk3399_calc_pull_reg_and_bit,
376649c55878SDavid Wu 	.drv_calc_reg		= rk3399_calc_drv_reg_and_bit,
376749c55878SDavid Wu };
376849c55878SDavid Wu 
376949c55878SDavid Wu static const struct udevice_id rockchip_pinctrl_dt_match[] = {
377049c55878SDavid Wu 	{ .compatible = "rockchip,px30-pinctrl",
377149c55878SDavid Wu 		.data = (ulong)&px30_pin_ctrl },
377249c55878SDavid Wu 	{ .compatible = "rockchip,rv1108-pinctrl",
377349c55878SDavid Wu 		.data = (ulong)&rv1108_pin_ctrl },
377492b1d31aSJianqun Xu 	{ .compatible = "rockchip,rv1126-pinctrl-legency",
3775cf04a17bSJianqun Xu 		.data = (ulong)&rv1126_pin_ctrl },
3776a2a3fc8fSJianqun Xu 	{ .compatible = "rockchip,rk1808-pinctrl",
3777a2a3fc8fSJianqun Xu 		.data = (ulong)&rk1808_pin_ctrl },
377849c55878SDavid Wu 	{ .compatible = "rockchip,rk2928-pinctrl",
377949c55878SDavid Wu 		.data = (ulong)&rk2928_pin_ctrl },
378049c55878SDavid Wu 	{ .compatible = "rockchip,rk3036-pinctrl",
378149c55878SDavid Wu 		.data = (ulong)&rk3036_pin_ctrl },
378249c55878SDavid Wu 	{ .compatible = "rockchip,rk3066a-pinctrl",
378349c55878SDavid Wu 		.data = (ulong)&rk3066a_pin_ctrl },
378449c55878SDavid Wu 	{ .compatible = "rockchip,rk3066b-pinctrl",
378549c55878SDavid Wu 		.data = (ulong)&rk3066b_pin_ctrl },
378649c55878SDavid Wu 	{ .compatible = "rockchip,rk3128-pinctrl",
378749c55878SDavid Wu 		.data = (ulong)&rk3128_pin_ctrl },
378849c55878SDavid Wu 	{ .compatible = "rockchip,rk3188-pinctrl",
378949c55878SDavid Wu 		.data = (ulong)&rk3188_pin_ctrl },
379049c55878SDavid Wu 	{ .compatible = "rockchip,rk3228-pinctrl",
379149c55878SDavid Wu 		.data = (ulong)&rk3228_pin_ctrl },
379249c55878SDavid Wu 	{ .compatible = "rockchip,rk3288-pinctrl",
379349c55878SDavid Wu 		.data = (ulong)&rk3288_pin_ctrl },
3794b3077611SDavid Wu 	{ .compatible = "rockchip,rk3308-pinctrl",
3795b3077611SDavid Wu 		.data = (ulong)&rk3308_pin_ctrl },
379649c55878SDavid Wu 	{ .compatible = "rockchip,rk3328-pinctrl",
379749c55878SDavid Wu 		.data = (ulong)&rk3328_pin_ctrl },
379849c55878SDavid Wu 	{ .compatible = "rockchip,rk3368-pinctrl",
379949c55878SDavid Wu 		.data = (ulong)&rk3368_pin_ctrl },
380049c55878SDavid Wu 	{ .compatible = "rockchip,rk3399-pinctrl",
380149c55878SDavid Wu 		.data = (ulong)&rk3399_pin_ctrl },
380249c55878SDavid Wu 	{},
380349c55878SDavid Wu };
380449c55878SDavid Wu 
380549c55878SDavid Wu U_BOOT_DRIVER(pinctrl_rockchip) = {
380649c55878SDavid Wu 	.name		= "rockchip_pinctrl",
380749c55878SDavid Wu 	.id		= UCLASS_PINCTRL,
380849c55878SDavid Wu 	.of_match	= rockchip_pinctrl_dt_match,
380949c55878SDavid Wu 	.priv_auto_alloc_size = sizeof(struct rockchip_pinctrl_priv),
381049c55878SDavid Wu 	.ops		= &rockchip_pinctrl_ops,
381149c55878SDavid Wu #if !CONFIG_IS_ENABLED(OF_PLATDATA)
381249c55878SDavid Wu 	.bind		= dm_scan_fdt_dev,
381349c55878SDavid Wu #endif
381449c55878SDavid Wu 	.probe		= rockchip_pinctrl_probe,
381549c55878SDavid Wu };
3816