xref: /rk3399_rockchip-uboot/drivers/pinctrl/pinctrl-rockchip.c (revision 2f6aff5865decdedd79ca2a28e640f3c90c8e4ce)
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,
7449c55878SDavid Wu 	DRV_TYPE_MAX
7549c55878SDavid Wu };
7649c55878SDavid Wu 
7755a89bc6SDavid Wu #define PULL_TYPE_IO_MASK		GENMASK(31, 16)
7855a89bc6SDavid Wu #define PULL_TYPE_WRITABLE_32BIT	BIT(31)
7955a89bc6SDavid Wu 
8049c55878SDavid Wu /**
8149c55878SDavid Wu  * enum type index corresponding to rockchip_pull_list arrays index.
8249c55878SDavid Wu  */
8349c55878SDavid Wu enum rockchip_pin_pull_type {
8449c55878SDavid Wu 	PULL_TYPE_IO_DEFAULT = 0,
8549c55878SDavid Wu 	PULL_TYPE_IO_1V8_ONLY,
8649c55878SDavid Wu 	PULL_TYPE_MAX
8749c55878SDavid Wu };
8849c55878SDavid Wu 
8949c55878SDavid Wu /**
9049e04eddSJianqun Xu  * enum mux route register type, should be invalid/default/topgrf/pmugrf.
9149e04eddSJianqun Xu  * INVALID: means do not need to set mux route
9249e04eddSJianqun Xu  * DEFAULT: means same regmap as pin iomux
9349e04eddSJianqun Xu  * TOPGRF: means mux route setting in topgrf
9449e04eddSJianqun Xu  * PMUGRF: means mux route setting in pmugrf
9549e04eddSJianqun Xu  */
9649e04eddSJianqun Xu enum rockchip_pin_route_type {
9749e04eddSJianqun Xu 	ROUTE_TYPE_DEFAULT = 0,
9849e04eddSJianqun Xu 	ROUTE_TYPE_TOPGRF = 1,
9949e04eddSJianqun Xu 	ROUTE_TYPE_PMUGRF = 2,
10049e04eddSJianqun Xu 
10149e04eddSJianqun Xu 	ROUTE_TYPE_INVALID = -1,
10249e04eddSJianqun Xu };
10349e04eddSJianqun Xu 
10449e04eddSJianqun Xu /**
10549c55878SDavid Wu  * @drv_type: drive strength variant using rockchip_perpin_drv_type
10649c55878SDavid Wu  * @offset: if initialized to -1 it will be autocalculated, by specifying
10749c55878SDavid Wu  *	    an initial offset value the relevant source offset can be reset
10849c55878SDavid Wu  *	    to a new value for autocalculating the following drive strength
10949c55878SDavid Wu  *	    registers. if used chips own cal_drv func instead to calculate
11049c55878SDavid Wu  *	    registers offset, the variant could be ignored.
11149c55878SDavid Wu  */
11249c55878SDavid Wu struct rockchip_drv {
11349c55878SDavid Wu 	enum rockchip_pin_drv_type	drv_type;
11449c55878SDavid Wu 	int				offset;
11549c55878SDavid Wu };
11649c55878SDavid Wu 
11749c55878SDavid Wu /**
11849c55878SDavid Wu  * @priv: common pinctrl private basedata
11949c55878SDavid Wu  * @pin_base: first pin number
12049c55878SDavid Wu  * @nr_pins: number of pins in this bank
12149c55878SDavid Wu  * @name: name of the bank
12249c55878SDavid Wu  * @bank_num: number of the bank, to account for holes
12349c55878SDavid Wu  * @iomux: array describing the 4 iomux sources of the bank
12449c55878SDavid Wu  * @drv: array describing the 4 drive strength sources of the bank
12549c55878SDavid Wu  * @pull_type: array describing the 4 pull type sources of the bank
12649c55878SDavid Wu  * @recalced_mask: bits describing the mux recalced pins of per bank
12749c55878SDavid Wu  * @route_mask: bits describing the routing pins of per bank
12849c55878SDavid Wu  */
12949c55878SDavid Wu struct rockchip_pin_bank {
13049c55878SDavid Wu 	struct rockchip_pinctrl_priv	*priv;
13149c55878SDavid Wu 	u32				pin_base;
13249c55878SDavid Wu 	u8				nr_pins;
13349c55878SDavid Wu 	char				*name;
13449c55878SDavid Wu 	u8				bank_num;
13549c55878SDavid Wu 	struct rockchip_iomux		iomux[4];
13649c55878SDavid Wu 	struct rockchip_drv		drv[4];
13749c55878SDavid Wu 	enum rockchip_pin_pull_type	pull_type[4];
13849c55878SDavid Wu 	u32				recalced_mask;
13949c55878SDavid Wu 	u32				route_mask;
14049c55878SDavid Wu };
14149c55878SDavid Wu 
14249c55878SDavid Wu #define PIN_BANK(id, pins, label)			\
14349c55878SDavid Wu 	{						\
14449c55878SDavid Wu 		.bank_num	= id,			\
14549c55878SDavid Wu 		.nr_pins	= pins,			\
14649c55878SDavid Wu 		.name		= label,		\
14749c55878SDavid Wu 		.iomux		= {			\
14849c55878SDavid Wu 			{ .offset = -1 },		\
14949c55878SDavid Wu 			{ .offset = -1 },		\
15049c55878SDavid Wu 			{ .offset = -1 },		\
15149c55878SDavid Wu 			{ .offset = -1 },		\
15249c55878SDavid Wu 		},					\
15349c55878SDavid Wu 	}
15449c55878SDavid Wu 
15549c55878SDavid Wu #define PIN_BANK_IOMUX_FLAGS(id, pins, label, iom0, iom1, iom2, iom3)	\
15649c55878SDavid Wu 	{								\
15749c55878SDavid Wu 		.bank_num	= id,					\
15849c55878SDavid Wu 		.nr_pins	= pins,					\
15949c55878SDavid Wu 		.name		= label,				\
16049c55878SDavid Wu 		.iomux		= {					\
16149c55878SDavid Wu 			{ .type = iom0, .offset = -1 },			\
16249c55878SDavid Wu 			{ .type = iom1, .offset = -1 },			\
16349c55878SDavid Wu 			{ .type = iom2, .offset = -1 },			\
16449c55878SDavid Wu 			{ .type = iom3, .offset = -1 },			\
16549c55878SDavid Wu 		},							\
16649c55878SDavid Wu 	}
16749c55878SDavid Wu 
168d499d466SJianqun Xu #define PIN_BANK_IOMUX_FLAGS_OFFSET(id, pins, label, iom0, iom1, iom2,	\
169d499d466SJianqun Xu 				    iom3, offset0, offset1, offset2,	\
170d499d466SJianqun Xu 				    offset3)				\
171d499d466SJianqun Xu 	{								\
172d499d466SJianqun Xu 		.bank_num	= id,					\
173d499d466SJianqun Xu 		.nr_pins	= pins,					\
174d499d466SJianqun Xu 		.name		= label,				\
175d499d466SJianqun Xu 		.iomux		= {					\
176d499d466SJianqun Xu 			{ .type = iom0, .offset = offset0 },		\
177d499d466SJianqun Xu 			{ .type = iom1, .offset = offset1 },		\
178d499d466SJianqun Xu 			{ .type = iom2, .offset = offset2 },		\
179d499d466SJianqun Xu 			{ .type = iom3, .offset = offset3 },		\
180d499d466SJianqun Xu 		},							\
181d499d466SJianqun Xu 	}
182d499d466SJianqun Xu 
18349c55878SDavid Wu #define PIN_BANK_DRV_FLAGS(id, pins, label, type0, type1, type2, type3) \
18449c55878SDavid Wu 	{								\
18549c55878SDavid Wu 		.bank_num	= id,					\
18649c55878SDavid Wu 		.nr_pins	= pins,					\
18749c55878SDavid Wu 		.name		= label,				\
18849c55878SDavid Wu 		.iomux		= {					\
18949c55878SDavid Wu 			{ .offset = -1 },				\
19049c55878SDavid Wu 			{ .offset = -1 },				\
19149c55878SDavid Wu 			{ .offset = -1 },				\
19249c55878SDavid Wu 			{ .offset = -1 },				\
19349c55878SDavid Wu 		},							\
19449c55878SDavid Wu 		.drv		= {					\
19549c55878SDavid Wu 			{ .drv_type = type0, .offset = -1 },		\
19649c55878SDavid Wu 			{ .drv_type = type1, .offset = -1 },		\
19749c55878SDavid Wu 			{ .drv_type = type2, .offset = -1 },		\
19849c55878SDavid Wu 			{ .drv_type = type3, .offset = -1 },		\
19949c55878SDavid Wu 		},							\
20049c55878SDavid Wu 	}
20149c55878SDavid Wu 
20249c55878SDavid Wu #define PIN_BANK_DRV_FLAGS_PULL_FLAGS(id, pins, label, drv0, drv1,	\
20349c55878SDavid Wu 				      drv2, drv3, pull0, pull1,		\
20449c55878SDavid Wu 				      pull2, pull3)			\
20549c55878SDavid Wu 	{								\
20649c55878SDavid Wu 		.bank_num	= id,					\
20749c55878SDavid Wu 		.nr_pins	= pins,					\
20849c55878SDavid Wu 		.name		= label,				\
20949c55878SDavid Wu 		.iomux		= {					\
21049c55878SDavid Wu 			{ .offset = -1 },				\
21149c55878SDavid Wu 			{ .offset = -1 },				\
21249c55878SDavid Wu 			{ .offset = -1 },				\
21349c55878SDavid Wu 			{ .offset = -1 },				\
21449c55878SDavid Wu 		},							\
21549c55878SDavid Wu 		.drv		= {					\
21649c55878SDavid Wu 			{ .drv_type = drv0, .offset = -1 },		\
21749c55878SDavid Wu 			{ .drv_type = drv1, .offset = -1 },		\
21849c55878SDavid Wu 			{ .drv_type = drv2, .offset = -1 },		\
21949c55878SDavid Wu 			{ .drv_type = drv3, .offset = -1 },		\
22049c55878SDavid Wu 		},							\
22149c55878SDavid Wu 		.pull_type[0] = pull0,					\
22249c55878SDavid Wu 		.pull_type[1] = pull1,					\
22349c55878SDavid Wu 		.pull_type[2] = pull2,					\
22449c55878SDavid Wu 		.pull_type[3] = pull3,					\
22549c55878SDavid Wu 	}
22649c55878SDavid Wu 
22749c55878SDavid Wu #define PIN_BANK_IOMUX_DRV_FLAGS_OFFSET(id, pins, label, iom0, iom1,	\
22849c55878SDavid Wu 					iom2, iom3, drv0, drv1, drv2,	\
22949c55878SDavid Wu 					drv3, offset0, offset1,		\
23049c55878SDavid Wu 					offset2, offset3)		\
23149c55878SDavid Wu 	{								\
23249c55878SDavid Wu 		.bank_num	= id,					\
23349c55878SDavid Wu 		.nr_pins	= pins,					\
23449c55878SDavid Wu 		.name		= label,				\
23549c55878SDavid Wu 		.iomux		= {					\
23649c55878SDavid Wu 			{ .type = iom0, .offset = -1 },			\
23749c55878SDavid Wu 			{ .type = iom1, .offset = -1 },			\
23849c55878SDavid Wu 			{ .type = iom2, .offset = -1 },			\
23949c55878SDavid Wu 			{ .type = iom3, .offset = -1 },			\
24049c55878SDavid Wu 		},							\
24149c55878SDavid Wu 		.drv		= {					\
24249c55878SDavid Wu 			{ .drv_type = drv0, .offset = offset0 },	\
24349c55878SDavid Wu 			{ .drv_type = drv1, .offset = offset1 },	\
24449c55878SDavid Wu 			{ .drv_type = drv2, .offset = offset2 },	\
24549c55878SDavid Wu 			{ .drv_type = drv3, .offset = offset3 },	\
24649c55878SDavid Wu 		},							\
24749c55878SDavid Wu 	}
24849c55878SDavid Wu 
24955a89bc6SDavid Wu #define PIN_BANK_IOMUX_DRV_PULL_FLAGS(id, pins, label, iom0, iom1,	\
25055a89bc6SDavid Wu 				      iom2, iom3, drv0, drv1, drv2,	\
25155a89bc6SDavid Wu 				      drv3, pull0, pull1, pull2,	\
25255a89bc6SDavid Wu 				      pull3)				\
25355a89bc6SDavid Wu 	{								\
25455a89bc6SDavid Wu 		.bank_num	= id,					\
25555a89bc6SDavid Wu 		.nr_pins	= pins,					\
25655a89bc6SDavid Wu 		.name		= label,				\
25755a89bc6SDavid Wu 		.iomux		= {					\
25855a89bc6SDavid Wu 			{ .type = iom0, .offset = -1 },			\
25955a89bc6SDavid Wu 			{ .type = iom1, .offset = -1 },			\
26055a89bc6SDavid Wu 			{ .type = iom2, .offset = -1 },			\
26155a89bc6SDavid Wu 			{ .type = iom3, .offset = -1 },			\
26255a89bc6SDavid Wu 		},							\
26355a89bc6SDavid Wu 		.drv		= {					\
26455a89bc6SDavid Wu 			{ .drv_type = drv0, .offset = -1 },		\
26555a89bc6SDavid Wu 			{ .drv_type = drv1, .offset = -1 },		\
26655a89bc6SDavid Wu 			{ .drv_type = drv2, .offset = -1 },		\
26755a89bc6SDavid Wu 			{ .drv_type = drv3, .offset = -1 },		\
26855a89bc6SDavid Wu 		},							\
26955a89bc6SDavid Wu 		.pull_type[0] = pull0,					\
27055a89bc6SDavid Wu 		.pull_type[1] = pull1,					\
27155a89bc6SDavid Wu 		.pull_type[2] = pull2,					\
27255a89bc6SDavid Wu 		.pull_type[3] = pull3,					\
27355a89bc6SDavid Wu 	}
27455a89bc6SDavid Wu 
27549c55878SDavid Wu #define PIN_BANK_IOMUX_FLAGS_DRV_FLAGS_OFFSET_PULL_FLAGS(id, pins,	\
27649c55878SDavid Wu 					      label, iom0, iom1, iom2,  \
27749c55878SDavid Wu 					      iom3, drv0, drv1, drv2,   \
27849c55878SDavid Wu 					      drv3, offset0, offset1,   \
27949c55878SDavid Wu 					      offset2, offset3, pull0,  \
28049c55878SDavid Wu 					      pull1, pull2, pull3)	\
28149c55878SDavid Wu 	{								\
28249c55878SDavid Wu 		.bank_num	= id,					\
28349c55878SDavid Wu 		.nr_pins	= pins,					\
28449c55878SDavid Wu 		.name		= label,				\
28549c55878SDavid Wu 		.iomux		= {					\
28649c55878SDavid Wu 			{ .type = iom0, .offset = -1 },			\
28749c55878SDavid Wu 			{ .type = iom1, .offset = -1 },			\
28849c55878SDavid Wu 			{ .type = iom2, .offset = -1 },			\
28949c55878SDavid Wu 			{ .type = iom3, .offset = -1 },			\
29049c55878SDavid Wu 		},							\
29149c55878SDavid Wu 		.drv		= {					\
29249c55878SDavid Wu 			{ .drv_type = drv0, .offset = offset0 },	\
29349c55878SDavid Wu 			{ .drv_type = drv1, .offset = offset1 },	\
29449c55878SDavid Wu 			{ .drv_type = drv2, .offset = offset2 },	\
29549c55878SDavid Wu 			{ .drv_type = drv3, .offset = offset3 },	\
29649c55878SDavid Wu 		},							\
29749c55878SDavid Wu 		.pull_type[0] = pull0,					\
29849c55878SDavid Wu 		.pull_type[1] = pull1,					\
29949c55878SDavid Wu 		.pull_type[2] = pull2,					\
30049c55878SDavid Wu 		.pull_type[3] = pull3,					\
30149c55878SDavid Wu 	}
30249c55878SDavid Wu 
30349e04eddSJianqun Xu #define PIN_BANK_MUX_ROUTE_FLAGS(ID, PIN, FUNC, REG, VAL, FLAG)		\
304d499d466SJianqun Xu 	{								\
305d499d466SJianqun Xu 		.bank_num	= ID,					\
306d499d466SJianqun Xu 		.pin		= PIN,					\
307d499d466SJianqun Xu 		.func		= FUNC,					\
308d499d466SJianqun Xu 		.route_offset	= REG,					\
309d499d466SJianqun Xu 		.route_val	= VAL,					\
31049e04eddSJianqun Xu 		.route_type	= FLAG,					\
311d499d466SJianqun Xu 	}
312d499d466SJianqun Xu 
31349e04eddSJianqun Xu #define MR_DEFAULT(ID, PIN, FUNC, REG, VAL)	\
31449e04eddSJianqun Xu 	PIN_BANK_MUX_ROUTE_FLAGS(ID, PIN, FUNC, REG, VAL, ROUTE_TYPE_DEFAULT)
31549e04eddSJianqun Xu 
31649e04eddSJianqun Xu #define MR_TOPGRF(ID, PIN, FUNC, REG, VAL)	\
31749e04eddSJianqun Xu 	PIN_BANK_MUX_ROUTE_FLAGS(ID, PIN, FUNC, REG, VAL, ROUTE_TYPE_TOPGRF)
31849e04eddSJianqun Xu 
31949e04eddSJianqun Xu #define MR_PMUGRF(ID, PIN, FUNC, REG, VAL)	\
32049e04eddSJianqun Xu 	PIN_BANK_MUX_ROUTE_FLAGS(ID, PIN, FUNC, REG, VAL, ROUTE_TYPE_PMUGRF)
32149e04eddSJianqun Xu 
32249c55878SDavid Wu /**
32349c55878SDavid Wu  * struct rockchip_mux_recalced_data: represent a pin iomux data.
32449c55878SDavid Wu  * @num: bank number.
32549c55878SDavid Wu  * @pin: pin number.
32649c55878SDavid Wu  * @bit: index at register.
32749c55878SDavid Wu  * @reg: register offset.
32849c55878SDavid Wu  * @mask: mask bit
32949c55878SDavid Wu  */
33049c55878SDavid Wu struct rockchip_mux_recalced_data {
33149c55878SDavid Wu 	u8 num;
33249c55878SDavid Wu 	u8 pin;
33349c55878SDavid Wu 	u32 reg;
33449c55878SDavid Wu 	u8 bit;
33549c55878SDavid Wu 	u8 mask;
33649c55878SDavid Wu };
33749c55878SDavid Wu 
33849c55878SDavid Wu /**
33949c55878SDavid Wu  * struct rockchip_mux_recalced_data: represent a pin iomux data.
34049c55878SDavid Wu  * @bank_num: bank number.
34149c55878SDavid Wu  * @pin: index at register or used to calc index.
34249c55878SDavid Wu  * @func: the min pin.
34349e04eddSJianqun Xu  * @route_type: the register type.
34449c55878SDavid Wu  * @route_offset: the max pin.
34549c55878SDavid Wu  * @route_val: the register offset.
34649c55878SDavid Wu  */
34749c55878SDavid Wu struct rockchip_mux_route_data {
34849c55878SDavid Wu 	u8 bank_num;
34949c55878SDavid Wu 	u8 pin;
35049c55878SDavid Wu 	u8 func;
35149e04eddSJianqun Xu 	enum rockchip_pin_route_type route_type : 8;
35249c55878SDavid Wu 	u32 route_offset;
35349c55878SDavid Wu 	u32 route_val;
35449c55878SDavid Wu };
35549c55878SDavid Wu 
35649c55878SDavid Wu /**
35749c55878SDavid Wu  */
35849c55878SDavid Wu struct rockchip_pin_ctrl {
35949c55878SDavid Wu 	struct rockchip_pin_bank	*pin_banks;
36049c55878SDavid Wu 	u32				nr_banks;
36149c55878SDavid Wu 	u32				nr_pins;
36249c55878SDavid Wu 	char				*label;
36349c55878SDavid Wu 	enum rockchip_pinctrl_type	type;
36449c55878SDavid Wu 	int				grf_mux_offset;
36549c55878SDavid Wu 	int				pmu_mux_offset;
36649c55878SDavid Wu 	int				grf_drv_offset;
36749c55878SDavid Wu 	int				pmu_drv_offset;
36849c55878SDavid Wu 	struct rockchip_mux_recalced_data *iomux_recalced;
36949c55878SDavid Wu 	u32				niomux_recalced;
37049c55878SDavid Wu 	struct rockchip_mux_route_data *iomux_routes;
37149c55878SDavid Wu 	u32				niomux_routes;
37249c55878SDavid Wu 
37313c03cb6SJianqun Xu 	int	(*ctrl_data_re_init)(const struct rockchip_pin_ctrl *ctrl);
374d5517017SDavid Wu 
375d5517017SDavid Wu 	int	(*soc_data_init)(struct rockchip_pinctrl_priv *info);
376d5517017SDavid Wu 
37749c55878SDavid Wu 	void	(*pull_calc_reg)(struct rockchip_pin_bank *bank,
37849c55878SDavid Wu 				 int pin_num, struct regmap **regmap,
37949c55878SDavid Wu 				 int *reg, u8 *bit);
38049c55878SDavid Wu 	void	(*drv_calc_reg)(struct rockchip_pin_bank *bank,
38149c55878SDavid Wu 				int pin_num, struct regmap **regmap,
38249c55878SDavid Wu 				int *reg, u8 *bit);
38349c55878SDavid Wu 	int	(*schmitt_calc_reg)(struct rockchip_pin_bank *bank,
38449c55878SDavid Wu 				    int pin_num, struct regmap **regmap,
38549c55878SDavid Wu 				    int *reg, u8 *bit);
38632c25d1fSDavid Wu 	int	(*slew_rate_calc_reg)(struct rockchip_pin_bank *bank,
38732c25d1fSDavid Wu 				      int pin_num, struct regmap **regmap,
38832c25d1fSDavid Wu 				      int *reg, u8 *bit);
38949c55878SDavid Wu };
39049c55878SDavid Wu 
39149c55878SDavid Wu /**
39249c55878SDavid Wu  */
39349c55878SDavid Wu struct rockchip_pinctrl_priv {
39449c55878SDavid Wu 	struct rockchip_pin_ctrl	*ctrl;
39549c55878SDavid Wu 	struct regmap			*regmap_base;
39649c55878SDavid Wu 	struct regmap			*regmap_pmu;
39749c55878SDavid Wu 
39849c55878SDavid Wu };
39949c55878SDavid Wu 
40049c55878SDavid Wu static int rockchip_verify_config(struct udevice *dev, u32 bank, u32 pin)
40149c55878SDavid Wu {
40249c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = dev_get_priv(dev);
40349c55878SDavid Wu 	struct rockchip_pin_ctrl *ctrl = priv->ctrl;
40449c55878SDavid Wu 
40549c55878SDavid Wu 	if (bank >= ctrl->nr_banks) {
40649c55878SDavid Wu 		debug("pin conf bank %d >= nbanks %d\n", bank, ctrl->nr_banks);
40749c55878SDavid Wu 		return -EINVAL;
40849c55878SDavid Wu 	}
40949c55878SDavid Wu 
41049c55878SDavid Wu 	if (pin >= MAX_ROCKCHIP_GPIO_PER_BANK) {
41149c55878SDavid Wu 		debug("pin conf pin %d >= %d\n", pin,
41249c55878SDavid Wu 		      MAX_ROCKCHIP_GPIO_PER_BANK);
41349c55878SDavid Wu 		return -EINVAL;
41449c55878SDavid Wu 	}
41549c55878SDavid Wu 
41649c55878SDavid Wu 	return 0;
41749c55878SDavid Wu }
41849c55878SDavid Wu 
41949c55878SDavid Wu static struct rockchip_mux_recalced_data rv1108_mux_recalced_data[] = {
42049c55878SDavid Wu 	{
42149c55878SDavid Wu 		.num = 1,
42249c55878SDavid Wu 		.pin = 0,
42349c55878SDavid Wu 		.reg = 0x418,
42449c55878SDavid Wu 		.bit = 0,
42549c55878SDavid Wu 		.mask = 0x3
42649c55878SDavid Wu 	}, {
42749c55878SDavid Wu 		.num = 1,
42849c55878SDavid Wu 		.pin = 1,
42949c55878SDavid Wu 		.reg = 0x418,
43049c55878SDavid Wu 		.bit = 2,
43149c55878SDavid Wu 		.mask = 0x3
43249c55878SDavid Wu 	}, {
43349c55878SDavid Wu 		.num = 1,
43449c55878SDavid Wu 		.pin = 2,
43549c55878SDavid Wu 		.reg = 0x418,
43649c55878SDavid Wu 		.bit = 4,
43749c55878SDavid Wu 		.mask = 0x3
43849c55878SDavid Wu 	}, {
43949c55878SDavid Wu 		.num = 1,
44049c55878SDavid Wu 		.pin = 3,
44149c55878SDavid Wu 		.reg = 0x418,
44249c55878SDavid Wu 		.bit = 6,
44349c55878SDavid Wu 		.mask = 0x3
44449c55878SDavid Wu 	}, {
44549c55878SDavid Wu 		.num = 1,
44649c55878SDavid Wu 		.pin = 4,
44749c55878SDavid Wu 		.reg = 0x418,
44849c55878SDavid Wu 		.bit = 8,
44949c55878SDavid Wu 		.mask = 0x3
45049c55878SDavid Wu 	}, {
45149c55878SDavid Wu 		.num = 1,
45249c55878SDavid Wu 		.pin = 5,
45349c55878SDavid Wu 		.reg = 0x418,
45449c55878SDavid Wu 		.bit = 10,
45549c55878SDavid Wu 		.mask = 0x3
45649c55878SDavid Wu 	}, {
45749c55878SDavid Wu 		.num = 1,
45849c55878SDavid Wu 		.pin = 6,
45949c55878SDavid Wu 		.reg = 0x418,
46049c55878SDavid Wu 		.bit = 12,
46149c55878SDavid Wu 		.mask = 0x3
46249c55878SDavid Wu 	}, {
46349c55878SDavid Wu 		.num = 1,
46449c55878SDavid Wu 		.pin = 7,
46549c55878SDavid Wu 		.reg = 0x418,
46649c55878SDavid Wu 		.bit = 14,
46749c55878SDavid Wu 		.mask = 0x3
46849c55878SDavid Wu 	}, {
46949c55878SDavid Wu 		.num = 1,
47049c55878SDavid Wu 		.pin = 8,
47149c55878SDavid Wu 		.reg = 0x41c,
47249c55878SDavid Wu 		.bit = 0,
47349c55878SDavid Wu 		.mask = 0x3
47449c55878SDavid Wu 	}, {
47549c55878SDavid Wu 		.num = 1,
47649c55878SDavid Wu 		.pin = 9,
47749c55878SDavid Wu 		.reg = 0x41c,
47849c55878SDavid Wu 		.bit = 2,
47949c55878SDavid Wu 		.mask = 0x3
48049c55878SDavid Wu 	},
48149c55878SDavid Wu };
48249c55878SDavid Wu 
483cf04a17bSJianqun Xu static struct rockchip_mux_recalced_data rv1126_mux_recalced_data[] = {
484cf04a17bSJianqun Xu 	{
485cf04a17bSJianqun Xu 		.num = 0,
486cf04a17bSJianqun Xu 		.pin = 20,
487cf04a17bSJianqun Xu 		.reg = 0x10000,
488cf04a17bSJianqun Xu 		.bit = 0,
489cf04a17bSJianqun Xu 		.mask = 0xf
490cf04a17bSJianqun Xu 	},
491cf04a17bSJianqun Xu 	{
492cf04a17bSJianqun Xu 		.num = 0,
493cf04a17bSJianqun Xu 		.pin = 21,
494cf04a17bSJianqun Xu 		.reg = 0x10000,
495cf04a17bSJianqun Xu 		.bit = 4,
496cf04a17bSJianqun Xu 		.mask = 0xf
497cf04a17bSJianqun Xu 	},
498cf04a17bSJianqun Xu 	{
499cf04a17bSJianqun Xu 		.num = 0,
500cf04a17bSJianqun Xu 		.pin = 22,
501cf04a17bSJianqun Xu 		.reg = 0x10000,
502cf04a17bSJianqun Xu 		.bit = 8,
503cf04a17bSJianqun Xu 		.mask = 0xf
504cf04a17bSJianqun Xu 	},
505cf04a17bSJianqun Xu 	{
506cf04a17bSJianqun Xu 		.num = 0,
507cf04a17bSJianqun Xu 		.pin = 23,
508cf04a17bSJianqun Xu 		.reg = 0x10000,
509cf04a17bSJianqun Xu 		.bit = 12,
510cf04a17bSJianqun Xu 		.mask = 0xf
511cf04a17bSJianqun Xu 	},
512cf04a17bSJianqun Xu };
513cf04a17bSJianqun Xu 
51449c55878SDavid Wu static  struct rockchip_mux_recalced_data rk3128_mux_recalced_data[] = {
51549c55878SDavid Wu 	{
51649c55878SDavid Wu 		.num = 2,
51749c55878SDavid Wu 		.pin = 20,
51849c55878SDavid Wu 		.reg = 0xe8,
51949c55878SDavid Wu 		.bit = 0,
52049c55878SDavid Wu 		.mask = 0x7
52149c55878SDavid Wu 	}, {
52249c55878SDavid Wu 		.num = 2,
52349c55878SDavid Wu 		.pin = 21,
52449c55878SDavid Wu 		.reg = 0xe8,
52549c55878SDavid Wu 		.bit = 4,
52649c55878SDavid Wu 		.mask = 0x7
52749c55878SDavid Wu 	}, {
52849c55878SDavid Wu 		.num = 2,
52949c55878SDavid Wu 		.pin = 22,
53049c55878SDavid Wu 		.reg = 0xe8,
53149c55878SDavid Wu 		.bit = 8,
53249c55878SDavid Wu 		.mask = 0x7
53349c55878SDavid Wu 	}, {
53449c55878SDavid Wu 		.num = 2,
53549c55878SDavid Wu 		.pin = 23,
53649c55878SDavid Wu 		.reg = 0xe8,
53749c55878SDavid Wu 		.bit = 12,
53849c55878SDavid Wu 		.mask = 0x7
53949c55878SDavid Wu 	}, {
54049c55878SDavid Wu 		.num = 2,
54149c55878SDavid Wu 		.pin = 24,
54249c55878SDavid Wu 		.reg = 0xd4,
54349c55878SDavid Wu 		.bit = 12,
54449c55878SDavid Wu 		.mask = 0x7
54549c55878SDavid Wu 	},
54649c55878SDavid Wu };
54749c55878SDavid Wu 
548b3077611SDavid Wu static struct rockchip_mux_recalced_data rk3308_mux_recalced_data[] = {
549b3077611SDavid Wu 	{
550b3077611SDavid Wu 		.num = 1,
551b3077611SDavid Wu 		.pin = 14,
552b3077611SDavid Wu 		.reg = 0x28,
553b3077611SDavid Wu 		.bit = 12,
554b3077611SDavid Wu 		.mask = 0x7
555b3077611SDavid Wu 	}, {
556b3077611SDavid Wu 		.num = 1,
557b3077611SDavid Wu 		.pin = 15,
558b3077611SDavid Wu 		.reg = 0x2c,
559b3077611SDavid Wu 		.bit = 0,
560b3077611SDavid Wu 		.mask = 0x3
561b3077611SDavid Wu 	}, {
562b3077611SDavid Wu 		.num = 1,
563b3077611SDavid Wu 		.pin = 18,
564b3077611SDavid Wu 		.reg = 0x30,
565b3077611SDavid Wu 		.bit = 4,
566b3077611SDavid Wu 		.mask = 0x7
567b3077611SDavid Wu 	}, {
568b3077611SDavid Wu 		.num = 1,
569b3077611SDavid Wu 		.pin = 19,
570b3077611SDavid Wu 		.reg = 0x30,
571b3077611SDavid Wu 		.bit = 8,
572b3077611SDavid Wu 		.mask = 0x7
573b3077611SDavid Wu 	}, {
574b3077611SDavid Wu 		.num = 1,
575b3077611SDavid Wu 		.pin = 20,
576b3077611SDavid Wu 		.reg = 0x30,
577b3077611SDavid Wu 		.bit = 12,
578b3077611SDavid Wu 		.mask = 0x7
579b3077611SDavid Wu 	}, {
580b3077611SDavid Wu 		.num = 1,
581b3077611SDavid Wu 		.pin = 21,
582b3077611SDavid Wu 		.reg = 0x34,
583b3077611SDavid Wu 		.bit = 0,
584b3077611SDavid Wu 		.mask = 0x7
585b3077611SDavid Wu 	}, {
586b3077611SDavid Wu 		.num = 1,
587b3077611SDavid Wu 		.pin = 22,
588b3077611SDavid Wu 		.reg = 0x34,
589b3077611SDavid Wu 		.bit = 4,
590b3077611SDavid Wu 		.mask = 0x7
591b3077611SDavid Wu 	}, {
592b3077611SDavid Wu 		.num = 1,
593b3077611SDavid Wu 		.pin = 23,
594b3077611SDavid Wu 		.reg = 0x34,
595b3077611SDavid Wu 		.bit = 8,
596b3077611SDavid Wu 		.mask = 0x7
597b3077611SDavid Wu 	}, {
598b3077611SDavid Wu 		.num = 3,
599b3077611SDavid Wu 		.pin = 12,
600b3077611SDavid Wu 		.reg = 0x68,
601b3077611SDavid Wu 		.bit = 8,
602b3077611SDavid Wu 		.mask = 0x7
603b3077611SDavid Wu 	}, {
604b3077611SDavid Wu 		.num = 3,
605b3077611SDavid Wu 		.pin = 13,
606b3077611SDavid Wu 		.reg = 0x68,
607b3077611SDavid Wu 		.bit = 12,
608b3077611SDavid Wu 		.mask = 0x7
609b3077611SDavid Wu 	},
610b3077611SDavid Wu };
611b3077611SDavid Wu 
612d5517017SDavid Wu static struct rockchip_mux_recalced_data rk3308b_mux_recalced_data[] = {
613d5517017SDavid Wu 	{
614d5517017SDavid Wu 		.num = 1,
615d5517017SDavid Wu 		.pin = 14,
616d5517017SDavid Wu 		.reg = 0x28,
617d5517017SDavid Wu 		.bit = 12,
618d5517017SDavid Wu 		.mask = 0xf
619d5517017SDavid Wu 	}, {
620d5517017SDavid Wu 		.num = 1,
621d5517017SDavid Wu 		.pin = 15,
622d5517017SDavid Wu 		.reg = 0x2c,
623d5517017SDavid Wu 		.bit = 0,
624d5517017SDavid Wu 		.mask = 0x3
625d5517017SDavid Wu 	}, {
626d5517017SDavid Wu 		.num = 1,
627d5517017SDavid Wu 		.pin = 18,
628d5517017SDavid Wu 		.reg = 0x30,
629d5517017SDavid Wu 		.bit = 4,
630d5517017SDavid Wu 		.mask = 0xf
631d5517017SDavid Wu 	}, {
632d5517017SDavid Wu 		.num = 1,
633d5517017SDavid Wu 		.pin = 19,
634d5517017SDavid Wu 		.reg = 0x30,
635d5517017SDavid Wu 		.bit = 8,
636d5517017SDavid Wu 		.mask = 0xf
637d5517017SDavid Wu 	}, {
638d5517017SDavid Wu 		.num = 1,
639d5517017SDavid Wu 		.pin = 20,
640d5517017SDavid Wu 		.reg = 0x30,
641d5517017SDavid Wu 		.bit = 12,
642d5517017SDavid Wu 		.mask = 0xf
643d5517017SDavid Wu 	}, {
644d5517017SDavid Wu 		.num = 1,
645d5517017SDavid Wu 		.pin = 21,
646d5517017SDavid Wu 		.reg = 0x34,
647d5517017SDavid Wu 		.bit = 0,
648d5517017SDavid Wu 		.mask = 0xf
649d5517017SDavid Wu 	}, {
650d5517017SDavid Wu 		.num = 1,
651d5517017SDavid Wu 		.pin = 22,
652d5517017SDavid Wu 		.reg = 0x34,
653d5517017SDavid Wu 		.bit = 4,
654d5517017SDavid Wu 		.mask = 0xf
655d5517017SDavid Wu 	}, {
656d5517017SDavid Wu 		.num = 1,
657d5517017SDavid Wu 		.pin = 23,
658d5517017SDavid Wu 		.reg = 0x34,
659d5517017SDavid Wu 		.bit = 8,
660d5517017SDavid Wu 		.mask = 0xf
661d5517017SDavid Wu 	}, {
662d5517017SDavid Wu 		.num = 3,
663752032c9SDavid.Wu 		.pin = 12,
664752032c9SDavid.Wu 		.reg = 0x68,
665752032c9SDavid.Wu 		.bit = 8,
666752032c9SDavid.Wu 		.mask = 0xf
667752032c9SDavid.Wu 	}, {
668752032c9SDavid.Wu 		.num = 3,
669d5517017SDavid Wu 		.pin = 13,
670d5517017SDavid Wu 		.reg = 0x68,
671d5517017SDavid Wu 		.bit = 12,
672d5517017SDavid Wu 		.mask = 0xf
673d5517017SDavid Wu 	}, {
674d5517017SDavid Wu 		.num = 2,
675d5517017SDavid Wu 		.pin = 2,
676d5517017SDavid Wu 		.reg = 0x608,
677d5517017SDavid Wu 		.bit = 0,
678d5517017SDavid Wu 		.mask = 0x7
679d5517017SDavid Wu 	}, {
680d5517017SDavid Wu 		.num = 2,
681d5517017SDavid Wu 		.pin = 3,
682d5517017SDavid Wu 		.reg = 0x608,
683d5517017SDavid Wu 		.bit = 4,
684d5517017SDavid Wu 		.mask = 0x7
685d5517017SDavid Wu 	}, {
686d5517017SDavid Wu 		.num = 2,
687d5517017SDavid Wu 		.pin = 16,
688d5517017SDavid Wu 		.reg = 0x610,
689d5517017SDavid Wu 		.bit = 8,
690d5517017SDavid Wu 		.mask = 0x7
691d5517017SDavid Wu 	}, {
692d5517017SDavid Wu 		.num = 3,
693d5517017SDavid Wu 		.pin = 10,
694d5517017SDavid Wu 		.reg = 0x610,
695d5517017SDavid Wu 		.bit = 0,
696d5517017SDavid Wu 		.mask = 0x7
697d5517017SDavid Wu 	}, {
698d5517017SDavid Wu 		.num = 3,
699d5517017SDavid Wu 		.pin = 11,
700d5517017SDavid Wu 		.reg = 0x610,
701d5517017SDavid Wu 		.bit = 4,
702d5517017SDavid Wu 		.mask = 0x7
703d5517017SDavid Wu 	},
704d5517017SDavid Wu };
705d5517017SDavid Wu 
70649c55878SDavid Wu static struct rockchip_mux_recalced_data rk3328_mux_recalced_data[] = {
70749c55878SDavid Wu 	{
70849c55878SDavid Wu 		.num = 2,
70949c55878SDavid Wu 		.pin = 12,
71049c55878SDavid Wu 		.reg = 0x24,
71149c55878SDavid Wu 		.bit = 8,
71249c55878SDavid Wu 		.mask = 0x3
71349c55878SDavid Wu 	}, {
71449c55878SDavid Wu 		.num = 2,
71549c55878SDavid Wu 		.pin = 15,
71649c55878SDavid Wu 		.reg = 0x28,
71749c55878SDavid Wu 		.bit = 0,
71849c55878SDavid Wu 		.mask = 0x7
71949c55878SDavid Wu 	}, {
72049c55878SDavid Wu 		.num = 2,
72149c55878SDavid Wu 		.pin = 23,
72249c55878SDavid Wu 		.reg = 0x30,
72349c55878SDavid Wu 		.bit = 14,
72449c55878SDavid Wu 		.mask = 0x3
72549c55878SDavid Wu 	},
72649c55878SDavid Wu };
72749c55878SDavid Wu 
728d499d466SJianqun Xu static struct rockchip_mux_route_data rv1126_mux_route_data[] = {
72949e04eddSJianqun Xu 	MR_TOPGRF(RK_GPIO3, RK_PD2, RK_FUNC_1, 0x10260, RK_GENMASK_VAL(0, 0, 0)), /* I2S0_MCLK_M0 */
73049e04eddSJianqun Xu 	MR_TOPGRF(RK_GPIO3, RK_PB0, RK_FUNC_3, 0x10260, RK_GENMASK_VAL(0, 0, 1)), /* I2S0_MCLK_M1 */
731d499d466SJianqun Xu 
73249e04eddSJianqun Xu 	MR_TOPGRF(RK_GPIO0, RK_PD4, RK_FUNC_4, 0x10260, RK_GENMASK_VAL(2, 3, 0)), /* I2S1_MCLK_M0 */
73349e04eddSJianqun Xu 	MR_TOPGRF(RK_GPIO1, RK_PD5, RK_FUNC_2, 0x10260, RK_GENMASK_VAL(2, 3, 1)), /* I2S1_MCLK_M1 */
73449e04eddSJianqun Xu 	MR_TOPGRF(RK_GPIO2, RK_PC7, RK_FUNC_6, 0x10260, RK_GENMASK_VAL(2, 3, 2)), /* I2S1_MCLK_M2 */
735d499d466SJianqun Xu 
73649e04eddSJianqun Xu 	MR_TOPGRF(RK_GPIO1, RK_PD0, RK_FUNC_1, 0x10260, RK_GENMASK_VAL(4, 4, 0)), /* I2S2_MCLK_M0 */
73749e04eddSJianqun Xu 	MR_TOPGRF(RK_GPIO2, RK_PB3, RK_FUNC_2, 0x10260, RK_GENMASK_VAL(4, 4, 1)), /* I2S2_MCLK_M1 */
738d499d466SJianqun Xu 
73949e04eddSJianqun Xu 	MR_TOPGRF(RK_GPIO3, RK_PD4, RK_FUNC_2, 0x10260, RK_GENMASK_VAL(12, 12, 0)), /* PDM_CLK0_M0 */
74049e04eddSJianqun Xu 	MR_TOPGRF(RK_GPIO3, RK_PC0, RK_FUNC_3, 0x10260, RK_GENMASK_VAL(12, 12, 1)), /* PDM_CLK0_M1 */
741d499d466SJianqun Xu 
74249e04eddSJianqun Xu 	MR_TOPGRF(RK_GPIO3, RK_PC6, RK_FUNC_1, 0x10264, RK_GENMASK_VAL(0, 0, 0)), /* CIF_CLKOUT_M0 */
74349e04eddSJianqun Xu 	MR_TOPGRF(RK_GPIO2, RK_PD1, RK_FUNC_3, 0x10264, RK_GENMASK_VAL(0, 0, 1)), /* CIF_CLKOUT_M1 */
744d499d466SJianqun Xu 
74549e04eddSJianqun Xu 	MR_TOPGRF(RK_GPIO3, RK_PA4, RK_FUNC_5, 0x10264, RK_GENMASK_VAL(4, 5, 0)), /* I2C3_SCL_M0 */
74649e04eddSJianqun Xu 	MR_TOPGRF(RK_GPIO2, RK_PD4, RK_FUNC_7, 0x10264, RK_GENMASK_VAL(4, 5, 1)), /* I2C3_SCL_M1 */
74749e04eddSJianqun Xu 	MR_TOPGRF(RK_GPIO1, RK_PD6, RK_FUNC_3, 0x10264, RK_GENMASK_VAL(4, 5, 2)), /* I2C3_SCL_M2 */
748d499d466SJianqun Xu 
74949e04eddSJianqun Xu 	MR_TOPGRF(RK_GPIO3, RK_PA0, RK_FUNC_7, 0x10264, RK_GENMASK_VAL(6, 6, 0)), /* I2C4_SCL_M0 */
75049e04eddSJianqun Xu 	MR_TOPGRF(RK_GPIO4, RK_PA0, RK_FUNC_4, 0x10264, RK_GENMASK_VAL(6, 6, 1)), /* I2C4_SCL_M1 */
751d499d466SJianqun Xu 
75249e04eddSJianqun Xu 	MR_TOPGRF(RK_GPIO2, RK_PA5, RK_FUNC_7, 0x10264, RK_GENMASK_VAL(8, 9, 0)), /* I2C5_SCL_M0 */
75349e04eddSJianqun Xu 	MR_TOPGRF(RK_GPIO3, RK_PB0, RK_FUNC_5, 0x10264, RK_GENMASK_VAL(8, 9, 1)), /* I2C5_SCL_M1 */
75449e04eddSJianqun Xu 	MR_TOPGRF(RK_GPIO1, RK_PD0, RK_FUNC_4, 0x10264, RK_GENMASK_VAL(8, 9, 2)), /* I2C5_SCL_M2 */
755d499d466SJianqun Xu 
75649e04eddSJianqun Xu 	MR_TOPGRF(RK_GPIO3, RK_PC0, RK_FUNC_5, 0x10264, RK_GENMASK_VAL(10, 11, 0)), /* SPI1_CLK_M0 */
75749e04eddSJianqun Xu 	MR_TOPGRF(RK_GPIO1, RK_PC6, RK_FUNC_3, 0x10264, RK_GENMASK_VAL(10, 11, 1)), /* SPI1_CLK_M1 */
75849e04eddSJianqun Xu 	MR_TOPGRF(RK_GPIO2, RK_PD5, RK_FUNC_6, 0x10264, RK_GENMASK_VAL(10, 11, 2)), /* SPI1_CLK_M2 */
759d499d466SJianqun Xu 
76049e04eddSJianqun Xu 	MR_TOPGRF(RK_GPIO3, RK_PC0, RK_FUNC_2, 0x10264, RK_GENMASK_VAL(12, 12, 0)), /* RGMII_CLK_M0 */
76149e04eddSJianqun Xu 	MR_TOPGRF(RK_GPIO2, RK_PB7, RK_FUNC_2, 0x10264, RK_GENMASK_VAL(12, 12, 1)), /* RGMII_CLK_M1 */
762d499d466SJianqun Xu 
76349e04eddSJianqun Xu 	MR_TOPGRF(RK_GPIO3, RK_PA1, RK_FUNC_3, 0x10264, RK_GENMASK_VAL(13, 13, 0)), /* CAN_TXD_M0 */
76449e04eddSJianqun Xu 	MR_TOPGRF(RK_GPIO3, RK_PA7, RK_FUNC_5, 0x10264, RK_GENMASK_VAL(13, 13, 1)), /* CAN_TXD_M1 */
765d499d466SJianqun Xu 
76649e04eddSJianqun Xu 	MR_TOPGRF(RK_GPIO3, RK_PA4, RK_FUNC_6, 0x10268, RK_GENMASK_VAL(0, 0, 0)), /* PWM8_M0 */
76749e04eddSJianqun Xu 	MR_TOPGRF(RK_GPIO2, RK_PD7, RK_FUNC_5, 0x10268, RK_GENMASK_VAL(0, 0, 1)), /* PWM8_M1 */
768d499d466SJianqun Xu 
76949e04eddSJianqun Xu 	MR_TOPGRF(RK_GPIO3, RK_PA5, RK_FUNC_6, 0x10268, RK_GENMASK_VAL(2, 2, 0)), /* PWM9_M0 */
77049e04eddSJianqun Xu 	MR_TOPGRF(RK_GPIO2, RK_PD6, RK_FUNC_5, 0x10268, RK_GENMASK_VAL(2, 2, 1)), /* PWM9_M1 */
771d499d466SJianqun Xu 
77249e04eddSJianqun Xu 	MR_TOPGRF(RK_GPIO3, RK_PA6, RK_FUNC_6, 0x10268, RK_GENMASK_VAL(4, 4, 0)), /* PWM10_M0 */
77349e04eddSJianqun Xu 	MR_TOPGRF(RK_GPIO2, RK_PD5, RK_FUNC_5, 0x10268, RK_GENMASK_VAL(4, 4, 1)), /* PWM10_M1 */
774d499d466SJianqun Xu 
77549e04eddSJianqun Xu 	MR_TOPGRF(RK_GPIO3, RK_PA7, RK_FUNC_6, 0x10268, RK_GENMASK_VAL(6, 6, 0)), /* PWM11_IR_M0 */
77649e04eddSJianqun Xu 	MR_TOPGRF(RK_GPIO3, RK_PA1, RK_FUNC_5, 0x10268, RK_GENMASK_VAL(6, 6, 1)), /* PWM11_IR_M1 */
777d499d466SJianqun Xu 
77849e04eddSJianqun Xu 	MR_TOPGRF(RK_GPIO1, RK_PA5, RK_FUNC_3, 0x10268, RK_GENMASK_VAL(8, 8, 0)), /* UART2_TX_M0 */
77949e04eddSJianqun Xu 	MR_TOPGRF(RK_GPIO3, RK_PA2, RK_FUNC_1, 0x10268, RK_GENMASK_VAL(8, 8, 1)), /* UART2_TX_M1 */
780d499d466SJianqun Xu 
78149e04eddSJianqun Xu 	MR_TOPGRF(RK_GPIO3, RK_PC6, RK_FUNC_3, 0x10268, RK_GENMASK_VAL(10, 11, 0)), /* UART3_TX_M0 */
78249e04eddSJianqun Xu 	MR_TOPGRF(RK_GPIO1, RK_PA7, RK_FUNC_2, 0x10268, RK_GENMASK_VAL(10, 11, 1)), /* UART3_TX_M1 */
78349e04eddSJianqun Xu 	MR_TOPGRF(RK_GPIO3, RK_PA0, RK_FUNC_4, 0x10268, RK_GENMASK_VAL(10, 11, 2)), /* UART3_TX_M2 */
784d499d466SJianqun Xu 
78549e04eddSJianqun Xu 	MR_TOPGRF(RK_GPIO3, RK_PA4, RK_FUNC_4, 0x10268, RK_GENMASK_VAL(12, 13, 0)), /* UART4_TX_M0 */
78649e04eddSJianqun Xu 	MR_TOPGRF(RK_GPIO2, RK_PA6, RK_FUNC_4, 0x10268, RK_GENMASK_VAL(12, 13, 1)), /* UART4_TX_M1 */
78749e04eddSJianqun Xu 	MR_TOPGRF(RK_GPIO1, RK_PD5, RK_FUNC_3, 0x10268, RK_GENMASK_VAL(12, 13, 2)), /* UART4_TX_M2 */
788d499d466SJianqun Xu 
78949e04eddSJianqun Xu 	MR_TOPGRF(RK_GPIO3, RK_PA6, RK_FUNC_4, 0x10268, RK_GENMASK_VAL(14, 15, 0)), /* UART5_TX_M0 */
79049e04eddSJianqun Xu 	MR_TOPGRF(RK_GPIO2, RK_PB0, RK_FUNC_4, 0x10268, RK_GENMASK_VAL(14, 15, 1)), /* UART5_TX_M1 */
79149e04eddSJianqun Xu 	MR_TOPGRF(RK_GPIO2, RK_PA0, RK_FUNC_3, 0x10268, RK_GENMASK_VAL(14, 15, 2)), /* UART5_TX_M2 */
79249e04eddSJianqun Xu 
79349e04eddSJianqun Xu 	MR_PMUGRF(RK_GPIO0, RK_PB6, RK_FUNC_3, 0x0114, RK_GENMASK_VAL(0, 0, 0)), /* PWM0_M0 */
79449e04eddSJianqun Xu 	MR_PMUGRF(RK_GPIO2, RK_PB3, RK_FUNC_5, 0x0114, RK_GENMASK_VAL(0, 0, 1)), /* PWM0_M1 */
79549e04eddSJianqun Xu 
79649e04eddSJianqun Xu 	MR_PMUGRF(RK_GPIO0, RK_PB7, RK_FUNC_3, 0x0114, RK_GENMASK_VAL(2, 2, 0)), /* PWM1_M0 */
79749e04eddSJianqun Xu 	MR_PMUGRF(RK_GPIO2, RK_PB2, RK_FUNC_5, 0x0114, RK_GENMASK_VAL(2, 2, 1)), /* PWM1_M1 */
79849e04eddSJianqun Xu 
79949e04eddSJianqun Xu 	MR_PMUGRF(RK_GPIO0, RK_PC0, RK_FUNC_3, 0x0114, RK_GENMASK_VAL(4, 4, 0)), /* PWM2_M0 */
80049e04eddSJianqun Xu 	MR_PMUGRF(RK_GPIO2, RK_PB1, RK_FUNC_5, 0x0114, RK_GENMASK_VAL(4, 4, 1)), /* PWM2_M1 */
80149e04eddSJianqun Xu 
80249e04eddSJianqun Xu 	MR_PMUGRF(RK_GPIO0, RK_PC1, RK_FUNC_3, 0x0114, RK_GENMASK_VAL(6, 6, 0)), /* PWM3_IR_M0 */
80349e04eddSJianqun Xu 	MR_PMUGRF(RK_GPIO2, RK_PB0, RK_FUNC_5, 0x0114, RK_GENMASK_VAL(6, 6, 1)), /* PWM3_IR_M1 */
80449e04eddSJianqun Xu 
80549e04eddSJianqun Xu 	MR_PMUGRF(RK_GPIO0, RK_PC2, RK_FUNC_3, 0x0114, RK_GENMASK_VAL(8, 8, 0)), /* PWM4_M0 */
80649e04eddSJianqun Xu 	MR_PMUGRF(RK_GPIO2, RK_PA7, RK_FUNC_5, 0x0114, RK_GENMASK_VAL(8, 8, 1)), /* PWM4_M1 */
80749e04eddSJianqun Xu 
80849e04eddSJianqun Xu 	MR_PMUGRF(RK_GPIO0, RK_PC3, RK_FUNC_3, 0x0114, RK_GENMASK_VAL(10, 10, 0)), /* PWM5_M0 */
80949e04eddSJianqun Xu 	MR_PMUGRF(RK_GPIO2, RK_PA6, RK_FUNC_5, 0x0114, RK_GENMASK_VAL(10, 10, 1)), /* PWM5_M1 */
81049e04eddSJianqun Xu 
81149e04eddSJianqun Xu 	MR_PMUGRF(RK_GPIO0, RK_PB2, RK_FUNC_3, 0x0114, RK_GENMASK_VAL(12, 12, 0)), /* PWM6_M0 */
81249e04eddSJianqun Xu 	MR_PMUGRF(RK_GPIO2, RK_PD4, RK_FUNC_5, 0x0114, RK_GENMASK_VAL(12, 12, 1)), /* PWM6_M1 */
81349e04eddSJianqun Xu 
81449e04eddSJianqun Xu 	MR_PMUGRF(RK_GPIO0, RK_PB1, RK_FUNC_3, 0x0114, RK_GENMASK_VAL(14, 14, 0)), /* PWM7_IR_M0 */
81549e04eddSJianqun Xu 	MR_PMUGRF(RK_GPIO3, RK_PA0, RK_FUNC_5, 0x0114, RK_GENMASK_VAL(14, 14, 1)), /* PWM7_IR_M1 */
81649e04eddSJianqun Xu 
81749e04eddSJianqun Xu 	MR_PMUGRF(RK_GPIO0, RK_PB0, RK_FUNC_1, 0x0118, RK_GENMASK_VAL(0, 1, 0)), /* SPI0_CLK_M0 */
81849e04eddSJianqun Xu 	MR_PMUGRF(RK_GPIO2, RK_PA1, RK_FUNC_1, 0x0118, RK_GENMASK_VAL(0, 1, 1)), /* SPI0_CLK_M1 */
81949e04eddSJianqun Xu 	MR_PMUGRF(RK_GPIO2, RK_PB2, RK_FUNC_6, 0x0118, RK_GENMASK_VAL(0, 1, 2)), /* SPI0_CLK_M2 */
82049e04eddSJianqun Xu 
82149e04eddSJianqun Xu 	MR_PMUGRF(RK_GPIO0, RK_PB6, RK_FUNC_2, 0x0118, RK_GENMASK_VAL(2, 2, 0)), /* UART1_TX_M0 */
82249e04eddSJianqun Xu 	MR_PMUGRF(RK_GPIO1, RK_PD0, RK_FUNC_5, 0x0118, RK_GENMASK_VAL(2, 2, 1)), /* UART1_TX_M1 */
823d499d466SJianqun Xu };
824d499d466SJianqun Xu 
82549c55878SDavid Wu static void rockchip_get_recalced_mux(struct rockchip_pin_bank *bank, int pin,
82649c55878SDavid Wu 				      int *reg, u8 *bit, int *mask)
82749c55878SDavid Wu {
82849c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
82949c55878SDavid Wu 	struct rockchip_pin_ctrl *ctrl = priv->ctrl;
83049c55878SDavid Wu 	struct rockchip_mux_recalced_data *data;
83149c55878SDavid Wu 	int i;
83249c55878SDavid Wu 
83349c55878SDavid Wu 	for (i = 0; i < ctrl->niomux_recalced; i++) {
83449c55878SDavid Wu 		data = &ctrl->iomux_recalced[i];
83549c55878SDavid Wu 		if (data->num == bank->bank_num &&
83649c55878SDavid Wu 		    data->pin == pin)
83749c55878SDavid Wu 			break;
83849c55878SDavid Wu 	}
83949c55878SDavid Wu 
84049c55878SDavid Wu 	if (i >= ctrl->niomux_recalced)
84149c55878SDavid Wu 		return;
84249c55878SDavid Wu 
84349c55878SDavid Wu 	*reg = data->reg;
84449c55878SDavid Wu 	*mask = data->mask;
84549c55878SDavid Wu 	*bit = data->bit;
84649c55878SDavid Wu }
84749c55878SDavid Wu 
84849c55878SDavid Wu static struct rockchip_mux_route_data px30_mux_route_data[] = {
84949c55878SDavid Wu 	{
85049c55878SDavid Wu 		/* cif-d2m0 */
85149c55878SDavid Wu 		.bank_num = 2,
85249c55878SDavid Wu 		.pin = 0,
85349c55878SDavid Wu 		.func = 1,
85449c55878SDavid Wu 		.route_offset = 0x184,
85549c55878SDavid Wu 		.route_val = BIT(16 + 7),
85649c55878SDavid Wu 	}, {
85749c55878SDavid Wu 		/* cif-d2m1 */
85849c55878SDavid Wu 		.bank_num = 3,
85949c55878SDavid Wu 		.pin = 3,
86049c55878SDavid Wu 		.func = 3,
86149c55878SDavid Wu 		.route_offset = 0x184,
86249c55878SDavid Wu 		.route_val = BIT(16 + 7) | BIT(7),
86349c55878SDavid Wu 	}, {
86449c55878SDavid Wu 		/* pdm-m0 */
86549c55878SDavid Wu 		.bank_num = 3,
86649c55878SDavid Wu 		.pin = 22,
86749c55878SDavid Wu 		.func = 2,
86849c55878SDavid Wu 		.route_offset = 0x184,
86949c55878SDavid Wu 		.route_val = BIT(16 + 8),
87049c55878SDavid Wu 	}, {
87149c55878SDavid Wu 		/* pdm-m1 */
87249c55878SDavid Wu 		.bank_num = 2,
87349c55878SDavid Wu 		.pin = 22,
87449c55878SDavid Wu 		.func = 1,
87549c55878SDavid Wu 		.route_offset = 0x184,
87649c55878SDavid Wu 		.route_val = BIT(16 + 8) | BIT(8),
87749c55878SDavid Wu 	}, {
87849c55878SDavid Wu 		/* uart2-rxm0 */
87949c55878SDavid Wu 		.bank_num = 1,
880793770dfSDavid Wu 		.pin = 27,
88149c55878SDavid Wu 		.func = 2,
88249c55878SDavid Wu 		.route_offset = 0x184,
883793770dfSDavid Wu 		.route_val = BIT(16 + 10),
88449c55878SDavid Wu 	}, {
88549c55878SDavid Wu 		/* uart2-rxm1 */
88649c55878SDavid Wu 		.bank_num = 2,
88749c55878SDavid Wu 		.pin = 14,
88849c55878SDavid Wu 		.func = 2,
88949c55878SDavid Wu 		.route_offset = 0x184,
890793770dfSDavid Wu 		.route_val = BIT(16 + 10) | BIT(10),
89149c55878SDavid Wu 	}, {
89249c55878SDavid Wu 		/* uart3-rxm0 */
89349c55878SDavid Wu 		.bank_num = 0,
89449c55878SDavid Wu 		.pin = 17,
89549c55878SDavid Wu 		.func = 2,
89649c55878SDavid Wu 		.route_offset = 0x184,
897793770dfSDavid Wu 		.route_val = BIT(16 + 9),
89849c55878SDavid Wu 	}, {
89949c55878SDavid Wu 		/* uart3-rxm1 */
90049c55878SDavid Wu 		.bank_num = 1,
901793770dfSDavid Wu 		.pin = 15,
90249c55878SDavid Wu 		.func = 2,
90349c55878SDavid Wu 		.route_offset = 0x184,
904793770dfSDavid Wu 		.route_val = BIT(16 + 9) | BIT(9),
90549c55878SDavid Wu 	},
90649c55878SDavid Wu };
90749c55878SDavid Wu 
908a2a3fc8fSJianqun Xu static struct rockchip_mux_route_data rk1808_mux_route_data[] = {
909a2a3fc8fSJianqun Xu 	{
910a2a3fc8fSJianqun Xu 		/* i2c2m0_sda */
911a2a3fc8fSJianqun Xu 		.bank_num = 3,
912a2a3fc8fSJianqun Xu 		.pin = 12,
913a2a3fc8fSJianqun Xu 		.func = 2,
914a2a3fc8fSJianqun Xu 		.route_offset = 0x190,
915a2a3fc8fSJianqun Xu 		.route_val = BIT(16 + 3),
916a2a3fc8fSJianqun Xu 	}, {
917a2a3fc8fSJianqun Xu 		/* i2c2m1_sda */
918a2a3fc8fSJianqun Xu 		.bank_num = 1,
919a2a3fc8fSJianqun Xu 		.pin = 13,
920a2a3fc8fSJianqun Xu 		.func = 2,
921a2a3fc8fSJianqun Xu 		.route_offset = 0x190,
922a2a3fc8fSJianqun Xu 		.route_val = BIT(16 + 3) | BIT(3),
923a2a3fc8fSJianqun Xu 	}, {
924a2a3fc8fSJianqun Xu 		/* uart2_rxm0 */
925a2a3fc8fSJianqun Xu 		.bank_num = 4,
926a2a3fc8fSJianqun Xu 		.pin = 3,
927a2a3fc8fSJianqun Xu 		.func = 2,
928a2a3fc8fSJianqun Xu 		.route_offset = 0x190,
929a2a3fc8fSJianqun Xu 		.route_val = BIT(16 + 14) | BIT(16 + 15),
930a2a3fc8fSJianqun Xu 	}, {
931a2a3fc8fSJianqun Xu 		/* uart2_rxm1 */
932a2a3fc8fSJianqun Xu 		.bank_num = 2,
933a2a3fc8fSJianqun Xu 		.pin = 25,
934a2a3fc8fSJianqun Xu 		.func = 2,
935a2a3fc8fSJianqun Xu 		.route_offset = 0x190,
936a2a3fc8fSJianqun Xu 		.route_val = BIT(16 + 14) | BIT(14) | BIT(16 + 15),
937a2a3fc8fSJianqun Xu 	}, {
938a2a3fc8fSJianqun Xu 		/* uart2_rxm2 */
939a2a3fc8fSJianqun Xu 		.bank_num = 3,
940a2a3fc8fSJianqun Xu 		.pin = 4,
941a2a3fc8fSJianqun Xu 		.func = 2,
942a2a3fc8fSJianqun Xu 		.route_offset = 0x190,
943a2a3fc8fSJianqun Xu 		.route_val = BIT(16 + 14) | BIT(16 + 15) | BIT(15),
944a2a3fc8fSJianqun Xu 	},
945a2a3fc8fSJianqun Xu };
946a2a3fc8fSJianqun Xu 
94749c55878SDavid Wu static struct rockchip_mux_route_data rk3128_mux_route_data[] = {
94849c55878SDavid Wu 	{
94949c55878SDavid Wu 		/* spi-0 */
95049c55878SDavid Wu 		.bank_num = 1,
95149c55878SDavid Wu 		.pin = 10,
95249c55878SDavid Wu 		.func = 1,
95349c55878SDavid Wu 		.route_offset = 0x144,
95449c55878SDavid Wu 		.route_val = BIT(16 + 3) | BIT(16 + 4),
95549c55878SDavid Wu 	}, {
95649c55878SDavid Wu 		/* spi-1 */
95749c55878SDavid Wu 		.bank_num = 1,
95849c55878SDavid Wu 		.pin = 27,
95949c55878SDavid Wu 		.func = 3,
96049c55878SDavid Wu 		.route_offset = 0x144,
96149c55878SDavid Wu 		.route_val = BIT(16 + 3) | BIT(16 + 4) | BIT(3),
96249c55878SDavid Wu 	}, {
96349c55878SDavid Wu 		/* spi-2 */
96449c55878SDavid Wu 		.bank_num = 0,
96549c55878SDavid Wu 		.pin = 13,
96649c55878SDavid Wu 		.func = 2,
96749c55878SDavid Wu 		.route_offset = 0x144,
96849c55878SDavid Wu 		.route_val = BIT(16 + 3) | BIT(16 + 4) | BIT(4),
96949c55878SDavid Wu 	}, {
97049c55878SDavid Wu 		/* i2s-0 */
97149c55878SDavid Wu 		.bank_num = 1,
97249c55878SDavid Wu 		.pin = 5,
97349c55878SDavid Wu 		.func = 1,
97449c55878SDavid Wu 		.route_offset = 0x144,
97549c55878SDavid Wu 		.route_val = BIT(16 + 5),
97649c55878SDavid Wu 	}, {
97749c55878SDavid Wu 		/* i2s-1 */
97849c55878SDavid Wu 		.bank_num = 0,
97949c55878SDavid Wu 		.pin = 14,
98049c55878SDavid Wu 		.func = 1,
98149c55878SDavid Wu 		.route_offset = 0x144,
98249c55878SDavid Wu 		.route_val = BIT(16 + 5) | BIT(5),
98349c55878SDavid Wu 	}, {
98449c55878SDavid Wu 		/* emmc-0 */
98549c55878SDavid Wu 		.bank_num = 1,
98649c55878SDavid Wu 		.pin = 22,
98749c55878SDavid Wu 		.func = 2,
98849c55878SDavid Wu 		.route_offset = 0x144,
98949c55878SDavid Wu 		.route_val = BIT(16 + 6),
99049c55878SDavid Wu 	}, {
99149c55878SDavid Wu 		/* emmc-1 */
99249c55878SDavid Wu 		.bank_num = 2,
99349c55878SDavid Wu 		.pin = 4,
99449c55878SDavid Wu 		.func = 2,
99549c55878SDavid Wu 		.route_offset = 0x144,
99649c55878SDavid Wu 		.route_val = BIT(16 + 6) | BIT(6),
99749c55878SDavid Wu 	},
99849c55878SDavid Wu };
99949c55878SDavid Wu 
100049c55878SDavid Wu static struct rockchip_mux_route_data rk3228_mux_route_data[] = {
100149c55878SDavid Wu 	{
100249c55878SDavid Wu 		/* pwm0-0 */
100349c55878SDavid Wu 		.bank_num = 0,
100449c55878SDavid Wu 		.pin = 26,
100549c55878SDavid Wu 		.func = 1,
100649c55878SDavid Wu 		.route_offset = 0x50,
100749c55878SDavid Wu 		.route_val = BIT(16),
100849c55878SDavid Wu 	}, {
100949c55878SDavid Wu 		/* pwm0-1 */
101049c55878SDavid Wu 		.bank_num = 3,
101149c55878SDavid Wu 		.pin = 21,
101249c55878SDavid Wu 		.func = 1,
101349c55878SDavid Wu 		.route_offset = 0x50,
101449c55878SDavid Wu 		.route_val = BIT(16) | BIT(0),
101549c55878SDavid Wu 	}, {
101649c55878SDavid Wu 		/* pwm1-0 */
101749c55878SDavid Wu 		.bank_num = 0,
101849c55878SDavid Wu 		.pin = 27,
101949c55878SDavid Wu 		.func = 1,
102049c55878SDavid Wu 		.route_offset = 0x50,
102149c55878SDavid Wu 		.route_val = BIT(16 + 1),
102249c55878SDavid Wu 	}, {
102349c55878SDavid Wu 		/* pwm1-1 */
102449c55878SDavid Wu 		.bank_num = 0,
102549c55878SDavid Wu 		.pin = 30,
102649c55878SDavid Wu 		.func = 2,
102749c55878SDavid Wu 		.route_offset = 0x50,
102849c55878SDavid Wu 		.route_val = BIT(16 + 1) | BIT(1),
102949c55878SDavid Wu 	}, {
103049c55878SDavid Wu 		/* pwm2-0 */
103149c55878SDavid Wu 		.bank_num = 0,
103249c55878SDavid Wu 		.pin = 28,
103349c55878SDavid Wu 		.func = 1,
103449c55878SDavid Wu 		.route_offset = 0x50,
103549c55878SDavid Wu 		.route_val = BIT(16 + 2),
103649c55878SDavid Wu 	}, {
103749c55878SDavid Wu 		/* pwm2-1 */
103849c55878SDavid Wu 		.bank_num = 1,
103949c55878SDavid Wu 		.pin = 12,
104049c55878SDavid Wu 		.func = 2,
104149c55878SDavid Wu 		.route_offset = 0x50,
104249c55878SDavid Wu 		.route_val = BIT(16 + 2) | BIT(2),
104349c55878SDavid Wu 	}, {
104449c55878SDavid Wu 		/* pwm3-0 */
104549c55878SDavid Wu 		.bank_num = 3,
104649c55878SDavid Wu 		.pin = 26,
104749c55878SDavid Wu 		.func = 1,
104849c55878SDavid Wu 		.route_offset = 0x50,
104949c55878SDavid Wu 		.route_val = BIT(16 + 3),
105049c55878SDavid Wu 	}, {
105149c55878SDavid Wu 		/* pwm3-1 */
105249c55878SDavid Wu 		.bank_num = 1,
105349c55878SDavid Wu 		.pin = 11,
105449c55878SDavid Wu 		.func = 2,
105549c55878SDavid Wu 		.route_offset = 0x50,
105649c55878SDavid Wu 		.route_val = BIT(16 + 3) | BIT(3),
105749c55878SDavid Wu 	}, {
105849c55878SDavid Wu 		/* sdio-0_d0 */
105949c55878SDavid Wu 		.bank_num = 1,
106049c55878SDavid Wu 		.pin = 1,
106149c55878SDavid Wu 		.func = 1,
106249c55878SDavid Wu 		.route_offset = 0x50,
106349c55878SDavid Wu 		.route_val = BIT(16 + 4),
106449c55878SDavid Wu 	}, {
106549c55878SDavid Wu 		/* sdio-1_d0 */
106649c55878SDavid Wu 		.bank_num = 3,
106749c55878SDavid Wu 		.pin = 2,
106849c55878SDavid Wu 		.func = 1,
106949c55878SDavid Wu 		.route_offset = 0x50,
107049c55878SDavid Wu 		.route_val = BIT(16 + 4) | BIT(4),
107149c55878SDavid Wu 	}, {
107249c55878SDavid Wu 		/* spi-0_rx */
107349c55878SDavid Wu 		.bank_num = 0,
107449c55878SDavid Wu 		.pin = 13,
107549c55878SDavid Wu 		.func = 2,
107649c55878SDavid Wu 		.route_offset = 0x50,
107749c55878SDavid Wu 		.route_val = BIT(16 + 5),
107849c55878SDavid Wu 	}, {
107949c55878SDavid Wu 		/* spi-1_rx */
108049c55878SDavid Wu 		.bank_num = 2,
108149c55878SDavid Wu 		.pin = 0,
108249c55878SDavid Wu 		.func = 2,
108349c55878SDavid Wu 		.route_offset = 0x50,
108449c55878SDavid Wu 		.route_val = BIT(16 + 5) | BIT(5),
108549c55878SDavid Wu 	}, {
108649c55878SDavid Wu 		/* emmc-0_cmd */
108749c55878SDavid Wu 		.bank_num = 1,
108849c55878SDavid Wu 		.pin = 22,
108949c55878SDavid Wu 		.func = 2,
109049c55878SDavid Wu 		.route_offset = 0x50,
109149c55878SDavid Wu 		.route_val = BIT(16 + 7),
109249c55878SDavid Wu 	}, {
109349c55878SDavid Wu 		/* emmc-1_cmd */
109449c55878SDavid Wu 		.bank_num = 2,
109549c55878SDavid Wu 		.pin = 4,
109649c55878SDavid Wu 		.func = 2,
109749c55878SDavid Wu 		.route_offset = 0x50,
109849c55878SDavid Wu 		.route_val = BIT(16 + 7) | BIT(7),
109949c55878SDavid Wu 	}, {
110049c55878SDavid Wu 		/* uart2-0_rx */
110149c55878SDavid Wu 		.bank_num = 1,
110249c55878SDavid Wu 		.pin = 19,
110349c55878SDavid Wu 		.func = 2,
110449c55878SDavid Wu 		.route_offset = 0x50,
110549c55878SDavid Wu 		.route_val = BIT(16 + 8),
110649c55878SDavid Wu 	}, {
110749c55878SDavid Wu 		/* uart2-1_rx */
110849c55878SDavid Wu 		.bank_num = 1,
110949c55878SDavid Wu 		.pin = 10,
111049c55878SDavid Wu 		.func = 2,
111149c55878SDavid Wu 		.route_offset = 0x50,
111249c55878SDavid Wu 		.route_val = BIT(16 + 8) | BIT(8),
111349c55878SDavid Wu 	}, {
111449c55878SDavid Wu 		/* uart1-0_rx */
111549c55878SDavid Wu 		.bank_num = 1,
111649c55878SDavid Wu 		.pin = 10,
111749c55878SDavid Wu 		.func = 1,
111849c55878SDavid Wu 		.route_offset = 0x50,
111949c55878SDavid Wu 		.route_val = BIT(16 + 11),
112049c55878SDavid Wu 	}, {
112149c55878SDavid Wu 		/* uart1-1_rx */
112249c55878SDavid Wu 		.bank_num = 3,
112349c55878SDavid Wu 		.pin = 13,
112449c55878SDavid Wu 		.func = 1,
112549c55878SDavid Wu 		.route_offset = 0x50,
112649c55878SDavid Wu 		.route_val = BIT(16 + 11) | BIT(11),
112749c55878SDavid Wu 	},
112849c55878SDavid Wu };
112949c55878SDavid Wu 
113049c55878SDavid Wu static struct rockchip_mux_route_data rk3288_mux_route_data[] = {
113149c55878SDavid Wu 	{
113249c55878SDavid Wu 		/* edphdmi_cecinoutt1 */
113349c55878SDavid Wu 		.bank_num = 7,
113449c55878SDavid Wu 		.pin = 16,
113549c55878SDavid Wu 		.func = 2,
113649c55878SDavid Wu 		.route_offset = 0x264,
113749c55878SDavid Wu 		.route_val = BIT(16 + 12) | BIT(12),
113849c55878SDavid Wu 	}, {
113949c55878SDavid Wu 		/* edphdmi_cecinout */
114049c55878SDavid Wu 		.bank_num = 7,
114149c55878SDavid Wu 		.pin = 23,
114249c55878SDavid Wu 		.func = 4,
114349c55878SDavid Wu 		.route_offset = 0x264,
114449c55878SDavid Wu 		.route_val = BIT(16 + 12),
114549c55878SDavid Wu 	},
114649c55878SDavid Wu };
114749c55878SDavid Wu 
1148b3077611SDavid Wu static struct rockchip_mux_route_data rk3308_mux_route_data[] = {
1149b3077611SDavid Wu 	{
1150d5517017SDavid Wu 		/* rtc_clk */
1151d5517017SDavid Wu 		.bank_num = 0,
1152d5517017SDavid Wu 		.pin = 19,
1153d5517017SDavid Wu 		.func = 1,
1154d5517017SDavid Wu 		.route_offset = 0x314,
1155d5517017SDavid Wu 		.route_val = BIT(16 + 0) | BIT(0),
1156d5517017SDavid Wu 	}, {
1157b3077611SDavid Wu 		/* uart2_rxm0 */
1158b3077611SDavid Wu 		.bank_num = 1,
1159b3077611SDavid Wu 		.pin = 22,
1160b3077611SDavid Wu 		.func = 2,
1161b3077611SDavid Wu 		.route_offset = 0x314,
1162b3077611SDavid Wu 		.route_val = BIT(16 + 2) | BIT(16 + 3),
1163b3077611SDavid Wu 	}, {
1164b3077611SDavid Wu 		/* uart2_rxm1 */
1165b3077611SDavid Wu 		.bank_num = 4,
1166b3077611SDavid Wu 		.pin = 26,
1167b3077611SDavid Wu 		.func = 2,
1168b3077611SDavid Wu 		.route_offset = 0x314,
1169b3077611SDavid Wu 		.route_val = BIT(16 + 2) | BIT(16 + 3) | BIT(2),
1170b3077611SDavid Wu 	}, {
1171b3077611SDavid Wu 		/* i2c3_sdam0 */
1172b3077611SDavid Wu 		.bank_num = 0,
1173b3077611SDavid Wu 		.pin = 23,
1174b3077611SDavid Wu 		.func = 2,
1175b3077611SDavid Wu 		.route_offset = 0x314,
1176b3077611SDavid Wu 		.route_val = BIT(16 + 4),
1177b3077611SDavid Wu 	}, {
1178b3077611SDavid Wu 		/* i2c3_sdam1 */
1179b3077611SDavid Wu 		.bank_num = 3,
1180b3077611SDavid Wu 		.pin = 12,
1181b3077611SDavid Wu 		.func = 2,
1182b3077611SDavid Wu 		.route_offset = 0x314,
1183b3077611SDavid Wu 		.route_val = BIT(16 + 4) | BIT(4),
1184d5517017SDavid Wu 	}, {
1185d5517017SDavid Wu 		/* i2s-8ch-1-sclktxm0 */
1186d5517017SDavid Wu 		.bank_num = 1,
1187d5517017SDavid Wu 		.pin = 3,
1188d5517017SDavid Wu 		.func = 2,
1189d5517017SDavid Wu 		.route_offset = 0x308,
1190d5517017SDavid Wu 		.route_val = BIT(16 + 3),
1191d5517017SDavid Wu 	}, {
1192d5517017SDavid Wu 		/* i2s-8ch-1-sclkrxm0 */
1193d5517017SDavid Wu 		.bank_num = 1,
1194d5517017SDavid Wu 		.pin = 4,
1195d5517017SDavid Wu 		.func = 2,
1196d5517017SDavid Wu 		.route_offset = 0x308,
1197d5517017SDavid Wu 		.route_val = BIT(16 + 3),
1198d5517017SDavid Wu 	}, {
1199d5517017SDavid Wu 		/* i2s-8ch-1-sclktxm1 */
1200d5517017SDavid Wu 		.bank_num = 1,
1201d5517017SDavid Wu 		.pin = 13,
1202d5517017SDavid Wu 		.func = 2,
1203d5517017SDavid Wu 		.route_offset = 0x308,
1204d5517017SDavid Wu 		.route_val = BIT(16 + 3) | BIT(3),
1205d5517017SDavid Wu 	}, {
1206d5517017SDavid Wu 		/* i2s-8ch-1-sclkrxm1 */
1207d5517017SDavid Wu 		.bank_num = 1,
1208d5517017SDavid Wu 		.pin = 14,
1209d5517017SDavid Wu 		.func = 2,
1210d5517017SDavid Wu 		.route_offset = 0x308,
1211d5517017SDavid Wu 		.route_val = BIT(16 + 3) | BIT(3),
1212d5517017SDavid Wu 	}, {
1213d5517017SDavid Wu 		/* pdm-clkm0 */
1214d5517017SDavid Wu 		.bank_num = 1,
1215d5517017SDavid Wu 		.pin = 4,
1216d5517017SDavid Wu 		.func = 3,
1217d5517017SDavid Wu 		.route_offset = 0x308,
1218d5517017SDavid Wu 		.route_val = BIT(16 + 12) | BIT(16 + 13),
1219d5517017SDavid Wu 	}, {
1220d5517017SDavid Wu 		/* pdm-clkm1 */
1221d5517017SDavid Wu 		.bank_num = 1,
1222d5517017SDavid Wu 		.pin = 14,
1223d5517017SDavid Wu 		.func = 4,
1224d5517017SDavid Wu 		.route_offset = 0x308,
1225d5517017SDavid Wu 		.route_val = BIT(16 + 12) | BIT(16 + 13) | BIT(12),
1226d5517017SDavid Wu 	}, {
1227d5517017SDavid Wu 		/* pdm-clkm2 */
1228d5517017SDavid Wu 		.bank_num = 2,
1229d5517017SDavid Wu 		.pin = 6,
1230d5517017SDavid Wu 		.func = 2,
1231d5517017SDavid Wu 		.route_offset = 0x308,
1232d5517017SDavid Wu 		.route_val = BIT(16 + 12) | BIT(16 + 13) | BIT(13),
1233d5517017SDavid Wu 	}, {
1234d5517017SDavid Wu 		/* pdm-clkm-m2 */
1235d5517017SDavid Wu 		.bank_num = 2,
1236d5517017SDavid Wu 		.pin = 4,
1237d5517017SDavid Wu 		.func = 3,
1238d5517017SDavid Wu 		.route_offset = 0x600,
1239d5517017SDavid Wu 		.route_val = BIT(16 + 2) | BIT(2),
1240d5517017SDavid Wu 	},
1241d5517017SDavid Wu };
1242d5517017SDavid Wu 
1243d5517017SDavid Wu static struct rockchip_mux_route_data rk3308b_mux_route_data[] = {
1244d5517017SDavid Wu 	{
1245d5517017SDavid Wu 		/* rtc_clk */
1246d5517017SDavid Wu 		.bank_num = 0,
1247d5517017SDavid Wu 		.pin = 19,
1248d5517017SDavid Wu 		.func = 1,
1249d5517017SDavid Wu 		.route_offset = 0x314,
1250d5517017SDavid Wu 		.route_val = BIT(16 + 0) | BIT(0),
1251d5517017SDavid Wu 	}, {
1252d5517017SDavid Wu 		/* uart2_rxm0 */
1253d5517017SDavid Wu 		.bank_num = 1,
1254d5517017SDavid Wu 		.pin = 22,
1255d5517017SDavid Wu 		.func = 2,
1256d5517017SDavid Wu 		.route_offset = 0x314,
1257d5517017SDavid Wu 		.route_val = BIT(16 + 2) | BIT(16 + 3),
1258d5517017SDavid Wu 	}, {
1259d5517017SDavid Wu 		/* uart2_rxm1 */
1260d5517017SDavid Wu 		.bank_num = 4,
1261d5517017SDavid Wu 		.pin = 26,
1262d5517017SDavid Wu 		.func = 2,
1263d5517017SDavid Wu 		.route_offset = 0x314,
1264d5517017SDavid Wu 		.route_val = BIT(16 + 2) | BIT(16 + 3) | BIT(2),
1265d5517017SDavid Wu 	}, {
1266d5517017SDavid Wu 		/* i2c3_sdam0 */
1267d5517017SDavid Wu 		.bank_num = 0,
1268d5517017SDavid Wu 		.pin = 15,
1269d5517017SDavid Wu 		.func = 2,
1270d5517017SDavid Wu 		.route_offset = 0x608,
1271d5517017SDavid Wu 		.route_val = BIT(16 + 8) | BIT(16 + 9),
1272d5517017SDavid Wu 	}, {
1273d5517017SDavid Wu 		/* i2c3_sdam1 */
1274d5517017SDavid Wu 		.bank_num = 3,
1275d5517017SDavid Wu 		.pin = 12,
1276d5517017SDavid Wu 		.func = 2,
1277d5517017SDavid Wu 		.route_offset = 0x608,
1278d5517017SDavid Wu 		.route_val = BIT(16 + 8) | BIT(16 + 9) | BIT(8),
1279d5517017SDavid Wu 	}, {
1280d5517017SDavid Wu 		/* i2c3_sdam2 */
1281d5517017SDavid Wu 		.bank_num = 2,
1282d5517017SDavid Wu 		.pin = 0,
1283d5517017SDavid Wu 		.func = 3,
1284d5517017SDavid Wu 		.route_offset = 0x608,
1285d5517017SDavid Wu 		.route_val = BIT(16 + 8) | BIT(16 + 9) | BIT(9),
1286d5517017SDavid Wu 	}, {
1287d5517017SDavid Wu 		/* i2s-8ch-1-sclktxm0 */
1288d5517017SDavid Wu 		.bank_num = 1,
1289d5517017SDavid Wu 		.pin = 3,
1290d5517017SDavid Wu 		.func = 2,
1291d5517017SDavid Wu 		.route_offset = 0x308,
1292d5517017SDavid Wu 		.route_val = BIT(16 + 3),
1293d5517017SDavid Wu 	}, {
1294d5517017SDavid Wu 		/* i2s-8ch-1-sclkrxm0 */
1295d5517017SDavid Wu 		.bank_num = 1,
1296d5517017SDavid Wu 		.pin = 4,
1297d5517017SDavid Wu 		.func = 2,
1298d5517017SDavid Wu 		.route_offset = 0x308,
1299d5517017SDavid Wu 		.route_val = BIT(16 + 3),
1300d5517017SDavid Wu 	}, {
1301d5517017SDavid Wu 		/* i2s-8ch-1-sclktxm1 */
1302d5517017SDavid Wu 		.bank_num = 1,
1303d5517017SDavid Wu 		.pin = 13,
1304d5517017SDavid Wu 		.func = 2,
1305d5517017SDavid Wu 		.route_offset = 0x308,
1306d5517017SDavid Wu 		.route_val = BIT(16 + 3) | BIT(3),
1307d5517017SDavid Wu 	}, {
1308d5517017SDavid Wu 		/* i2s-8ch-1-sclkrxm1 */
1309d5517017SDavid Wu 		.bank_num = 1,
1310d5517017SDavid Wu 		.pin = 14,
1311d5517017SDavid Wu 		.func = 2,
1312d5517017SDavid Wu 		.route_offset = 0x308,
1313d5517017SDavid Wu 		.route_val = BIT(16 + 3) | BIT(3),
1314d5517017SDavid Wu 	}, {
1315d5517017SDavid Wu 		/* pdm-clkm0 */
1316d5517017SDavid Wu 		.bank_num = 1,
1317d5517017SDavid Wu 		.pin = 4,
1318d5517017SDavid Wu 		.func = 3,
1319d5517017SDavid Wu 		.route_offset = 0x308,
1320d5517017SDavid Wu 		.route_val =  BIT(16 + 12) | BIT(16 + 13),
1321d5517017SDavid Wu 	}, {
1322d5517017SDavid Wu 		/* pdm-clkm1 */
1323d5517017SDavid Wu 		.bank_num = 1,
1324d5517017SDavid Wu 		.pin = 14,
1325d5517017SDavid Wu 		.func = 4,
1326d5517017SDavid Wu 		.route_offset = 0x308,
1327d5517017SDavid Wu 		.route_val = BIT(16 + 12) | BIT(16 + 13) | BIT(12),
1328d5517017SDavid Wu 	}, {
1329d5517017SDavid Wu 		/* pdm-clkm2 */
1330d5517017SDavid Wu 		.bank_num = 2,
1331d5517017SDavid Wu 		.pin = 6,
1332d5517017SDavid Wu 		.func = 2,
1333d5517017SDavid Wu 		.route_offset = 0x308,
1334d5517017SDavid Wu 		.route_val = BIT(16 + 12) | BIT(16 + 13) | BIT(13),
1335d5517017SDavid Wu 	}, {
1336d5517017SDavid Wu 		/* pdm-clkm-m2 */
1337d5517017SDavid Wu 		.bank_num = 2,
1338d5517017SDavid Wu 		.pin = 4,
1339d5517017SDavid Wu 		.func = 3,
1340d5517017SDavid Wu 		.route_offset = 0x600,
1341d5517017SDavid Wu 		.route_val = BIT(16 + 2) | BIT(2),
1342d5517017SDavid Wu 	}, {
1343d5517017SDavid Wu 		/* spi1_miso */
1344d5517017SDavid Wu 		.bank_num = 3,
1345d5517017SDavid Wu 		.pin = 10,
1346d5517017SDavid Wu 		.func = 3,
1347d5517017SDavid Wu 		.route_offset = 0x314,
1348d5517017SDavid Wu 		.route_val = BIT(16 + 9),
1349d5517017SDavid Wu 	}, {
1350d5517017SDavid Wu 		/* spi1_miso_m1 */
1351d5517017SDavid Wu 		.bank_num = 2,
1352d5517017SDavid Wu 		.pin = 4,
1353d5517017SDavid Wu 		.func = 2,
1354d5517017SDavid Wu 		.route_offset = 0x314,
1355d5517017SDavid Wu 		.route_val = BIT(16 + 9) | BIT(9),
1356d5517017SDavid Wu 	}, {
1357d5517017SDavid Wu 		/* owire_m0 */
1358d5517017SDavid Wu 		.bank_num = 0,
1359d5517017SDavid Wu 		.pin = 11,
1360d5517017SDavid Wu 		.func = 3,
1361d5517017SDavid Wu 		.route_offset = 0x314,
1362d5517017SDavid Wu 		.route_val = BIT(16 + 10) | BIT(16 + 11),
1363d5517017SDavid Wu 	}, {
1364d5517017SDavid Wu 		/* owire_m1 */
1365d5517017SDavid Wu 		.bank_num = 1,
1366d5517017SDavid Wu 		.pin = 22,
1367d5517017SDavid Wu 		.func = 7,
1368d5517017SDavid Wu 		.route_offset = 0x314,
1369d5517017SDavid Wu 		.route_val = BIT(16 + 10) | BIT(16 + 11) | BIT(10),
1370d5517017SDavid Wu 	}, {
1371d5517017SDavid Wu 		/* owire_m2 */
1372d5517017SDavid Wu 		.bank_num = 2,
1373d5517017SDavid Wu 		.pin = 2,
1374d5517017SDavid Wu 		.func = 5,
1375d5517017SDavid Wu 		.route_offset = 0x314,
1376d5517017SDavid Wu 		.route_val = BIT(16 + 10) | BIT(16 + 11) | BIT(11),
1377d5517017SDavid Wu 	}, {
1378d5517017SDavid Wu 		/* can_rxd_m0 */
1379d5517017SDavid Wu 		.bank_num = 0,
1380d5517017SDavid Wu 		.pin = 11,
1381d5517017SDavid Wu 		.func = 2,
1382d5517017SDavid Wu 		.route_offset = 0x314,
1383d5517017SDavid Wu 		.route_val = BIT(16 + 12) | BIT(16 + 13),
1384d5517017SDavid Wu 	}, {
1385d5517017SDavid Wu 		/* can_rxd_m1 */
1386d5517017SDavid Wu 		.bank_num = 1,
1387d5517017SDavid Wu 		.pin = 22,
1388d5517017SDavid Wu 		.func = 5,
1389d5517017SDavid Wu 		.route_offset = 0x314,
1390d5517017SDavid Wu 		.route_val = BIT(16 + 12) | BIT(16 + 13) | BIT(12),
1391d5517017SDavid Wu 	}, {
1392d5517017SDavid Wu 		/* can_rxd_m2 */
1393d5517017SDavid Wu 		.bank_num = 2,
1394d5517017SDavid Wu 		.pin = 2,
1395d5517017SDavid Wu 		.func = 4,
1396d5517017SDavid Wu 		.route_offset = 0x314,
1397d5517017SDavid Wu 		.route_val = BIT(16 + 12) | BIT(16 + 13) | BIT(13),
1398d5517017SDavid Wu 	}, {
1399d5517017SDavid Wu 		/* mac_rxd0_m0 */
1400d5517017SDavid Wu 		.bank_num = 1,
1401d5517017SDavid Wu 		.pin = 20,
1402d5517017SDavid Wu 		.func = 3,
1403d5517017SDavid Wu 		.route_offset = 0x314,
1404d5517017SDavid Wu 		.route_val = BIT(16 + 14),
1405d5517017SDavid Wu 	}, {
1406d5517017SDavid Wu 		/* mac_rxd0_m1 */
1407d5517017SDavid Wu 		.bank_num = 4,
1408d5517017SDavid Wu 		.pin = 2,
1409d5517017SDavid Wu 		.func = 2,
1410d5517017SDavid Wu 		.route_offset = 0x314,
1411d5517017SDavid Wu 		.route_val = BIT(16 + 14) | BIT(14),
1412d5517017SDavid Wu 	}, {
1413d5517017SDavid Wu 		/* uart3_rx */
1414d5517017SDavid Wu 		.bank_num = 3,
1415d5517017SDavid Wu 		.pin = 12,
1416d5517017SDavid Wu 		.func = 4,
1417d5517017SDavid Wu 		.route_offset = 0x314,
1418d5517017SDavid Wu 		.route_val = BIT(16 + 15),
1419d5517017SDavid Wu 	}, {
1420d5517017SDavid Wu 		/* uart3_rx_m1 */
1421d5517017SDavid Wu 		.bank_num = 0,
1422d5517017SDavid Wu 		.pin = 17,
1423d5517017SDavid Wu 		.func = 3,
1424d5517017SDavid Wu 		.route_offset = 0x314,
1425d5517017SDavid Wu 		.route_val = BIT(16 + 15) | BIT(15),
1426b3077611SDavid Wu 	},
1427b3077611SDavid Wu };
1428b3077611SDavid Wu 
142949c55878SDavid Wu static struct rockchip_mux_route_data rk3328_mux_route_data[] = {
143049c55878SDavid Wu 	{
143149c55878SDavid Wu 		/* uart2dbg_rxm0 */
143249c55878SDavid Wu 		.bank_num = 1,
143349c55878SDavid Wu 		.pin = 1,
143449c55878SDavid Wu 		.func = 2,
143549c55878SDavid Wu 		.route_offset = 0x50,
143649c55878SDavid Wu 		.route_val = BIT(16) | BIT(16 + 1),
143749c55878SDavid Wu 	}, {
143849c55878SDavid Wu 		/* uart2dbg_rxm1 */
143949c55878SDavid Wu 		.bank_num = 2,
144049c55878SDavid Wu 		.pin = 1,
144149c55878SDavid Wu 		.func = 1,
144249c55878SDavid Wu 		.route_offset = 0x50,
144349c55878SDavid Wu 		.route_val = BIT(16) | BIT(16 + 1) | BIT(0),
144449c55878SDavid Wu 	}, {
144549c55878SDavid Wu 		/* gmac-m1_rxd0 */
144649c55878SDavid Wu 		.bank_num = 1,
144749c55878SDavid Wu 		.pin = 11,
144849c55878SDavid Wu 		.func = 2,
144949c55878SDavid Wu 		.route_offset = 0x50,
145049c55878SDavid Wu 		.route_val = BIT(16 + 2) | BIT(2),
145149c55878SDavid Wu 	}, {
145249c55878SDavid Wu 		/* gmac-m1-optimized_rxd3 */
145349c55878SDavid Wu 		.bank_num = 1,
145449c55878SDavid Wu 		.pin = 14,
145549c55878SDavid Wu 		.func = 2,
145649c55878SDavid Wu 		.route_offset = 0x50,
145749c55878SDavid Wu 		.route_val = BIT(16 + 10) | BIT(10),
145849c55878SDavid Wu 	}, {
145949c55878SDavid Wu 		/* pdm_sdi0m0 */
146049c55878SDavid Wu 		.bank_num = 2,
146149c55878SDavid Wu 		.pin = 19,
146249c55878SDavid Wu 		.func = 2,
146349c55878SDavid Wu 		.route_offset = 0x50,
146449c55878SDavid Wu 		.route_val = BIT(16 + 3),
146549c55878SDavid Wu 	}, {
146649c55878SDavid Wu 		/* pdm_sdi0m1 */
146749c55878SDavid Wu 		.bank_num = 1,
146849c55878SDavid Wu 		.pin = 23,
146949c55878SDavid Wu 		.func = 3,
147049c55878SDavid Wu 		.route_offset = 0x50,
147149c55878SDavid Wu 		.route_val =  BIT(16 + 3) | BIT(3),
147249c55878SDavid Wu 	}, {
147349c55878SDavid Wu 		/* spi_rxdm2 */
147449c55878SDavid Wu 		.bank_num = 3,
147549c55878SDavid Wu 		.pin = 2,
147649c55878SDavid Wu 		.func = 4,
147749c55878SDavid Wu 		.route_offset = 0x50,
147849c55878SDavid Wu 		.route_val =  BIT(16 + 4) | BIT(16 + 5) | BIT(5),
147949c55878SDavid Wu 	}, {
148049c55878SDavid Wu 		/* i2s2_sdim0 */
148149c55878SDavid Wu 		.bank_num = 1,
148249c55878SDavid Wu 		.pin = 24,
148349c55878SDavid Wu 		.func = 1,
148449c55878SDavid Wu 		.route_offset = 0x50,
148549c55878SDavid Wu 		.route_val = BIT(16 + 6),
148649c55878SDavid Wu 	}, {
148749c55878SDavid Wu 		/* i2s2_sdim1 */
148849c55878SDavid Wu 		.bank_num = 3,
148949c55878SDavid Wu 		.pin = 2,
149049c55878SDavid Wu 		.func = 6,
149149c55878SDavid Wu 		.route_offset = 0x50,
149249c55878SDavid Wu 		.route_val =  BIT(16 + 6) | BIT(6),
149349c55878SDavid Wu 	}, {
149449c55878SDavid Wu 		/* card_iom1 */
149549c55878SDavid Wu 		.bank_num = 2,
149649c55878SDavid Wu 		.pin = 22,
149749c55878SDavid Wu 		.func = 3,
149849c55878SDavid Wu 		.route_offset = 0x50,
149949c55878SDavid Wu 		.route_val =  BIT(16 + 7) | BIT(7),
150049c55878SDavid Wu 	}, {
150149c55878SDavid Wu 		/* tsp_d5m1 */
150249c55878SDavid Wu 		.bank_num = 2,
150349c55878SDavid Wu 		.pin = 16,
150449c55878SDavid Wu 		.func = 3,
150549c55878SDavid Wu 		.route_offset = 0x50,
150649c55878SDavid Wu 		.route_val =  BIT(16 + 8) | BIT(8),
150749c55878SDavid Wu 	}, {
150849c55878SDavid Wu 		/* cif_data5m1 */
150949c55878SDavid Wu 		.bank_num = 2,
151049c55878SDavid Wu 		.pin = 16,
151149c55878SDavid Wu 		.func = 4,
151249c55878SDavid Wu 		.route_offset = 0x50,
151349c55878SDavid Wu 		.route_val =  BIT(16 + 9) | BIT(9),
151449c55878SDavid Wu 	},
151549c55878SDavid Wu };
151649c55878SDavid Wu 
151749c55878SDavid Wu static struct rockchip_mux_route_data rk3399_mux_route_data[] = {
151849c55878SDavid Wu 	{
151949c55878SDavid Wu 		/* uart2dbga_rx */
152049c55878SDavid Wu 		.bank_num = 4,
152149c55878SDavid Wu 		.pin = 8,
152249c55878SDavid Wu 		.func = 2,
152349c55878SDavid Wu 		.route_offset = 0xe21c,
152449c55878SDavid Wu 		.route_val = BIT(16 + 10) | BIT(16 + 11),
152549c55878SDavid Wu 	}, {
152649c55878SDavid Wu 		/* uart2dbgb_rx */
152749c55878SDavid Wu 		.bank_num = 4,
152849c55878SDavid Wu 		.pin = 16,
152949c55878SDavid Wu 		.func = 2,
153049c55878SDavid Wu 		.route_offset = 0xe21c,
153149c55878SDavid Wu 		.route_val = BIT(16 + 10) | BIT(16 + 11) | BIT(10),
153249c55878SDavid Wu 	}, {
153349c55878SDavid Wu 		/* uart2dbgc_rx */
153449c55878SDavid Wu 		.bank_num = 4,
153549c55878SDavid Wu 		.pin = 19,
153649c55878SDavid Wu 		.func = 1,
153749c55878SDavid Wu 		.route_offset = 0xe21c,
153849c55878SDavid Wu 		.route_val = BIT(16 + 10) | BIT(16 + 11) | BIT(11),
153949c55878SDavid Wu 	}, {
154049c55878SDavid Wu 		/* pcie_clkreqn */
154149c55878SDavid Wu 		.bank_num = 2,
154249c55878SDavid Wu 		.pin = 26,
154349c55878SDavid Wu 		.func = 2,
154449c55878SDavid Wu 		.route_offset = 0xe21c,
154549c55878SDavid Wu 		.route_val = BIT(16 + 14),
154649c55878SDavid Wu 	}, {
154749c55878SDavid Wu 		/* pcie_clkreqnb */
154849c55878SDavid Wu 		.bank_num = 4,
154949c55878SDavid Wu 		.pin = 24,
155049c55878SDavid Wu 		.func = 1,
155149c55878SDavid Wu 		.route_offset = 0xe21c,
155249c55878SDavid Wu 		.route_val = BIT(16 + 14) | BIT(14),
155349c55878SDavid Wu 	},
155449c55878SDavid Wu };
155549c55878SDavid Wu 
155649e04eddSJianqun Xu static enum rockchip_pin_route_type
155749e04eddSJianqun Xu rockchip_get_mux_route(struct rockchip_pin_bank *bank, int pin,
155849c55878SDavid Wu 		       int mux, u32 *reg, u32 *value)
155949c55878SDavid Wu {
156049c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
156149c55878SDavid Wu 	struct rockchip_pin_ctrl *ctrl = priv->ctrl;
156249c55878SDavid Wu 	struct rockchip_mux_route_data *data;
156349c55878SDavid Wu 	int i;
156449c55878SDavid Wu 
156549c55878SDavid Wu 	for (i = 0; i < ctrl->niomux_routes; i++) {
156649c55878SDavid Wu 		data = &ctrl->iomux_routes[i];
156749c55878SDavid Wu 		if ((data->bank_num == bank->bank_num) &&
156849c55878SDavid Wu 		    (data->pin == pin) && (data->func == mux))
156949c55878SDavid Wu 			break;
157049c55878SDavid Wu 	}
157149c55878SDavid Wu 
157249c55878SDavid Wu 	if (i >= ctrl->niomux_routes)
157349e04eddSJianqun Xu 		return ROUTE_TYPE_INVALID;
157449c55878SDavid Wu 
157549c55878SDavid Wu 	*reg = data->route_offset;
157649c55878SDavid Wu 	*value = data->route_val;
157749c55878SDavid Wu 
157849e04eddSJianqun Xu 	return data->route_type;
157949c55878SDavid Wu }
158049c55878SDavid Wu 
158149c55878SDavid Wu static int rockchip_get_mux(struct rockchip_pin_bank *bank, int pin)
158249c55878SDavid Wu {
158349c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
158449c55878SDavid Wu 	int iomux_num = (pin / 8);
158549c55878SDavid Wu 	struct regmap *regmap;
158649c55878SDavid Wu 	unsigned int val;
158749c55878SDavid Wu 	int reg, ret, mask, mux_type;
158849c55878SDavid Wu 	u8 bit;
158949c55878SDavid Wu 
159049c55878SDavid Wu 	if (iomux_num > 3)
159149c55878SDavid Wu 		return -EINVAL;
159249c55878SDavid Wu 
159349c55878SDavid Wu 	if (bank->iomux[iomux_num].type & IOMUX_UNROUTED) {
159449c55878SDavid Wu 		debug("pin %d is unrouted\n", pin);
159549c55878SDavid Wu 		return -EINVAL;
159649c55878SDavid Wu 	}
159749c55878SDavid Wu 
159849c55878SDavid Wu 	if (bank->iomux[iomux_num].type & IOMUX_GPIO_ONLY)
159949c55878SDavid Wu 		return RK_FUNC_GPIO;
160049c55878SDavid Wu 
1601cf04a17bSJianqun Xu 	if (bank->iomux[iomux_num].type & IOMUX_SOURCE_PMU)
1602cf04a17bSJianqun Xu 		regmap = priv->regmap_pmu;
1603cf04a17bSJianqun Xu 	else if (bank->iomux[iomux_num].type & IOMUX_L_SOURCE_PMU)
1604cf04a17bSJianqun Xu 		regmap = (pin % 8 < 4) ? priv->regmap_pmu : priv->regmap_base;
1605cf04a17bSJianqun Xu 	else
1606cf04a17bSJianqun Xu 		regmap = priv->regmap_base;
160749c55878SDavid Wu 
160849c55878SDavid Wu 	/* get basic quadrupel of mux registers and the correct reg inside */
160949c55878SDavid Wu 	mux_type = bank->iomux[iomux_num].type;
161049c55878SDavid Wu 	reg = bank->iomux[iomux_num].offset;
161149c55878SDavid Wu 	if (mux_type & IOMUX_WIDTH_4BIT) {
161249c55878SDavid Wu 		if ((pin % 8) >= 4)
161349c55878SDavid Wu 			reg += 0x4;
161449c55878SDavid Wu 		bit = (pin % 4) * 4;
161549c55878SDavid Wu 		mask = 0xf;
161649c55878SDavid Wu 	} else if (mux_type & IOMUX_WIDTH_3BIT) {
161749c55878SDavid Wu 		if ((pin % 8) >= 5)
161849c55878SDavid Wu 			reg += 0x4;
161949c55878SDavid Wu 		bit = (pin % 8 % 5) * 3;
162049c55878SDavid Wu 		mask = 0x7;
162149c55878SDavid Wu 	} else {
162249c55878SDavid Wu 		bit = (pin % 8) * 2;
162349c55878SDavid Wu 		mask = 0x3;
162449c55878SDavid Wu 	}
162549c55878SDavid Wu 
162649c55878SDavid Wu 	if (bank->recalced_mask & BIT(pin))
162749c55878SDavid Wu 		rockchip_get_recalced_mux(bank, pin, &reg, &bit, &mask);
162849c55878SDavid Wu 
162949c55878SDavid Wu 	ret = regmap_read(regmap, reg, &val);
163049c55878SDavid Wu 	if (ret)
163149c55878SDavid Wu 		return ret;
163249c55878SDavid Wu 
163349c55878SDavid Wu 	return ((val >> bit) & mask);
163449c55878SDavid Wu }
163549c55878SDavid Wu 
163649c55878SDavid Wu static int rockchip_pinctrl_get_gpio_mux(struct udevice *dev, int banknum,
163749c55878SDavid Wu 					 int index)
163849c55878SDavid Wu {	struct rockchip_pinctrl_priv *priv = dev_get_priv(dev);
163949c55878SDavid Wu 	struct rockchip_pin_ctrl *ctrl = priv->ctrl;
164049c55878SDavid Wu 
164149c55878SDavid Wu 	return rockchip_get_mux(&ctrl->pin_banks[banknum], index);
164249c55878SDavid Wu }
164349c55878SDavid Wu 
164449c55878SDavid Wu static int rockchip_verify_mux(struct rockchip_pin_bank *bank,
164549c55878SDavid Wu 			       int pin, int mux)
164649c55878SDavid Wu {
164749c55878SDavid Wu 	int iomux_num = (pin / 8);
164849c55878SDavid Wu 
164949c55878SDavid Wu 	if (iomux_num > 3)
165049c55878SDavid Wu 		return -EINVAL;
165149c55878SDavid Wu 
165249c55878SDavid Wu 	if (bank->iomux[iomux_num].type & IOMUX_UNROUTED) {
165349c55878SDavid Wu 		debug("pin %d is unrouted\n", pin);
165449c55878SDavid Wu 		return -EINVAL;
165549c55878SDavid Wu 	}
165649c55878SDavid Wu 
165749c55878SDavid Wu 	if (bank->iomux[iomux_num].type & IOMUX_GPIO_ONLY) {
165849c55878SDavid Wu 		if (mux != IOMUX_GPIO_ONLY) {
165949c55878SDavid Wu 			debug("pin %d only supports a gpio mux\n", pin);
166049c55878SDavid Wu 			return -ENOTSUPP;
166149c55878SDavid Wu 		}
166249c55878SDavid Wu 	}
166349c55878SDavid Wu 
166449c55878SDavid Wu 	return 0;
166549c55878SDavid Wu }
166649c55878SDavid Wu 
166749c55878SDavid Wu /*
166849c55878SDavid Wu  * Set a new mux function for a pin.
166949c55878SDavid Wu  *
167049c55878SDavid Wu  * The register is divided into the upper and lower 16 bit. When changing
167149c55878SDavid Wu  * a value, the previous register value is not read and changed. Instead
167249c55878SDavid Wu  * it seems the changed bits are marked in the upper 16 bit, while the
167349c55878SDavid Wu  * changed value gets set in the same offset in the lower 16 bit.
167449c55878SDavid Wu  * All pin settings seem to be 2 bit wide in both the upper and lower
167549c55878SDavid Wu  * parts.
167649c55878SDavid Wu  * @bank: pin bank to change
167749c55878SDavid Wu  * @pin: pin to change
167849c55878SDavid Wu  * @mux: new mux function to set
167949c55878SDavid Wu  */
168049c55878SDavid Wu static int rockchip_set_mux(struct rockchip_pin_bank *bank, int pin, int mux)
168149c55878SDavid Wu {
168249c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
168349c55878SDavid Wu 	int iomux_num = (pin / 8);
168449c55878SDavid Wu 	struct regmap *regmap;
168549c55878SDavid Wu 	int reg, ret, mask, mux_type;
168649c55878SDavid Wu 	u8 bit;
168749e04eddSJianqun Xu 	u32 data;
168849c55878SDavid Wu 
168949c55878SDavid Wu 	ret = rockchip_verify_mux(bank, pin, mux);
169049c55878SDavid Wu 	if (ret < 0)
169149c55878SDavid Wu 		return ret;
169249c55878SDavid Wu 
169349c55878SDavid Wu 	if (bank->iomux[iomux_num].type & IOMUX_GPIO_ONLY)
169449c55878SDavid Wu 		return 0;
169549c55878SDavid Wu 
169649c55878SDavid Wu 	debug("setting mux of GPIO%d-%d to %d\n", bank->bank_num, pin, mux);
169749c55878SDavid Wu 
1698cf04a17bSJianqun Xu 	if (bank->iomux[iomux_num].type & IOMUX_SOURCE_PMU)
1699cf04a17bSJianqun Xu 		regmap = priv->regmap_pmu;
1700cf04a17bSJianqun Xu 	else if (bank->iomux[iomux_num].type & IOMUX_L_SOURCE_PMU)
1701cf04a17bSJianqun Xu 		regmap = (pin % 8 < 4) ? priv->regmap_pmu : priv->regmap_base;
1702cf04a17bSJianqun Xu 	else
1703cf04a17bSJianqun Xu 		regmap = priv->regmap_base;
170449c55878SDavid Wu 
170549c55878SDavid Wu 	/* get basic quadrupel of mux registers and the correct reg inside */
170649c55878SDavid Wu 	mux_type = bank->iomux[iomux_num].type;
170749c55878SDavid Wu 	reg = bank->iomux[iomux_num].offset;
170849c55878SDavid Wu 	if (mux_type & IOMUX_WIDTH_4BIT) {
170949c55878SDavid Wu 		if ((pin % 8) >= 4)
171049c55878SDavid Wu 			reg += 0x4;
171149c55878SDavid Wu 		bit = (pin % 4) * 4;
171249c55878SDavid Wu 		mask = 0xf;
171349c55878SDavid Wu 	} else if (mux_type & IOMUX_WIDTH_3BIT) {
171449c55878SDavid Wu 		if ((pin % 8) >= 5)
171549c55878SDavid Wu 			reg += 0x4;
171649c55878SDavid Wu 		bit = (pin % 8 % 5) * 3;
171749c55878SDavid Wu 		mask = 0x7;
171849c55878SDavid Wu 	} else {
171949c55878SDavid Wu 		bit = (pin % 8) * 2;
172049c55878SDavid Wu 		mask = 0x3;
172149c55878SDavid Wu 	}
172249c55878SDavid Wu 
172349c55878SDavid Wu 	if (bank->recalced_mask & BIT(pin))
172449c55878SDavid Wu 		rockchip_get_recalced_mux(bank, pin, &reg, &bit, &mask);
172549c55878SDavid Wu 
172649c55878SDavid Wu 	if (bank->route_mask & BIT(pin)) {
172749e04eddSJianqun Xu 		u32 route_reg = 0, route_val = 0;
172849e04eddSJianqun Xu 
172949e04eddSJianqun Xu 		ret = rockchip_get_mux_route(bank, pin, mux,
173049e04eddSJianqun Xu 					     &route_reg, &route_val);
173149e04eddSJianqun Xu 		switch (ret) {
173249e04eddSJianqun Xu 		case ROUTE_TYPE_DEFAULT:
173349e04eddSJianqun Xu 			regmap_write(regmap, route_reg, route_val);
173449e04eddSJianqun Xu 			break;
173549e04eddSJianqun Xu 		case ROUTE_TYPE_TOPGRF:
173649e04eddSJianqun Xu 			regmap_write(priv->regmap_base, route_reg, route_val);
173749e04eddSJianqun Xu 			break;
173849e04eddSJianqun Xu 		case ROUTE_TYPE_PMUGRF:
173949e04eddSJianqun Xu 			regmap_write(priv->regmap_pmu, route_reg, route_val);
174049e04eddSJianqun Xu 			break;
174149e04eddSJianqun Xu 		case ROUTE_TYPE_INVALID: /* Fall through */
174249e04eddSJianqun Xu 		default:
174349e04eddSJianqun Xu 			break;
174449c55878SDavid Wu 		}
174549c55878SDavid Wu 	}
174649c55878SDavid Wu 
17474bafc2daSDavid Wu 	if (mux_type & IOMUX_WRITABLE_32BIT) {
17488bf1bc66SDavid Wu 		regmap_read(regmap, reg, &data);
17494bafc2daSDavid Wu 		data &= ~(mask << bit);
17504bafc2daSDavid Wu 	} else {
175149c55878SDavid Wu 		data = (mask << (bit + 16));
17524bafc2daSDavid Wu 	}
17538bf1bc66SDavid Wu 
175449c55878SDavid Wu 	data |= (mux & mask) << bit;
175549c55878SDavid Wu 	ret = regmap_write(regmap, reg, data);
175649c55878SDavid Wu 
175749c55878SDavid Wu 	return ret;
175849c55878SDavid Wu }
175949c55878SDavid Wu 
176049c55878SDavid Wu #define PX30_PULL_PMU_OFFSET		0x10
176149c55878SDavid Wu #define PX30_PULL_GRF_OFFSET		0x60
176249c55878SDavid Wu #define PX30_PULL_BITS_PER_PIN		2
176349c55878SDavid Wu #define PX30_PULL_PINS_PER_REG		8
176449c55878SDavid Wu #define PX30_PULL_BANK_STRIDE		16
176549c55878SDavid Wu 
176649c55878SDavid Wu static void px30_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
176749c55878SDavid Wu 				       int pin_num, struct regmap **regmap,
176849c55878SDavid Wu 				       int *reg, u8 *bit)
176949c55878SDavid Wu {
177049c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
177149c55878SDavid Wu 
177249c55878SDavid Wu 	/* The first 32 pins of the first bank are located in PMU */
177349c55878SDavid Wu 	if (bank->bank_num == 0) {
177449c55878SDavid Wu 		*regmap = priv->regmap_pmu;
177549c55878SDavid Wu 		*reg = PX30_PULL_PMU_OFFSET;
177649c55878SDavid Wu 	} else {
177749c55878SDavid Wu 		*regmap = priv->regmap_base;
177849c55878SDavid Wu 		*reg = PX30_PULL_GRF_OFFSET;
177949c55878SDavid Wu 
178049c55878SDavid Wu 		/* correct the offset, as we're starting with the 2nd bank */
178149c55878SDavid Wu 		*reg -= 0x10;
178249c55878SDavid Wu 		*reg += bank->bank_num * PX30_PULL_BANK_STRIDE;
178349c55878SDavid Wu 	}
178449c55878SDavid Wu 
178549c55878SDavid Wu 	*reg += ((pin_num / PX30_PULL_PINS_PER_REG) * 4);
178649c55878SDavid Wu 	*bit = (pin_num % PX30_PULL_PINS_PER_REG);
178749c55878SDavid Wu 	*bit *= PX30_PULL_BITS_PER_PIN;
178849c55878SDavid Wu }
178949c55878SDavid Wu 
179049c55878SDavid Wu #define PX30_DRV_PMU_OFFSET		0x20
179149c55878SDavid Wu #define PX30_DRV_GRF_OFFSET		0xf0
179249c55878SDavid Wu #define PX30_DRV_BITS_PER_PIN		2
179349c55878SDavid Wu #define PX30_DRV_PINS_PER_REG		8
179449c55878SDavid Wu #define PX30_DRV_BANK_STRIDE		16
179549c55878SDavid Wu 
179649c55878SDavid Wu static void px30_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
179749c55878SDavid Wu 				      int pin_num, struct regmap **regmap,
179849c55878SDavid Wu 				      int *reg, u8 *bit)
179949c55878SDavid Wu {
180049c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
180149c55878SDavid Wu 
180249c55878SDavid Wu 	/* The first 32 pins of the first bank are located in PMU */
180349c55878SDavid Wu 	if (bank->bank_num == 0) {
180449c55878SDavid Wu 		*regmap = priv->regmap_pmu;
180549c55878SDavid Wu 		*reg = PX30_DRV_PMU_OFFSET;
180649c55878SDavid Wu 	} else {
180749c55878SDavid Wu 		*regmap = priv->regmap_base;
180849c55878SDavid Wu 		*reg = PX30_DRV_GRF_OFFSET;
180949c55878SDavid Wu 
181049c55878SDavid Wu 		/* correct the offset, as we're starting with the 2nd bank */
181149c55878SDavid Wu 		*reg -= 0x10;
181249c55878SDavid Wu 		*reg += bank->bank_num * PX30_DRV_BANK_STRIDE;
181349c55878SDavid Wu 	}
181449c55878SDavid Wu 
181549c55878SDavid Wu 	*reg += ((pin_num / PX30_DRV_PINS_PER_REG) * 4);
181649c55878SDavid Wu 	*bit = (pin_num % PX30_DRV_PINS_PER_REG);
181749c55878SDavid Wu 	*bit *= PX30_DRV_BITS_PER_PIN;
181849c55878SDavid Wu }
181949c55878SDavid Wu 
182049c55878SDavid Wu #define PX30_SCHMITT_PMU_OFFSET			0x38
182149c55878SDavid Wu #define PX30_SCHMITT_GRF_OFFSET			0xc0
182249c55878SDavid Wu #define PX30_SCHMITT_PINS_PER_PMU_REG		16
182349c55878SDavid Wu #define PX30_SCHMITT_BANK_STRIDE		16
182449c55878SDavid Wu #define PX30_SCHMITT_PINS_PER_GRF_REG		8
182549c55878SDavid Wu 
182649c55878SDavid Wu static int px30_calc_schmitt_reg_and_bit(struct rockchip_pin_bank *bank,
182749c55878SDavid Wu 					 int pin_num,
182849c55878SDavid Wu 					 struct regmap **regmap,
182949c55878SDavid Wu 					 int *reg, u8 *bit)
183049c55878SDavid Wu {
183149c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
183249c55878SDavid Wu 	int pins_per_reg;
183349c55878SDavid Wu 
183449c55878SDavid Wu 	if (bank->bank_num == 0) {
183549c55878SDavid Wu 		*regmap = priv->regmap_pmu;
183649c55878SDavid Wu 		*reg = PX30_SCHMITT_PMU_OFFSET;
183749c55878SDavid Wu 		pins_per_reg = PX30_SCHMITT_PINS_PER_PMU_REG;
183849c55878SDavid Wu 	} else {
183949c55878SDavid Wu 		*regmap = priv->regmap_base;
184049c55878SDavid Wu 		*reg = PX30_SCHMITT_GRF_OFFSET;
184149c55878SDavid Wu 		pins_per_reg = PX30_SCHMITT_PINS_PER_GRF_REG;
184249c55878SDavid Wu 		*reg += (bank->bank_num - 1) * PX30_SCHMITT_BANK_STRIDE;
184349c55878SDavid Wu 	}
184449c55878SDavid Wu 	*reg += ((pin_num / pins_per_reg) * 4);
184549c55878SDavid Wu 	*bit = pin_num % pins_per_reg;
184649c55878SDavid Wu 
184749c55878SDavid Wu 	return 0;
184849c55878SDavid Wu }
184949c55878SDavid Wu 
185049c55878SDavid Wu #define RV1108_PULL_PMU_OFFSET		0x10
185149c55878SDavid Wu #define RV1108_PULL_OFFSET		0x110
185249c55878SDavid Wu #define RV1108_PULL_PINS_PER_REG	8
185349c55878SDavid Wu #define RV1108_PULL_BITS_PER_PIN	2
185449c55878SDavid Wu #define RV1108_PULL_BANK_STRIDE		16
185549c55878SDavid Wu 
185649c55878SDavid Wu static void rv1108_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
185749c55878SDavid Wu 					 int pin_num, struct regmap **regmap,
185849c55878SDavid Wu 					 int *reg, u8 *bit)
185949c55878SDavid Wu {
186049c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
186149c55878SDavid Wu 
186249c55878SDavid Wu 	/* The first 24 pins of the first bank are located in PMU */
186349c55878SDavid Wu 	if (bank->bank_num == 0) {
186449c55878SDavid Wu 		*regmap = priv->regmap_pmu;
186549c55878SDavid Wu 		*reg = RV1108_PULL_PMU_OFFSET;
186649c55878SDavid Wu 	} else {
186749c55878SDavid Wu 		*reg = RV1108_PULL_OFFSET;
186849c55878SDavid Wu 		*regmap = priv->regmap_base;
186949c55878SDavid Wu 		/* correct the offset, as we're starting with the 2nd bank */
187049c55878SDavid Wu 		*reg -= 0x10;
187149c55878SDavid Wu 		*reg += bank->bank_num * RV1108_PULL_BANK_STRIDE;
187249c55878SDavid Wu 	}
187349c55878SDavid Wu 
187449c55878SDavid Wu 	*reg += ((pin_num / RV1108_PULL_PINS_PER_REG) * 4);
187549c55878SDavid Wu 	*bit = (pin_num % RV1108_PULL_PINS_PER_REG);
187649c55878SDavid Wu 	*bit *= RV1108_PULL_BITS_PER_PIN;
187749c55878SDavid Wu }
187849c55878SDavid Wu 
187949c55878SDavid Wu #define RV1108_DRV_PMU_OFFSET		0x20
188049c55878SDavid Wu #define RV1108_DRV_GRF_OFFSET		0x210
188149c55878SDavid Wu #define RV1108_DRV_BITS_PER_PIN		2
188249c55878SDavid Wu #define RV1108_DRV_PINS_PER_REG		8
188349c55878SDavid Wu #define RV1108_DRV_BANK_STRIDE		16
188449c55878SDavid Wu 
188549c55878SDavid Wu static void rv1108_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
188649c55878SDavid Wu 					int pin_num, struct regmap **regmap,
188749c55878SDavid Wu 					int *reg, u8 *bit)
188849c55878SDavid Wu {
188949c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
189049c55878SDavid Wu 
189149c55878SDavid Wu 	/* The first 24 pins of the first bank are located in PMU */
189249c55878SDavid Wu 	if (bank->bank_num == 0) {
189349c55878SDavid Wu 		*regmap = priv->regmap_pmu;
189449c55878SDavid Wu 		*reg = RV1108_DRV_PMU_OFFSET;
189549c55878SDavid Wu 	} else {
189649c55878SDavid Wu 		*regmap = priv->regmap_base;
189749c55878SDavid Wu 		*reg = RV1108_DRV_GRF_OFFSET;
189849c55878SDavid Wu 
189949c55878SDavid Wu 		/* correct the offset, as we're starting with the 2nd bank */
190049c55878SDavid Wu 		*reg -= 0x10;
190149c55878SDavid Wu 		*reg += bank->bank_num * RV1108_DRV_BANK_STRIDE;
190249c55878SDavid Wu 	}
190349c55878SDavid Wu 
190449c55878SDavid Wu 	*reg += ((pin_num / RV1108_DRV_PINS_PER_REG) * 4);
190549c55878SDavid Wu 	*bit = pin_num % RV1108_DRV_PINS_PER_REG;
190649c55878SDavid Wu 	*bit *= RV1108_DRV_BITS_PER_PIN;
190749c55878SDavid Wu }
190849c55878SDavid Wu 
190949c55878SDavid Wu #define RV1108_SCHMITT_PMU_OFFSET		0x30
191049c55878SDavid Wu #define RV1108_SCHMITT_GRF_OFFSET		0x388
191149c55878SDavid Wu #define RV1108_SCHMITT_BANK_STRIDE		8
191249c55878SDavid Wu #define RV1108_SCHMITT_PINS_PER_GRF_REG		16
191349c55878SDavid Wu #define RV1108_SCHMITT_PINS_PER_PMU_REG		8
191449c55878SDavid Wu 
191549c55878SDavid Wu static int rv1108_calc_schmitt_reg_and_bit(struct rockchip_pin_bank *bank,
191649c55878SDavid Wu 					   int pin_num,
191749c55878SDavid Wu 					   struct regmap **regmap,
191849c55878SDavid Wu 					   int *reg, u8 *bit)
191949c55878SDavid Wu {
192049c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
192149c55878SDavid Wu 	int pins_per_reg;
192249c55878SDavid Wu 
192349c55878SDavid Wu 	if (bank->bank_num == 0) {
192449c55878SDavid Wu 		*regmap = priv->regmap_pmu;
192549c55878SDavid Wu 		*reg = RV1108_SCHMITT_PMU_OFFSET;
192649c55878SDavid Wu 		pins_per_reg = RV1108_SCHMITT_PINS_PER_PMU_REG;
192749c55878SDavid Wu 	} else {
192849c55878SDavid Wu 		*regmap = priv->regmap_base;
192949c55878SDavid Wu 		*reg = RV1108_SCHMITT_GRF_OFFSET;
193049c55878SDavid Wu 		pins_per_reg = RV1108_SCHMITT_PINS_PER_GRF_REG;
193149c55878SDavid Wu 		*reg += (bank->bank_num  - 1) * RV1108_SCHMITT_BANK_STRIDE;
193249c55878SDavid Wu 	}
193349c55878SDavid Wu 	*reg += ((pin_num / pins_per_reg) * 4);
193449c55878SDavid Wu 	*bit = pin_num % pins_per_reg;
193549c55878SDavid Wu 
193649c55878SDavid Wu 	return 0;
193749c55878SDavid Wu }
193849c55878SDavid Wu 
1939cf04a17bSJianqun Xu #define RV1126_PULL_PMU_OFFSET		0x40
1940cf04a17bSJianqun Xu #define RV1126_PULL_GRF_GPIO1A0_OFFSET		0x10108
1941cf04a17bSJianqun Xu #define RV1126_PULL_PINS_PER_REG	8
1942cf04a17bSJianqun Xu #define RV1126_PULL_BITS_PER_PIN	2
1943cf04a17bSJianqun Xu #define RV1126_PULL_BANK_STRIDE		16
1944cf04a17bSJianqun Xu #define RV1126_GPIO_C4_D7(p)	(p >= 20 && p <= 31) /* GPIO0_C4 ~ GPIO0_D7 */
1945cf04a17bSJianqun Xu 
1946cf04a17bSJianqun Xu static void rv1126_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
1947cf04a17bSJianqun Xu 					 int pin_num, struct regmap **regmap,
1948cf04a17bSJianqun Xu 					 int *reg, u8 *bit)
1949cf04a17bSJianqun Xu {
1950cf04a17bSJianqun Xu 	struct rockchip_pinctrl_priv *priv = bank->priv;
1951cf04a17bSJianqun Xu 
1952cf04a17bSJianqun Xu 	/* The first 24 pins of the first bank are located in PMU */
1953cf04a17bSJianqun Xu 	if (bank->bank_num == 0) {
1954cf04a17bSJianqun Xu 		if (RV1126_GPIO_C4_D7(pin_num)) {
1955cf04a17bSJianqun Xu 			*regmap = priv->regmap_base;
1956cf04a17bSJianqun Xu 			*reg = RV1126_PULL_GRF_GPIO1A0_OFFSET;
1957cf04a17bSJianqun Xu 			*reg -= (((31 - pin_num) / RV1126_PULL_PINS_PER_REG + 1) * 4);
1958cf04a17bSJianqun Xu 			*bit = pin_num % RV1126_PULL_PINS_PER_REG;
1959cf04a17bSJianqun Xu 			*bit *= RV1126_PULL_BITS_PER_PIN;
1960cf04a17bSJianqun Xu 			return;
1961cf04a17bSJianqun Xu 		}
1962cf04a17bSJianqun Xu 		*regmap = priv->regmap_pmu;
1963cf04a17bSJianqun Xu 		*reg = RV1126_PULL_PMU_OFFSET;
1964cf04a17bSJianqun Xu 	} else {
1965cf04a17bSJianqun Xu 		*reg = RV1126_PULL_GRF_GPIO1A0_OFFSET;
1966cf04a17bSJianqun Xu 		*regmap = priv->regmap_base;
1967d499d466SJianqun Xu 		*reg += (bank->bank_num - 1) * RV1126_PULL_BANK_STRIDE;
1968cf04a17bSJianqun Xu 	}
1969cf04a17bSJianqun Xu 
1970cf04a17bSJianqun Xu 	*reg += ((pin_num / RV1126_PULL_PINS_PER_REG) * 4);
1971cf04a17bSJianqun Xu 	*bit = (pin_num % RV1126_PULL_PINS_PER_REG);
1972cf04a17bSJianqun Xu 	*bit *= RV1126_PULL_BITS_PER_PIN;
1973cf04a17bSJianqun Xu }
1974cf04a17bSJianqun Xu 
1975cf04a17bSJianqun Xu #define RV1126_DRV_PMU_OFFSET		0x20
1976cf04a17bSJianqun Xu #define RV1126_DRV_GRF_GPIO1A0_OFFSET		0x10090
1977cf04a17bSJianqun Xu #define RV1126_DRV_BITS_PER_PIN		4
1978cf04a17bSJianqun Xu #define RV1126_DRV_PINS_PER_REG		4
1979cf04a17bSJianqun Xu #define RV1126_DRV_BANK_STRIDE		32
1980cf04a17bSJianqun Xu 
1981cf04a17bSJianqun Xu static void rv1126_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
1982cf04a17bSJianqun Xu 					int pin_num, struct regmap **regmap,
1983cf04a17bSJianqun Xu 					int *reg, u8 *bit)
1984cf04a17bSJianqun Xu {
1985cf04a17bSJianqun Xu 	struct rockchip_pinctrl_priv *priv = bank->priv;
1986cf04a17bSJianqun Xu 
1987cf04a17bSJianqun Xu 	/* The first 24 pins of the first bank are located in PMU */
1988cf04a17bSJianqun Xu 	if (bank->bank_num == 0) {
1989cf04a17bSJianqun Xu 		if (RV1126_GPIO_C4_D7(pin_num)) {
1990cf04a17bSJianqun Xu 			*regmap = priv->regmap_base;
1991cf04a17bSJianqun Xu 			*reg = RV1126_DRV_GRF_GPIO1A0_OFFSET;
1992cf04a17bSJianqun Xu 			*reg -= (((31 - pin_num) / RV1126_DRV_PINS_PER_REG + 1) * 4);
1993d499d466SJianqun Xu 			*reg -= 0x4;
1994cf04a17bSJianqun Xu 			*bit = pin_num % RV1126_DRV_PINS_PER_REG;
1995cf04a17bSJianqun Xu 			*bit *= RV1126_DRV_BITS_PER_PIN;
1996cf04a17bSJianqun Xu 			return;
1997cf04a17bSJianqun Xu 		}
1998cf04a17bSJianqun Xu 		*regmap = priv->regmap_pmu;
1999cf04a17bSJianqun Xu 		*reg = RV1126_DRV_PMU_OFFSET;
2000cf04a17bSJianqun Xu 	} else {
2001cf04a17bSJianqun Xu 		*regmap = priv->regmap_base;
2002cf04a17bSJianqun Xu 		*reg = RV1126_DRV_GRF_GPIO1A0_OFFSET;
2003d499d466SJianqun Xu 		*reg += (bank->bank_num - 1) * RV1126_DRV_BANK_STRIDE;
2004cf04a17bSJianqun Xu 	}
2005cf04a17bSJianqun Xu 
2006cf04a17bSJianqun Xu 	*reg += ((pin_num / RV1126_DRV_PINS_PER_REG) * 4);
2007cf04a17bSJianqun Xu 	*bit = pin_num % RV1126_DRV_PINS_PER_REG;
2008cf04a17bSJianqun Xu 	*bit *= RV1126_DRV_BITS_PER_PIN;
2009cf04a17bSJianqun Xu }
2010cf04a17bSJianqun Xu 
2011cf04a17bSJianqun Xu #define RV1126_SCHMITT_PMU_OFFSET		0x60
2012cf04a17bSJianqun Xu #define RV1126_SCHMITT_GRF_GPIO1A0_OFFSET		0x10188
2013cf04a17bSJianqun Xu #define RV1126_SCHMITT_BANK_STRIDE		16
2014cf04a17bSJianqun Xu #define RV1126_SCHMITT_PINS_PER_GRF_REG		8
2015cf04a17bSJianqun Xu #define RV1126_SCHMITT_PINS_PER_PMU_REG		8
2016cf04a17bSJianqun Xu 
2017cf04a17bSJianqun Xu static int rv1126_calc_schmitt_reg_and_bit(struct rockchip_pin_bank *bank,
2018cf04a17bSJianqun Xu 					   int pin_num,
2019cf04a17bSJianqun Xu 					   struct regmap **regmap,
2020cf04a17bSJianqun Xu 					   int *reg, u8 *bit)
2021cf04a17bSJianqun Xu {
2022cf04a17bSJianqun Xu 	struct rockchip_pinctrl_priv *priv = bank->priv;
2023cf04a17bSJianqun Xu 	int pins_per_reg;
2024cf04a17bSJianqun Xu 
2025cf04a17bSJianqun Xu 	if (bank->bank_num == 0) {
2026cf04a17bSJianqun Xu 		if (RV1126_GPIO_C4_D7(pin_num)) {
2027cf04a17bSJianqun Xu 			*regmap = priv->regmap_base;
2028cf04a17bSJianqun Xu 			*reg = RV1126_SCHMITT_GRF_GPIO1A0_OFFSET;
2029cf04a17bSJianqun Xu 			*reg -= (((31 - pin_num) / RV1126_SCHMITT_PINS_PER_GRF_REG + 1) * 4);
2030cf04a17bSJianqun Xu 			*bit = pin_num % RV1126_SCHMITT_PINS_PER_GRF_REG;
2031cf04a17bSJianqun Xu 			return 0;
2032cf04a17bSJianqun Xu 		}
2033cf04a17bSJianqun Xu 		*regmap = priv->regmap_pmu;
2034cf04a17bSJianqun Xu 		*reg = RV1126_SCHMITT_PMU_OFFSET;
2035cf04a17bSJianqun Xu 		pins_per_reg = RV1126_SCHMITT_PINS_PER_PMU_REG;
2036cf04a17bSJianqun Xu 	} else {
2037cf04a17bSJianqun Xu 		*regmap = priv->regmap_base;
2038cf04a17bSJianqun Xu 		*reg = RV1126_SCHMITT_GRF_GPIO1A0_OFFSET;
2039cf04a17bSJianqun Xu 		pins_per_reg = RV1126_SCHMITT_PINS_PER_GRF_REG;
2040d499d466SJianqun Xu 		*reg += (bank->bank_num - 1) * RV1126_SCHMITT_BANK_STRIDE;
2041cf04a17bSJianqun Xu 	}
2042cf04a17bSJianqun Xu 	*reg += ((pin_num / pins_per_reg) * 4);
2043cf04a17bSJianqun Xu 	*bit = pin_num % pins_per_reg;
2044cf04a17bSJianqun Xu 
2045cf04a17bSJianqun Xu 	return 0;
2046cf04a17bSJianqun Xu }
2047cf04a17bSJianqun Xu 
2048a2a3fc8fSJianqun Xu #define RK1808_PULL_PMU_OFFSET		0x10
2049a2a3fc8fSJianqun Xu #define RK1808_PULL_GRF_OFFSET		0x80
2050a2a3fc8fSJianqun Xu #define RK1808_PULL_PINS_PER_REG	8
2051a2a3fc8fSJianqun Xu #define RK1808_PULL_BITS_PER_PIN	2
2052a2a3fc8fSJianqun Xu #define RK1808_PULL_BANK_STRIDE		16
2053a2a3fc8fSJianqun Xu 
2054a2a3fc8fSJianqun Xu static void rk1808_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
2055a2a3fc8fSJianqun Xu 					 int pin_num,
2056a2a3fc8fSJianqun Xu 					 struct regmap **regmap,
2057a2a3fc8fSJianqun Xu 					 int *reg, u8 *bit)
2058a2a3fc8fSJianqun Xu {
2059a2a3fc8fSJianqun Xu 	struct rockchip_pinctrl_priv *priv = bank->priv;
2060a2a3fc8fSJianqun Xu 
2061a2a3fc8fSJianqun Xu 	if (bank->bank_num == 0) {
2062a2a3fc8fSJianqun Xu 		*regmap = priv->regmap_pmu;
2063a2a3fc8fSJianqun Xu 		*reg = RK1808_PULL_PMU_OFFSET;
2064a2a3fc8fSJianqun Xu 	} else {
2065a2a3fc8fSJianqun Xu 		*reg = RK1808_PULL_GRF_OFFSET;
2066a2a3fc8fSJianqun Xu 		*regmap = priv->regmap_base;
2067a2a3fc8fSJianqun Xu 	}
2068a2a3fc8fSJianqun Xu 
2069a2a3fc8fSJianqun Xu 	*reg += ((pin_num / RK1808_PULL_PINS_PER_REG) * 4);
2070a2a3fc8fSJianqun Xu 	*bit = (pin_num % RK1808_PULL_PINS_PER_REG);
2071a2a3fc8fSJianqun Xu 	*bit *= RK1808_PULL_BITS_PER_PIN;
2072a2a3fc8fSJianqun Xu }
2073a2a3fc8fSJianqun Xu 
2074a2a3fc8fSJianqun Xu #define RK1808_DRV_PMU_OFFSET		0x20
2075a2a3fc8fSJianqun Xu #define RK1808_DRV_GRF_OFFSET		0x140
2076a2a3fc8fSJianqun Xu #define RK1808_DRV_BITS_PER_PIN		2
2077a2a3fc8fSJianqun Xu #define RK1808_DRV_PINS_PER_REG		8
2078a2a3fc8fSJianqun Xu #define RK1808_DRV_BANK_STRIDE		16
2079a2a3fc8fSJianqun Xu 
2080a2a3fc8fSJianqun Xu static void rk1808_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
2081a2a3fc8fSJianqun Xu 					int pin_num,
2082a2a3fc8fSJianqun Xu 					struct regmap **regmap,
2083a2a3fc8fSJianqun Xu 					int *reg, u8 *bit)
2084a2a3fc8fSJianqun Xu {
2085a2a3fc8fSJianqun Xu 	struct rockchip_pinctrl_priv *priv = bank->priv;
2086a2a3fc8fSJianqun Xu 
2087a2a3fc8fSJianqun Xu 	if (bank->bank_num == 0) {
2088a2a3fc8fSJianqun Xu 		*regmap = priv->regmap_pmu;
2089a2a3fc8fSJianqun Xu 		*reg = RK1808_DRV_PMU_OFFSET;
2090a2a3fc8fSJianqun Xu 	} else {
2091a2a3fc8fSJianqun Xu 		*regmap = priv->regmap_base;
2092a2a3fc8fSJianqun Xu 		*reg = RK1808_DRV_GRF_OFFSET;
2093a2a3fc8fSJianqun Xu 	}
2094a2a3fc8fSJianqun Xu 
2095a2a3fc8fSJianqun Xu 	*reg += ((pin_num / RK1808_DRV_PINS_PER_REG) * 4);
2096a2a3fc8fSJianqun Xu 	*bit = pin_num % RK1808_DRV_PINS_PER_REG;
2097a2a3fc8fSJianqun Xu 	*bit *= RK1808_DRV_BITS_PER_PIN;
2098a2a3fc8fSJianqun Xu }
2099a2a3fc8fSJianqun Xu 
2100a2a3fc8fSJianqun Xu #define RK1808_SCHMITT_PMU_OFFSET		0x0040
2101a2a3fc8fSJianqun Xu #define RK1808_SCHMITT_GRF_OFFSET		0x0100
2102a2a3fc8fSJianqun Xu #define RK1808_SCHMITT_BANK_STRIDE		16
2103a2a3fc8fSJianqun Xu #define RK1808_SCHMITT_PINS_PER_REG		8
2104a2a3fc8fSJianqun Xu 
2105a2a3fc8fSJianqun Xu static int rk1808_calc_schmitt_reg_and_bit(struct rockchip_pin_bank *bank,
2106a2a3fc8fSJianqun Xu 					   int pin_num,
2107a2a3fc8fSJianqun Xu 					   struct regmap **regmap,
2108a2a3fc8fSJianqun Xu 					   int *reg, u8 *bit)
2109a2a3fc8fSJianqun Xu {
2110a2a3fc8fSJianqun Xu 	struct rockchip_pinctrl_priv *priv = bank->priv;
2111a2a3fc8fSJianqun Xu 
2112a2a3fc8fSJianqun Xu 	if (bank->bank_num == 0) {
2113a2a3fc8fSJianqun Xu 		*regmap = priv->regmap_pmu;
2114a2a3fc8fSJianqun Xu 		*reg = RK1808_SCHMITT_PMU_OFFSET;
2115a2a3fc8fSJianqun Xu 	} else {
2116a2a3fc8fSJianqun Xu 		*regmap = priv->regmap_base;
2117a2a3fc8fSJianqun Xu 		*reg = RK1808_SCHMITT_GRF_OFFSET;
2118a2a3fc8fSJianqun Xu 		*reg += (bank->bank_num  - 1) * RK1808_SCHMITT_BANK_STRIDE;
2119a2a3fc8fSJianqun Xu 	}
2120a2a3fc8fSJianqun Xu 	*reg += ((pin_num / RK1808_SCHMITT_PINS_PER_REG) * 4);
2121a2a3fc8fSJianqun Xu 	*bit = pin_num % RK1808_SCHMITT_PINS_PER_REG;
2122a2a3fc8fSJianqun Xu 
2123a2a3fc8fSJianqun Xu 	return 0;
2124a2a3fc8fSJianqun Xu }
2125a2a3fc8fSJianqun Xu 
212649c55878SDavid Wu #define RK2928_PULL_OFFSET		0x118
212749c55878SDavid Wu #define RK2928_PULL_PINS_PER_REG	16
212849c55878SDavid Wu #define RK2928_PULL_BANK_STRIDE		8
212949c55878SDavid Wu 
213049c55878SDavid Wu static void rk2928_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
213149c55878SDavid Wu 					 int pin_num, struct regmap **regmap,
213249c55878SDavid Wu 					 int *reg, u8 *bit)
213349c55878SDavid Wu {
213449c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
213549c55878SDavid Wu 
213649c55878SDavid Wu 	*regmap = priv->regmap_base;
213749c55878SDavid Wu 	*reg = RK2928_PULL_OFFSET;
213849c55878SDavid Wu 	*reg += bank->bank_num * RK2928_PULL_BANK_STRIDE;
213949c55878SDavid Wu 	*reg += (pin_num / RK2928_PULL_PINS_PER_REG) * 4;
214049c55878SDavid Wu 
214149c55878SDavid Wu 	*bit = pin_num % RK2928_PULL_PINS_PER_REG;
214249c55878SDavid Wu };
214349c55878SDavid Wu 
214449c55878SDavid Wu #define RK3128_PULL_OFFSET	0x118
214549c55878SDavid Wu 
214649c55878SDavid Wu static void rk3128_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
214749c55878SDavid Wu 					 int pin_num, struct regmap **regmap,
214849c55878SDavid Wu 					 int *reg, u8 *bit)
214949c55878SDavid Wu {
215049c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
215149c55878SDavid Wu 
215249c55878SDavid Wu 	*regmap = priv->regmap_base;
215349c55878SDavid Wu 	*reg = RK3128_PULL_OFFSET;
215449c55878SDavid Wu 	*reg += bank->bank_num * RK2928_PULL_BANK_STRIDE;
215549c55878SDavid Wu 	*reg += ((pin_num / RK2928_PULL_PINS_PER_REG) * 4);
215649c55878SDavid Wu 
215749c55878SDavid Wu 	*bit = pin_num % RK2928_PULL_PINS_PER_REG;
215849c55878SDavid Wu }
215949c55878SDavid Wu 
216049c55878SDavid Wu #define RK3188_PULL_OFFSET		0x164
216149c55878SDavid Wu #define RK3188_PULL_BITS_PER_PIN	2
216249c55878SDavid Wu #define RK3188_PULL_PINS_PER_REG	8
216349c55878SDavid Wu #define RK3188_PULL_BANK_STRIDE		16
216449c55878SDavid Wu #define RK3188_PULL_PMU_OFFSET		0x64
216549c55878SDavid Wu 
216649c55878SDavid Wu static void rk3188_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
216749c55878SDavid Wu 					 int pin_num, struct regmap **regmap,
216849c55878SDavid Wu 					 int *reg, u8 *bit)
216949c55878SDavid Wu {
217049c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
217149c55878SDavid Wu 
217249c55878SDavid Wu 	/* The first 12 pins of the first bank are located elsewhere */
217349c55878SDavid Wu 	if (bank->bank_num == 0 && pin_num < 12) {
217449c55878SDavid Wu 		*regmap = priv->regmap_pmu;
217549c55878SDavid Wu 		*reg = RK3188_PULL_PMU_OFFSET;
217649c55878SDavid Wu 
217749c55878SDavid Wu 		*reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4);
217849c55878SDavid Wu 		*bit = pin_num % RK3188_PULL_PINS_PER_REG;
217949c55878SDavid Wu 		*bit *= RK3188_PULL_BITS_PER_PIN;
218049c55878SDavid Wu 	} else {
218149c55878SDavid Wu 		*regmap = priv->regmap_base;
218249c55878SDavid Wu 		*reg = RK3188_PULL_OFFSET;
218349c55878SDavid Wu 
218449c55878SDavid Wu 		/* correct the offset, as it is the 2nd pull register */
218549c55878SDavid Wu 		*reg -= 4;
218649c55878SDavid Wu 		*reg += bank->bank_num * RK3188_PULL_BANK_STRIDE;
218749c55878SDavid Wu 		*reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4);
218849c55878SDavid Wu 
218949c55878SDavid Wu 		/*
219049c55878SDavid Wu 		 * The bits in these registers have an inverse ordering
219149c55878SDavid Wu 		 * with the lowest pin being in bits 15:14 and the highest
219249c55878SDavid Wu 		 * pin in bits 1:0
219349c55878SDavid Wu 		 */
219449c55878SDavid Wu 		*bit = 7 - (pin_num % RK3188_PULL_PINS_PER_REG);
219549c55878SDavid Wu 		*bit *= RK3188_PULL_BITS_PER_PIN;
219649c55878SDavid Wu 	}
219749c55878SDavid Wu }
219849c55878SDavid Wu 
219949c55878SDavid Wu #define RK3288_PULL_OFFSET		0x140
220049c55878SDavid Wu static void rk3288_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
220149c55878SDavid Wu 					 int pin_num, struct regmap **regmap,
220249c55878SDavid Wu 					 int *reg, u8 *bit)
220349c55878SDavid Wu {
220449c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
220549c55878SDavid Wu 
220649c55878SDavid Wu 	/* The first 24 pins of the first bank are located in PMU */
220749c55878SDavid Wu 	if (bank->bank_num == 0) {
220849c55878SDavid Wu 		*regmap = priv->regmap_pmu;
220949c55878SDavid Wu 		*reg = RK3188_PULL_PMU_OFFSET;
221049c55878SDavid Wu 
221149c55878SDavid Wu 		*reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4);
221249c55878SDavid Wu 		*bit = pin_num % RK3188_PULL_PINS_PER_REG;
221349c55878SDavid Wu 		*bit *= RK3188_PULL_BITS_PER_PIN;
221449c55878SDavid Wu 	} else {
221549c55878SDavid Wu 		*regmap = priv->regmap_base;
221649c55878SDavid Wu 		*reg = RK3288_PULL_OFFSET;
221749c55878SDavid Wu 
221849c55878SDavid Wu 		/* correct the offset, as we're starting with the 2nd bank */
221949c55878SDavid Wu 		*reg -= 0x10;
222049c55878SDavid Wu 		*reg += bank->bank_num * RK3188_PULL_BANK_STRIDE;
222149c55878SDavid Wu 		*reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4);
222249c55878SDavid Wu 
222349c55878SDavid Wu 		*bit = (pin_num % RK3188_PULL_PINS_PER_REG);
222449c55878SDavid Wu 		*bit *= RK3188_PULL_BITS_PER_PIN;
222549c55878SDavid Wu 	}
222649c55878SDavid Wu }
222749c55878SDavid Wu 
222849c55878SDavid Wu #define RK3288_DRV_PMU_OFFSET		0x70
222949c55878SDavid Wu #define RK3288_DRV_GRF_OFFSET		0x1c0
223049c55878SDavid Wu #define RK3288_DRV_BITS_PER_PIN		2
223149c55878SDavid Wu #define RK3288_DRV_PINS_PER_REG		8
223249c55878SDavid Wu #define RK3288_DRV_BANK_STRIDE		16
223349c55878SDavid Wu 
223449c55878SDavid Wu static void rk3288_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
223549c55878SDavid Wu 					int pin_num, struct regmap **regmap,
223649c55878SDavid Wu 					int *reg, u8 *bit)
223749c55878SDavid Wu {
223849c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
223949c55878SDavid Wu 
224049c55878SDavid Wu 	/* The first 24 pins of the first bank are located in PMU */
224149c55878SDavid Wu 	if (bank->bank_num == 0) {
224249c55878SDavid Wu 		*regmap = priv->regmap_pmu;
224349c55878SDavid Wu 		*reg = RK3288_DRV_PMU_OFFSET;
224449c55878SDavid Wu 
224549c55878SDavid Wu 		*reg += ((pin_num / RK3288_DRV_PINS_PER_REG) * 4);
224649c55878SDavid Wu 		*bit = pin_num % RK3288_DRV_PINS_PER_REG;
224749c55878SDavid Wu 		*bit *= RK3288_DRV_BITS_PER_PIN;
224849c55878SDavid Wu 	} else {
224949c55878SDavid Wu 		*regmap = priv->regmap_base;
225049c55878SDavid Wu 		*reg = RK3288_DRV_GRF_OFFSET;
225149c55878SDavid Wu 
225249c55878SDavid Wu 		/* correct the offset, as we're starting with the 2nd bank */
225349c55878SDavid Wu 		*reg -= 0x10;
225449c55878SDavid Wu 		*reg += bank->bank_num * RK3288_DRV_BANK_STRIDE;
225549c55878SDavid Wu 		*reg += ((pin_num / RK3288_DRV_PINS_PER_REG) * 4);
225649c55878SDavid Wu 
225749c55878SDavid Wu 		*bit = (pin_num % RK3288_DRV_PINS_PER_REG);
225849c55878SDavid Wu 		*bit *= RK3288_DRV_BITS_PER_PIN;
225949c55878SDavid Wu 	}
226049c55878SDavid Wu }
226149c55878SDavid Wu 
226249c55878SDavid Wu #define RK3228_PULL_OFFSET		0x100
226349c55878SDavid Wu 
226449c55878SDavid Wu static void rk3228_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
226549c55878SDavid Wu 					 int pin_num, struct regmap **regmap,
226649c55878SDavid Wu 					 int *reg, u8 *bit)
226749c55878SDavid Wu {
226849c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
226949c55878SDavid Wu 
227049c55878SDavid Wu 	*regmap = priv->regmap_base;
227149c55878SDavid Wu 	*reg = RK3228_PULL_OFFSET;
227249c55878SDavid Wu 	*reg += bank->bank_num * RK3188_PULL_BANK_STRIDE;
227349c55878SDavid Wu 	*reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4);
227449c55878SDavid Wu 
227549c55878SDavid Wu 	*bit = (pin_num % RK3188_PULL_PINS_PER_REG);
227649c55878SDavid Wu 	*bit *= RK3188_PULL_BITS_PER_PIN;
227749c55878SDavid Wu }
227849c55878SDavid Wu 
227949c55878SDavid Wu #define RK3228_DRV_GRF_OFFSET		0x200
228049c55878SDavid Wu 
228149c55878SDavid Wu static void rk3228_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
228249c55878SDavid Wu 					int pin_num, struct regmap **regmap,
228349c55878SDavid Wu 					int *reg, u8 *bit)
228449c55878SDavid Wu {
228549c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
228649c55878SDavid Wu 
228749c55878SDavid Wu 	*regmap = priv->regmap_base;
228849c55878SDavid Wu 	*reg = RK3228_DRV_GRF_OFFSET;
228949c55878SDavid Wu 	*reg += bank->bank_num * RK3288_DRV_BANK_STRIDE;
229049c55878SDavid Wu 	*reg += ((pin_num / RK3288_DRV_PINS_PER_REG) * 4);
229149c55878SDavid Wu 
229249c55878SDavid Wu 	*bit = (pin_num % RK3288_DRV_PINS_PER_REG);
229349c55878SDavid Wu 	*bit *= RK3288_DRV_BITS_PER_PIN;
229449c55878SDavid Wu }
229549c55878SDavid Wu 
2296b3077611SDavid Wu #define RK3308_PULL_OFFSET		0xa0
2297b3077611SDavid Wu 
2298b3077611SDavid Wu static void rk3308_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
2299b3077611SDavid Wu 					 int pin_num, struct regmap **regmap,
2300b3077611SDavid Wu 					 int *reg, u8 *bit)
2301b3077611SDavid Wu {
2302b3077611SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
2303b3077611SDavid Wu 
2304b3077611SDavid Wu 	*regmap = priv->regmap_base;
2305b3077611SDavid Wu 	*reg = RK3308_PULL_OFFSET;
2306b3077611SDavid Wu 	*reg += bank->bank_num * RK3188_PULL_BANK_STRIDE;
2307b3077611SDavid Wu 	*reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4);
2308b3077611SDavid Wu 
2309b3077611SDavid Wu 	*bit = (pin_num % RK3188_PULL_PINS_PER_REG);
2310b3077611SDavid Wu 	*bit *= RK3188_PULL_BITS_PER_PIN;
2311b3077611SDavid Wu }
2312b3077611SDavid Wu 
2313b3077611SDavid Wu #define RK3308_DRV_GRF_OFFSET		0x100
2314b3077611SDavid Wu 
2315b3077611SDavid Wu static void rk3308_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
2316b3077611SDavid Wu 					int pin_num, struct regmap **regmap,
2317b3077611SDavid Wu 					int *reg, u8 *bit)
2318b3077611SDavid Wu {
2319b3077611SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
2320b3077611SDavid Wu 
2321b3077611SDavid Wu 	*regmap = priv->regmap_base;
2322b3077611SDavid Wu 	*reg = RK3308_DRV_GRF_OFFSET;
2323b3077611SDavid Wu 	*reg += bank->bank_num * RK3288_DRV_BANK_STRIDE;
2324b3077611SDavid Wu 	*reg += ((pin_num / RK3288_DRV_PINS_PER_REG) * 4);
2325b3077611SDavid Wu 
2326b3077611SDavid Wu 	*bit = (pin_num % RK3288_DRV_PINS_PER_REG);
2327b3077611SDavid Wu 	*bit *= RK3288_DRV_BITS_PER_PIN;
2328b3077611SDavid Wu }
2329b3077611SDavid Wu 
2330b3077611SDavid Wu #define RK3308_SCHMITT_PINS_PER_REG	8
2331b3077611SDavid Wu #define RK3308_SCHMITT_BANK_STRIDE	16
2332b3077611SDavid Wu #define RK3308_SCHMITT_GRF_OFFSET	0x1a0
2333b3077611SDavid Wu 
2334b3077611SDavid Wu static int rk3308_calc_schmitt_reg_and_bit(struct rockchip_pin_bank *bank,
2335b3077611SDavid Wu 					   int pin_num,
2336b3077611SDavid Wu 					   struct regmap **regmap,
2337b3077611SDavid Wu 					   int *reg, u8 *bit)
2338b3077611SDavid Wu {
2339b3077611SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
2340b3077611SDavid Wu 
2341b3077611SDavid Wu 	*regmap = priv->regmap_base;
2342b3077611SDavid Wu 	*reg = RK3308_SCHMITT_GRF_OFFSET;
2343b3077611SDavid Wu 
2344b3077611SDavid Wu 	*reg += bank->bank_num * RK3308_SCHMITT_BANK_STRIDE;
2345b3077611SDavid Wu 	*reg += ((pin_num / RK3308_SCHMITT_PINS_PER_REG) * 4);
2346b3077611SDavid Wu 	*bit = pin_num % RK3308_SCHMITT_PINS_PER_REG;
2347b3077611SDavid Wu 
2348b3077611SDavid Wu 	return 0;
2349b3077611SDavid Wu }
2350b3077611SDavid Wu 
235149c55878SDavid Wu #define RK3368_PULL_GRF_OFFSET		0x100
235249c55878SDavid Wu #define RK3368_PULL_PMU_OFFSET		0x10
235349c55878SDavid Wu 
235449c55878SDavid Wu static void rk3368_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
235549c55878SDavid Wu 					 int pin_num, struct regmap **regmap,
235649c55878SDavid Wu 					 int *reg, u8 *bit)
235749c55878SDavid Wu {
235849c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
235949c55878SDavid Wu 
236049c55878SDavid Wu 	/* The first 32 pins of the first bank are located in PMU */
236149c55878SDavid Wu 	if (bank->bank_num == 0) {
236249c55878SDavid Wu 		*regmap = priv->regmap_pmu;
236349c55878SDavid Wu 		*reg = RK3368_PULL_PMU_OFFSET;
236449c55878SDavid Wu 
236549c55878SDavid Wu 		*reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4);
236649c55878SDavid Wu 		*bit = pin_num % RK3188_PULL_PINS_PER_REG;
236749c55878SDavid Wu 		*bit *= RK3188_PULL_BITS_PER_PIN;
236849c55878SDavid Wu 	} else {
236949c55878SDavid Wu 		*regmap = priv->regmap_base;
237049c55878SDavid Wu 		*reg = RK3368_PULL_GRF_OFFSET;
237149c55878SDavid Wu 
237249c55878SDavid Wu 		/* correct the offset, as we're starting with the 2nd bank */
237349c55878SDavid Wu 		*reg -= 0x10;
237449c55878SDavid Wu 		*reg += bank->bank_num * RK3188_PULL_BANK_STRIDE;
237549c55878SDavid Wu 		*reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4);
237649c55878SDavid Wu 
237749c55878SDavid Wu 		*bit = (pin_num % RK3188_PULL_PINS_PER_REG);
237849c55878SDavid Wu 		*bit *= RK3188_PULL_BITS_PER_PIN;
237949c55878SDavid Wu 	}
238049c55878SDavid Wu }
238149c55878SDavid Wu 
238249c55878SDavid Wu #define RK3368_DRV_PMU_OFFSET		0x20
238349c55878SDavid Wu #define RK3368_DRV_GRF_OFFSET		0x200
238449c55878SDavid Wu 
238549c55878SDavid Wu static void rk3368_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
238649c55878SDavid Wu 					int pin_num, struct regmap **regmap,
238749c55878SDavid Wu 					int *reg, u8 *bit)
238849c55878SDavid Wu {
238949c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
239049c55878SDavid Wu 
239149c55878SDavid Wu 	/* The first 32 pins of the first bank are located in PMU */
239249c55878SDavid Wu 	if (bank->bank_num == 0) {
239349c55878SDavid Wu 		*regmap = priv->regmap_pmu;
239449c55878SDavid Wu 		*reg = RK3368_DRV_PMU_OFFSET;
239549c55878SDavid Wu 
239649c55878SDavid Wu 		*reg += ((pin_num / RK3288_DRV_PINS_PER_REG) * 4);
239749c55878SDavid Wu 		*bit = pin_num % RK3288_DRV_PINS_PER_REG;
239849c55878SDavid Wu 		*bit *= RK3288_DRV_BITS_PER_PIN;
239949c55878SDavid Wu 	} else {
240049c55878SDavid Wu 		*regmap = priv->regmap_base;
240149c55878SDavid Wu 		*reg = RK3368_DRV_GRF_OFFSET;
240249c55878SDavid Wu 
240349c55878SDavid Wu 		/* correct the offset, as we're starting with the 2nd bank */
240449c55878SDavid Wu 		*reg -= 0x10;
240549c55878SDavid Wu 		*reg += bank->bank_num * RK3288_DRV_BANK_STRIDE;
240649c55878SDavid Wu 		*reg += ((pin_num / RK3288_DRV_PINS_PER_REG) * 4);
240749c55878SDavid Wu 
240849c55878SDavid Wu 		*bit = (pin_num % RK3288_DRV_PINS_PER_REG);
240949c55878SDavid Wu 		*bit *= RK3288_DRV_BITS_PER_PIN;
241049c55878SDavid Wu 	}
241149c55878SDavid Wu }
241249c55878SDavid Wu 
241349c55878SDavid Wu #define RK3399_PULL_GRF_OFFSET		0xe040
241449c55878SDavid Wu #define RK3399_PULL_PMU_OFFSET		0x40
241549c55878SDavid Wu #define RK3399_DRV_3BITS_PER_PIN	3
241649c55878SDavid Wu 
241749c55878SDavid Wu static void rk3399_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
241849c55878SDavid Wu 					 int pin_num, struct regmap **regmap,
241949c55878SDavid Wu 					 int *reg, u8 *bit)
242049c55878SDavid Wu {
242149c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
242249c55878SDavid Wu 
242349c55878SDavid Wu 	/* The bank0:16 and bank1:32 pins are located in PMU */
242449c55878SDavid Wu 	if ((bank->bank_num == 0) || (bank->bank_num == 1)) {
242549c55878SDavid Wu 		*regmap = priv->regmap_pmu;
242649c55878SDavid Wu 		*reg = RK3399_PULL_PMU_OFFSET;
242749c55878SDavid Wu 
242849c55878SDavid Wu 		*reg += bank->bank_num * RK3188_PULL_BANK_STRIDE;
242949c55878SDavid Wu 
243049c55878SDavid Wu 		*reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4);
243149c55878SDavid Wu 		*bit = pin_num % RK3188_PULL_PINS_PER_REG;
243249c55878SDavid Wu 		*bit *= RK3188_PULL_BITS_PER_PIN;
243349c55878SDavid Wu 	} else {
243449c55878SDavid Wu 		*regmap = priv->regmap_base;
243549c55878SDavid Wu 		*reg = RK3399_PULL_GRF_OFFSET;
243649c55878SDavid Wu 
243749c55878SDavid Wu 		/* correct the offset, as we're starting with the 3rd bank */
243849c55878SDavid Wu 		*reg -= 0x20;
243949c55878SDavid Wu 		*reg += bank->bank_num * RK3188_PULL_BANK_STRIDE;
244049c55878SDavid Wu 		*reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4);
244149c55878SDavid Wu 
244249c55878SDavid Wu 		*bit = (pin_num % RK3188_PULL_PINS_PER_REG);
244349c55878SDavid Wu 		*bit *= RK3188_PULL_BITS_PER_PIN;
244449c55878SDavid Wu 	}
244549c55878SDavid Wu }
244649c55878SDavid Wu 
244749c55878SDavid Wu static void rk3399_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
244849c55878SDavid Wu 					int pin_num, struct regmap **regmap,
244949c55878SDavid Wu 					int *reg, u8 *bit)
245049c55878SDavid Wu {
245149c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
245249c55878SDavid Wu 	int drv_num = (pin_num / 8);
245349c55878SDavid Wu 
245449c55878SDavid Wu 	/*  The bank0:16 and bank1:32 pins are located in PMU */
245549c55878SDavid Wu 	if ((bank->bank_num == 0) || (bank->bank_num == 1))
245649c55878SDavid Wu 		*regmap = priv->regmap_pmu;
245749c55878SDavid Wu 	else
245849c55878SDavid Wu 		*regmap = priv->regmap_base;
245949c55878SDavid Wu 
246049c55878SDavid Wu 	*reg = bank->drv[drv_num].offset;
246149c55878SDavid Wu 	if ((bank->drv[drv_num].drv_type == DRV_TYPE_IO_1V8_3V0_AUTO) ||
246249c55878SDavid Wu 	    (bank->drv[drv_num].drv_type == DRV_TYPE_IO_3V3_ONLY))
246349c55878SDavid Wu 		*bit = (pin_num % 8) * 3;
246449c55878SDavid Wu 	else
246549c55878SDavid Wu 		*bit = (pin_num % 8) * 2;
246649c55878SDavid Wu }
246749c55878SDavid Wu 
246849c55878SDavid Wu static int rockchip_perpin_drv_list[DRV_TYPE_MAX][8] = {
246949c55878SDavid Wu 	{ 2, 4, 8, 12, -1, -1, -1, -1 },
247049c55878SDavid Wu 	{ 3, 6, 9, 12, -1, -1, -1, -1 },
247149c55878SDavid Wu 	{ 5, 10, 15, 20, -1, -1, -1, -1 },
247249c55878SDavid Wu 	{ 4, 6, 8, 10, 12, 14, 16, 18 },
247349c55878SDavid Wu 	{ 4, 7, 10, 13, 16, 19, 22, 26 }
247449c55878SDavid Wu };
247549c55878SDavid Wu 
247649c55878SDavid Wu static int rockchip_set_drive_perpin(struct rockchip_pin_bank *bank,
247749c55878SDavid Wu 				     int pin_num, int strength)
247849c55878SDavid Wu {
247949c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
248049c55878SDavid Wu 	struct rockchip_pin_ctrl *ctrl = priv->ctrl;
248149c55878SDavid Wu 	struct regmap *regmap;
248249c55878SDavid Wu 	int reg, ret, i;
248349c55878SDavid Wu 	u32 data, rmask_bits, temp;
248449c55878SDavid Wu 	u8 bit;
24852c16899dSDavid.Wu 	/* Where need to clean the special mask for rockchip_perpin_drv_list */
24862c16899dSDavid.Wu 	int drv_type = bank->drv[pin_num / 8].drv_type & (~DRV_TYPE_IO_MASK);
248749c55878SDavid Wu 
248849c55878SDavid Wu 	debug("setting drive of GPIO%d-%d to %d\n", bank->bank_num,
248949c55878SDavid Wu 	      pin_num, strength);
249049c55878SDavid Wu 
249149c55878SDavid Wu 	ctrl->drv_calc_reg(bank, pin_num, &regmap, &reg, &bit);
2492d499d466SJianqun Xu 	if (ctrl->type == RV1126) {
2493d499d466SJianqun Xu 		rmask_bits = RV1126_DRV_BITS_PER_PIN;
2494d499d466SJianqun Xu 		ret = strength;
2495d499d466SJianqun Xu 		goto config;
2496d499d466SJianqun Xu 	}
249749c55878SDavid Wu 
249849c55878SDavid Wu 	ret = -EINVAL;
249949c55878SDavid Wu 	for (i = 0; i < ARRAY_SIZE(rockchip_perpin_drv_list[drv_type]); i++) {
250049c55878SDavid Wu 		if (rockchip_perpin_drv_list[drv_type][i] == strength) {
250149c55878SDavid Wu 			ret = i;
250249c55878SDavid Wu 			break;
250349c55878SDavid Wu 		} else if (rockchip_perpin_drv_list[drv_type][i] < 0) {
250449c55878SDavid Wu 			ret = rockchip_perpin_drv_list[drv_type][i];
250549c55878SDavid Wu 			break;
250649c55878SDavid Wu 		}
250749c55878SDavid Wu 	}
250849c55878SDavid Wu 
250949c55878SDavid Wu 	if (ret < 0) {
251049c55878SDavid Wu 		debug("unsupported driver strength %d\n", strength);
251149c55878SDavid Wu 		return ret;
251249c55878SDavid Wu 	}
251349c55878SDavid Wu 
251449c55878SDavid Wu 	switch (drv_type) {
251549c55878SDavid Wu 	case DRV_TYPE_IO_1V8_3V0_AUTO:
251649c55878SDavid Wu 	case DRV_TYPE_IO_3V3_ONLY:
251749c55878SDavid Wu 		rmask_bits = RK3399_DRV_3BITS_PER_PIN;
251849c55878SDavid Wu 		switch (bit) {
251949c55878SDavid Wu 		case 0 ... 12:
252049c55878SDavid Wu 			/* regular case, nothing to do */
252149c55878SDavid Wu 			break;
252249c55878SDavid Wu 		case 15:
252349c55878SDavid Wu 			/*
252449c55878SDavid Wu 			 * drive-strength offset is special, as it is spread
252549c55878SDavid Wu 			 * over 2 registers, the bit data[15] contains bit 0
252649c55878SDavid Wu 			 * of the value while temp[1:0] contains bits 2 and 1
252749c55878SDavid Wu 			 */
252849c55878SDavid Wu 			data = (ret & 0x1) << 15;
252949c55878SDavid Wu 			temp = (ret >> 0x1) & 0x3;
253049c55878SDavid Wu 
253149c55878SDavid Wu 			data |= BIT(31);
253249c55878SDavid Wu 			ret = regmap_write(regmap, reg, data);
253349c55878SDavid Wu 			if (ret)
253449c55878SDavid Wu 				return ret;
253549c55878SDavid Wu 
253649c55878SDavid Wu 			temp |= (0x3 << 16);
253749c55878SDavid Wu 			reg += 0x4;
253849c55878SDavid Wu 			ret = regmap_write(regmap, reg, temp);
253949c55878SDavid Wu 
254049c55878SDavid Wu 			return ret;
254149c55878SDavid Wu 		case 18 ... 21:
254249c55878SDavid Wu 			/* setting fully enclosed in the second register */
254349c55878SDavid Wu 			reg += 4;
254449c55878SDavid Wu 			bit -= 16;
254549c55878SDavid Wu 			break;
254649c55878SDavid Wu 		default:
254749c55878SDavid Wu 			debug("unsupported bit: %d for pinctrl drive type: %d\n",
254849c55878SDavid Wu 			      bit, drv_type);
254949c55878SDavid Wu 			return -EINVAL;
255049c55878SDavid Wu 		}
255149c55878SDavid Wu 		break;
255249c55878SDavid Wu 	case DRV_TYPE_IO_DEFAULT:
255349c55878SDavid Wu 	case DRV_TYPE_IO_1V8_OR_3V0:
255449c55878SDavid Wu 	case DRV_TYPE_IO_1V8_ONLY:
255549c55878SDavid Wu 		rmask_bits = RK3288_DRV_BITS_PER_PIN;
255649c55878SDavid Wu 		break;
255749c55878SDavid Wu 	default:
255849c55878SDavid Wu 		debug("unsupported pinctrl drive type: %d\n",
255949c55878SDavid Wu 		      drv_type);
256049c55878SDavid Wu 		return -EINVAL;
256149c55878SDavid Wu 	}
256249c55878SDavid Wu 
2563d499d466SJianqun Xu config:
256455a89bc6SDavid Wu 	if (bank->drv[pin_num / 8].drv_type & DRV_TYPE_WRITABLE_32BIT) {
256555a89bc6SDavid Wu 		regmap_read(regmap, reg, &data);
256655a89bc6SDavid Wu 		data &= ~(((1 << rmask_bits) - 1) << bit);
256755a89bc6SDavid Wu 	} else {
256849c55878SDavid Wu 		/* enable the write to the equivalent lower bits */
256949c55878SDavid Wu 		data = ((1 << rmask_bits) - 1) << (bit + 16);
257055a89bc6SDavid Wu 	}
257149c55878SDavid Wu 
257255a89bc6SDavid Wu 	data |= (ret << bit);
257349c55878SDavid Wu 	ret = regmap_write(regmap, reg, data);
257449c55878SDavid Wu 	return ret;
257549c55878SDavid Wu }
257649c55878SDavid Wu 
257749c55878SDavid Wu static int rockchip_pull_list[PULL_TYPE_MAX][4] = {
257849c55878SDavid Wu 	{
257949c55878SDavid Wu 		PIN_CONFIG_BIAS_DISABLE,
258049c55878SDavid Wu 		PIN_CONFIG_BIAS_PULL_UP,
258149c55878SDavid Wu 		PIN_CONFIG_BIAS_PULL_DOWN,
258249c55878SDavid Wu 		PIN_CONFIG_BIAS_BUS_HOLD
258349c55878SDavid Wu 	},
258449c55878SDavid Wu 	{
258549c55878SDavid Wu 		PIN_CONFIG_BIAS_DISABLE,
258649c55878SDavid Wu 		PIN_CONFIG_BIAS_PULL_DOWN,
258749c55878SDavid Wu 		PIN_CONFIG_BIAS_DISABLE,
258849c55878SDavid Wu 		PIN_CONFIG_BIAS_PULL_UP
258949c55878SDavid Wu 	},
259049c55878SDavid Wu };
259149c55878SDavid Wu 
259249c55878SDavid Wu static int rockchip_set_pull(struct rockchip_pin_bank *bank,
259349c55878SDavid Wu 			     int pin_num, int pull)
259449c55878SDavid Wu {
259549c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
259649c55878SDavid Wu 	struct rockchip_pin_ctrl *ctrl = priv->ctrl;
259749c55878SDavid Wu 	struct regmap *regmap;
259849c55878SDavid Wu 	int reg, ret, i, pull_type;
259949c55878SDavid Wu 	u8 bit;
260049c55878SDavid Wu 	u32 data;
260149c55878SDavid Wu 
260249c55878SDavid Wu 	debug("setting pull of GPIO%d-%d to %d\n", bank->bank_num,
260349c55878SDavid Wu 	      pin_num, pull);
260449c55878SDavid Wu 
260549c55878SDavid Wu 	/* rk3066b does support any pulls */
260649c55878SDavid Wu 	if (ctrl->type == RK3066B)
260749c55878SDavid Wu 		return pull ? -EINVAL : 0;
260849c55878SDavid Wu 
260949c55878SDavid Wu 	ctrl->pull_calc_reg(bank, pin_num, &regmap, &reg, &bit);
261049c55878SDavid Wu 
261149c55878SDavid Wu 	switch (ctrl->type) {
261249c55878SDavid Wu 	case RK2928:
261349c55878SDavid Wu 	case RK3128:
261449c55878SDavid Wu 		data = BIT(bit + 16);
261549c55878SDavid Wu 		if (pull == PIN_CONFIG_BIAS_DISABLE)
261649c55878SDavid Wu 			data |= BIT(bit);
261749c55878SDavid Wu 		ret = regmap_write(regmap, reg, data);
261849c55878SDavid Wu 		break;
261949c55878SDavid Wu 	case PX30:
262049c55878SDavid Wu 	case RV1108:
2621cf04a17bSJianqun Xu 	case RV1126:
2622a2a3fc8fSJianqun Xu 	case RK1808:
262349c55878SDavid Wu 	case RK3188:
262449c55878SDavid Wu 	case RK3288:
2625b3077611SDavid Wu 	case RK3308:
262649c55878SDavid Wu 	case RK3368:
262749c55878SDavid Wu 	case RK3399:
26282c16899dSDavid.Wu 		/*
26292c16899dSDavid.Wu 		 * Where need to clean the special mask for
26302c16899dSDavid.Wu 		 * rockchip_pull_list.
26312c16899dSDavid.Wu 		 */
26322c16899dSDavid.Wu 		pull_type = bank->pull_type[pin_num / 8] & (~PULL_TYPE_IO_MASK);
263349c55878SDavid Wu 		ret = -EINVAL;
263449c55878SDavid Wu 		for (i = 0; i < ARRAY_SIZE(rockchip_pull_list[pull_type]);
263549c55878SDavid Wu 			i++) {
263649c55878SDavid Wu 			if (rockchip_pull_list[pull_type][i] == pull) {
263749c55878SDavid Wu 				ret = i;
263849c55878SDavid Wu 				break;
263949c55878SDavid Wu 			}
264049c55878SDavid Wu 		}
264149c55878SDavid Wu 
264249c55878SDavid Wu 		if (ret < 0) {
264349c55878SDavid Wu 			debug("unsupported pull setting %d\n", pull);
264449c55878SDavid Wu 			return ret;
264549c55878SDavid Wu 		}
264649c55878SDavid Wu 
264755a89bc6SDavid Wu 		if (bank->pull_type[pin_num / 8] & PULL_TYPE_WRITABLE_32BIT) {
264855a89bc6SDavid Wu 			regmap_read(regmap, reg, &data);
264955a89bc6SDavid Wu 			data &= ~(((1 << RK3188_PULL_BITS_PER_PIN) - 1) << bit);
265055a89bc6SDavid Wu 		} else {
265149c55878SDavid Wu 			/* enable the write to the equivalent lower bits */
265249c55878SDavid Wu 			data = ((1 << RK3188_PULL_BITS_PER_PIN) - 1) << (bit + 16);
265355a89bc6SDavid Wu 		}
265449c55878SDavid Wu 
265555a89bc6SDavid Wu 		data |= (ret << bit);
265649c55878SDavid Wu 		ret = regmap_write(regmap, reg, data);
265749c55878SDavid Wu 		break;
265849c55878SDavid Wu 	default:
265949c55878SDavid Wu 		debug("unsupported pinctrl type\n");
266049c55878SDavid Wu 		return -EINVAL;
266149c55878SDavid Wu 	}
266249c55878SDavid Wu 
266349c55878SDavid Wu 	return ret;
266449c55878SDavid Wu }
266549c55878SDavid Wu 
266649c55878SDavid Wu #define RK3328_SCHMITT_BITS_PER_PIN		1
266749c55878SDavid Wu #define RK3328_SCHMITT_PINS_PER_REG		16
266849c55878SDavid Wu #define RK3328_SCHMITT_BANK_STRIDE		8
266949c55878SDavid Wu #define RK3328_SCHMITT_GRF_OFFSET		0x380
267049c55878SDavid Wu 
267149c55878SDavid Wu static int rk3328_calc_schmitt_reg_and_bit(struct rockchip_pin_bank *bank,
267249c55878SDavid Wu 					   int pin_num,
267349c55878SDavid Wu 					   struct regmap **regmap,
267449c55878SDavid Wu 					   int *reg, u8 *bit)
267549c55878SDavid Wu {
267649c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
267749c55878SDavid Wu 
267849c55878SDavid Wu 	*regmap = priv->regmap_base;
267949c55878SDavid Wu 	*reg = RK3328_SCHMITT_GRF_OFFSET;
268049c55878SDavid Wu 
268149c55878SDavid Wu 	*reg += bank->bank_num * RK3328_SCHMITT_BANK_STRIDE;
268249c55878SDavid Wu 	*reg += ((pin_num / RK3328_SCHMITT_PINS_PER_REG) * 4);
268349c55878SDavid Wu 	*bit = pin_num % RK3328_SCHMITT_PINS_PER_REG;
268449c55878SDavid Wu 
268549c55878SDavid Wu 	return 0;
268649c55878SDavid Wu }
268749c55878SDavid Wu 
268849c55878SDavid Wu static int rockchip_set_schmitt(struct rockchip_pin_bank *bank,
268949c55878SDavid Wu 				int pin_num, int enable)
269049c55878SDavid Wu {
269149c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
269249c55878SDavid Wu 	struct rockchip_pin_ctrl *ctrl = priv->ctrl;
269349c55878SDavid Wu 	struct regmap *regmap;
269449c55878SDavid Wu 	int reg, ret;
269549c55878SDavid Wu 	u8 bit;
269649c55878SDavid Wu 	u32 data;
269749c55878SDavid Wu 
269849c55878SDavid Wu 	debug("setting input schmitt of GPIO%d-%d to %d\n", bank->bank_num,
269949c55878SDavid Wu 	      pin_num, enable);
270049c55878SDavid Wu 
270149c55878SDavid Wu 	ret = ctrl->schmitt_calc_reg(bank, pin_num, &regmap, &reg, &bit);
270249c55878SDavid Wu 	if (ret)
270349c55878SDavid Wu 		return ret;
270449c55878SDavid Wu 
270549c55878SDavid Wu 	/* enable the write to the equivalent lower bits */
270649c55878SDavid Wu 	data = BIT(bit + 16) | (enable << bit);
270749c55878SDavid Wu 
270849c55878SDavid Wu 	return regmap_write(regmap, reg, data);
270949c55878SDavid Wu }
271049c55878SDavid Wu 
271132c25d1fSDavid Wu #define PX30_SLEW_RATE_PMU_OFFSET		0x30
271232c25d1fSDavid Wu #define PX30_SLEW_RATE_GRF_OFFSET		0x90
271332c25d1fSDavid Wu #define PX30_SLEW_RATE_PINS_PER_PMU_REG		16
271432c25d1fSDavid Wu #define PX30_SLEW_RATE_BANK_STRIDE		16
271532c25d1fSDavid Wu #define PX30_SLEW_RATE_PINS_PER_GRF_REG		8
271632c25d1fSDavid Wu 
271732c25d1fSDavid Wu static int px30_calc_slew_rate_reg_and_bit(struct rockchip_pin_bank *bank,
271832c25d1fSDavid Wu 					   int pin_num,
271932c25d1fSDavid Wu 					   struct regmap **regmap,
272032c25d1fSDavid Wu 					   int *reg, u8 *bit)
272132c25d1fSDavid Wu {
272232c25d1fSDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
272332c25d1fSDavid Wu 	int pins_per_reg;
272432c25d1fSDavid Wu 
272532c25d1fSDavid Wu 	if (bank->bank_num == 0) {
272632c25d1fSDavid Wu 		*regmap = priv->regmap_pmu;
272732c25d1fSDavid Wu 		*reg = PX30_SLEW_RATE_PMU_OFFSET;
272832c25d1fSDavid Wu 		pins_per_reg = PX30_SCHMITT_PINS_PER_PMU_REG;
272932c25d1fSDavid Wu 	} else {
273032c25d1fSDavid Wu 		*regmap = priv->regmap_base;
273132c25d1fSDavid Wu 		*reg = PX30_SCHMITT_GRF_OFFSET;
273232c25d1fSDavid Wu 		pins_per_reg = PX30_SCHMITT_PINS_PER_GRF_REG;
273332c25d1fSDavid Wu 		*reg += (bank->bank_num  - 1) * PX30_SCHMITT_BANK_STRIDE;
273432c25d1fSDavid Wu 	}
273532c25d1fSDavid Wu 	*reg += ((pin_num / pins_per_reg) * 4);
273632c25d1fSDavid Wu 	*bit = pin_num % pins_per_reg;
273732c25d1fSDavid Wu 
273832c25d1fSDavid Wu 	return 0;
273932c25d1fSDavid Wu }
274032c25d1fSDavid Wu 
274132c25d1fSDavid Wu static int rockchip_set_slew_rate(struct rockchip_pin_bank *bank,
274232c25d1fSDavid Wu 				  int pin_num, int speed)
274332c25d1fSDavid Wu {
274432c25d1fSDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
274532c25d1fSDavid Wu 	struct rockchip_pin_ctrl *ctrl = priv->ctrl;
274632c25d1fSDavid Wu 	struct regmap *regmap;
274732c25d1fSDavid Wu 	int reg, ret;
274832c25d1fSDavid Wu 	u8 bit;
274932c25d1fSDavid Wu 	u32 data;
275032c25d1fSDavid Wu 
275132c25d1fSDavid Wu 	debug("setting slew rate of GPIO%d-%d to %d\n", bank->bank_num,
275232c25d1fSDavid Wu 	      pin_num, speed);
275332c25d1fSDavid Wu 
275432c25d1fSDavid Wu 	ret = ctrl->slew_rate_calc_reg(bank, pin_num, &regmap, &reg, &bit);
275532c25d1fSDavid Wu 	if (ret)
275632c25d1fSDavid Wu 		return ret;
275732c25d1fSDavid Wu 
275832c25d1fSDavid Wu 	/* enable the write to the equivalent lower bits */
275932c25d1fSDavid Wu 	data = BIT(bit + 16) | (speed << bit);
276032c25d1fSDavid Wu 
276132c25d1fSDavid Wu 	return regmap_write(regmap, reg, data);
276232c25d1fSDavid Wu }
276332c25d1fSDavid Wu 
276449c55878SDavid Wu /*
276549c55878SDavid Wu  * Pinconf_ops handling
276649c55878SDavid Wu  */
276749c55878SDavid Wu static bool rockchip_pinconf_pull_valid(struct rockchip_pin_ctrl *ctrl,
276849c55878SDavid Wu 					unsigned int pull)
276949c55878SDavid Wu {
277049c55878SDavid Wu 	switch (ctrl->type) {
277149c55878SDavid Wu 	case RK2928:
277249c55878SDavid Wu 	case RK3128:
277349c55878SDavid Wu 		return (pull == PIN_CONFIG_BIAS_PULL_PIN_DEFAULT ||
277449c55878SDavid Wu 			pull == PIN_CONFIG_BIAS_DISABLE);
277549c55878SDavid Wu 	case RK3066B:
277649c55878SDavid Wu 		return pull ? false : true;
277749c55878SDavid Wu 	case PX30:
277849c55878SDavid Wu 	case RV1108:
2779cf04a17bSJianqun Xu 	case RV1126:
2780a2a3fc8fSJianqun Xu 	case RK1808:
278149c55878SDavid Wu 	case RK3188:
278249c55878SDavid Wu 	case RK3288:
2783b3077611SDavid Wu 	case RK3308:
278449c55878SDavid Wu 	case RK3368:
278549c55878SDavid Wu 	case RK3399:
278649c55878SDavid Wu 		return (pull != PIN_CONFIG_BIAS_PULL_PIN_DEFAULT);
278749c55878SDavid Wu 	}
278849c55878SDavid Wu 
278949c55878SDavid Wu 	return false;
279049c55878SDavid Wu }
279149c55878SDavid Wu 
279249c55878SDavid Wu /* set the pin config settings for a specified pin */
279349c55878SDavid Wu static int rockchip_pinconf_set(struct rockchip_pin_bank *bank,
279449c55878SDavid Wu 				u32 pin, u32 param, u32 arg)
279549c55878SDavid Wu {
279649c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
279749c55878SDavid Wu 	struct rockchip_pin_ctrl *ctrl = priv->ctrl;
279849c55878SDavid Wu 	int rc;
279949c55878SDavid Wu 
280049c55878SDavid Wu 	switch (param) {
280149c55878SDavid Wu 	case PIN_CONFIG_BIAS_DISABLE:
280249c55878SDavid Wu 		rc =  rockchip_set_pull(bank, pin, param);
280349c55878SDavid Wu 		if (rc)
280449c55878SDavid Wu 			return rc;
280549c55878SDavid Wu 		break;
280649c55878SDavid Wu 
280749c55878SDavid Wu 	case PIN_CONFIG_BIAS_PULL_UP:
280849c55878SDavid Wu 	case PIN_CONFIG_BIAS_PULL_DOWN:
280949c55878SDavid Wu 	case PIN_CONFIG_BIAS_PULL_PIN_DEFAULT:
281049c55878SDavid Wu 	case PIN_CONFIG_BIAS_BUS_HOLD:
281149c55878SDavid Wu 		if (!rockchip_pinconf_pull_valid(ctrl, param))
281249c55878SDavid Wu 			return -ENOTSUPP;
281349c55878SDavid Wu 
281449c55878SDavid Wu 		if (!arg)
281549c55878SDavid Wu 			return -EINVAL;
281649c55878SDavid Wu 
281749c55878SDavid Wu 		rc = rockchip_set_pull(bank, pin, param);
281849c55878SDavid Wu 		if (rc)
281949c55878SDavid Wu 			return rc;
282049c55878SDavid Wu 		break;
282149c55878SDavid Wu 
282249c55878SDavid Wu 	case PIN_CONFIG_DRIVE_STRENGTH:
282349c55878SDavid Wu 		if (!ctrl->drv_calc_reg)
282449c55878SDavid Wu 			return -ENOTSUPP;
282549c55878SDavid Wu 
282649c55878SDavid Wu 		rc = rockchip_set_drive_perpin(bank, pin, arg);
282749c55878SDavid Wu 		if (rc < 0)
282849c55878SDavid Wu 			return rc;
282949c55878SDavid Wu 		break;
283049c55878SDavid Wu 
283149c55878SDavid Wu 	case PIN_CONFIG_INPUT_SCHMITT_ENABLE:
283249c55878SDavid Wu 		if (!ctrl->schmitt_calc_reg)
283349c55878SDavid Wu 			return -ENOTSUPP;
283449c55878SDavid Wu 
283549c55878SDavid Wu 		rc = rockchip_set_schmitt(bank, pin, arg);
283649c55878SDavid Wu 		if (rc < 0)
283749c55878SDavid Wu 			return rc;
283849c55878SDavid Wu 		break;
283949c55878SDavid Wu 
284032c25d1fSDavid Wu 	case PIN_CONFIG_SLEW_RATE:
284132c25d1fSDavid Wu 		if (!ctrl->slew_rate_calc_reg)
284232c25d1fSDavid Wu 			return -ENOTSUPP;
284332c25d1fSDavid Wu 
284432c25d1fSDavid Wu 		rc = rockchip_set_slew_rate(bank,
284532c25d1fSDavid Wu 					    pin - bank->pin_base, arg);
284632c25d1fSDavid Wu 		if (rc < 0)
284732c25d1fSDavid Wu 			return rc;
284832c25d1fSDavid Wu 		break;
284932c25d1fSDavid Wu 
285049c55878SDavid Wu 	default:
285149c55878SDavid Wu 		break;
285249c55878SDavid Wu 	}
285349c55878SDavid Wu 
285449c55878SDavid Wu 	return 0;
285549c55878SDavid Wu }
285649c55878SDavid Wu 
285749c55878SDavid Wu static const struct pinconf_param rockchip_conf_params[] = {
285849c55878SDavid Wu 	{ "bias-disable", PIN_CONFIG_BIAS_DISABLE, 0 },
285949c55878SDavid Wu 	{ "bias-bus-hold", PIN_CONFIG_BIAS_BUS_HOLD, 0 },
286049c55878SDavid Wu 	{ "bias-pull-up", PIN_CONFIG_BIAS_PULL_UP, 1 },
286149c55878SDavid Wu 	{ "bias-pull-down", PIN_CONFIG_BIAS_PULL_DOWN, 1 },
286249c55878SDavid Wu 	{ "drive-strength", PIN_CONFIG_DRIVE_STRENGTH, 0 },
286349c55878SDavid Wu 	{ "input-enable", PIN_CONFIG_INPUT_ENABLE, 1 },
286449c55878SDavid Wu 	{ "input-disable", PIN_CONFIG_INPUT_ENABLE, 0 },
286549c55878SDavid Wu 	{ "input-schmitt-disable", PIN_CONFIG_INPUT_SCHMITT_ENABLE, 0 },
286649c55878SDavid Wu 	{ "input-schmitt-enable", PIN_CONFIG_INPUT_SCHMITT_ENABLE, 1 },
286732c25d1fSDavid Wu 	{ "slew-rate", PIN_CONFIG_SLEW_RATE, 0 },
286849c55878SDavid Wu };
286949c55878SDavid Wu 
287049c55878SDavid Wu static int rockchip_pinconf_prop_name_to_param(const char *property,
287149c55878SDavid Wu 					       u32 *default_value)
287249c55878SDavid Wu {
287349c55878SDavid Wu 	const struct pinconf_param *p, *end;
287449c55878SDavid Wu 
287549c55878SDavid Wu 	p = rockchip_conf_params;
287649c55878SDavid Wu 	end = p + sizeof(rockchip_conf_params) / sizeof(struct pinconf_param);
287749c55878SDavid Wu 
287849c55878SDavid Wu 	/* See if this pctldev supports this parameter */
287949c55878SDavid Wu 	for (; p < end; p++) {
288049c55878SDavid Wu 		if (!strcmp(property, p->property)) {
288149c55878SDavid Wu 			*default_value = p->default_value;
288249c55878SDavid Wu 			return p->param;
288349c55878SDavid Wu 		}
288449c55878SDavid Wu 	}
288549c55878SDavid Wu 
288649c55878SDavid Wu 	*default_value = 0;
288749c55878SDavid Wu 	return -EPERM;
288849c55878SDavid Wu }
288949c55878SDavid Wu 
289049c55878SDavid Wu static int rockchip_pinctrl_set_state(struct udevice *dev,
289149c55878SDavid Wu 				      struct udevice *config)
289249c55878SDavid Wu {
289349c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = dev_get_priv(dev);
289449c55878SDavid Wu 	struct rockchip_pin_ctrl *ctrl = priv->ctrl;
289549c55878SDavid Wu 	u32 cells[MAX_ROCKCHIP_PINS_ENTRIES * 4];
289649c55878SDavid Wu 	u32 bank, pin, mux, conf, arg, default_val;
289749c55878SDavid Wu 	int ret, count, i;
289849c55878SDavid Wu 	const char *prop_name;
289949c55878SDavid Wu 	const void *value;
29002208cfa9SKever Yang 	int prop_len, param;
29012208cfa9SKever Yang 	const u32 *data;
29022208cfa9SKever Yang 	ofnode node;
2903d2e2dbd6SJason Zhu #if defined(CONFIG_OF_LIVE) && !defined(CONFIG_SPL_BUILD)
29042208cfa9SKever Yang 	const struct device_node *np;
29052208cfa9SKever Yang 	struct property *pp;
29062208cfa9SKever Yang #else
29072208cfa9SKever Yang 	int property_offset, pcfg_node;
29082208cfa9SKever Yang 	const void *blob = gd->fdt_blob;
29092208cfa9SKever Yang #endif
29102208cfa9SKever Yang 	data = dev_read_prop(config, "rockchip,pins", &count);
291149c55878SDavid Wu 	if (count < 0) {
291287f0ac57SDavid Wu 		debug("%s: bad array size %d\n", __func__, count);
291349c55878SDavid Wu 		return -EINVAL;
291449c55878SDavid Wu 	}
291549c55878SDavid Wu 
291687f0ac57SDavid Wu 	count /= sizeof(u32);
291749c55878SDavid Wu 	if (count > MAX_ROCKCHIP_PINS_ENTRIES * 4) {
291849c55878SDavid Wu 		debug("%s: unsupported pins array count %d\n",
291949c55878SDavid Wu 		      __func__, count);
292049c55878SDavid Wu 		return -EINVAL;
292149c55878SDavid Wu 	}
292249c55878SDavid Wu 
292387f0ac57SDavid Wu 	for (i = 0; i < count; i++)
292487f0ac57SDavid Wu 		cells[i] = fdt32_to_cpu(data[i]);
292587f0ac57SDavid Wu 
292649c55878SDavid Wu 	for (i = 0; i < (count >> 2); i++) {
292749c55878SDavid Wu 		bank = cells[4 * i + 0];
292849c55878SDavid Wu 		pin = cells[4 * i + 1];
292949c55878SDavid Wu 		mux = cells[4 * i + 2];
293049c55878SDavid Wu 		conf = cells[4 * i + 3];
293149c55878SDavid Wu 
293249c55878SDavid Wu 		ret = rockchip_verify_config(dev, bank, pin);
293349c55878SDavid Wu 		if (ret)
293449c55878SDavid Wu 			return ret;
293549c55878SDavid Wu 
293649c55878SDavid Wu 		ret = rockchip_set_mux(&ctrl->pin_banks[bank], pin, mux);
293749c55878SDavid Wu 		if (ret)
293849c55878SDavid Wu 			return ret;
293949c55878SDavid Wu 
29402208cfa9SKever Yang 		node = ofnode_get_by_phandle(conf);
29412208cfa9SKever Yang 		if (!ofnode_valid(node))
294249c55878SDavid Wu 			return -ENODEV;
2943d2e2dbd6SJason Zhu #if defined(CONFIG_OF_LIVE) && !defined(CONFIG_SPL_BUILD)
29442208cfa9SKever Yang 		np = ofnode_to_np(node);
29452208cfa9SKever Yang 		for (pp = np->properties; pp; pp = pp->next) {
29462208cfa9SKever Yang 			prop_name = pp->name;
29472208cfa9SKever Yang 			prop_len = pp->length;
29482208cfa9SKever Yang 			value = pp->value;
29492208cfa9SKever Yang #else
29502208cfa9SKever Yang 		pcfg_node = ofnode_to_offset(node);
295149c55878SDavid Wu 		fdt_for_each_property_offset(property_offset, blob, pcfg_node) {
295249c55878SDavid Wu 			value = fdt_getprop_by_offset(blob, property_offset,
295349c55878SDavid Wu 						      &prop_name, &prop_len);
295449c55878SDavid Wu 			if (!value)
295549c55878SDavid Wu 				return -ENOENT;
29562208cfa9SKever Yang #endif
295749c55878SDavid Wu 			param = rockchip_pinconf_prop_name_to_param(prop_name,
295849c55878SDavid Wu 								    &default_val);
295949c55878SDavid Wu 			if (param < 0)
296049c55878SDavid Wu 				break;
296149c55878SDavid Wu 
296249c55878SDavid Wu 			if (prop_len >= sizeof(fdt32_t))
296349c55878SDavid Wu 				arg = fdt32_to_cpu(*(fdt32_t *)value);
296449c55878SDavid Wu 			else
296549c55878SDavid Wu 				arg = default_val;
296649c55878SDavid Wu 
296749c55878SDavid Wu 			ret = rockchip_pinconf_set(&ctrl->pin_banks[bank], pin,
296849c55878SDavid Wu 						   param, arg);
296949c55878SDavid Wu 			if (ret) {
297049c55878SDavid Wu 				debug("%s: rockchip_pinconf_set fail: %d\n",
297149c55878SDavid Wu 				      __func__, ret);
297249c55878SDavid Wu 				return ret;
297349c55878SDavid Wu 			}
297449c55878SDavid Wu 		}
297549c55878SDavid Wu 	}
297649c55878SDavid Wu 
297749c55878SDavid Wu 	return 0;
297849c55878SDavid Wu }
297949c55878SDavid Wu 
298009989a56SJianqun Xu static int rockchip_pinctrl_get_pins_count(struct udevice *dev)
298109989a56SJianqun Xu {
298209989a56SJianqun Xu 	struct rockchip_pinctrl_priv *priv = dev_get_priv(dev);
298309989a56SJianqun Xu 	struct rockchip_pin_ctrl *ctrl = priv->ctrl;
298409989a56SJianqun Xu 
298509989a56SJianqun Xu 	return ctrl->nr_pins;
298609989a56SJianqun Xu }
298709989a56SJianqun Xu 
298849c55878SDavid Wu static struct pinctrl_ops rockchip_pinctrl_ops = {
298909989a56SJianqun Xu 	.get_pins_count			= rockchip_pinctrl_get_pins_count,
299049c55878SDavid Wu 	.set_state			= rockchip_pinctrl_set_state,
299149c55878SDavid Wu 	.get_gpio_mux			= rockchip_pinctrl_get_gpio_mux,
299249c55878SDavid Wu };
299349c55878SDavid Wu 
299413c03cb6SJianqun Xu static const struct rockchip_pin_ctrl rk3308b_pin_ctrl;
2995d5517017SDavid Wu 
299649c55878SDavid Wu /* retrieve the soc specific data */
299713c03cb6SJianqun Xu static const struct rockchip_pin_ctrl *
299813c03cb6SJianqun Xu rockchip_pinctrl_get_soc_data(struct udevice *dev)
299949c55878SDavid Wu {
300049c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = dev_get_priv(dev);
300113c03cb6SJianqun Xu 	const struct rockchip_pin_ctrl *ctrl =
300213c03cb6SJianqun Xu 		(const struct rockchip_pin_ctrl *)dev_get_driver_data(dev);
300349c55878SDavid Wu 	struct rockchip_pin_bank *bank;
300449c55878SDavid Wu 	int grf_offs, pmu_offs, drv_grf_offs, drv_pmu_offs, i, j;
300513c03cb6SJianqun Xu 	u32 nr_pins;
300613c03cb6SJianqun Xu 
300713c03cb6SJianqun Xu 	if (soc_is_rk3308b())
300813c03cb6SJianqun Xu 		ctrl = &rk3308b_pin_ctrl;
300949c55878SDavid Wu 
301049c55878SDavid Wu 	grf_offs = ctrl->grf_mux_offset;
301149c55878SDavid Wu 	pmu_offs = ctrl->pmu_mux_offset;
301249c55878SDavid Wu 	drv_pmu_offs = ctrl->pmu_drv_offset;
301349c55878SDavid Wu 	drv_grf_offs = ctrl->grf_drv_offset;
301449c55878SDavid Wu 	bank = ctrl->pin_banks;
301549c55878SDavid Wu 
3016d5517017SDavid Wu 	/* Ctrl data re-initialize for some Socs */
3017d5517017SDavid Wu 	if (ctrl->ctrl_data_re_init) {
3018d5517017SDavid Wu 		if (ctrl->ctrl_data_re_init(ctrl))
3019d5517017SDavid Wu 			return NULL;
3020d5517017SDavid Wu 	}
3021d5517017SDavid Wu 
302213c03cb6SJianqun Xu 	nr_pins = 0;
302349c55878SDavid Wu 	for (i = 0; i < ctrl->nr_banks; ++i, ++bank) {
302449c55878SDavid Wu 		int bank_pins = 0;
302549c55878SDavid Wu 
302649c55878SDavid Wu 		bank->priv = priv;
302713c03cb6SJianqun Xu 		bank->pin_base = nr_pins;
302813c03cb6SJianqun Xu 		nr_pins += bank->nr_pins;
302949c55878SDavid Wu 
303049c55878SDavid Wu 		/* calculate iomux and drv offsets */
303149c55878SDavid Wu 		for (j = 0; j < 4; j++) {
303249c55878SDavid Wu 			struct rockchip_iomux *iom = &bank->iomux[j];
303349c55878SDavid Wu 			struct rockchip_drv *drv = &bank->drv[j];
303449c55878SDavid Wu 			int inc;
303549c55878SDavid Wu 
303649c55878SDavid Wu 			if (bank_pins >= bank->nr_pins)
303749c55878SDavid Wu 				break;
303849c55878SDavid Wu 
303949c55878SDavid Wu 			/* preset iomux offset value, set new start value */
304049c55878SDavid Wu 			if (iom->offset >= 0) {
3041d499d466SJianqun Xu 				if ((iom->type & IOMUX_SOURCE_PMU) || (iom->type & IOMUX_L_SOURCE_PMU))
304249c55878SDavid Wu 					pmu_offs = iom->offset;
304349c55878SDavid Wu 				else
304449c55878SDavid Wu 					grf_offs = iom->offset;
304549c55878SDavid Wu 			} else { /* set current iomux offset */
3046d499d466SJianqun Xu 				iom->offset = ((iom->type & IOMUX_SOURCE_PMU) ||
3047d499d466SJianqun Xu 					       (iom->type & IOMUX_L_SOURCE_PMU)) ?
304849c55878SDavid Wu 							pmu_offs : grf_offs;
304949c55878SDavid Wu 			}
305049c55878SDavid Wu 
305149c55878SDavid Wu 			/* preset drv offset value, set new start value */
305249c55878SDavid Wu 			if (drv->offset >= 0) {
305349c55878SDavid Wu 				if (iom->type & IOMUX_SOURCE_PMU)
305449c55878SDavid Wu 					drv_pmu_offs = drv->offset;
305549c55878SDavid Wu 				else
305649c55878SDavid Wu 					drv_grf_offs = drv->offset;
305749c55878SDavid Wu 			} else { /* set current drv offset */
305849c55878SDavid Wu 				drv->offset = (iom->type & IOMUX_SOURCE_PMU) ?
305949c55878SDavid Wu 						drv_pmu_offs : drv_grf_offs;
306049c55878SDavid Wu 			}
306149c55878SDavid Wu 
306249c55878SDavid Wu 			debug("bank %d, iomux %d has iom_offset 0x%x drv_offset 0x%x\n",
306349c55878SDavid Wu 			      i, j, iom->offset, drv->offset);
306449c55878SDavid Wu 
306549c55878SDavid Wu 			/*
306649c55878SDavid Wu 			 * Increase offset according to iomux width.
306749c55878SDavid Wu 			 * 4bit iomux'es are spread over two registers.
306849c55878SDavid Wu 			 */
306949c55878SDavid Wu 			inc = (iom->type & (IOMUX_WIDTH_4BIT |
307088a1f7ffSDavid Wu 					    IOMUX_WIDTH_3BIT |
307188a1f7ffSDavid Wu 					    IOMUX_8WIDTH_2BIT)) ? 8 : 4;
3072d499d466SJianqun Xu 			if ((iom->type & IOMUX_SOURCE_PMU) || (iom->type & IOMUX_L_SOURCE_PMU))
307349c55878SDavid Wu 				pmu_offs += inc;
307449c55878SDavid Wu 			else
307549c55878SDavid Wu 				grf_offs += inc;
307649c55878SDavid Wu 
307749c55878SDavid Wu 			/*
307849c55878SDavid Wu 			 * Increase offset according to drv width.
307949c55878SDavid Wu 			 * 3bit drive-strenth'es are spread over two registers.
308049c55878SDavid Wu 			 */
308149c55878SDavid Wu 			if ((drv->drv_type == DRV_TYPE_IO_1V8_3V0_AUTO) ||
308249c55878SDavid Wu 			    (drv->drv_type == DRV_TYPE_IO_3V3_ONLY))
308349c55878SDavid Wu 				inc = 8;
308449c55878SDavid Wu 			else
308549c55878SDavid Wu 				inc = 4;
308649c55878SDavid Wu 
308749c55878SDavid Wu 			if (iom->type & IOMUX_SOURCE_PMU)
308849c55878SDavid Wu 				drv_pmu_offs += inc;
308949c55878SDavid Wu 			else
309049c55878SDavid Wu 				drv_grf_offs += inc;
309149c55878SDavid Wu 
309249c55878SDavid Wu 			bank_pins += 8;
309349c55878SDavid Wu 		}
309449c55878SDavid Wu 
309549c55878SDavid Wu 		/* calculate the per-bank recalced_mask */
309649c55878SDavid Wu 		for (j = 0; j < ctrl->niomux_recalced; j++) {
309749c55878SDavid Wu 			int pin = 0;
309849c55878SDavid Wu 
309949c55878SDavid Wu 			if (ctrl->iomux_recalced[j].num == bank->bank_num) {
310049c55878SDavid Wu 				pin = ctrl->iomux_recalced[j].pin;
310149c55878SDavid Wu 				bank->recalced_mask |= BIT(pin);
310249c55878SDavid Wu 			}
310349c55878SDavid Wu 		}
310449c55878SDavid Wu 
310549c55878SDavid Wu 		/* calculate the per-bank route_mask */
310649c55878SDavid Wu 		for (j = 0; j < ctrl->niomux_routes; j++) {
310749c55878SDavid Wu 			int pin = 0;
310849c55878SDavid Wu 
310949c55878SDavid Wu 			if (ctrl->iomux_routes[j].bank_num == bank->bank_num) {
311049c55878SDavid Wu 				pin = ctrl->iomux_routes[j].pin;
311149c55878SDavid Wu 				bank->route_mask |= BIT(pin);
311249c55878SDavid Wu 			}
311349c55878SDavid Wu 		}
311449c55878SDavid Wu 	}
311549c55878SDavid Wu 
311613c03cb6SJianqun Xu 	WARN_ON(nr_pins != ctrl->nr_pins);
311713c03cb6SJianqun Xu 
311849c55878SDavid Wu 	return ctrl;
311949c55878SDavid Wu }
312049c55878SDavid Wu 
3121d5517017SDavid Wu /* SoC data specially handle */
3122d5517017SDavid Wu 
3123d5517017SDavid Wu /* rk3308b SoC data initialize */
3124d5517017SDavid Wu #define RK3308B_GRF_SOC_CON13			0x608
3125d5517017SDavid Wu #define RK3308B_GRF_SOC_CON15			0x610
3126d5517017SDavid Wu 
3127d5517017SDavid Wu /* RK3308B_GRF_SOC_CON13 */
3128d5517017SDavid Wu #define RK3308B_GRF_I2C3_IOFUNC_SRC_CTRL	(BIT(16 + 10) | BIT(10))
3129d5517017SDavid Wu #define RK3308B_GRF_GPIO2A3_SEL_SRC_CTRL	(BIT(16 + 7)  | BIT(7))
3130d5517017SDavid Wu #define RK3308B_GRF_GPIO2A2_SEL_SRC_CTRL	(BIT(16 + 3)  | BIT(3))
3131d5517017SDavid Wu 
3132d5517017SDavid Wu /* RK3308B_GRF_SOC_CON15 */
3133d5517017SDavid Wu #define RK3308B_GRF_GPIO2C0_SEL_SRC_CTRL	(BIT(16 + 11) | BIT(11))
3134d5517017SDavid Wu #define RK3308B_GRF_GPIO3B3_SEL_SRC_CTRL	(BIT(16 + 7)  | BIT(7))
3135d5517017SDavid Wu #define RK3308B_GRF_GPIO3B2_SEL_SRC_CTRL	(BIT(16 + 3)  | BIT(3))
3136d5517017SDavid Wu 
3137d5517017SDavid Wu static int rk3308b_soc_data_init(struct rockchip_pinctrl_priv *priv)
3138d5517017SDavid Wu {
3139d5517017SDavid Wu 	int ret;
3140d5517017SDavid Wu 
3141d5517017SDavid Wu 	/*
3142d5517017SDavid Wu 	 * Enable the special ctrl  of selected sources.
3143d5517017SDavid Wu 	 */
3144d5517017SDavid Wu 	ret = regmap_write(priv->regmap_base, RK3308B_GRF_SOC_CON13,
3145d5517017SDavid Wu 			   RK3308B_GRF_I2C3_IOFUNC_SRC_CTRL |
3146d5517017SDavid Wu 			   RK3308B_GRF_GPIO2A3_SEL_SRC_CTRL |
3147d5517017SDavid Wu 			   RK3308B_GRF_GPIO2A2_SEL_SRC_CTRL);
3148d5517017SDavid Wu 	if (ret)
3149d5517017SDavid Wu 		return ret;
3150d5517017SDavid Wu 
3151d5517017SDavid Wu 	ret = regmap_write(priv->regmap_base, RK3308B_GRF_SOC_CON15,
3152d5517017SDavid Wu 			   RK3308B_GRF_GPIO2C0_SEL_SRC_CTRL |
3153d5517017SDavid Wu 			   RK3308B_GRF_GPIO3B3_SEL_SRC_CTRL |
3154d5517017SDavid Wu 			   RK3308B_GRF_GPIO3B2_SEL_SRC_CTRL);
3155d5517017SDavid Wu 	if (ret)
3156d5517017SDavid Wu 		return ret;
3157d5517017SDavid Wu 
3158d5517017SDavid Wu 	return 0;
3159d5517017SDavid Wu }
3160d5517017SDavid Wu 
316149c55878SDavid Wu static int rockchip_pinctrl_probe(struct udevice *dev)
316249c55878SDavid Wu {
316349c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = dev_get_priv(dev);
316413c03cb6SJianqun Xu 	const struct rockchip_pin_ctrl *ctrl;
316549c55878SDavid Wu 	struct udevice *syscon;
316649c55878SDavid Wu 	struct regmap *regmap;
316749c55878SDavid Wu 	int ret = 0;
316849c55878SDavid Wu 
316949c55878SDavid Wu 	/* get rockchip grf syscon phandle */
317049c55878SDavid Wu 	ret = uclass_get_device_by_phandle(UCLASS_SYSCON, dev, "rockchip,grf",
317149c55878SDavid Wu 					   &syscon);
317249c55878SDavid Wu 	if (ret) {
317349c55878SDavid Wu 		debug("unable to find rockchip,grf syscon device (%d)\n", ret);
317449c55878SDavid Wu 		return ret;
317549c55878SDavid Wu 	}
317649c55878SDavid Wu 
317749c55878SDavid Wu 	/* get grf-reg base address */
317849c55878SDavid Wu 	regmap = syscon_get_regmap(syscon);
317949c55878SDavid Wu 	if (!regmap) {
318049c55878SDavid Wu 		debug("unable to find rockchip grf regmap\n");
318149c55878SDavid Wu 		return -ENODEV;
318249c55878SDavid Wu 	}
318349c55878SDavid Wu 	priv->regmap_base = regmap;
318449c55878SDavid Wu 
318549c55878SDavid Wu 	/* option: get pmu-reg base address */
318649c55878SDavid Wu 	ret = uclass_get_device_by_phandle(UCLASS_SYSCON, dev, "rockchip,pmu",
318749c55878SDavid Wu 					   &syscon);
318849c55878SDavid Wu 	if (!ret) {
318949c55878SDavid Wu 		/* get pmugrf-reg base address */
319049c55878SDavid Wu 		regmap = syscon_get_regmap(syscon);
319149c55878SDavid Wu 		if (!regmap) {
319249c55878SDavid Wu 			debug("unable to find rockchip pmu regmap\n");
319349c55878SDavid Wu 			return -ENODEV;
319449c55878SDavid Wu 		}
319549c55878SDavid Wu 		priv->regmap_pmu = regmap;
319649c55878SDavid Wu 	}
319749c55878SDavid Wu 
319849c55878SDavid Wu 	ctrl = rockchip_pinctrl_get_soc_data(dev);
319949c55878SDavid Wu 	if (!ctrl) {
320049c55878SDavid Wu 		debug("driver data not available\n");
320149c55878SDavid Wu 		return -EINVAL;
320249c55878SDavid Wu 	}
320349c55878SDavid Wu 
3204d5517017SDavid Wu 	/* Special handle for some Socs */
3205d5517017SDavid Wu 	if (ctrl->soc_data_init) {
3206d5517017SDavid Wu 		ret = ctrl->soc_data_init(priv);
3207d5517017SDavid Wu 		if (ret)
3208d5517017SDavid Wu 			return ret;
3209d5517017SDavid Wu 	}
3210d5517017SDavid Wu 
321113c03cb6SJianqun Xu 	priv->ctrl = (struct rockchip_pin_ctrl *)ctrl;
321249c55878SDavid Wu 	return 0;
321349c55878SDavid Wu }
321449c55878SDavid Wu 
321549c55878SDavid Wu static struct rockchip_pin_bank px30_pin_banks[] = {
321649c55878SDavid Wu 	PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0", IOMUX_SOURCE_PMU,
321749c55878SDavid Wu 					     IOMUX_SOURCE_PMU,
321849c55878SDavid Wu 					     IOMUX_SOURCE_PMU,
321949c55878SDavid Wu 					     IOMUX_SOURCE_PMU
322049c55878SDavid Wu 			    ),
322149c55878SDavid Wu 	PIN_BANK_IOMUX_FLAGS(1, 32, "gpio1", IOMUX_WIDTH_4BIT,
322249c55878SDavid Wu 					     IOMUX_WIDTH_4BIT,
322349c55878SDavid Wu 					     IOMUX_WIDTH_4BIT,
322449c55878SDavid Wu 					     IOMUX_WIDTH_4BIT
322549c55878SDavid Wu 			    ),
322649c55878SDavid Wu 	PIN_BANK_IOMUX_FLAGS(2, 32, "gpio2", IOMUX_WIDTH_4BIT,
322749c55878SDavid Wu 					     IOMUX_WIDTH_4BIT,
322849c55878SDavid Wu 					     IOMUX_WIDTH_4BIT,
322949c55878SDavid Wu 					     IOMUX_WIDTH_4BIT
323049c55878SDavid Wu 			    ),
323149c55878SDavid Wu 	PIN_BANK_IOMUX_FLAGS(3, 32, "gpio3", IOMUX_WIDTH_4BIT,
323249c55878SDavid Wu 					     IOMUX_WIDTH_4BIT,
323349c55878SDavid Wu 					     IOMUX_WIDTH_4BIT,
323449c55878SDavid Wu 					     IOMUX_WIDTH_4BIT
323549c55878SDavid Wu 			    ),
323649c55878SDavid Wu };
323749c55878SDavid Wu 
323813c03cb6SJianqun Xu static const struct rockchip_pin_ctrl px30_pin_ctrl = {
323949c55878SDavid Wu 	.pin_banks		= px30_pin_banks,
324049c55878SDavid Wu 	.nr_banks		= ARRAY_SIZE(px30_pin_banks),
324113c03cb6SJianqun Xu 	.nr_pins		= 128,
324249c55878SDavid Wu 	.label			= "PX30-GPIO",
324349c55878SDavid Wu 	.type			= PX30,
324449c55878SDavid Wu 	.grf_mux_offset		= 0x0,
324549c55878SDavid Wu 	.pmu_mux_offset		= 0x0,
324649c55878SDavid Wu 	.iomux_routes		= px30_mux_route_data,
324749c55878SDavid Wu 	.niomux_routes		= ARRAY_SIZE(px30_mux_route_data),
324849c55878SDavid Wu 	.pull_calc_reg		= px30_calc_pull_reg_and_bit,
324949c55878SDavid Wu 	.drv_calc_reg		= px30_calc_drv_reg_and_bit,
325049c55878SDavid Wu 	.schmitt_calc_reg	= px30_calc_schmitt_reg_and_bit,
325132c25d1fSDavid Wu 	.slew_rate_calc_reg	= px30_calc_slew_rate_reg_and_bit,
325249c55878SDavid Wu };
325349c55878SDavid Wu 
325449c55878SDavid Wu static struct rockchip_pin_bank rv1108_pin_banks[] = {
325549c55878SDavid Wu 	PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0", IOMUX_SOURCE_PMU,
325649c55878SDavid Wu 					     IOMUX_SOURCE_PMU,
325749c55878SDavid Wu 					     IOMUX_SOURCE_PMU,
325849c55878SDavid Wu 					     IOMUX_SOURCE_PMU),
325949c55878SDavid Wu 	PIN_BANK_IOMUX_FLAGS(1, 32, "gpio1", 0, 0, 0, 0),
326049c55878SDavid Wu 	PIN_BANK_IOMUX_FLAGS(2, 32, "gpio2", 0, 0, 0, 0),
326149c55878SDavid Wu 	PIN_BANK_IOMUX_FLAGS(3, 32, "gpio3", 0, 0, 0, 0),
326249c55878SDavid Wu };
326349c55878SDavid Wu 
326413c03cb6SJianqun Xu static const struct rockchip_pin_ctrl rv1108_pin_ctrl = {
326549c55878SDavid Wu 	.pin_banks		= rv1108_pin_banks,
326649c55878SDavid Wu 	.nr_banks		= ARRAY_SIZE(rv1108_pin_banks),
326713c03cb6SJianqun Xu 	.nr_pins		= 128,
326849c55878SDavid Wu 	.label			= "RV1108-GPIO",
326949c55878SDavid Wu 	.type			= RV1108,
327049c55878SDavid Wu 	.grf_mux_offset		= 0x10,
327149c55878SDavid Wu 	.pmu_mux_offset		= 0x0,
327249c55878SDavid Wu 	.iomux_recalced		= rv1108_mux_recalced_data,
327349c55878SDavid Wu 	.niomux_recalced	= ARRAY_SIZE(rv1108_mux_recalced_data),
327449c55878SDavid Wu 	.pull_calc_reg		= rv1108_calc_pull_reg_and_bit,
327549c55878SDavid Wu 	.drv_calc_reg		= rv1108_calc_drv_reg_and_bit,
327649c55878SDavid Wu 	.schmitt_calc_reg	= rv1108_calc_schmitt_reg_and_bit,
327749c55878SDavid Wu };
327849c55878SDavid Wu 
3279cf04a17bSJianqun Xu static struct rockchip_pin_bank rv1126_pin_banks[] = {
3280cf04a17bSJianqun Xu 	PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0",
3281cf04a17bSJianqun Xu 			     IOMUX_WIDTH_4BIT | IOMUX_SOURCE_PMU,
3282cf04a17bSJianqun Xu 			     IOMUX_WIDTH_4BIT | IOMUX_SOURCE_PMU,
3283cf04a17bSJianqun Xu 			     IOMUX_WIDTH_4BIT | IOMUX_L_SOURCE_PMU,
3284cf04a17bSJianqun Xu 			     IOMUX_WIDTH_4BIT),
3285d499d466SJianqun Xu 	PIN_BANK_IOMUX_FLAGS_OFFSET(1, 32, "gpio1",
3286cf04a17bSJianqun Xu 			     IOMUX_WIDTH_4BIT,
3287cf04a17bSJianqun Xu 			     IOMUX_WIDTH_4BIT,
3288cf04a17bSJianqun Xu 			     IOMUX_WIDTH_4BIT,
3289d499d466SJianqun Xu 			     IOMUX_WIDTH_4BIT,
3290d499d466SJianqun Xu 			     0x10010, 0x10018, 0x10020, 0x10028),
3291cf04a17bSJianqun Xu 	PIN_BANK_IOMUX_FLAGS(2, 32, "gpio2",
3292cf04a17bSJianqun Xu 			     IOMUX_WIDTH_4BIT,
3293cf04a17bSJianqun Xu 			     IOMUX_WIDTH_4BIT,
3294cf04a17bSJianqun Xu 			     IOMUX_WIDTH_4BIT,
3295cf04a17bSJianqun Xu 			     IOMUX_WIDTH_4BIT),
3296cf04a17bSJianqun Xu 	PIN_BANK_IOMUX_FLAGS(3, 32, "gpio3",
3297cf04a17bSJianqun Xu 			     IOMUX_WIDTH_4BIT,
3298cf04a17bSJianqun Xu 			     IOMUX_WIDTH_4BIT,
3299cf04a17bSJianqun Xu 			     IOMUX_WIDTH_4BIT,
3300cf04a17bSJianqun Xu 			     IOMUX_WIDTH_4BIT),
3301cf04a17bSJianqun Xu 	PIN_BANK_IOMUX_FLAGS(4, 2, "gpio4",
3302cf04a17bSJianqun Xu 			     IOMUX_WIDTH_4BIT, 0, 0, 0),
3303cf04a17bSJianqun Xu };
3304cf04a17bSJianqun Xu 
330513c03cb6SJianqun Xu static const struct rockchip_pin_ctrl rv1126_pin_ctrl = {
3306cf04a17bSJianqun Xu 	.pin_banks		= rv1126_pin_banks,
3307cf04a17bSJianqun Xu 	.nr_banks		= ARRAY_SIZE(rv1126_pin_banks),
330813c03cb6SJianqun Xu 	.nr_pins		= 130,
3309cf04a17bSJianqun Xu 	.label			= "RV1126-GPIO",
3310cf04a17bSJianqun Xu 	.type			= RV1126,
3311cf04a17bSJianqun Xu 	.grf_mux_offset		= 0x10004, /* mux offset from GPIO0_D0 */
3312cf04a17bSJianqun Xu 	.pmu_mux_offset		= 0x0,
3313d499d466SJianqun Xu 	.iomux_routes		= rv1126_mux_route_data,
3314d499d466SJianqun Xu 	.niomux_routes		= ARRAY_SIZE(rv1126_mux_route_data),
3315cf04a17bSJianqun Xu 	.iomux_recalced		= rv1126_mux_recalced_data,
3316cf04a17bSJianqun Xu 	.niomux_recalced	= ARRAY_SIZE(rv1126_mux_recalced_data),
3317cf04a17bSJianqun Xu 	.pull_calc_reg		= rv1126_calc_pull_reg_and_bit,
3318cf04a17bSJianqun Xu 	.drv_calc_reg		= rv1126_calc_drv_reg_and_bit,
3319cf04a17bSJianqun Xu 	.schmitt_calc_reg	= rv1126_calc_schmitt_reg_and_bit,
3320cf04a17bSJianqun Xu };
3321cf04a17bSJianqun Xu 
3322a2a3fc8fSJianqun Xu static struct rockchip_pin_bank rk1808_pin_banks[] = {
3323a2a3fc8fSJianqun Xu 	PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0",
3324a2a3fc8fSJianqun Xu 			     IOMUX_SOURCE_PMU,
3325a2a3fc8fSJianqun Xu 			     IOMUX_SOURCE_PMU,
3326a2a3fc8fSJianqun Xu 			     IOMUX_SOURCE_PMU,
3327a2a3fc8fSJianqun Xu 			     IOMUX_SOURCE_PMU),
3328a2a3fc8fSJianqun Xu 	PIN_BANK_IOMUX_FLAGS(1, 32, "gpio1",
3329a2a3fc8fSJianqun Xu 			     IOMUX_WIDTH_4BIT,
3330a2a3fc8fSJianqun Xu 			     IOMUX_WIDTH_4BIT,
3331a2a3fc8fSJianqun Xu 			     IOMUX_WIDTH_4BIT,
3332a2a3fc8fSJianqun Xu 			     IOMUX_WIDTH_4BIT),
3333a2a3fc8fSJianqun Xu 	PIN_BANK_IOMUX_FLAGS(2, 32, "gpio2",
3334a2a3fc8fSJianqun Xu 			     IOMUX_WIDTH_4BIT,
3335a2a3fc8fSJianqun Xu 			     IOMUX_WIDTH_4BIT,
3336a2a3fc8fSJianqun Xu 			     IOMUX_WIDTH_4BIT,
3337a2a3fc8fSJianqun Xu 			     IOMUX_WIDTH_4BIT),
3338a2a3fc8fSJianqun Xu 	PIN_BANK_IOMUX_FLAGS(3, 32, "gpio3",
3339a2a3fc8fSJianqun Xu 			     IOMUX_WIDTH_4BIT,
3340a2a3fc8fSJianqun Xu 			     IOMUX_WIDTH_4BIT,
3341a2a3fc8fSJianqun Xu 			     IOMUX_WIDTH_4BIT,
3342a2a3fc8fSJianqun Xu 			     IOMUX_WIDTH_4BIT),
3343a2a3fc8fSJianqun Xu 	PIN_BANK_IOMUX_FLAGS(4, 32, "gpio4",
3344a2a3fc8fSJianqun Xu 			     IOMUX_WIDTH_4BIT,
3345a2a3fc8fSJianqun Xu 			     IOMUX_WIDTH_4BIT,
3346a2a3fc8fSJianqun Xu 			     IOMUX_WIDTH_4BIT,
3347a2a3fc8fSJianqun Xu 			     IOMUX_WIDTH_4BIT),
3348a2a3fc8fSJianqun Xu };
3349a2a3fc8fSJianqun Xu 
335013c03cb6SJianqun Xu static const struct rockchip_pin_ctrl rk1808_pin_ctrl = {
3351a2a3fc8fSJianqun Xu 	.pin_banks		= rk1808_pin_banks,
3352a2a3fc8fSJianqun Xu 	.nr_banks		= ARRAY_SIZE(rk1808_pin_banks),
335313c03cb6SJianqun Xu 	.nr_pins		= 160,
3354a2a3fc8fSJianqun Xu 	.label			= "RK1808-GPIO",
3355a2a3fc8fSJianqun Xu 	.type			= RK1808,
3356a2a3fc8fSJianqun Xu 	.iomux_routes		= rk1808_mux_route_data,
3357a2a3fc8fSJianqun Xu 	.niomux_routes		= ARRAY_SIZE(rk1808_mux_route_data),
3358a2a3fc8fSJianqun Xu 	.grf_mux_offset		= 0x0,
3359a2a3fc8fSJianqun Xu 	.pmu_mux_offset		= 0x0,
3360a2a3fc8fSJianqun Xu 	.pull_calc_reg		= rk1808_calc_pull_reg_and_bit,
3361a2a3fc8fSJianqun Xu 	.drv_calc_reg		= rk1808_calc_drv_reg_and_bit,
3362a2a3fc8fSJianqun Xu 	.schmitt_calc_reg	= rk1808_calc_schmitt_reg_and_bit,
3363a2a3fc8fSJianqun Xu };
3364a2a3fc8fSJianqun Xu 
336549c55878SDavid Wu static struct rockchip_pin_bank rk2928_pin_banks[] = {
336649c55878SDavid Wu 	PIN_BANK(0, 32, "gpio0"),
336749c55878SDavid Wu 	PIN_BANK(1, 32, "gpio1"),
336849c55878SDavid Wu 	PIN_BANK(2, 32, "gpio2"),
336949c55878SDavid Wu 	PIN_BANK(3, 32, "gpio3"),
337049c55878SDavid Wu };
337149c55878SDavid Wu 
337213c03cb6SJianqun Xu static const struct rockchip_pin_ctrl rk2928_pin_ctrl = {
337349c55878SDavid Wu 	.pin_banks		= rk2928_pin_banks,
337449c55878SDavid Wu 	.nr_banks		= ARRAY_SIZE(rk2928_pin_banks),
337513c03cb6SJianqun Xu 	.nr_pins		= 128,
337649c55878SDavid Wu 	.label			= "RK2928-GPIO",
337749c55878SDavid Wu 	.type			= RK2928,
337849c55878SDavid Wu 	.grf_mux_offset		= 0xa8,
337949c55878SDavid Wu 	.pull_calc_reg		= rk2928_calc_pull_reg_and_bit,
338049c55878SDavid Wu };
338149c55878SDavid Wu 
338249c55878SDavid Wu static struct rockchip_pin_bank rk3036_pin_banks[] = {
338349c55878SDavid Wu 	PIN_BANK(0, 32, "gpio0"),
338449c55878SDavid Wu 	PIN_BANK(1, 32, "gpio1"),
338549c55878SDavid Wu 	PIN_BANK(2, 32, "gpio2"),
338649c55878SDavid Wu };
338749c55878SDavid Wu 
338813c03cb6SJianqun Xu static const struct rockchip_pin_ctrl rk3036_pin_ctrl = {
338949c55878SDavid Wu 	.pin_banks		= rk3036_pin_banks,
339049c55878SDavid Wu 	.nr_banks		= ARRAY_SIZE(rk3036_pin_banks),
339113c03cb6SJianqun Xu 	.nr_pins		= 96,
339249c55878SDavid Wu 	.label			= "RK3036-GPIO",
339349c55878SDavid Wu 	.type			= RK2928,
339449c55878SDavid Wu 	.grf_mux_offset		= 0xa8,
339549c55878SDavid Wu 	.pull_calc_reg		= rk2928_calc_pull_reg_and_bit,
339649c55878SDavid Wu };
339749c55878SDavid Wu 
339849c55878SDavid Wu static struct rockchip_pin_bank rk3066a_pin_banks[] = {
339949c55878SDavid Wu 	PIN_BANK(0, 32, "gpio0"),
340049c55878SDavid Wu 	PIN_BANK(1, 32, "gpio1"),
340149c55878SDavid Wu 	PIN_BANK(2, 32, "gpio2"),
340249c55878SDavid Wu 	PIN_BANK(3, 32, "gpio3"),
340349c55878SDavid Wu 	PIN_BANK(4, 32, "gpio4"),
340449c55878SDavid Wu 	PIN_BANK(6, 16, "gpio6"),
340549c55878SDavid Wu };
340649c55878SDavid Wu 
340713c03cb6SJianqun Xu static const struct rockchip_pin_ctrl rk3066a_pin_ctrl = {
340849c55878SDavid Wu 	.pin_banks		= rk3066a_pin_banks,
340949c55878SDavid Wu 	.nr_banks		= ARRAY_SIZE(rk3066a_pin_banks),
341013c03cb6SJianqun Xu 	.nr_pins		= 176,
341149c55878SDavid Wu 	.label			= "RK3066a-GPIO",
341249c55878SDavid Wu 	.type			= RK2928,
341349c55878SDavid Wu 	.grf_mux_offset		= 0xa8,
341449c55878SDavid Wu 	.pull_calc_reg		= rk2928_calc_pull_reg_and_bit,
341549c55878SDavid Wu };
341649c55878SDavid Wu 
341749c55878SDavid Wu static struct rockchip_pin_bank rk3066b_pin_banks[] = {
341849c55878SDavid Wu 	PIN_BANK(0, 32, "gpio0"),
341949c55878SDavid Wu 	PIN_BANK(1, 32, "gpio1"),
342049c55878SDavid Wu 	PIN_BANK(2, 32, "gpio2"),
342149c55878SDavid Wu 	PIN_BANK(3, 32, "gpio3"),
342249c55878SDavid Wu };
342349c55878SDavid Wu 
342413c03cb6SJianqun Xu static const struct rockchip_pin_ctrl rk3066b_pin_ctrl = {
342549c55878SDavid Wu 	.pin_banks		= rk3066b_pin_banks,
342649c55878SDavid Wu 	.nr_banks		= ARRAY_SIZE(rk3066b_pin_banks),
342713c03cb6SJianqun Xu 	.nr_pins		= 128,
342849c55878SDavid Wu 	.label			= "RK3066b-GPIO",
342949c55878SDavid Wu 	.type			= RK3066B,
343049c55878SDavid Wu 	.grf_mux_offset		= 0x60,
343149c55878SDavid Wu };
343249c55878SDavid Wu 
343349c55878SDavid Wu static struct rockchip_pin_bank rk3128_pin_banks[] = {
343449c55878SDavid Wu 	PIN_BANK(0, 32, "gpio0"),
343549c55878SDavid Wu 	PIN_BANK(1, 32, "gpio1"),
343649c55878SDavid Wu 	PIN_BANK(2, 32, "gpio2"),
343749c55878SDavid Wu 	PIN_BANK(3, 32, "gpio3"),
343849c55878SDavid Wu };
343949c55878SDavid Wu 
344013c03cb6SJianqun Xu static const struct rockchip_pin_ctrl rk3128_pin_ctrl = {
344149c55878SDavid Wu 	.pin_banks		= rk3128_pin_banks,
344249c55878SDavid Wu 	.nr_banks		= ARRAY_SIZE(rk3128_pin_banks),
344313c03cb6SJianqun Xu 	.nr_pins		= 128,
344449c55878SDavid Wu 	.label			= "RK3128-GPIO",
344549c55878SDavid Wu 	.type			= RK3128,
344649c55878SDavid Wu 	.grf_mux_offset		= 0xa8,
344749c55878SDavid Wu 	.iomux_recalced		= rk3128_mux_recalced_data,
344849c55878SDavid Wu 	.niomux_recalced	= ARRAY_SIZE(rk3128_mux_recalced_data),
344949c55878SDavid Wu 	.iomux_routes		= rk3128_mux_route_data,
345049c55878SDavid Wu 	.niomux_routes		= ARRAY_SIZE(rk3128_mux_route_data),
345149c55878SDavid Wu 	.pull_calc_reg		= rk3128_calc_pull_reg_and_bit,
345249c55878SDavid Wu };
345349c55878SDavid Wu 
345449c55878SDavid Wu static struct rockchip_pin_bank rk3188_pin_banks[] = {
345549c55878SDavid Wu 	PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0", IOMUX_GPIO_ONLY, 0, 0, 0),
345649c55878SDavid Wu 	PIN_BANK(1, 32, "gpio1"),
345749c55878SDavid Wu 	PIN_BANK(2, 32, "gpio2"),
345849c55878SDavid Wu 	PIN_BANK(3, 32, "gpio3"),
345949c55878SDavid Wu };
346049c55878SDavid Wu 
346113c03cb6SJianqun Xu static const struct rockchip_pin_ctrl rk3188_pin_ctrl = {
346249c55878SDavid Wu 	.pin_banks		= rk3188_pin_banks,
346349c55878SDavid Wu 	.nr_banks		= ARRAY_SIZE(rk3188_pin_banks),
346413c03cb6SJianqun Xu 	.nr_pins		= 128,
346549c55878SDavid Wu 	.label			= "RK3188-GPIO",
346649c55878SDavid Wu 	.type			= RK3188,
346749c55878SDavid Wu 	.grf_mux_offset		= 0x60,
346849c55878SDavid Wu 	.pull_calc_reg		= rk3188_calc_pull_reg_and_bit,
346949c55878SDavid Wu };
347049c55878SDavid Wu 
347149c55878SDavid Wu static struct rockchip_pin_bank rk3228_pin_banks[] = {
347249c55878SDavid Wu 	PIN_BANK(0, 32, "gpio0"),
347349c55878SDavid Wu 	PIN_BANK(1, 32, "gpio1"),
347449c55878SDavid Wu 	PIN_BANK(2, 32, "gpio2"),
347549c55878SDavid Wu 	PIN_BANK(3, 32, "gpio3"),
347649c55878SDavid Wu };
347749c55878SDavid Wu 
347813c03cb6SJianqun Xu static const struct rockchip_pin_ctrl rk3228_pin_ctrl = {
347949c55878SDavid Wu 	.pin_banks		= rk3228_pin_banks,
348049c55878SDavid Wu 	.nr_banks		= ARRAY_SIZE(rk3228_pin_banks),
348113c03cb6SJianqun Xu 	.nr_pins		= 128,
348249c55878SDavid Wu 	.label			= "RK3228-GPIO",
348349c55878SDavid Wu 	.type			= RK3288,
348449c55878SDavid Wu 	.grf_mux_offset		= 0x0,
348549c55878SDavid Wu 	.iomux_routes		= rk3228_mux_route_data,
348649c55878SDavid Wu 	.niomux_routes		= ARRAY_SIZE(rk3228_mux_route_data),
348749c55878SDavid Wu 	.pull_calc_reg		= rk3228_calc_pull_reg_and_bit,
348849c55878SDavid Wu 	.drv_calc_reg		= rk3228_calc_drv_reg_and_bit,
348949c55878SDavid Wu };
349049c55878SDavid Wu 
349149c55878SDavid Wu static struct rockchip_pin_bank rk3288_pin_banks[] = {
349255a89bc6SDavid Wu 	PIN_BANK_IOMUX_DRV_PULL_FLAGS(0, 24, "gpio0",
34934bafc2daSDavid Wu 				      IOMUX_SOURCE_PMU | IOMUX_WRITABLE_32BIT,
34944bafc2daSDavid Wu 				      IOMUX_SOURCE_PMU | IOMUX_WRITABLE_32BIT,
349555a89bc6SDavid Wu 				      IOMUX_SOURCE_PMU | IOMUX_WRITABLE_32BIT,
349655a89bc6SDavid Wu 				      IOMUX_UNROUTED,
349755a89bc6SDavid Wu 				      DRV_TYPE_WRITABLE_32BIT,
349855a89bc6SDavid Wu 				      DRV_TYPE_WRITABLE_32BIT,
349955a89bc6SDavid Wu 				      DRV_TYPE_WRITABLE_32BIT,
350055a89bc6SDavid Wu 				      0,
350155a89bc6SDavid Wu 				      PULL_TYPE_WRITABLE_32BIT,
350255a89bc6SDavid Wu 				      PULL_TYPE_WRITABLE_32BIT,
350355a89bc6SDavid Wu 				      PULL_TYPE_WRITABLE_32BIT,
350455a89bc6SDavid Wu 				      0
350549c55878SDavid Wu 			    ),
350649c55878SDavid Wu 	PIN_BANK_IOMUX_FLAGS(1, 32, "gpio1", IOMUX_UNROUTED,
350749c55878SDavid Wu 					     IOMUX_UNROUTED,
350849c55878SDavid Wu 					     IOMUX_UNROUTED,
350949c55878SDavid Wu 					     0
351049c55878SDavid Wu 			    ),
351149c55878SDavid Wu 	PIN_BANK_IOMUX_FLAGS(2, 32, "gpio2", 0, 0, 0, IOMUX_UNROUTED),
351249c55878SDavid Wu 	PIN_BANK_IOMUX_FLAGS(3, 32, "gpio3", 0, 0, 0, IOMUX_WIDTH_4BIT),
351349c55878SDavid Wu 	PIN_BANK_IOMUX_FLAGS(4, 32, "gpio4", IOMUX_WIDTH_4BIT,
351449c55878SDavid Wu 					     IOMUX_WIDTH_4BIT,
351549c55878SDavid Wu 					     0,
351649c55878SDavid Wu 					     0
351749c55878SDavid Wu 			    ),
351849c55878SDavid Wu 	PIN_BANK_IOMUX_FLAGS(5, 32, "gpio5", IOMUX_UNROUTED,
351949c55878SDavid Wu 					     0,
352049c55878SDavid Wu 					     0,
352149c55878SDavid Wu 					     IOMUX_UNROUTED
352249c55878SDavid Wu 			    ),
352349c55878SDavid Wu 	PIN_BANK_IOMUX_FLAGS(6, 32, "gpio6", 0, 0, 0, IOMUX_UNROUTED),
352449c55878SDavid Wu 	PIN_BANK_IOMUX_FLAGS(7, 32, "gpio7", 0,
352549c55878SDavid Wu 					     0,
352649c55878SDavid Wu 					     IOMUX_WIDTH_4BIT,
352749c55878SDavid Wu 					     IOMUX_UNROUTED
352849c55878SDavid Wu 			    ),
352949c55878SDavid Wu 	PIN_BANK(8, 16, "gpio8"),
353049c55878SDavid Wu };
353149c55878SDavid Wu 
353213c03cb6SJianqun Xu static const struct rockchip_pin_ctrl rk3288_pin_ctrl = {
353349c55878SDavid Wu 	.pin_banks		= rk3288_pin_banks,
353449c55878SDavid Wu 	.nr_banks		= ARRAY_SIZE(rk3288_pin_banks),
3535*2f6aff58SJianqun Xu 	.nr_pins		= 264,
353649c55878SDavid Wu 	.label			= "RK3288-GPIO",
353749c55878SDavid Wu 	.type			= RK3288,
353849c55878SDavid Wu 	.grf_mux_offset		= 0x0,
353949c55878SDavid Wu 	.pmu_mux_offset		= 0x84,
354049c55878SDavid Wu 	.iomux_routes		= rk3288_mux_route_data,
354149c55878SDavid Wu 	.niomux_routes		= ARRAY_SIZE(rk3288_mux_route_data),
354249c55878SDavid Wu 	.pull_calc_reg		= rk3288_calc_pull_reg_and_bit,
354349c55878SDavid Wu 	.drv_calc_reg		= rk3288_calc_drv_reg_and_bit,
354449c55878SDavid Wu };
354549c55878SDavid Wu 
3546b3077611SDavid Wu static struct rockchip_pin_bank rk3308_pin_banks[] = {
3547b3077611SDavid Wu 	PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0", IOMUX_8WIDTH_2BIT,
3548b3077611SDavid Wu 					     IOMUX_8WIDTH_2BIT,
3549b3077611SDavid Wu 					     IOMUX_8WIDTH_2BIT,
3550b3077611SDavid Wu 					     IOMUX_8WIDTH_2BIT),
3551b3077611SDavid Wu 	PIN_BANK_IOMUX_FLAGS(1, 32, "gpio1", IOMUX_8WIDTH_2BIT,
3552b3077611SDavid Wu 					     IOMUX_8WIDTH_2BIT,
3553b3077611SDavid Wu 					     IOMUX_8WIDTH_2BIT,
3554b3077611SDavid Wu 					     IOMUX_8WIDTH_2BIT),
3555b3077611SDavid Wu 	PIN_BANK_IOMUX_FLAGS(2, 32, "gpio2", IOMUX_8WIDTH_2BIT,
3556b3077611SDavid Wu 					     IOMUX_8WIDTH_2BIT,
3557b3077611SDavid Wu 					     IOMUX_8WIDTH_2BIT,
3558b3077611SDavid Wu 					     IOMUX_8WIDTH_2BIT),
3559b3077611SDavid Wu 	PIN_BANK_IOMUX_FLAGS(3, 32, "gpio3", IOMUX_8WIDTH_2BIT,
3560b3077611SDavid Wu 					     IOMUX_8WIDTH_2BIT,
3561b3077611SDavid Wu 					     IOMUX_8WIDTH_2BIT,
3562b3077611SDavid Wu 					     IOMUX_8WIDTH_2BIT),
3563b3077611SDavid Wu 	PIN_BANK_IOMUX_FLAGS(4, 32, "gpio4", IOMUX_8WIDTH_2BIT,
3564b3077611SDavid Wu 					     IOMUX_8WIDTH_2BIT,
3565b3077611SDavid Wu 					     IOMUX_8WIDTH_2BIT,
3566b3077611SDavid Wu 					     IOMUX_8WIDTH_2BIT),
3567b3077611SDavid Wu };
3568b3077611SDavid Wu 
3569b3077611SDavid Wu static struct rockchip_pin_ctrl rk3308_pin_ctrl = {
3570b3077611SDavid Wu 		.pin_banks		= rk3308_pin_banks,
3571b3077611SDavid Wu 		.nr_banks		= ARRAY_SIZE(rk3308_pin_banks),
3572e21613fbSJianqun Xu 		.nr_pins		= 160,
3573b3077611SDavid Wu 		.label			= "RK3308-GPIO",
3574b3077611SDavid Wu 		.type			= RK3308,
3575b3077611SDavid Wu 		.grf_mux_offset		= 0x0,
3576b3077611SDavid Wu 		.iomux_recalced		= rk3308_mux_recalced_data,
3577b3077611SDavid Wu 		.niomux_recalced	= ARRAY_SIZE(rk3308_mux_recalced_data),
3578b3077611SDavid Wu 		.iomux_routes		= rk3308_mux_route_data,
3579b3077611SDavid Wu 		.niomux_routes		= ARRAY_SIZE(rk3308_mux_route_data),
358013c03cb6SJianqun Xu 		.pull_calc_reg		= rk3308_calc_pull_reg_and_bit,
358113c03cb6SJianqun Xu 		.drv_calc_reg		= rk3308_calc_drv_reg_and_bit,
358213c03cb6SJianqun Xu 		.schmitt_calc_reg	= rk3308_calc_schmitt_reg_and_bit,
358313c03cb6SJianqun Xu };
358413c03cb6SJianqun Xu 
358513c03cb6SJianqun Xu static const struct rockchip_pin_ctrl rk3308b_pin_ctrl = {
358613c03cb6SJianqun Xu 	.pin_banks		= rk3308_pin_banks,
358713c03cb6SJianqun Xu 	.nr_banks		= ARRAY_SIZE(rk3308_pin_banks),
358813c03cb6SJianqun Xu 	.nr_pins		= 160,
358913c03cb6SJianqun Xu 	.label			= "RK3308-GPIO",
359013c03cb6SJianqun Xu 	.type			= RK3308,
359113c03cb6SJianqun Xu 	.grf_mux_offset		= 0x0,
359213c03cb6SJianqun Xu 	.iomux_recalced		= rk3308b_mux_recalced_data,
359313c03cb6SJianqun Xu 	.niomux_recalced	= ARRAY_SIZE(rk3308b_mux_recalced_data),
359413c03cb6SJianqun Xu 	.iomux_routes		= rk3308b_mux_route_data,
359513c03cb6SJianqun Xu 	.niomux_routes		= ARRAY_SIZE(rk3308b_mux_route_data),
3596d5517017SDavid Wu 	.soc_data_init		= rk3308b_soc_data_init,
3597b3077611SDavid Wu 	.pull_calc_reg		= rk3308_calc_pull_reg_and_bit,
3598b3077611SDavid Wu 	.drv_calc_reg		= rk3308_calc_drv_reg_and_bit,
3599b3077611SDavid Wu 	.schmitt_calc_reg	= rk3308_calc_schmitt_reg_and_bit,
3600b3077611SDavid Wu };
3601b3077611SDavid Wu 
360249c55878SDavid Wu static struct rockchip_pin_bank rk3328_pin_banks[] = {
360349c55878SDavid Wu 	PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0", 0, 0, 0, 0),
360449c55878SDavid Wu 	PIN_BANK_IOMUX_FLAGS(1, 32, "gpio1", 0, 0, 0, 0),
360549c55878SDavid Wu 	PIN_BANK_IOMUX_FLAGS(2, 32, "gpio2", 0,
360649c55878SDavid Wu 			     IOMUX_WIDTH_3BIT,
360749c55878SDavid Wu 			     IOMUX_WIDTH_3BIT,
360849c55878SDavid Wu 			     0),
360949c55878SDavid Wu 	PIN_BANK_IOMUX_FLAGS(3, 32, "gpio3",
361049c55878SDavid Wu 			     IOMUX_WIDTH_3BIT,
361149c55878SDavid Wu 			     IOMUX_WIDTH_3BIT,
361249c55878SDavid Wu 			     0,
361349c55878SDavid Wu 			     0),
361449c55878SDavid Wu };
361549c55878SDavid Wu 
361613c03cb6SJianqun Xu static const struct rockchip_pin_ctrl rk3328_pin_ctrl = {
361749c55878SDavid Wu 	.pin_banks		= rk3328_pin_banks,
361849c55878SDavid Wu 	.nr_banks		= ARRAY_SIZE(rk3328_pin_banks),
361913c03cb6SJianqun Xu 	.nr_pins		= 128,
362049c55878SDavid Wu 	.label			= "RK3328-GPIO",
362149c55878SDavid Wu 	.type			= RK3288,
362249c55878SDavid Wu 	.grf_mux_offset		= 0x0,
362349c55878SDavid Wu 	.iomux_recalced		= rk3328_mux_recalced_data,
362449c55878SDavid Wu 	.niomux_recalced	= ARRAY_SIZE(rk3328_mux_recalced_data),
362549c55878SDavid Wu 	.iomux_routes		= rk3328_mux_route_data,
362649c55878SDavid Wu 	.niomux_routes		= ARRAY_SIZE(rk3328_mux_route_data),
362749c55878SDavid Wu 	.pull_calc_reg		= rk3228_calc_pull_reg_and_bit,
362849c55878SDavid Wu 	.drv_calc_reg		= rk3228_calc_drv_reg_and_bit,
362949c55878SDavid Wu 	.schmitt_calc_reg	= rk3328_calc_schmitt_reg_and_bit,
363049c55878SDavid Wu };
363149c55878SDavid Wu 
363249c55878SDavid Wu static struct rockchip_pin_bank rk3368_pin_banks[] = {
363349c55878SDavid Wu 	PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0", IOMUX_SOURCE_PMU,
363449c55878SDavid Wu 					     IOMUX_SOURCE_PMU,
363549c55878SDavid Wu 					     IOMUX_SOURCE_PMU,
363649c55878SDavid Wu 					     IOMUX_SOURCE_PMU
363749c55878SDavid Wu 			    ),
363849c55878SDavid Wu 	PIN_BANK(1, 32, "gpio1"),
363949c55878SDavid Wu 	PIN_BANK(2, 32, "gpio2"),
364049c55878SDavid Wu 	PIN_BANK(3, 32, "gpio3"),
364149c55878SDavid Wu };
364249c55878SDavid Wu 
364313c03cb6SJianqun Xu static const struct rockchip_pin_ctrl rk3368_pin_ctrl = {
364449c55878SDavid Wu 	.pin_banks		= rk3368_pin_banks,
364549c55878SDavid Wu 	.nr_banks		= ARRAY_SIZE(rk3368_pin_banks),
364613c03cb6SJianqun Xu 	.nr_pins		= 128,
364749c55878SDavid Wu 	.label			= "RK3368-GPIO",
364849c55878SDavid Wu 	.type			= RK3368,
364949c55878SDavid Wu 	.grf_mux_offset		= 0x0,
365049c55878SDavid Wu 	.pmu_mux_offset		= 0x0,
365149c55878SDavid Wu 	.pull_calc_reg		= rk3368_calc_pull_reg_and_bit,
365249c55878SDavid Wu 	.drv_calc_reg		= rk3368_calc_drv_reg_and_bit,
365349c55878SDavid Wu };
365449c55878SDavid Wu 
365549c55878SDavid Wu static struct rockchip_pin_bank rk3399_pin_banks[] = {
365649c55878SDavid Wu 	PIN_BANK_IOMUX_FLAGS_DRV_FLAGS_OFFSET_PULL_FLAGS(0, 32, "gpio0",
365749c55878SDavid Wu 							 IOMUX_SOURCE_PMU,
365849c55878SDavid Wu 							 IOMUX_SOURCE_PMU,
365949c55878SDavid Wu 							 IOMUX_SOURCE_PMU,
366049c55878SDavid Wu 							 IOMUX_SOURCE_PMU,
366149c55878SDavid Wu 							 DRV_TYPE_IO_1V8_ONLY,
366249c55878SDavid Wu 							 DRV_TYPE_IO_1V8_ONLY,
366349c55878SDavid Wu 							 DRV_TYPE_IO_DEFAULT,
366449c55878SDavid Wu 							 DRV_TYPE_IO_DEFAULT,
366549c55878SDavid Wu 							 0x80,
366649c55878SDavid Wu 							 0x88,
366749c55878SDavid Wu 							 -1,
366849c55878SDavid Wu 							 -1,
366949c55878SDavid Wu 							 PULL_TYPE_IO_1V8_ONLY,
367049c55878SDavid Wu 							 PULL_TYPE_IO_1V8_ONLY,
367149c55878SDavid Wu 							 PULL_TYPE_IO_DEFAULT,
367249c55878SDavid Wu 							 PULL_TYPE_IO_DEFAULT
367349c55878SDavid Wu 							),
367449c55878SDavid Wu 	PIN_BANK_IOMUX_DRV_FLAGS_OFFSET(1, 32, "gpio1", IOMUX_SOURCE_PMU,
367549c55878SDavid Wu 					IOMUX_SOURCE_PMU,
367649c55878SDavid Wu 					IOMUX_SOURCE_PMU,
367749c55878SDavid Wu 					IOMUX_SOURCE_PMU,
367849c55878SDavid Wu 					DRV_TYPE_IO_1V8_OR_3V0,
367949c55878SDavid Wu 					DRV_TYPE_IO_1V8_OR_3V0,
368049c55878SDavid Wu 					DRV_TYPE_IO_1V8_OR_3V0,
368149c55878SDavid Wu 					DRV_TYPE_IO_1V8_OR_3V0,
368249c55878SDavid Wu 					0xa0,
368349c55878SDavid Wu 					0xa8,
368449c55878SDavid Wu 					0xb0,
368549c55878SDavid Wu 					0xb8
368649c55878SDavid Wu 					),
368749c55878SDavid Wu 	PIN_BANK_DRV_FLAGS_PULL_FLAGS(2, 32, "gpio2", DRV_TYPE_IO_1V8_OR_3V0,
368849c55878SDavid Wu 				      DRV_TYPE_IO_1V8_OR_3V0,
368949c55878SDavid Wu 				      DRV_TYPE_IO_1V8_ONLY,
369049c55878SDavid Wu 				      DRV_TYPE_IO_1V8_ONLY,
369149c55878SDavid Wu 				      PULL_TYPE_IO_DEFAULT,
369249c55878SDavid Wu 				      PULL_TYPE_IO_DEFAULT,
369349c55878SDavid Wu 				      PULL_TYPE_IO_1V8_ONLY,
369449c55878SDavid Wu 				      PULL_TYPE_IO_1V8_ONLY
369549c55878SDavid Wu 				      ),
369649c55878SDavid Wu 	PIN_BANK_DRV_FLAGS(3, 32, "gpio3", DRV_TYPE_IO_3V3_ONLY,
369749c55878SDavid Wu 			   DRV_TYPE_IO_3V3_ONLY,
369849c55878SDavid Wu 			   DRV_TYPE_IO_3V3_ONLY,
369949c55878SDavid Wu 			   DRV_TYPE_IO_1V8_OR_3V0
370049c55878SDavid Wu 			   ),
370149c55878SDavid Wu 	PIN_BANK_DRV_FLAGS(4, 32, "gpio4", DRV_TYPE_IO_1V8_OR_3V0,
370249c55878SDavid Wu 			   DRV_TYPE_IO_1V8_3V0_AUTO,
370349c55878SDavid Wu 			   DRV_TYPE_IO_1V8_OR_3V0,
370449c55878SDavid Wu 			   DRV_TYPE_IO_1V8_OR_3V0
370549c55878SDavid Wu 			   ),
370649c55878SDavid Wu };
370749c55878SDavid Wu 
370813c03cb6SJianqun Xu static const struct rockchip_pin_ctrl rk3399_pin_ctrl = {
370949c55878SDavid Wu 	.pin_banks		= rk3399_pin_banks,
371049c55878SDavid Wu 	.nr_banks		= ARRAY_SIZE(rk3399_pin_banks),
371113c03cb6SJianqun Xu 	.nr_pins		= 160,
371249c55878SDavid Wu 	.label			= "RK3399-GPIO",
371349c55878SDavid Wu 	.type			= RK3399,
371449c55878SDavid Wu 	.grf_mux_offset		= 0xe000,
371549c55878SDavid Wu 	.pmu_mux_offset		= 0x0,
371649c55878SDavid Wu 	.grf_drv_offset		= 0xe100,
371749c55878SDavid Wu 	.pmu_drv_offset		= 0x80,
371849c55878SDavid Wu 	.iomux_routes		= rk3399_mux_route_data,
371949c55878SDavid Wu 	.niomux_routes		= ARRAY_SIZE(rk3399_mux_route_data),
372049c55878SDavid Wu 	.pull_calc_reg		= rk3399_calc_pull_reg_and_bit,
372149c55878SDavid Wu 	.drv_calc_reg		= rk3399_calc_drv_reg_and_bit,
372249c55878SDavid Wu };
372349c55878SDavid Wu 
372449c55878SDavid Wu static const struct udevice_id rockchip_pinctrl_dt_match[] = {
372549c55878SDavid Wu 	{ .compatible = "rockchip,px30-pinctrl",
372649c55878SDavid Wu 		.data = (ulong)&px30_pin_ctrl },
372749c55878SDavid Wu 	{ .compatible = "rockchip,rv1108-pinctrl",
372849c55878SDavid Wu 		.data = (ulong)&rv1108_pin_ctrl },
3729cf04a17bSJianqun Xu 	{ .compatible = "rockchip,rv1126-pinctrl",
3730cf04a17bSJianqun Xu 		.data = (ulong)&rv1126_pin_ctrl },
3731a2a3fc8fSJianqun Xu 	{ .compatible = "rockchip,rk1808-pinctrl",
3732a2a3fc8fSJianqun Xu 		.data = (ulong)&rk1808_pin_ctrl },
373349c55878SDavid Wu 	{ .compatible = "rockchip,rk2928-pinctrl",
373449c55878SDavid Wu 		.data = (ulong)&rk2928_pin_ctrl },
373549c55878SDavid Wu 	{ .compatible = "rockchip,rk3036-pinctrl",
373649c55878SDavid Wu 		.data = (ulong)&rk3036_pin_ctrl },
373749c55878SDavid Wu 	{ .compatible = "rockchip,rk3066a-pinctrl",
373849c55878SDavid Wu 		.data = (ulong)&rk3066a_pin_ctrl },
373949c55878SDavid Wu 	{ .compatible = "rockchip,rk3066b-pinctrl",
374049c55878SDavid Wu 		.data = (ulong)&rk3066b_pin_ctrl },
374149c55878SDavid Wu 	{ .compatible = "rockchip,rk3128-pinctrl",
374249c55878SDavid Wu 		.data = (ulong)&rk3128_pin_ctrl },
374349c55878SDavid Wu 	{ .compatible = "rockchip,rk3188-pinctrl",
374449c55878SDavid Wu 		.data = (ulong)&rk3188_pin_ctrl },
374549c55878SDavid Wu 	{ .compatible = "rockchip,rk3228-pinctrl",
374649c55878SDavid Wu 		.data = (ulong)&rk3228_pin_ctrl },
374749c55878SDavid Wu 	{ .compatible = "rockchip,rk3288-pinctrl",
374849c55878SDavid Wu 		.data = (ulong)&rk3288_pin_ctrl },
3749b3077611SDavid Wu 	{ .compatible = "rockchip,rk3308-pinctrl",
3750b3077611SDavid Wu 		.data = (ulong)&rk3308_pin_ctrl },
375149c55878SDavid Wu 	{ .compatible = "rockchip,rk3328-pinctrl",
375249c55878SDavid Wu 		.data = (ulong)&rk3328_pin_ctrl },
375349c55878SDavid Wu 	{ .compatible = "rockchip,rk3368-pinctrl",
375449c55878SDavid Wu 		.data = (ulong)&rk3368_pin_ctrl },
375549c55878SDavid Wu 	{ .compatible = "rockchip,rk3399-pinctrl",
375649c55878SDavid Wu 		.data = (ulong)&rk3399_pin_ctrl },
375749c55878SDavid Wu 	{},
375849c55878SDavid Wu };
375949c55878SDavid Wu 
376049c55878SDavid Wu U_BOOT_DRIVER(pinctrl_rockchip) = {
376149c55878SDavid Wu 	.name		= "rockchip_pinctrl",
376249c55878SDavid Wu 	.id		= UCLASS_PINCTRL,
376349c55878SDavid Wu 	.of_match	= rockchip_pinctrl_dt_match,
376449c55878SDavid Wu 	.priv_auto_alloc_size = sizeof(struct rockchip_pinctrl_priv),
376549c55878SDavid Wu 	.ops		= &rockchip_pinctrl_ops,
376649c55878SDavid Wu #if !CONFIG_IS_ENABLED(OF_PLATDATA)
376749c55878SDavid Wu 	.bind		= dm_scan_fdt_dev,
376849c55878SDavid Wu #endif
376949c55878SDavid Wu 	.probe		= rockchip_pinctrl_probe,
377049c55878SDavid Wu };
3771