xref: /rk3399_rockchip-uboot/drivers/pinctrl/pinctrl-rockchip.c (revision 878372fa05604423a654fc6c9a72ced24ae87727)
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,
74c066e3f7SJianqun Xu 	DRV_TYPE_IO_SMIC,
7549c55878SDavid Wu 	DRV_TYPE_MAX
7649c55878SDavid Wu };
7749c55878SDavid Wu 
7855a89bc6SDavid Wu #define PULL_TYPE_IO_MASK		GENMASK(31, 16)
7955a89bc6SDavid Wu #define PULL_TYPE_WRITABLE_32BIT	BIT(31)
8055a89bc6SDavid Wu 
8149c55878SDavid Wu /**
8249c55878SDavid Wu  * enum type index corresponding to rockchip_pull_list arrays index.
8349c55878SDavid Wu  */
8449c55878SDavid Wu enum rockchip_pin_pull_type {
8549c55878SDavid Wu 	PULL_TYPE_IO_DEFAULT = 0,
8649c55878SDavid Wu 	PULL_TYPE_IO_1V8_ONLY,
8749c55878SDavid Wu 	PULL_TYPE_MAX
8849c55878SDavid Wu };
8949c55878SDavid Wu 
9049c55878SDavid Wu /**
9149e04eddSJianqun Xu  * enum mux route register type, should be invalid/default/topgrf/pmugrf.
9249e04eddSJianqun Xu  * INVALID: means do not need to set mux route
9349e04eddSJianqun Xu  * DEFAULT: means same regmap as pin iomux
9449e04eddSJianqun Xu  * TOPGRF: means mux route setting in topgrf
9549e04eddSJianqun Xu  * PMUGRF: means mux route setting in pmugrf
9649e04eddSJianqun Xu  */
9749e04eddSJianqun Xu enum rockchip_pin_route_type {
9849e04eddSJianqun Xu 	ROUTE_TYPE_DEFAULT = 0,
9949e04eddSJianqun Xu 	ROUTE_TYPE_TOPGRF = 1,
10049e04eddSJianqun Xu 	ROUTE_TYPE_PMUGRF = 2,
10149e04eddSJianqun Xu 
10249e04eddSJianqun Xu 	ROUTE_TYPE_INVALID = -1,
10349e04eddSJianqun Xu };
10449e04eddSJianqun Xu 
10549e04eddSJianqun Xu /**
10649c55878SDavid Wu  * @drv_type: drive strength variant using rockchip_perpin_drv_type
10749c55878SDavid Wu  * @offset: if initialized to -1 it will be autocalculated, by specifying
10849c55878SDavid Wu  *	    an initial offset value the relevant source offset can be reset
10949c55878SDavid Wu  *	    to a new value for autocalculating the following drive strength
11049c55878SDavid Wu  *	    registers. if used chips own cal_drv func instead to calculate
11149c55878SDavid Wu  *	    registers offset, the variant could be ignored.
11249c55878SDavid Wu  */
11349c55878SDavid Wu struct rockchip_drv {
11449c55878SDavid Wu 	enum rockchip_pin_drv_type	drv_type;
11549c55878SDavid Wu 	int				offset;
11649c55878SDavid Wu };
11749c55878SDavid Wu 
11849c55878SDavid Wu /**
11949c55878SDavid Wu  * @priv: common pinctrl private basedata
12049c55878SDavid Wu  * @pin_base: first pin number
12149c55878SDavid Wu  * @nr_pins: number of pins in this bank
12249c55878SDavid Wu  * @name: name of the bank
12349c55878SDavid Wu  * @bank_num: number of the bank, to account for holes
12449c55878SDavid Wu  * @iomux: array describing the 4 iomux sources of the bank
12549c55878SDavid Wu  * @drv: array describing the 4 drive strength sources of the bank
12649c55878SDavid Wu  * @pull_type: array describing the 4 pull type sources of the bank
12749c55878SDavid Wu  * @recalced_mask: bits describing the mux recalced pins of per bank
12849c55878SDavid Wu  * @route_mask: bits describing the routing pins of per bank
12949c55878SDavid Wu  */
13049c55878SDavid Wu struct rockchip_pin_bank {
13149c55878SDavid Wu 	struct rockchip_pinctrl_priv	*priv;
13249c55878SDavid Wu 	u32				pin_base;
13349c55878SDavid Wu 	u8				nr_pins;
13449c55878SDavid Wu 	char				*name;
13549c55878SDavid Wu 	u8				bank_num;
13649c55878SDavid Wu 	struct rockchip_iomux		iomux[4];
13749c55878SDavid Wu 	struct rockchip_drv		drv[4];
13849c55878SDavid Wu 	enum rockchip_pin_pull_type	pull_type[4];
13949c55878SDavid Wu 	u32				recalced_mask;
14049c55878SDavid Wu 	u32				route_mask;
14149c55878SDavid Wu };
14249c55878SDavid Wu 
14349c55878SDavid Wu #define PIN_BANK(id, pins, label)			\
14449c55878SDavid Wu 	{						\
14549c55878SDavid Wu 		.bank_num	= id,			\
14649c55878SDavid Wu 		.nr_pins	= pins,			\
14749c55878SDavid Wu 		.name		= label,		\
14849c55878SDavid Wu 		.iomux		= {			\
14949c55878SDavid Wu 			{ .offset = -1 },		\
15049c55878SDavid Wu 			{ .offset = -1 },		\
15149c55878SDavid Wu 			{ .offset = -1 },		\
15249c55878SDavid Wu 			{ .offset = -1 },		\
15349c55878SDavid Wu 		},					\
15449c55878SDavid Wu 	}
15549c55878SDavid Wu 
15649c55878SDavid Wu #define PIN_BANK_IOMUX_FLAGS(id, pins, label, iom0, iom1, iom2, iom3)	\
15749c55878SDavid Wu 	{								\
15849c55878SDavid Wu 		.bank_num	= id,					\
15949c55878SDavid Wu 		.nr_pins	= pins,					\
16049c55878SDavid Wu 		.name		= label,				\
16149c55878SDavid Wu 		.iomux		= {					\
16249c55878SDavid Wu 			{ .type = iom0, .offset = -1 },			\
16349c55878SDavid Wu 			{ .type = iom1, .offset = -1 },			\
16449c55878SDavid Wu 			{ .type = iom2, .offset = -1 },			\
16549c55878SDavid Wu 			{ .type = iom3, .offset = -1 },			\
16649c55878SDavid Wu 		},							\
16749c55878SDavid Wu 	}
16849c55878SDavid Wu 
169d499d466SJianqun Xu #define PIN_BANK_IOMUX_FLAGS_OFFSET(id, pins, label, iom0, iom1, iom2,	\
170d499d466SJianqun Xu 				    iom3, offset0, offset1, offset2,	\
171d499d466SJianqun Xu 				    offset3)				\
172d499d466SJianqun Xu 	{								\
173d499d466SJianqun Xu 		.bank_num	= id,					\
174d499d466SJianqun Xu 		.nr_pins	= pins,					\
175d499d466SJianqun Xu 		.name		= label,				\
176d499d466SJianqun Xu 		.iomux		= {					\
177d499d466SJianqun Xu 			{ .type = iom0, .offset = offset0 },		\
178d499d466SJianqun Xu 			{ .type = iom1, .offset = offset1 },		\
179d499d466SJianqun Xu 			{ .type = iom2, .offset = offset2 },		\
180d499d466SJianqun Xu 			{ .type = iom3, .offset = offset3 },		\
181d499d466SJianqun Xu 		},							\
182d499d466SJianqun Xu 	}
183d499d466SJianqun Xu 
18449c55878SDavid Wu #define PIN_BANK_DRV_FLAGS(id, pins, label, type0, type1, type2, type3) \
18549c55878SDavid Wu 	{								\
18649c55878SDavid Wu 		.bank_num	= id,					\
18749c55878SDavid Wu 		.nr_pins	= pins,					\
18849c55878SDavid Wu 		.name		= label,				\
18949c55878SDavid Wu 		.iomux		= {					\
19049c55878SDavid Wu 			{ .offset = -1 },				\
19149c55878SDavid Wu 			{ .offset = -1 },				\
19249c55878SDavid Wu 			{ .offset = -1 },				\
19349c55878SDavid Wu 			{ .offset = -1 },				\
19449c55878SDavid Wu 		},							\
19549c55878SDavid Wu 		.drv		= {					\
19649c55878SDavid Wu 			{ .drv_type = type0, .offset = -1 },		\
19749c55878SDavid Wu 			{ .drv_type = type1, .offset = -1 },		\
19849c55878SDavid Wu 			{ .drv_type = type2, .offset = -1 },		\
19949c55878SDavid Wu 			{ .drv_type = type3, .offset = -1 },		\
20049c55878SDavid Wu 		},							\
20149c55878SDavid Wu 	}
20249c55878SDavid Wu 
20349c55878SDavid Wu #define PIN_BANK_DRV_FLAGS_PULL_FLAGS(id, pins, label, drv0, drv1,	\
20449c55878SDavid Wu 				      drv2, drv3, pull0, pull1,		\
20549c55878SDavid Wu 				      pull2, pull3)			\
20649c55878SDavid Wu 	{								\
20749c55878SDavid Wu 		.bank_num	= id,					\
20849c55878SDavid Wu 		.nr_pins	= pins,					\
20949c55878SDavid Wu 		.name		= label,				\
21049c55878SDavid Wu 		.iomux		= {					\
21149c55878SDavid Wu 			{ .offset = -1 },				\
21249c55878SDavid Wu 			{ .offset = -1 },				\
21349c55878SDavid Wu 			{ .offset = -1 },				\
21449c55878SDavid Wu 			{ .offset = -1 },				\
21549c55878SDavid Wu 		},							\
21649c55878SDavid Wu 		.drv		= {					\
21749c55878SDavid Wu 			{ .drv_type = drv0, .offset = -1 },		\
21849c55878SDavid Wu 			{ .drv_type = drv1, .offset = -1 },		\
21949c55878SDavid Wu 			{ .drv_type = drv2, .offset = -1 },		\
22049c55878SDavid Wu 			{ .drv_type = drv3, .offset = -1 },		\
22149c55878SDavid Wu 		},							\
22249c55878SDavid Wu 		.pull_type[0] = pull0,					\
22349c55878SDavid Wu 		.pull_type[1] = pull1,					\
22449c55878SDavid Wu 		.pull_type[2] = pull2,					\
22549c55878SDavid Wu 		.pull_type[3] = pull3,					\
22649c55878SDavid Wu 	}
22749c55878SDavid Wu 
22849c55878SDavid Wu #define PIN_BANK_IOMUX_DRV_FLAGS_OFFSET(id, pins, label, iom0, iom1,	\
22949c55878SDavid Wu 					iom2, iom3, drv0, drv1, drv2,	\
23049c55878SDavid Wu 					drv3, offset0, offset1,		\
23149c55878SDavid Wu 					offset2, offset3)		\
23249c55878SDavid Wu 	{								\
23349c55878SDavid Wu 		.bank_num	= id,					\
23449c55878SDavid Wu 		.nr_pins	= pins,					\
23549c55878SDavid Wu 		.name		= label,				\
23649c55878SDavid Wu 		.iomux		= {					\
23749c55878SDavid Wu 			{ .type = iom0, .offset = -1 },			\
23849c55878SDavid Wu 			{ .type = iom1, .offset = -1 },			\
23949c55878SDavid Wu 			{ .type = iom2, .offset = -1 },			\
24049c55878SDavid Wu 			{ .type = iom3, .offset = -1 },			\
24149c55878SDavid Wu 		},							\
24249c55878SDavid Wu 		.drv		= {					\
24349c55878SDavid Wu 			{ .drv_type = drv0, .offset = offset0 },	\
24449c55878SDavid Wu 			{ .drv_type = drv1, .offset = offset1 },	\
24549c55878SDavid Wu 			{ .drv_type = drv2, .offset = offset2 },	\
24649c55878SDavid Wu 			{ .drv_type = drv3, .offset = offset3 },	\
24749c55878SDavid Wu 		},							\
24849c55878SDavid Wu 	}
24949c55878SDavid Wu 
25055a89bc6SDavid Wu #define PIN_BANK_IOMUX_DRV_PULL_FLAGS(id, pins, label, iom0, iom1,	\
25155a89bc6SDavid Wu 				      iom2, iom3, drv0, drv1, drv2,	\
25255a89bc6SDavid Wu 				      drv3, pull0, pull1, pull2,	\
25355a89bc6SDavid Wu 				      pull3)				\
25455a89bc6SDavid Wu 	{								\
25555a89bc6SDavid Wu 		.bank_num	= id,					\
25655a89bc6SDavid Wu 		.nr_pins	= pins,					\
25755a89bc6SDavid Wu 		.name		= label,				\
25855a89bc6SDavid Wu 		.iomux		= {					\
25955a89bc6SDavid Wu 			{ .type = iom0, .offset = -1 },			\
26055a89bc6SDavid Wu 			{ .type = iom1, .offset = -1 },			\
26155a89bc6SDavid Wu 			{ .type = iom2, .offset = -1 },			\
26255a89bc6SDavid Wu 			{ .type = iom3, .offset = -1 },			\
26355a89bc6SDavid Wu 		},							\
26455a89bc6SDavid Wu 		.drv		= {					\
26555a89bc6SDavid Wu 			{ .drv_type = drv0, .offset = -1 },		\
26655a89bc6SDavid Wu 			{ .drv_type = drv1, .offset = -1 },		\
26755a89bc6SDavid Wu 			{ .drv_type = drv2, .offset = -1 },		\
26855a89bc6SDavid Wu 			{ .drv_type = drv3, .offset = -1 },		\
26955a89bc6SDavid Wu 		},							\
27055a89bc6SDavid Wu 		.pull_type[0] = pull0,					\
27155a89bc6SDavid Wu 		.pull_type[1] = pull1,					\
27255a89bc6SDavid Wu 		.pull_type[2] = pull2,					\
27355a89bc6SDavid Wu 		.pull_type[3] = pull3,					\
27455a89bc6SDavid Wu 	}
27555a89bc6SDavid Wu 
27649c55878SDavid Wu #define PIN_BANK_IOMUX_FLAGS_DRV_FLAGS_OFFSET_PULL_FLAGS(id, pins,	\
27749c55878SDavid Wu 					      label, iom0, iom1, iom2,  \
27849c55878SDavid Wu 					      iom3, drv0, drv1, drv2,   \
27949c55878SDavid Wu 					      drv3, offset0, offset1,   \
28049c55878SDavid Wu 					      offset2, offset3, pull0,  \
28149c55878SDavid Wu 					      pull1, pull2, pull3)	\
28249c55878SDavid Wu 	{								\
28349c55878SDavid Wu 		.bank_num	= id,					\
28449c55878SDavid Wu 		.nr_pins	= pins,					\
28549c55878SDavid Wu 		.name		= label,				\
28649c55878SDavid Wu 		.iomux		= {					\
28749c55878SDavid Wu 			{ .type = iom0, .offset = -1 },			\
28849c55878SDavid Wu 			{ .type = iom1, .offset = -1 },			\
28949c55878SDavid Wu 			{ .type = iom2, .offset = -1 },			\
29049c55878SDavid Wu 			{ .type = iom3, .offset = -1 },			\
29149c55878SDavid Wu 		},							\
29249c55878SDavid Wu 		.drv		= {					\
29349c55878SDavid Wu 			{ .drv_type = drv0, .offset = offset0 },	\
29449c55878SDavid Wu 			{ .drv_type = drv1, .offset = offset1 },	\
29549c55878SDavid Wu 			{ .drv_type = drv2, .offset = offset2 },	\
29649c55878SDavid Wu 			{ .drv_type = drv3, .offset = offset3 },	\
29749c55878SDavid Wu 		},							\
29849c55878SDavid Wu 		.pull_type[0] = pull0,					\
29949c55878SDavid Wu 		.pull_type[1] = pull1,					\
30049c55878SDavid Wu 		.pull_type[2] = pull2,					\
30149c55878SDavid Wu 		.pull_type[3] = pull3,					\
30249c55878SDavid Wu 	}
30349c55878SDavid Wu 
30449e04eddSJianqun Xu #define PIN_BANK_MUX_ROUTE_FLAGS(ID, PIN, FUNC, REG, VAL, FLAG)		\
305d499d466SJianqun Xu 	{								\
306d499d466SJianqun Xu 		.bank_num	= ID,					\
307d499d466SJianqun Xu 		.pin		= PIN,					\
308d499d466SJianqun Xu 		.func		= FUNC,					\
309d499d466SJianqun Xu 		.route_offset	= REG,					\
310d499d466SJianqun Xu 		.route_val	= VAL,					\
31149e04eddSJianqun Xu 		.route_type	= FLAG,					\
312d499d466SJianqun Xu 	}
313d499d466SJianqun Xu 
31449e04eddSJianqun Xu #define MR_DEFAULT(ID, PIN, FUNC, REG, VAL)	\
31549e04eddSJianqun Xu 	PIN_BANK_MUX_ROUTE_FLAGS(ID, PIN, FUNC, REG, VAL, ROUTE_TYPE_DEFAULT)
31649e04eddSJianqun Xu 
31749e04eddSJianqun Xu #define MR_TOPGRF(ID, PIN, FUNC, REG, VAL)	\
31849e04eddSJianqun Xu 	PIN_BANK_MUX_ROUTE_FLAGS(ID, PIN, FUNC, REG, VAL, ROUTE_TYPE_TOPGRF)
31949e04eddSJianqun Xu 
32049e04eddSJianqun Xu #define MR_PMUGRF(ID, PIN, FUNC, REG, VAL)	\
32149e04eddSJianqun Xu 	PIN_BANK_MUX_ROUTE_FLAGS(ID, PIN, FUNC, REG, VAL, ROUTE_TYPE_PMUGRF)
32249e04eddSJianqun Xu 
32349c55878SDavid Wu /**
32449c55878SDavid Wu  * struct rockchip_mux_recalced_data: represent a pin iomux data.
32549c55878SDavid Wu  * @num: bank number.
32649c55878SDavid Wu  * @pin: pin number.
32749c55878SDavid Wu  * @bit: index at register.
32849c55878SDavid Wu  * @reg: register offset.
32949c55878SDavid Wu  * @mask: mask bit
33049c55878SDavid Wu  */
33149c55878SDavid Wu struct rockchip_mux_recalced_data {
33249c55878SDavid Wu 	u8 num;
33349c55878SDavid Wu 	u8 pin;
33449c55878SDavid Wu 	u32 reg;
33549c55878SDavid Wu 	u8 bit;
33649c55878SDavid Wu 	u8 mask;
33749c55878SDavid Wu };
33849c55878SDavid Wu 
33949c55878SDavid Wu /**
34049c55878SDavid Wu  * struct rockchip_mux_recalced_data: represent a pin iomux data.
34149c55878SDavid Wu  * @bank_num: bank number.
34249c55878SDavid Wu  * @pin: index at register or used to calc index.
34349c55878SDavid Wu  * @func: the min pin.
34449e04eddSJianqun Xu  * @route_type: the register type.
34549c55878SDavid Wu  * @route_offset: the max pin.
34649c55878SDavid Wu  * @route_val: the register offset.
34749c55878SDavid Wu  */
34849c55878SDavid Wu struct rockchip_mux_route_data {
34949c55878SDavid Wu 	u8 bank_num;
35049c55878SDavid Wu 	u8 pin;
35149c55878SDavid Wu 	u8 func;
35249e04eddSJianqun Xu 	enum rockchip_pin_route_type route_type : 8;
35349c55878SDavid Wu 	u32 route_offset;
35449c55878SDavid Wu 	u32 route_val;
35549c55878SDavid Wu };
35649c55878SDavid Wu 
35749c55878SDavid Wu /**
35849c55878SDavid Wu  */
35949c55878SDavid Wu struct rockchip_pin_ctrl {
36049c55878SDavid Wu 	struct rockchip_pin_bank	*pin_banks;
36149c55878SDavid Wu 	u32				nr_banks;
36249c55878SDavid Wu 	u32				nr_pins;
36349c55878SDavid Wu 	char				*label;
36449c55878SDavid Wu 	enum rockchip_pinctrl_type	type;
36549c55878SDavid Wu 	int				grf_mux_offset;
36649c55878SDavid Wu 	int				pmu_mux_offset;
36749c55878SDavid Wu 	int				grf_drv_offset;
36849c55878SDavid Wu 	int				pmu_drv_offset;
36949c55878SDavid Wu 	struct rockchip_mux_recalced_data *iomux_recalced;
37049c55878SDavid Wu 	u32				niomux_recalced;
37149c55878SDavid Wu 	struct rockchip_mux_route_data *iomux_routes;
37249c55878SDavid Wu 	u32				niomux_routes;
37349c55878SDavid Wu 
37413c03cb6SJianqun Xu 	int	(*ctrl_data_re_init)(const struct rockchip_pin_ctrl *ctrl);
375d5517017SDavid Wu 
376d5517017SDavid Wu 	int	(*soc_data_init)(struct rockchip_pinctrl_priv *info);
377d5517017SDavid Wu 
37849c55878SDavid Wu 	void	(*pull_calc_reg)(struct rockchip_pin_bank *bank,
37949c55878SDavid Wu 				 int pin_num, struct regmap **regmap,
38049c55878SDavid Wu 				 int *reg, u8 *bit);
38149c55878SDavid Wu 	void	(*drv_calc_reg)(struct rockchip_pin_bank *bank,
38249c55878SDavid Wu 				int pin_num, struct regmap **regmap,
38349c55878SDavid Wu 				int *reg, u8 *bit);
38449c55878SDavid Wu 	int	(*schmitt_calc_reg)(struct rockchip_pin_bank *bank,
38549c55878SDavid Wu 				    int pin_num, struct regmap **regmap,
38649c55878SDavid Wu 				    int *reg, u8 *bit);
38732c25d1fSDavid Wu 	int	(*slew_rate_calc_reg)(struct rockchip_pin_bank *bank,
38832c25d1fSDavid Wu 				      int pin_num, struct regmap **regmap,
38932c25d1fSDavid Wu 				      int *reg, u8 *bit);
39049c55878SDavid Wu };
39149c55878SDavid Wu 
39249c55878SDavid Wu /**
39349c55878SDavid Wu  */
39449c55878SDavid Wu struct rockchip_pinctrl_priv {
39549c55878SDavid Wu 	struct rockchip_pin_ctrl	*ctrl;
39649c55878SDavid Wu 	struct regmap			*regmap_base;
39749c55878SDavid Wu 	struct regmap			*regmap_pmu;
39849c55878SDavid Wu 
39949c55878SDavid Wu };
40049c55878SDavid Wu 
rockchip_verify_config(struct udevice * dev,u32 bank,u32 pin)40149c55878SDavid Wu static int rockchip_verify_config(struct udevice *dev, u32 bank, u32 pin)
40249c55878SDavid Wu {
40349c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = dev_get_priv(dev);
40449c55878SDavid Wu 	struct rockchip_pin_ctrl *ctrl = priv->ctrl;
40549c55878SDavid Wu 
40649c55878SDavid Wu 	if (bank >= ctrl->nr_banks) {
40749c55878SDavid Wu 		debug("pin conf bank %d >= nbanks %d\n", bank, ctrl->nr_banks);
40849c55878SDavid Wu 		return -EINVAL;
40949c55878SDavid Wu 	}
41049c55878SDavid Wu 
41149c55878SDavid Wu 	if (pin >= MAX_ROCKCHIP_GPIO_PER_BANK) {
41249c55878SDavid Wu 		debug("pin conf pin %d >= %d\n", pin,
41349c55878SDavid Wu 		      MAX_ROCKCHIP_GPIO_PER_BANK);
41449c55878SDavid Wu 		return -EINVAL;
41549c55878SDavid Wu 	}
41649c55878SDavid Wu 
41749c55878SDavid Wu 	return 0;
41849c55878SDavid Wu }
41949c55878SDavid Wu 
42049c55878SDavid Wu static struct rockchip_mux_recalced_data rv1108_mux_recalced_data[] = {
42149c55878SDavid Wu 	{
42249c55878SDavid Wu 		.num = 1,
42349c55878SDavid Wu 		.pin = 0,
42449c55878SDavid Wu 		.reg = 0x418,
42549c55878SDavid Wu 		.bit = 0,
42649c55878SDavid Wu 		.mask = 0x3
42749c55878SDavid Wu 	}, {
42849c55878SDavid Wu 		.num = 1,
42949c55878SDavid Wu 		.pin = 1,
43049c55878SDavid Wu 		.reg = 0x418,
43149c55878SDavid Wu 		.bit = 2,
43249c55878SDavid Wu 		.mask = 0x3
43349c55878SDavid Wu 	}, {
43449c55878SDavid Wu 		.num = 1,
43549c55878SDavid Wu 		.pin = 2,
43649c55878SDavid Wu 		.reg = 0x418,
43749c55878SDavid Wu 		.bit = 4,
43849c55878SDavid Wu 		.mask = 0x3
43949c55878SDavid Wu 	}, {
44049c55878SDavid Wu 		.num = 1,
44149c55878SDavid Wu 		.pin = 3,
44249c55878SDavid Wu 		.reg = 0x418,
44349c55878SDavid Wu 		.bit = 6,
44449c55878SDavid Wu 		.mask = 0x3
44549c55878SDavid Wu 	}, {
44649c55878SDavid Wu 		.num = 1,
44749c55878SDavid Wu 		.pin = 4,
44849c55878SDavid Wu 		.reg = 0x418,
44949c55878SDavid Wu 		.bit = 8,
45049c55878SDavid Wu 		.mask = 0x3
45149c55878SDavid Wu 	}, {
45249c55878SDavid Wu 		.num = 1,
45349c55878SDavid Wu 		.pin = 5,
45449c55878SDavid Wu 		.reg = 0x418,
45549c55878SDavid Wu 		.bit = 10,
45649c55878SDavid Wu 		.mask = 0x3
45749c55878SDavid Wu 	}, {
45849c55878SDavid Wu 		.num = 1,
45949c55878SDavid Wu 		.pin = 6,
46049c55878SDavid Wu 		.reg = 0x418,
46149c55878SDavid Wu 		.bit = 12,
46249c55878SDavid Wu 		.mask = 0x3
46349c55878SDavid Wu 	}, {
46449c55878SDavid Wu 		.num = 1,
46549c55878SDavid Wu 		.pin = 7,
46649c55878SDavid Wu 		.reg = 0x418,
46749c55878SDavid Wu 		.bit = 14,
46849c55878SDavid Wu 		.mask = 0x3
46949c55878SDavid Wu 	}, {
47049c55878SDavid Wu 		.num = 1,
47149c55878SDavid Wu 		.pin = 8,
47249c55878SDavid Wu 		.reg = 0x41c,
47349c55878SDavid Wu 		.bit = 0,
47449c55878SDavid Wu 		.mask = 0x3
47549c55878SDavid Wu 	}, {
47649c55878SDavid Wu 		.num = 1,
47749c55878SDavid Wu 		.pin = 9,
47849c55878SDavid Wu 		.reg = 0x41c,
47949c55878SDavid Wu 		.bit = 2,
48049c55878SDavid Wu 		.mask = 0x3
48149c55878SDavid Wu 	},
48249c55878SDavid Wu };
48349c55878SDavid Wu 
484cf04a17bSJianqun Xu static struct rockchip_mux_recalced_data rv1126_mux_recalced_data[] = {
485cf04a17bSJianqun Xu 	{
486cf04a17bSJianqun Xu 		.num = 0,
487cf04a17bSJianqun Xu 		.pin = 20,
488cf04a17bSJianqun Xu 		.reg = 0x10000,
489cf04a17bSJianqun Xu 		.bit = 0,
490cf04a17bSJianqun Xu 		.mask = 0xf
491cf04a17bSJianqun Xu 	},
492cf04a17bSJianqun Xu 	{
493cf04a17bSJianqun Xu 		.num = 0,
494cf04a17bSJianqun Xu 		.pin = 21,
495cf04a17bSJianqun Xu 		.reg = 0x10000,
496cf04a17bSJianqun Xu 		.bit = 4,
497cf04a17bSJianqun Xu 		.mask = 0xf
498cf04a17bSJianqun Xu 	},
499cf04a17bSJianqun Xu 	{
500cf04a17bSJianqun Xu 		.num = 0,
501cf04a17bSJianqun Xu 		.pin = 22,
502cf04a17bSJianqun Xu 		.reg = 0x10000,
503cf04a17bSJianqun Xu 		.bit = 8,
504cf04a17bSJianqun Xu 		.mask = 0xf
505cf04a17bSJianqun Xu 	},
506cf04a17bSJianqun Xu 	{
507cf04a17bSJianqun Xu 		.num = 0,
508cf04a17bSJianqun Xu 		.pin = 23,
509cf04a17bSJianqun Xu 		.reg = 0x10000,
510cf04a17bSJianqun Xu 		.bit = 12,
511cf04a17bSJianqun Xu 		.mask = 0xf
512cf04a17bSJianqun Xu 	},
513cf04a17bSJianqun Xu };
514cf04a17bSJianqun Xu 
51549c55878SDavid Wu static  struct rockchip_mux_recalced_data rk3128_mux_recalced_data[] = {
51649c55878SDavid Wu 	{
51749c55878SDavid Wu 		.num = 2,
51849c55878SDavid Wu 		.pin = 20,
51949c55878SDavid Wu 		.reg = 0xe8,
52049c55878SDavid Wu 		.bit = 0,
52149c55878SDavid Wu 		.mask = 0x7
52249c55878SDavid Wu 	}, {
52349c55878SDavid Wu 		.num = 2,
52449c55878SDavid Wu 		.pin = 21,
52549c55878SDavid Wu 		.reg = 0xe8,
52649c55878SDavid Wu 		.bit = 4,
52749c55878SDavid Wu 		.mask = 0x7
52849c55878SDavid Wu 	}, {
52949c55878SDavid Wu 		.num = 2,
53049c55878SDavid Wu 		.pin = 22,
53149c55878SDavid Wu 		.reg = 0xe8,
53249c55878SDavid Wu 		.bit = 8,
53349c55878SDavid Wu 		.mask = 0x7
53449c55878SDavid Wu 	}, {
53549c55878SDavid Wu 		.num = 2,
53649c55878SDavid Wu 		.pin = 23,
53749c55878SDavid Wu 		.reg = 0xe8,
53849c55878SDavid Wu 		.bit = 12,
53949c55878SDavid Wu 		.mask = 0x7
54049c55878SDavid Wu 	}, {
54149c55878SDavid Wu 		.num = 2,
54249c55878SDavid Wu 		.pin = 24,
54349c55878SDavid Wu 		.reg = 0xd4,
54449c55878SDavid Wu 		.bit = 12,
54549c55878SDavid Wu 		.mask = 0x7
54649c55878SDavid Wu 	},
54749c55878SDavid Wu };
54849c55878SDavid Wu 
549b3077611SDavid Wu static struct rockchip_mux_recalced_data rk3308_mux_recalced_data[] = {
550b3077611SDavid Wu 	{
551b3077611SDavid Wu 		.num = 1,
552b3077611SDavid Wu 		.pin = 14,
553b3077611SDavid Wu 		.reg = 0x28,
554b3077611SDavid Wu 		.bit = 12,
555b3077611SDavid Wu 		.mask = 0x7
556b3077611SDavid Wu 	}, {
557b3077611SDavid Wu 		.num = 1,
558b3077611SDavid Wu 		.pin = 15,
559b3077611SDavid Wu 		.reg = 0x2c,
560b3077611SDavid Wu 		.bit = 0,
561b3077611SDavid Wu 		.mask = 0x3
562b3077611SDavid Wu 	}, {
563b3077611SDavid Wu 		.num = 1,
564b3077611SDavid Wu 		.pin = 18,
565b3077611SDavid Wu 		.reg = 0x30,
566b3077611SDavid Wu 		.bit = 4,
567b3077611SDavid Wu 		.mask = 0x7
568b3077611SDavid Wu 	}, {
569b3077611SDavid Wu 		.num = 1,
570b3077611SDavid Wu 		.pin = 19,
571b3077611SDavid Wu 		.reg = 0x30,
572b3077611SDavid Wu 		.bit = 8,
573b3077611SDavid Wu 		.mask = 0x7
574b3077611SDavid Wu 	}, {
575b3077611SDavid Wu 		.num = 1,
576b3077611SDavid Wu 		.pin = 20,
577b3077611SDavid Wu 		.reg = 0x30,
578b3077611SDavid Wu 		.bit = 12,
579b3077611SDavid Wu 		.mask = 0x7
580b3077611SDavid Wu 	}, {
581b3077611SDavid Wu 		.num = 1,
582b3077611SDavid Wu 		.pin = 21,
583b3077611SDavid Wu 		.reg = 0x34,
584b3077611SDavid Wu 		.bit = 0,
585b3077611SDavid Wu 		.mask = 0x7
586b3077611SDavid Wu 	}, {
587b3077611SDavid Wu 		.num = 1,
588b3077611SDavid Wu 		.pin = 22,
589b3077611SDavid Wu 		.reg = 0x34,
590b3077611SDavid Wu 		.bit = 4,
591b3077611SDavid Wu 		.mask = 0x7
592b3077611SDavid Wu 	}, {
593b3077611SDavid Wu 		.num = 1,
594b3077611SDavid Wu 		.pin = 23,
595b3077611SDavid Wu 		.reg = 0x34,
596b3077611SDavid Wu 		.bit = 8,
597b3077611SDavid Wu 		.mask = 0x7
598b3077611SDavid Wu 	}, {
599b3077611SDavid Wu 		.num = 3,
600b3077611SDavid Wu 		.pin = 12,
601b3077611SDavid Wu 		.reg = 0x68,
602b3077611SDavid Wu 		.bit = 8,
603b3077611SDavid Wu 		.mask = 0x7
604b3077611SDavid Wu 	}, {
605b3077611SDavid Wu 		.num = 3,
606b3077611SDavid Wu 		.pin = 13,
607b3077611SDavid Wu 		.reg = 0x68,
608b3077611SDavid Wu 		.bit = 12,
609b3077611SDavid Wu 		.mask = 0x7
610b3077611SDavid Wu 	},
611b3077611SDavid Wu };
612b3077611SDavid Wu 
613d5517017SDavid Wu static struct rockchip_mux_recalced_data rk3308b_mux_recalced_data[] = {
614d5517017SDavid Wu 	{
615d5517017SDavid Wu 		.num = 1,
616d5517017SDavid Wu 		.pin = 14,
617d5517017SDavid Wu 		.reg = 0x28,
618d5517017SDavid Wu 		.bit = 12,
619d5517017SDavid Wu 		.mask = 0xf
620d5517017SDavid Wu 	}, {
621d5517017SDavid Wu 		.num = 1,
622d5517017SDavid Wu 		.pin = 15,
623d5517017SDavid Wu 		.reg = 0x2c,
624d5517017SDavid Wu 		.bit = 0,
625d5517017SDavid Wu 		.mask = 0x3
626d5517017SDavid Wu 	}, {
627d5517017SDavid Wu 		.num = 1,
628d5517017SDavid Wu 		.pin = 18,
629d5517017SDavid Wu 		.reg = 0x30,
630d5517017SDavid Wu 		.bit = 4,
631d5517017SDavid Wu 		.mask = 0xf
632d5517017SDavid Wu 	}, {
633d5517017SDavid Wu 		.num = 1,
634d5517017SDavid Wu 		.pin = 19,
635d5517017SDavid Wu 		.reg = 0x30,
636d5517017SDavid Wu 		.bit = 8,
637d5517017SDavid Wu 		.mask = 0xf
638d5517017SDavid Wu 	}, {
639d5517017SDavid Wu 		.num = 1,
640d5517017SDavid Wu 		.pin = 20,
641d5517017SDavid Wu 		.reg = 0x30,
642d5517017SDavid Wu 		.bit = 12,
643d5517017SDavid Wu 		.mask = 0xf
644d5517017SDavid Wu 	}, {
645d5517017SDavid Wu 		.num = 1,
646d5517017SDavid Wu 		.pin = 21,
647d5517017SDavid Wu 		.reg = 0x34,
648d5517017SDavid Wu 		.bit = 0,
649d5517017SDavid Wu 		.mask = 0xf
650d5517017SDavid Wu 	}, {
651d5517017SDavid Wu 		.num = 1,
652d5517017SDavid Wu 		.pin = 22,
653d5517017SDavid Wu 		.reg = 0x34,
654d5517017SDavid Wu 		.bit = 4,
655d5517017SDavid Wu 		.mask = 0xf
656d5517017SDavid Wu 	}, {
657d5517017SDavid Wu 		.num = 1,
658d5517017SDavid Wu 		.pin = 23,
659d5517017SDavid Wu 		.reg = 0x34,
660d5517017SDavid Wu 		.bit = 8,
661d5517017SDavid Wu 		.mask = 0xf
662d5517017SDavid Wu 	}, {
663d5517017SDavid Wu 		.num = 3,
664752032c9SDavid.Wu 		.pin = 12,
665752032c9SDavid.Wu 		.reg = 0x68,
666752032c9SDavid.Wu 		.bit = 8,
667752032c9SDavid.Wu 		.mask = 0xf
668752032c9SDavid.Wu 	}, {
669752032c9SDavid.Wu 		.num = 3,
670d5517017SDavid Wu 		.pin = 13,
671d5517017SDavid Wu 		.reg = 0x68,
672d5517017SDavid Wu 		.bit = 12,
673d5517017SDavid Wu 		.mask = 0xf
674d5517017SDavid Wu 	}, {
675d5517017SDavid Wu 		.num = 2,
676d5517017SDavid Wu 		.pin = 2,
677d5517017SDavid Wu 		.reg = 0x608,
678d5517017SDavid Wu 		.bit = 0,
679d5517017SDavid Wu 		.mask = 0x7
680d5517017SDavid Wu 	}, {
681d5517017SDavid Wu 		.num = 2,
682d5517017SDavid Wu 		.pin = 3,
683d5517017SDavid Wu 		.reg = 0x608,
684d5517017SDavid Wu 		.bit = 4,
685d5517017SDavid Wu 		.mask = 0x7
686d5517017SDavid Wu 	}, {
687d5517017SDavid Wu 		.num = 2,
688d5517017SDavid Wu 		.pin = 16,
689d5517017SDavid Wu 		.reg = 0x610,
690d5517017SDavid Wu 		.bit = 8,
691d5517017SDavid Wu 		.mask = 0x7
692d5517017SDavid Wu 	}, {
693d5517017SDavid Wu 		.num = 3,
694d5517017SDavid Wu 		.pin = 10,
695d5517017SDavid Wu 		.reg = 0x610,
696d5517017SDavid Wu 		.bit = 0,
697d5517017SDavid Wu 		.mask = 0x7
698d5517017SDavid Wu 	}, {
699d5517017SDavid Wu 		.num = 3,
700d5517017SDavid Wu 		.pin = 11,
701d5517017SDavid Wu 		.reg = 0x610,
702d5517017SDavid Wu 		.bit = 4,
703d5517017SDavid Wu 		.mask = 0x7
704d5517017SDavid Wu 	},
705d5517017SDavid Wu };
706d5517017SDavid Wu 
70749c55878SDavid Wu static struct rockchip_mux_recalced_data rk3328_mux_recalced_data[] = {
70849c55878SDavid Wu 	{
709*878372faSYe Zhang 		/* gpio2_b7_sel */
71049c55878SDavid Wu 		.num = 2,
71149c55878SDavid Wu 		.pin = 15,
71249c55878SDavid Wu 		.reg = 0x28,
71349c55878SDavid Wu 		.bit = 0,
71449c55878SDavid Wu 		.mask = 0x7
71549c55878SDavid Wu 	}, {
716*878372faSYe Zhang 		/* gpio2_c7_sel */
71749c55878SDavid Wu 		.num = 2,
71849c55878SDavid Wu 		.pin = 23,
71949c55878SDavid Wu 		.reg = 0x30,
72049c55878SDavid Wu 		.bit = 14,
72149c55878SDavid Wu 		.mask = 0x3
722*878372faSYe Zhang 	}, {
723*878372faSYe Zhang 		/* gpio3_b1_sel */
724*878372faSYe Zhang 		.num = 3,
725*878372faSYe Zhang 		.pin = 9,
726*878372faSYe Zhang 		.reg = 0x44,
727*878372faSYe Zhang 		.bit = 2,
728*878372faSYe Zhang 		.mask = 0x3
729*878372faSYe Zhang 	}, {
730*878372faSYe Zhang 		/* gpio3_b2_sel */
731*878372faSYe Zhang 		.num = 3,
732*878372faSYe Zhang 		.pin = 10,
733*878372faSYe Zhang 		.reg = 0x44,
734*878372faSYe Zhang 		.bit = 4,
735*878372faSYe Zhang 		.mask = 0x3
736*878372faSYe Zhang 	}, {
737*878372faSYe Zhang 		/* gpio3_b3_sel */
738*878372faSYe Zhang 		.num = 3,
739*878372faSYe Zhang 		.pin = 11,
740*878372faSYe Zhang 		.reg = 0x44,
741*878372faSYe Zhang 		.bit = 6,
742*878372faSYe Zhang 		.mask = 0x3
743*878372faSYe Zhang 	}, {
744*878372faSYe Zhang 		/* gpio3_b4_sel */
745*878372faSYe Zhang 		.num = 3,
746*878372faSYe Zhang 		.pin = 12,
747*878372faSYe Zhang 		.reg = 0x44,
748*878372faSYe Zhang 		.bit = 8,
749*878372faSYe Zhang 		.mask = 0x3
750*878372faSYe Zhang 	}, {
751*878372faSYe Zhang 		/* gpio3_b5_sel */
752*878372faSYe Zhang 		.num = 3,
753*878372faSYe Zhang 		.pin = 13,
754*878372faSYe Zhang 		.reg = 0x44,
755*878372faSYe Zhang 		.bit = 10,
756*878372faSYe Zhang 		.mask = 0x3
757*878372faSYe Zhang 	}, {
758*878372faSYe Zhang 		/* gpio3_b6_sel */
759*878372faSYe Zhang 		.num = 3,
760*878372faSYe Zhang 		.pin = 14,
761*878372faSYe Zhang 		.reg = 0x44,
762*878372faSYe Zhang 		.bit = 12,
763*878372faSYe Zhang 		.mask = 0x3
764*878372faSYe Zhang 	}, {
765*878372faSYe Zhang 		/* gpio3_b7_sel */
766*878372faSYe Zhang 		.num = 3,
767*878372faSYe Zhang 		.pin = 15,
768*878372faSYe Zhang 		.reg = 0x44,
769*878372faSYe Zhang 		.bit = 14,
770*878372faSYe Zhang 		.mask = 0x3
77149c55878SDavid Wu 	},
77249c55878SDavid Wu };
77349c55878SDavid Wu 
774d499d466SJianqun Xu static struct rockchip_mux_route_data rv1126_mux_route_data[] = {
77549e04eddSJianqun Xu 	MR_TOPGRF(RK_GPIO3, RK_PD2, RK_FUNC_1, 0x10260, RK_GENMASK_VAL(0, 0, 0)), /* I2S0_MCLK_M0 */
77649e04eddSJianqun Xu 	MR_TOPGRF(RK_GPIO3, RK_PB0, RK_FUNC_3, 0x10260, RK_GENMASK_VAL(0, 0, 1)), /* I2S0_MCLK_M1 */
777d499d466SJianqun Xu 
778d2f01304SJianqun Xu 	MR_TOPGRF(RK_GPIO0, RK_PD4, RK_FUNC_4, 0x10260, RK_GENMASK_VAL(3, 2, 0)), /* I2S1_MCLK_M0 */
779d2f01304SJianqun Xu 	MR_TOPGRF(RK_GPIO1, RK_PD5, RK_FUNC_2, 0x10260, RK_GENMASK_VAL(3, 2, 1)), /* I2S1_MCLK_M1 */
780d2f01304SJianqun Xu 	MR_TOPGRF(RK_GPIO2, RK_PC7, RK_FUNC_6, 0x10260, RK_GENMASK_VAL(3, 2, 2)), /* I2S1_MCLK_M2 */
781d499d466SJianqun Xu 
78249e04eddSJianqun Xu 	MR_TOPGRF(RK_GPIO1, RK_PD0, RK_FUNC_1, 0x10260, RK_GENMASK_VAL(4, 4, 0)), /* I2S2_MCLK_M0 */
78349e04eddSJianqun Xu 	MR_TOPGRF(RK_GPIO2, RK_PB3, RK_FUNC_2, 0x10260, RK_GENMASK_VAL(4, 4, 1)), /* I2S2_MCLK_M1 */
784d499d466SJianqun Xu 
78549e04eddSJianqun Xu 	MR_TOPGRF(RK_GPIO3, RK_PD4, RK_FUNC_2, 0x10260, RK_GENMASK_VAL(12, 12, 0)), /* PDM_CLK0_M0 */
78649e04eddSJianqun Xu 	MR_TOPGRF(RK_GPIO3, RK_PC0, RK_FUNC_3, 0x10260, RK_GENMASK_VAL(12, 12, 1)), /* PDM_CLK0_M1 */
787d499d466SJianqun Xu 
78849e04eddSJianqun Xu 	MR_TOPGRF(RK_GPIO3, RK_PC6, RK_FUNC_1, 0x10264, RK_GENMASK_VAL(0, 0, 0)), /* CIF_CLKOUT_M0 */
78949e04eddSJianqun Xu 	MR_TOPGRF(RK_GPIO2, RK_PD1, RK_FUNC_3, 0x10264, RK_GENMASK_VAL(0, 0, 1)), /* CIF_CLKOUT_M1 */
790d499d466SJianqun Xu 
791d2f01304SJianqun Xu 	MR_TOPGRF(RK_GPIO3, RK_PA4, RK_FUNC_5, 0x10264, RK_GENMASK_VAL(5, 4, 0)), /* I2C3_SCL_M0 */
792d2f01304SJianqun Xu 	MR_TOPGRF(RK_GPIO2, RK_PD4, RK_FUNC_7, 0x10264, RK_GENMASK_VAL(5, 4, 1)), /* I2C3_SCL_M1 */
793d2f01304SJianqun Xu 	MR_TOPGRF(RK_GPIO1, RK_PD6, RK_FUNC_3, 0x10264, RK_GENMASK_VAL(5, 4, 2)), /* I2C3_SCL_M2 */
794d499d466SJianqun Xu 
79549e04eddSJianqun Xu 	MR_TOPGRF(RK_GPIO3, RK_PA0, RK_FUNC_7, 0x10264, RK_GENMASK_VAL(6, 6, 0)), /* I2C4_SCL_M0 */
79649e04eddSJianqun Xu 	MR_TOPGRF(RK_GPIO4, RK_PA0, RK_FUNC_4, 0x10264, RK_GENMASK_VAL(6, 6, 1)), /* I2C4_SCL_M1 */
797d499d466SJianqun Xu 
798d2f01304SJianqun Xu 	MR_TOPGRF(RK_GPIO2, RK_PA5, RK_FUNC_7, 0x10264, RK_GENMASK_VAL(9, 8, 0)), /* I2C5_SCL_M0 */
799d2f01304SJianqun Xu 	MR_TOPGRF(RK_GPIO3, RK_PB0, RK_FUNC_5, 0x10264, RK_GENMASK_VAL(9, 8, 1)), /* I2C5_SCL_M1 */
800d2f01304SJianqun Xu 	MR_TOPGRF(RK_GPIO1, RK_PD0, RK_FUNC_4, 0x10264, RK_GENMASK_VAL(9, 8, 2)), /* I2C5_SCL_M2 */
801d499d466SJianqun Xu 
802d2f01304SJianqun Xu 	MR_TOPGRF(RK_GPIO3, RK_PC0, RK_FUNC_5, 0x10264, RK_GENMASK_VAL(11, 10, 0)), /* SPI1_CLK_M0 */
803d2f01304SJianqun Xu 	MR_TOPGRF(RK_GPIO1, RK_PC6, RK_FUNC_3, 0x10264, RK_GENMASK_VAL(11, 10, 1)), /* SPI1_CLK_M1 */
804d2f01304SJianqun Xu 	MR_TOPGRF(RK_GPIO2, RK_PD5, RK_FUNC_6, 0x10264, RK_GENMASK_VAL(11, 10, 2)), /* SPI1_CLK_M2 */
805d499d466SJianqun Xu 
80649e04eddSJianqun Xu 	MR_TOPGRF(RK_GPIO3, RK_PC0, RK_FUNC_2, 0x10264, RK_GENMASK_VAL(12, 12, 0)), /* RGMII_CLK_M0 */
80749e04eddSJianqun Xu 	MR_TOPGRF(RK_GPIO2, RK_PB7, RK_FUNC_2, 0x10264, RK_GENMASK_VAL(12, 12, 1)), /* RGMII_CLK_M1 */
808d499d466SJianqun Xu 
80949e04eddSJianqun Xu 	MR_TOPGRF(RK_GPIO3, RK_PA1, RK_FUNC_3, 0x10264, RK_GENMASK_VAL(13, 13, 0)), /* CAN_TXD_M0 */
81049e04eddSJianqun Xu 	MR_TOPGRF(RK_GPIO3, RK_PA7, RK_FUNC_5, 0x10264, RK_GENMASK_VAL(13, 13, 1)), /* CAN_TXD_M1 */
811d499d466SJianqun Xu 
81249e04eddSJianqun Xu 	MR_TOPGRF(RK_GPIO3, RK_PA4, RK_FUNC_6, 0x10268, RK_GENMASK_VAL(0, 0, 0)), /* PWM8_M0 */
81349e04eddSJianqun Xu 	MR_TOPGRF(RK_GPIO2, RK_PD7, RK_FUNC_5, 0x10268, RK_GENMASK_VAL(0, 0, 1)), /* PWM8_M1 */
814d499d466SJianqun Xu 
81549e04eddSJianqun Xu 	MR_TOPGRF(RK_GPIO3, RK_PA5, RK_FUNC_6, 0x10268, RK_GENMASK_VAL(2, 2, 0)), /* PWM9_M0 */
81649e04eddSJianqun Xu 	MR_TOPGRF(RK_GPIO2, RK_PD6, RK_FUNC_5, 0x10268, RK_GENMASK_VAL(2, 2, 1)), /* PWM9_M1 */
817d499d466SJianqun Xu 
81849e04eddSJianqun Xu 	MR_TOPGRF(RK_GPIO3, RK_PA6, RK_FUNC_6, 0x10268, RK_GENMASK_VAL(4, 4, 0)), /* PWM10_M0 */
81949e04eddSJianqun Xu 	MR_TOPGRF(RK_GPIO2, RK_PD5, RK_FUNC_5, 0x10268, RK_GENMASK_VAL(4, 4, 1)), /* PWM10_M1 */
820d499d466SJianqun Xu 
82149e04eddSJianqun Xu 	MR_TOPGRF(RK_GPIO3, RK_PA7, RK_FUNC_6, 0x10268, RK_GENMASK_VAL(6, 6, 0)), /* PWM11_IR_M0 */
82249e04eddSJianqun Xu 	MR_TOPGRF(RK_GPIO3, RK_PA1, RK_FUNC_5, 0x10268, RK_GENMASK_VAL(6, 6, 1)), /* PWM11_IR_M1 */
823d499d466SJianqun Xu 
82449e04eddSJianqun Xu 	MR_TOPGRF(RK_GPIO1, RK_PA5, RK_FUNC_3, 0x10268, RK_GENMASK_VAL(8, 8, 0)), /* UART2_TX_M0 */
82549e04eddSJianqun Xu 	MR_TOPGRF(RK_GPIO3, RK_PA2, RK_FUNC_1, 0x10268, RK_GENMASK_VAL(8, 8, 1)), /* UART2_TX_M1 */
826d499d466SJianqun Xu 
827d2f01304SJianqun Xu 	MR_TOPGRF(RK_GPIO3, RK_PC6, RK_FUNC_3, 0x10268, RK_GENMASK_VAL(11, 10, 0)), /* UART3_TX_M0 */
828d2f01304SJianqun Xu 	MR_TOPGRF(RK_GPIO1, RK_PA7, RK_FUNC_2, 0x10268, RK_GENMASK_VAL(11, 10, 1)), /* UART3_TX_M1 */
829d2f01304SJianqun Xu 	MR_TOPGRF(RK_GPIO3, RK_PA0, RK_FUNC_4, 0x10268, RK_GENMASK_VAL(11, 10, 2)), /* UART3_TX_M2 */
830d499d466SJianqun Xu 
831d2f01304SJianqun Xu 	MR_TOPGRF(RK_GPIO3, RK_PA4, RK_FUNC_4, 0x10268, RK_GENMASK_VAL(13, 12, 0)), /* UART4_TX_M0 */
832d2f01304SJianqun Xu 	MR_TOPGRF(RK_GPIO2, RK_PA6, RK_FUNC_4, 0x10268, RK_GENMASK_VAL(13, 12, 1)), /* UART4_TX_M1 */
833d2f01304SJianqun Xu 	MR_TOPGRF(RK_GPIO1, RK_PD5, RK_FUNC_3, 0x10268, RK_GENMASK_VAL(13, 12, 2)), /* UART4_TX_M2 */
834d499d466SJianqun Xu 
835d2f01304SJianqun Xu 	MR_TOPGRF(RK_GPIO3, RK_PA6, RK_FUNC_4, 0x10268, RK_GENMASK_VAL(15, 14, 0)), /* UART5_TX_M0 */
836d2f01304SJianqun Xu 	MR_TOPGRF(RK_GPIO2, RK_PB0, RK_FUNC_4, 0x10268, RK_GENMASK_VAL(15, 14, 1)), /* UART5_TX_M1 */
837d2f01304SJianqun Xu 	MR_TOPGRF(RK_GPIO2, RK_PA0, RK_FUNC_3, 0x10268, RK_GENMASK_VAL(15, 14, 2)), /* UART5_TX_M2 */
83849e04eddSJianqun Xu 
83949e04eddSJianqun Xu 	MR_PMUGRF(RK_GPIO0, RK_PB6, RK_FUNC_3, 0x0114, RK_GENMASK_VAL(0, 0, 0)), /* PWM0_M0 */
84049e04eddSJianqun Xu 	MR_PMUGRF(RK_GPIO2, RK_PB3, RK_FUNC_5, 0x0114, RK_GENMASK_VAL(0, 0, 1)), /* PWM0_M1 */
84149e04eddSJianqun Xu 
84249e04eddSJianqun Xu 	MR_PMUGRF(RK_GPIO0, RK_PB7, RK_FUNC_3, 0x0114, RK_GENMASK_VAL(2, 2, 0)), /* PWM1_M0 */
84349e04eddSJianqun Xu 	MR_PMUGRF(RK_GPIO2, RK_PB2, RK_FUNC_5, 0x0114, RK_GENMASK_VAL(2, 2, 1)), /* PWM1_M1 */
84449e04eddSJianqun Xu 
84549e04eddSJianqun Xu 	MR_PMUGRF(RK_GPIO0, RK_PC0, RK_FUNC_3, 0x0114, RK_GENMASK_VAL(4, 4, 0)), /* PWM2_M0 */
84649e04eddSJianqun Xu 	MR_PMUGRF(RK_GPIO2, RK_PB1, RK_FUNC_5, 0x0114, RK_GENMASK_VAL(4, 4, 1)), /* PWM2_M1 */
84749e04eddSJianqun Xu 
84849e04eddSJianqun Xu 	MR_PMUGRF(RK_GPIO0, RK_PC1, RK_FUNC_3, 0x0114, RK_GENMASK_VAL(6, 6, 0)), /* PWM3_IR_M0 */
84949e04eddSJianqun Xu 	MR_PMUGRF(RK_GPIO2, RK_PB0, RK_FUNC_5, 0x0114, RK_GENMASK_VAL(6, 6, 1)), /* PWM3_IR_M1 */
85049e04eddSJianqun Xu 
85149e04eddSJianqun Xu 	MR_PMUGRF(RK_GPIO0, RK_PC2, RK_FUNC_3, 0x0114, RK_GENMASK_VAL(8, 8, 0)), /* PWM4_M0 */
85249e04eddSJianqun Xu 	MR_PMUGRF(RK_GPIO2, RK_PA7, RK_FUNC_5, 0x0114, RK_GENMASK_VAL(8, 8, 1)), /* PWM4_M1 */
85349e04eddSJianqun Xu 
85449e04eddSJianqun Xu 	MR_PMUGRF(RK_GPIO0, RK_PC3, RK_FUNC_3, 0x0114, RK_GENMASK_VAL(10, 10, 0)), /* PWM5_M0 */
85549e04eddSJianqun Xu 	MR_PMUGRF(RK_GPIO2, RK_PA6, RK_FUNC_5, 0x0114, RK_GENMASK_VAL(10, 10, 1)), /* PWM5_M1 */
85649e04eddSJianqun Xu 
85749e04eddSJianqun Xu 	MR_PMUGRF(RK_GPIO0, RK_PB2, RK_FUNC_3, 0x0114, RK_GENMASK_VAL(12, 12, 0)), /* PWM6_M0 */
85849e04eddSJianqun Xu 	MR_PMUGRF(RK_GPIO2, RK_PD4, RK_FUNC_5, 0x0114, RK_GENMASK_VAL(12, 12, 1)), /* PWM6_M1 */
85949e04eddSJianqun Xu 
86049e04eddSJianqun Xu 	MR_PMUGRF(RK_GPIO0, RK_PB1, RK_FUNC_3, 0x0114, RK_GENMASK_VAL(14, 14, 0)), /* PWM7_IR_M0 */
86149e04eddSJianqun Xu 	MR_PMUGRF(RK_GPIO3, RK_PA0, RK_FUNC_5, 0x0114, RK_GENMASK_VAL(14, 14, 1)), /* PWM7_IR_M1 */
86249e04eddSJianqun Xu 
863d2f01304SJianqun Xu 	MR_PMUGRF(RK_GPIO0, RK_PB0, RK_FUNC_1, 0x0118, RK_GENMASK_VAL(1, 0, 0)), /* SPI0_CLK_M0 */
864d2f01304SJianqun Xu 	MR_PMUGRF(RK_GPIO2, RK_PA1, RK_FUNC_1, 0x0118, RK_GENMASK_VAL(1, 0, 1)), /* SPI0_CLK_M1 */
865d2f01304SJianqun Xu 	MR_PMUGRF(RK_GPIO2, RK_PB2, RK_FUNC_6, 0x0118, RK_GENMASK_VAL(1, 0, 2)), /* SPI0_CLK_M2 */
86649e04eddSJianqun Xu 
86749e04eddSJianqun Xu 	MR_PMUGRF(RK_GPIO0, RK_PB6, RK_FUNC_2, 0x0118, RK_GENMASK_VAL(2, 2, 0)), /* UART1_TX_M0 */
86849e04eddSJianqun Xu 	MR_PMUGRF(RK_GPIO1, RK_PD0, RK_FUNC_5, 0x0118, RK_GENMASK_VAL(2, 2, 1)), /* UART1_TX_M1 */
869d2f01304SJianqun Xu 	MR_PMUGRF(RK_GPIO0, RK_PC3, RK_FUNC_1, 0x0118, RK_GENMASK_VAL(4, 4, 1)), /* I2C2 */
870d499d466SJianqun Xu };
871d499d466SJianqun Xu 
rockchip_get_recalced_mux(struct rockchip_pin_bank * bank,int pin,int * reg,u8 * bit,int * mask)87249c55878SDavid Wu static void rockchip_get_recalced_mux(struct rockchip_pin_bank *bank, int pin,
87349c55878SDavid Wu 				      int *reg, u8 *bit, int *mask)
87449c55878SDavid Wu {
87549c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
87649c55878SDavid Wu 	struct rockchip_pin_ctrl *ctrl = priv->ctrl;
87749c55878SDavid Wu 	struct rockchip_mux_recalced_data *data;
87849c55878SDavid Wu 	int i;
87949c55878SDavid Wu 
88049c55878SDavid Wu 	for (i = 0; i < ctrl->niomux_recalced; i++) {
88149c55878SDavid Wu 		data = &ctrl->iomux_recalced[i];
88249c55878SDavid Wu 		if (data->num == bank->bank_num &&
88349c55878SDavid Wu 		    data->pin == pin)
88449c55878SDavid Wu 			break;
88549c55878SDavid Wu 	}
88649c55878SDavid Wu 
88749c55878SDavid Wu 	if (i >= ctrl->niomux_recalced)
88849c55878SDavid Wu 		return;
88949c55878SDavid Wu 
89049c55878SDavid Wu 	*reg = data->reg;
89149c55878SDavid Wu 	*mask = data->mask;
89249c55878SDavid Wu 	*bit = data->bit;
89349c55878SDavid Wu }
89449c55878SDavid Wu 
89549c55878SDavid Wu static struct rockchip_mux_route_data px30_mux_route_data[] = {
89649c55878SDavid Wu 	{
89749c55878SDavid Wu 		/* cif-d2m0 */
89849c55878SDavid Wu 		.bank_num = 2,
89949c55878SDavid Wu 		.pin = 0,
90049c55878SDavid Wu 		.func = 1,
90149c55878SDavid Wu 		.route_offset = 0x184,
90249c55878SDavid Wu 		.route_val = BIT(16 + 7),
90349c55878SDavid Wu 	}, {
90449c55878SDavid Wu 		/* cif-d2m1 */
90549c55878SDavid Wu 		.bank_num = 3,
90649c55878SDavid Wu 		.pin = 3,
90749c55878SDavid Wu 		.func = 3,
90849c55878SDavid Wu 		.route_offset = 0x184,
90949c55878SDavid Wu 		.route_val = BIT(16 + 7) | BIT(7),
91049c55878SDavid Wu 	}, {
91149c55878SDavid Wu 		/* pdm-m0 */
91249c55878SDavid Wu 		.bank_num = 3,
91349c55878SDavid Wu 		.pin = 22,
91449c55878SDavid Wu 		.func = 2,
91549c55878SDavid Wu 		.route_offset = 0x184,
91649c55878SDavid Wu 		.route_val = BIT(16 + 8),
91749c55878SDavid Wu 	}, {
91849c55878SDavid Wu 		/* pdm-m1 */
91949c55878SDavid Wu 		.bank_num = 2,
92049c55878SDavid Wu 		.pin = 22,
92149c55878SDavid Wu 		.func = 1,
92249c55878SDavid Wu 		.route_offset = 0x184,
92349c55878SDavid Wu 		.route_val = BIT(16 + 8) | BIT(8),
92449c55878SDavid Wu 	}, {
92549c55878SDavid Wu 		/* uart2-rxm0 */
92649c55878SDavid Wu 		.bank_num = 1,
927793770dfSDavid Wu 		.pin = 27,
92849c55878SDavid Wu 		.func = 2,
92949c55878SDavid Wu 		.route_offset = 0x184,
930793770dfSDavid Wu 		.route_val = BIT(16 + 10),
93149c55878SDavid Wu 	}, {
93249c55878SDavid Wu 		/* uart2-rxm1 */
93349c55878SDavid Wu 		.bank_num = 2,
93449c55878SDavid Wu 		.pin = 14,
93549c55878SDavid Wu 		.func = 2,
93649c55878SDavid Wu 		.route_offset = 0x184,
937793770dfSDavid Wu 		.route_val = BIT(16 + 10) | BIT(10),
93849c55878SDavid Wu 	}, {
93949c55878SDavid Wu 		/* uart3-rxm0 */
94049c55878SDavid Wu 		.bank_num = 0,
94149c55878SDavid Wu 		.pin = 17,
94249c55878SDavid Wu 		.func = 2,
94349c55878SDavid Wu 		.route_offset = 0x184,
944793770dfSDavid Wu 		.route_val = BIT(16 + 9),
94549c55878SDavid Wu 	}, {
94649c55878SDavid Wu 		/* uart3-rxm1 */
94749c55878SDavid Wu 		.bank_num = 1,
948793770dfSDavid Wu 		.pin = 15,
94949c55878SDavid Wu 		.func = 2,
95049c55878SDavid Wu 		.route_offset = 0x184,
951793770dfSDavid Wu 		.route_val = BIT(16 + 9) | BIT(9),
95249c55878SDavid Wu 	},
95349c55878SDavid Wu };
95449c55878SDavid Wu 
955a2a3fc8fSJianqun Xu static struct rockchip_mux_route_data rk1808_mux_route_data[] = {
956a2a3fc8fSJianqun Xu 	{
957a2a3fc8fSJianqun Xu 		/* i2c2m0_sda */
958a2a3fc8fSJianqun Xu 		.bank_num = 3,
959a2a3fc8fSJianqun Xu 		.pin = 12,
960a2a3fc8fSJianqun Xu 		.func = 2,
961a2a3fc8fSJianqun Xu 		.route_offset = 0x190,
962a2a3fc8fSJianqun Xu 		.route_val = BIT(16 + 3),
963a2a3fc8fSJianqun Xu 	}, {
964a2a3fc8fSJianqun Xu 		/* i2c2m1_sda */
965a2a3fc8fSJianqun Xu 		.bank_num = 1,
966a2a3fc8fSJianqun Xu 		.pin = 13,
967a2a3fc8fSJianqun Xu 		.func = 2,
968a2a3fc8fSJianqun Xu 		.route_offset = 0x190,
969a2a3fc8fSJianqun Xu 		.route_val = BIT(16 + 3) | BIT(3),
970a2a3fc8fSJianqun Xu 	}, {
971a2a3fc8fSJianqun Xu 		/* uart2_rxm0 */
972a2a3fc8fSJianqun Xu 		.bank_num = 4,
973a2a3fc8fSJianqun Xu 		.pin = 3,
974a2a3fc8fSJianqun Xu 		.func = 2,
975a2a3fc8fSJianqun Xu 		.route_offset = 0x190,
976a2a3fc8fSJianqun Xu 		.route_val = BIT(16 + 14) | BIT(16 + 15),
977a2a3fc8fSJianqun Xu 	}, {
978a2a3fc8fSJianqun Xu 		/* uart2_rxm1 */
979a2a3fc8fSJianqun Xu 		.bank_num = 2,
980a2a3fc8fSJianqun Xu 		.pin = 25,
981a2a3fc8fSJianqun Xu 		.func = 2,
982a2a3fc8fSJianqun Xu 		.route_offset = 0x190,
983a2a3fc8fSJianqun Xu 		.route_val = BIT(16 + 14) | BIT(14) | BIT(16 + 15),
984a2a3fc8fSJianqun Xu 	}, {
985a2a3fc8fSJianqun Xu 		/* uart2_rxm2 */
986a2a3fc8fSJianqun Xu 		.bank_num = 3,
987a2a3fc8fSJianqun Xu 		.pin = 4,
988a2a3fc8fSJianqun Xu 		.func = 2,
989a2a3fc8fSJianqun Xu 		.route_offset = 0x190,
990a2a3fc8fSJianqun Xu 		.route_val = BIT(16 + 14) | BIT(16 + 15) | BIT(15),
991a2a3fc8fSJianqun Xu 	},
992a2a3fc8fSJianqun Xu };
993a2a3fc8fSJianqun Xu 
99449c55878SDavid Wu static struct rockchip_mux_route_data rk3128_mux_route_data[] = {
99549c55878SDavid Wu 	{
99649c55878SDavid Wu 		/* spi-0 */
99749c55878SDavid Wu 		.bank_num = 1,
99849c55878SDavid Wu 		.pin = 10,
99949c55878SDavid Wu 		.func = 1,
100049c55878SDavid Wu 		.route_offset = 0x144,
100149c55878SDavid Wu 		.route_val = BIT(16 + 3) | BIT(16 + 4),
100249c55878SDavid Wu 	}, {
100349c55878SDavid Wu 		/* spi-1 */
100449c55878SDavid Wu 		.bank_num = 1,
100549c55878SDavid Wu 		.pin = 27,
100649c55878SDavid Wu 		.func = 3,
100749c55878SDavid Wu 		.route_offset = 0x144,
100849c55878SDavid Wu 		.route_val = BIT(16 + 3) | BIT(16 + 4) | BIT(3),
100949c55878SDavid Wu 	}, {
101049c55878SDavid Wu 		/* spi-2 */
101149c55878SDavid Wu 		.bank_num = 0,
101249c55878SDavid Wu 		.pin = 13,
101349c55878SDavid Wu 		.func = 2,
101449c55878SDavid Wu 		.route_offset = 0x144,
101549c55878SDavid Wu 		.route_val = BIT(16 + 3) | BIT(16 + 4) | BIT(4),
101649c55878SDavid Wu 	}, {
101749c55878SDavid Wu 		/* i2s-0 */
101849c55878SDavid Wu 		.bank_num = 1,
101949c55878SDavid Wu 		.pin = 5,
102049c55878SDavid Wu 		.func = 1,
102149c55878SDavid Wu 		.route_offset = 0x144,
102249c55878SDavid Wu 		.route_val = BIT(16 + 5),
102349c55878SDavid Wu 	}, {
102449c55878SDavid Wu 		/* i2s-1 */
102549c55878SDavid Wu 		.bank_num = 0,
102649c55878SDavid Wu 		.pin = 14,
102749c55878SDavid Wu 		.func = 1,
102849c55878SDavid Wu 		.route_offset = 0x144,
102949c55878SDavid Wu 		.route_val = BIT(16 + 5) | BIT(5),
103049c55878SDavid Wu 	}, {
103149c55878SDavid Wu 		/* emmc-0 */
103249c55878SDavid Wu 		.bank_num = 1,
103349c55878SDavid Wu 		.pin = 22,
103449c55878SDavid Wu 		.func = 2,
103549c55878SDavid Wu 		.route_offset = 0x144,
103649c55878SDavid Wu 		.route_val = BIT(16 + 6),
103749c55878SDavid Wu 	}, {
103849c55878SDavid Wu 		/* emmc-1 */
103949c55878SDavid Wu 		.bank_num = 2,
104049c55878SDavid Wu 		.pin = 4,
104149c55878SDavid Wu 		.func = 2,
104249c55878SDavid Wu 		.route_offset = 0x144,
104349c55878SDavid Wu 		.route_val = BIT(16 + 6) | BIT(6),
104449c55878SDavid Wu 	},
104549c55878SDavid Wu };
104649c55878SDavid Wu 
104749c55878SDavid Wu static struct rockchip_mux_route_data rk3228_mux_route_data[] = {
104849c55878SDavid Wu 	{
104949c55878SDavid Wu 		/* pwm0-0 */
105049c55878SDavid Wu 		.bank_num = 0,
105149c55878SDavid Wu 		.pin = 26,
105249c55878SDavid Wu 		.func = 1,
105349c55878SDavid Wu 		.route_offset = 0x50,
105449c55878SDavid Wu 		.route_val = BIT(16),
105549c55878SDavid Wu 	}, {
105649c55878SDavid Wu 		/* pwm0-1 */
105749c55878SDavid Wu 		.bank_num = 3,
105849c55878SDavid Wu 		.pin = 21,
105949c55878SDavid Wu 		.func = 1,
106049c55878SDavid Wu 		.route_offset = 0x50,
106149c55878SDavid Wu 		.route_val = BIT(16) | BIT(0),
106249c55878SDavid Wu 	}, {
106349c55878SDavid Wu 		/* pwm1-0 */
106449c55878SDavid Wu 		.bank_num = 0,
106549c55878SDavid Wu 		.pin = 27,
106649c55878SDavid Wu 		.func = 1,
106749c55878SDavid Wu 		.route_offset = 0x50,
106849c55878SDavid Wu 		.route_val = BIT(16 + 1),
106949c55878SDavid Wu 	}, {
107049c55878SDavid Wu 		/* pwm1-1 */
107149c55878SDavid Wu 		.bank_num = 0,
107249c55878SDavid Wu 		.pin = 30,
107349c55878SDavid Wu 		.func = 2,
107449c55878SDavid Wu 		.route_offset = 0x50,
107549c55878SDavid Wu 		.route_val = BIT(16 + 1) | BIT(1),
107649c55878SDavid Wu 	}, {
107749c55878SDavid Wu 		/* pwm2-0 */
107849c55878SDavid Wu 		.bank_num = 0,
107949c55878SDavid Wu 		.pin = 28,
108049c55878SDavid Wu 		.func = 1,
108149c55878SDavid Wu 		.route_offset = 0x50,
108249c55878SDavid Wu 		.route_val = BIT(16 + 2),
108349c55878SDavid Wu 	}, {
108449c55878SDavid Wu 		/* pwm2-1 */
108549c55878SDavid Wu 		.bank_num = 1,
108649c55878SDavid Wu 		.pin = 12,
108749c55878SDavid Wu 		.func = 2,
108849c55878SDavid Wu 		.route_offset = 0x50,
108949c55878SDavid Wu 		.route_val = BIT(16 + 2) | BIT(2),
109049c55878SDavid Wu 	}, {
109149c55878SDavid Wu 		/* pwm3-0 */
109249c55878SDavid Wu 		.bank_num = 3,
109349c55878SDavid Wu 		.pin = 26,
109449c55878SDavid Wu 		.func = 1,
109549c55878SDavid Wu 		.route_offset = 0x50,
109649c55878SDavid Wu 		.route_val = BIT(16 + 3),
109749c55878SDavid Wu 	}, {
109849c55878SDavid Wu 		/* pwm3-1 */
109949c55878SDavid Wu 		.bank_num = 1,
110049c55878SDavid Wu 		.pin = 11,
110149c55878SDavid Wu 		.func = 2,
110249c55878SDavid Wu 		.route_offset = 0x50,
110349c55878SDavid Wu 		.route_val = BIT(16 + 3) | BIT(3),
110449c55878SDavid Wu 	}, {
110549c55878SDavid Wu 		/* sdio-0_d0 */
110649c55878SDavid Wu 		.bank_num = 1,
110749c55878SDavid Wu 		.pin = 1,
110849c55878SDavid Wu 		.func = 1,
110949c55878SDavid Wu 		.route_offset = 0x50,
111049c55878SDavid Wu 		.route_val = BIT(16 + 4),
111149c55878SDavid Wu 	}, {
111249c55878SDavid Wu 		/* sdio-1_d0 */
111349c55878SDavid Wu 		.bank_num = 3,
111449c55878SDavid Wu 		.pin = 2,
111549c55878SDavid Wu 		.func = 1,
111649c55878SDavid Wu 		.route_offset = 0x50,
111749c55878SDavid Wu 		.route_val = BIT(16 + 4) | BIT(4),
111849c55878SDavid Wu 	}, {
111949c55878SDavid Wu 		/* spi-0_rx */
112049c55878SDavid Wu 		.bank_num = 0,
112149c55878SDavid Wu 		.pin = 13,
112249c55878SDavid Wu 		.func = 2,
112349c55878SDavid Wu 		.route_offset = 0x50,
112449c55878SDavid Wu 		.route_val = BIT(16 + 5),
112549c55878SDavid Wu 	}, {
112649c55878SDavid Wu 		/* spi-1_rx */
112749c55878SDavid Wu 		.bank_num = 2,
112849c55878SDavid Wu 		.pin = 0,
112949c55878SDavid Wu 		.func = 2,
113049c55878SDavid Wu 		.route_offset = 0x50,
113149c55878SDavid Wu 		.route_val = BIT(16 + 5) | BIT(5),
113249c55878SDavid Wu 	}, {
113349c55878SDavid Wu 		/* emmc-0_cmd */
113449c55878SDavid Wu 		.bank_num = 1,
113549c55878SDavid Wu 		.pin = 22,
113649c55878SDavid Wu 		.func = 2,
113749c55878SDavid Wu 		.route_offset = 0x50,
113849c55878SDavid Wu 		.route_val = BIT(16 + 7),
113949c55878SDavid Wu 	}, {
114049c55878SDavid Wu 		/* emmc-1_cmd */
114149c55878SDavid Wu 		.bank_num = 2,
114249c55878SDavid Wu 		.pin = 4,
114349c55878SDavid Wu 		.func = 2,
114449c55878SDavid Wu 		.route_offset = 0x50,
114549c55878SDavid Wu 		.route_val = BIT(16 + 7) | BIT(7),
114649c55878SDavid Wu 	}, {
114749c55878SDavid Wu 		/* uart2-0_rx */
114849c55878SDavid Wu 		.bank_num = 1,
114949c55878SDavid Wu 		.pin = 19,
115049c55878SDavid Wu 		.func = 2,
115149c55878SDavid Wu 		.route_offset = 0x50,
115249c55878SDavid Wu 		.route_val = BIT(16 + 8),
115349c55878SDavid Wu 	}, {
115449c55878SDavid Wu 		/* uart2-1_rx */
115549c55878SDavid Wu 		.bank_num = 1,
115649c55878SDavid Wu 		.pin = 10,
115749c55878SDavid Wu 		.func = 2,
115849c55878SDavid Wu 		.route_offset = 0x50,
115949c55878SDavid Wu 		.route_val = BIT(16 + 8) | BIT(8),
116049c55878SDavid Wu 	}, {
116149c55878SDavid Wu 		/* uart1-0_rx */
116249c55878SDavid Wu 		.bank_num = 1,
116349c55878SDavid Wu 		.pin = 10,
116449c55878SDavid Wu 		.func = 1,
116549c55878SDavid Wu 		.route_offset = 0x50,
116649c55878SDavid Wu 		.route_val = BIT(16 + 11),
116749c55878SDavid Wu 	}, {
116849c55878SDavid Wu 		/* uart1-1_rx */
116949c55878SDavid Wu 		.bank_num = 3,
117049c55878SDavid Wu 		.pin = 13,
117149c55878SDavid Wu 		.func = 1,
117249c55878SDavid Wu 		.route_offset = 0x50,
117349c55878SDavid Wu 		.route_val = BIT(16 + 11) | BIT(11),
117449c55878SDavid Wu 	},
117549c55878SDavid Wu };
117649c55878SDavid Wu 
117749c55878SDavid Wu static struct rockchip_mux_route_data rk3288_mux_route_data[] = {
117849c55878SDavid Wu 	{
117949c55878SDavid Wu 		/* edphdmi_cecinoutt1 */
118049c55878SDavid Wu 		.bank_num = 7,
118149c55878SDavid Wu 		.pin = 16,
118249c55878SDavid Wu 		.func = 2,
118349c55878SDavid Wu 		.route_offset = 0x264,
118449c55878SDavid Wu 		.route_val = BIT(16 + 12) | BIT(12),
118549c55878SDavid Wu 	}, {
118649c55878SDavid Wu 		/* edphdmi_cecinout */
118749c55878SDavid Wu 		.bank_num = 7,
118849c55878SDavid Wu 		.pin = 23,
118949c55878SDavid Wu 		.func = 4,
119049c55878SDavid Wu 		.route_offset = 0x264,
119149c55878SDavid Wu 		.route_val = BIT(16 + 12),
119249c55878SDavid Wu 	},
119349c55878SDavid Wu };
119449c55878SDavid Wu 
1195b3077611SDavid Wu static struct rockchip_mux_route_data rk3308_mux_route_data[] = {
1196b3077611SDavid Wu 	{
1197d5517017SDavid Wu 		/* rtc_clk */
1198d5517017SDavid Wu 		.bank_num = 0,
1199d5517017SDavid Wu 		.pin = 19,
1200d5517017SDavid Wu 		.func = 1,
1201d5517017SDavid Wu 		.route_offset = 0x314,
1202d5517017SDavid Wu 		.route_val = BIT(16 + 0) | BIT(0),
1203d5517017SDavid Wu 	}, {
1204b3077611SDavid Wu 		/* uart2_rxm0 */
1205b3077611SDavid Wu 		.bank_num = 1,
1206b3077611SDavid Wu 		.pin = 22,
1207b3077611SDavid Wu 		.func = 2,
1208b3077611SDavid Wu 		.route_offset = 0x314,
1209b3077611SDavid Wu 		.route_val = BIT(16 + 2) | BIT(16 + 3),
1210b3077611SDavid Wu 	}, {
1211b3077611SDavid Wu 		/* uart2_rxm1 */
1212b3077611SDavid Wu 		.bank_num = 4,
1213b3077611SDavid Wu 		.pin = 26,
1214b3077611SDavid Wu 		.func = 2,
1215b3077611SDavid Wu 		.route_offset = 0x314,
1216b3077611SDavid Wu 		.route_val = BIT(16 + 2) | BIT(16 + 3) | BIT(2),
1217b3077611SDavid Wu 	}, {
1218b3077611SDavid Wu 		/* i2c3_sdam0 */
1219b3077611SDavid Wu 		.bank_num = 0,
1220b3077611SDavid Wu 		.pin = 23,
1221b3077611SDavid Wu 		.func = 2,
1222b3077611SDavid Wu 		.route_offset = 0x314,
1223b3077611SDavid Wu 		.route_val = BIT(16 + 4),
1224b3077611SDavid Wu 	}, {
1225b3077611SDavid Wu 		/* i2c3_sdam1 */
1226b3077611SDavid Wu 		.bank_num = 3,
1227b3077611SDavid Wu 		.pin = 12,
1228b3077611SDavid Wu 		.func = 2,
1229b3077611SDavid Wu 		.route_offset = 0x314,
1230b3077611SDavid Wu 		.route_val = BIT(16 + 4) | BIT(4),
1231d5517017SDavid Wu 	}, {
1232d5517017SDavid Wu 		/* i2s-8ch-1-sclktxm0 */
1233d5517017SDavid Wu 		.bank_num = 1,
1234d5517017SDavid Wu 		.pin = 3,
1235d5517017SDavid Wu 		.func = 2,
1236d5517017SDavid Wu 		.route_offset = 0x308,
1237d5517017SDavid Wu 		.route_val = BIT(16 + 3),
1238d5517017SDavid Wu 	}, {
1239d5517017SDavid Wu 		/* i2s-8ch-1-sclkrxm0 */
1240d5517017SDavid Wu 		.bank_num = 1,
1241d5517017SDavid Wu 		.pin = 4,
1242d5517017SDavid Wu 		.func = 2,
1243d5517017SDavid Wu 		.route_offset = 0x308,
1244d5517017SDavid Wu 		.route_val = BIT(16 + 3),
1245d5517017SDavid Wu 	}, {
1246d5517017SDavid Wu 		/* i2s-8ch-1-sclktxm1 */
1247d5517017SDavid Wu 		.bank_num = 1,
1248d5517017SDavid Wu 		.pin = 13,
1249d5517017SDavid Wu 		.func = 2,
1250d5517017SDavid Wu 		.route_offset = 0x308,
1251d5517017SDavid Wu 		.route_val = BIT(16 + 3) | BIT(3),
1252d5517017SDavid Wu 	}, {
1253d5517017SDavid Wu 		/* i2s-8ch-1-sclkrxm1 */
1254d5517017SDavid Wu 		.bank_num = 1,
1255d5517017SDavid Wu 		.pin = 14,
1256d5517017SDavid Wu 		.func = 2,
1257d5517017SDavid Wu 		.route_offset = 0x308,
1258d5517017SDavid Wu 		.route_val = BIT(16 + 3) | BIT(3),
1259d5517017SDavid Wu 	}, {
1260d5517017SDavid Wu 		/* pdm-clkm0 */
1261d5517017SDavid Wu 		.bank_num = 1,
1262d5517017SDavid Wu 		.pin = 4,
1263d5517017SDavid Wu 		.func = 3,
1264d5517017SDavid Wu 		.route_offset = 0x308,
1265d5517017SDavid Wu 		.route_val = BIT(16 + 12) | BIT(16 + 13),
1266d5517017SDavid Wu 	}, {
1267d5517017SDavid Wu 		/* pdm-clkm1 */
1268d5517017SDavid Wu 		.bank_num = 1,
1269d5517017SDavid Wu 		.pin = 14,
1270d5517017SDavid Wu 		.func = 4,
1271d5517017SDavid Wu 		.route_offset = 0x308,
1272d5517017SDavid Wu 		.route_val = BIT(16 + 12) | BIT(16 + 13) | BIT(12),
1273d5517017SDavid Wu 	}, {
1274d5517017SDavid Wu 		/* pdm-clkm2 */
1275d5517017SDavid Wu 		.bank_num = 2,
1276d5517017SDavid Wu 		.pin = 6,
1277d5517017SDavid Wu 		.func = 2,
1278d5517017SDavid Wu 		.route_offset = 0x308,
1279d5517017SDavid Wu 		.route_val = BIT(16 + 12) | BIT(16 + 13) | BIT(13),
1280d5517017SDavid Wu 	}, {
1281d5517017SDavid Wu 		/* pdm-clkm-m2 */
1282d5517017SDavid Wu 		.bank_num = 2,
1283d5517017SDavid Wu 		.pin = 4,
1284d5517017SDavid Wu 		.func = 3,
1285d5517017SDavid Wu 		.route_offset = 0x600,
1286d5517017SDavid Wu 		.route_val = BIT(16 + 2) | BIT(2),
1287d5517017SDavid Wu 	},
1288d5517017SDavid Wu };
1289d5517017SDavid Wu 
1290d5517017SDavid Wu static struct rockchip_mux_route_data rk3308b_mux_route_data[] = {
1291d5517017SDavid Wu 	{
1292d5517017SDavid Wu 		/* rtc_clk */
1293d5517017SDavid Wu 		.bank_num = 0,
1294d5517017SDavid Wu 		.pin = 19,
1295d5517017SDavid Wu 		.func = 1,
1296d5517017SDavid Wu 		.route_offset = 0x314,
1297d5517017SDavid Wu 		.route_val = BIT(16 + 0) | BIT(0),
1298d5517017SDavid Wu 	}, {
1299d5517017SDavid Wu 		/* uart2_rxm0 */
1300d5517017SDavid Wu 		.bank_num = 1,
1301d5517017SDavid Wu 		.pin = 22,
1302d5517017SDavid Wu 		.func = 2,
1303d5517017SDavid Wu 		.route_offset = 0x314,
1304d5517017SDavid Wu 		.route_val = BIT(16 + 2) | BIT(16 + 3),
1305d5517017SDavid Wu 	}, {
1306d5517017SDavid Wu 		/* uart2_rxm1 */
1307d5517017SDavid Wu 		.bank_num = 4,
1308d5517017SDavid Wu 		.pin = 26,
1309d5517017SDavid Wu 		.func = 2,
1310d5517017SDavid Wu 		.route_offset = 0x314,
1311d5517017SDavid Wu 		.route_val = BIT(16 + 2) | BIT(16 + 3) | BIT(2),
1312d5517017SDavid Wu 	}, {
1313d5517017SDavid Wu 		/* i2c3_sdam0 */
1314d5517017SDavid Wu 		.bank_num = 0,
1315d5517017SDavid Wu 		.pin = 15,
1316d5517017SDavid Wu 		.func = 2,
1317d5517017SDavid Wu 		.route_offset = 0x608,
1318d5517017SDavid Wu 		.route_val = BIT(16 + 8) | BIT(16 + 9),
1319d5517017SDavid Wu 	}, {
1320d5517017SDavid Wu 		/* i2c3_sdam1 */
1321d5517017SDavid Wu 		.bank_num = 3,
1322d5517017SDavid Wu 		.pin = 12,
1323d5517017SDavid Wu 		.func = 2,
1324d5517017SDavid Wu 		.route_offset = 0x608,
1325d5517017SDavid Wu 		.route_val = BIT(16 + 8) | BIT(16 + 9) | BIT(8),
1326d5517017SDavid Wu 	}, {
1327d5517017SDavid Wu 		/* i2c3_sdam2 */
1328d5517017SDavid Wu 		.bank_num = 2,
1329d5517017SDavid Wu 		.pin = 0,
1330d5517017SDavid Wu 		.func = 3,
1331d5517017SDavid Wu 		.route_offset = 0x608,
1332d5517017SDavid Wu 		.route_val = BIT(16 + 8) | BIT(16 + 9) | BIT(9),
1333d5517017SDavid Wu 	}, {
1334d5517017SDavid Wu 		/* i2s-8ch-1-sclktxm0 */
1335d5517017SDavid Wu 		.bank_num = 1,
1336d5517017SDavid Wu 		.pin = 3,
1337d5517017SDavid Wu 		.func = 2,
1338d5517017SDavid Wu 		.route_offset = 0x308,
1339d5517017SDavid Wu 		.route_val = BIT(16 + 3),
1340d5517017SDavid Wu 	}, {
1341d5517017SDavid Wu 		/* i2s-8ch-1-sclkrxm0 */
1342d5517017SDavid Wu 		.bank_num = 1,
1343d5517017SDavid Wu 		.pin = 4,
1344d5517017SDavid Wu 		.func = 2,
1345d5517017SDavid Wu 		.route_offset = 0x308,
1346d5517017SDavid Wu 		.route_val = BIT(16 + 3),
1347d5517017SDavid Wu 	}, {
1348d5517017SDavid Wu 		/* i2s-8ch-1-sclktxm1 */
1349d5517017SDavid Wu 		.bank_num = 1,
1350d5517017SDavid Wu 		.pin = 13,
1351d5517017SDavid Wu 		.func = 2,
1352d5517017SDavid Wu 		.route_offset = 0x308,
1353d5517017SDavid Wu 		.route_val = BIT(16 + 3) | BIT(3),
1354d5517017SDavid Wu 	}, {
1355d5517017SDavid Wu 		/* i2s-8ch-1-sclkrxm1 */
1356d5517017SDavid Wu 		.bank_num = 1,
1357d5517017SDavid Wu 		.pin = 14,
1358d5517017SDavid Wu 		.func = 2,
1359d5517017SDavid Wu 		.route_offset = 0x308,
1360d5517017SDavid Wu 		.route_val = BIT(16 + 3) | BIT(3),
1361d5517017SDavid Wu 	}, {
1362d5517017SDavid Wu 		/* pdm-clkm0 */
1363d5517017SDavid Wu 		.bank_num = 1,
1364d5517017SDavid Wu 		.pin = 4,
1365d5517017SDavid Wu 		.func = 3,
1366d5517017SDavid Wu 		.route_offset = 0x308,
1367d5517017SDavid Wu 		.route_val =  BIT(16 + 12) | BIT(16 + 13),
1368d5517017SDavid Wu 	}, {
1369d5517017SDavid Wu 		/* pdm-clkm1 */
1370d5517017SDavid Wu 		.bank_num = 1,
1371d5517017SDavid Wu 		.pin = 14,
1372d5517017SDavid Wu 		.func = 4,
1373d5517017SDavid Wu 		.route_offset = 0x308,
1374d5517017SDavid Wu 		.route_val = BIT(16 + 12) | BIT(16 + 13) | BIT(12),
1375d5517017SDavid Wu 	}, {
1376d5517017SDavid Wu 		/* pdm-clkm2 */
1377d5517017SDavid Wu 		.bank_num = 2,
1378d5517017SDavid Wu 		.pin = 6,
1379d5517017SDavid Wu 		.func = 2,
1380d5517017SDavid Wu 		.route_offset = 0x308,
1381d5517017SDavid Wu 		.route_val = BIT(16 + 12) | BIT(16 + 13) | BIT(13),
1382d5517017SDavid Wu 	}, {
1383d5517017SDavid Wu 		/* pdm-clkm-m2 */
1384d5517017SDavid Wu 		.bank_num = 2,
1385d5517017SDavid Wu 		.pin = 4,
1386d5517017SDavid Wu 		.func = 3,
1387d5517017SDavid Wu 		.route_offset = 0x600,
1388d5517017SDavid Wu 		.route_val = BIT(16 + 2) | BIT(2),
1389d5517017SDavid Wu 	}, {
1390d5517017SDavid Wu 		/* spi1_miso */
1391d5517017SDavid Wu 		.bank_num = 3,
1392d5517017SDavid Wu 		.pin = 10,
1393d5517017SDavid Wu 		.func = 3,
1394d5517017SDavid Wu 		.route_offset = 0x314,
1395d5517017SDavid Wu 		.route_val = BIT(16 + 9),
1396d5517017SDavid Wu 	}, {
1397d5517017SDavid Wu 		/* spi1_miso_m1 */
1398d5517017SDavid Wu 		.bank_num = 2,
1399d5517017SDavid Wu 		.pin = 4,
1400d5517017SDavid Wu 		.func = 2,
1401d5517017SDavid Wu 		.route_offset = 0x314,
1402d5517017SDavid Wu 		.route_val = BIT(16 + 9) | BIT(9),
1403d5517017SDavid Wu 	}, {
1404d5517017SDavid Wu 		/* owire_m0 */
1405d5517017SDavid Wu 		.bank_num = 0,
1406d5517017SDavid Wu 		.pin = 11,
1407d5517017SDavid Wu 		.func = 3,
1408d5517017SDavid Wu 		.route_offset = 0x314,
1409d5517017SDavid Wu 		.route_val = BIT(16 + 10) | BIT(16 + 11),
1410d5517017SDavid Wu 	}, {
1411d5517017SDavid Wu 		/* owire_m1 */
1412d5517017SDavid Wu 		.bank_num = 1,
1413d5517017SDavid Wu 		.pin = 22,
1414d5517017SDavid Wu 		.func = 7,
1415d5517017SDavid Wu 		.route_offset = 0x314,
1416d5517017SDavid Wu 		.route_val = BIT(16 + 10) | BIT(16 + 11) | BIT(10),
1417d5517017SDavid Wu 	}, {
1418d5517017SDavid Wu 		/* owire_m2 */
1419d5517017SDavid Wu 		.bank_num = 2,
1420d5517017SDavid Wu 		.pin = 2,
1421d5517017SDavid Wu 		.func = 5,
1422d5517017SDavid Wu 		.route_offset = 0x314,
1423d5517017SDavid Wu 		.route_val = BIT(16 + 10) | BIT(16 + 11) | BIT(11),
1424d5517017SDavid Wu 	}, {
1425d5517017SDavid Wu 		/* can_rxd_m0 */
1426d5517017SDavid Wu 		.bank_num = 0,
1427d5517017SDavid Wu 		.pin = 11,
1428d5517017SDavid Wu 		.func = 2,
1429d5517017SDavid Wu 		.route_offset = 0x314,
1430d5517017SDavid Wu 		.route_val = BIT(16 + 12) | BIT(16 + 13),
1431d5517017SDavid Wu 	}, {
1432d5517017SDavid Wu 		/* can_rxd_m1 */
1433d5517017SDavid Wu 		.bank_num = 1,
1434d5517017SDavid Wu 		.pin = 22,
1435d5517017SDavid Wu 		.func = 5,
1436d5517017SDavid Wu 		.route_offset = 0x314,
1437d5517017SDavid Wu 		.route_val = BIT(16 + 12) | BIT(16 + 13) | BIT(12),
1438d5517017SDavid Wu 	}, {
1439d5517017SDavid Wu 		/* can_rxd_m2 */
1440d5517017SDavid Wu 		.bank_num = 2,
1441d5517017SDavid Wu 		.pin = 2,
1442d5517017SDavid Wu 		.func = 4,
1443d5517017SDavid Wu 		.route_offset = 0x314,
1444d5517017SDavid Wu 		.route_val = BIT(16 + 12) | BIT(16 + 13) | BIT(13),
1445d5517017SDavid Wu 	}, {
1446d5517017SDavid Wu 		/* mac_rxd0_m0 */
1447d5517017SDavid Wu 		.bank_num = 1,
1448d5517017SDavid Wu 		.pin = 20,
1449d5517017SDavid Wu 		.func = 3,
1450d5517017SDavid Wu 		.route_offset = 0x314,
1451d5517017SDavid Wu 		.route_val = BIT(16 + 14),
1452d5517017SDavid Wu 	}, {
1453d5517017SDavid Wu 		/* mac_rxd0_m1 */
1454d5517017SDavid Wu 		.bank_num = 4,
1455d5517017SDavid Wu 		.pin = 2,
1456d5517017SDavid Wu 		.func = 2,
1457d5517017SDavid Wu 		.route_offset = 0x314,
1458d5517017SDavid Wu 		.route_val = BIT(16 + 14) | BIT(14),
1459d5517017SDavid Wu 	}, {
1460d5517017SDavid Wu 		/* uart3_rx */
1461d5517017SDavid Wu 		.bank_num = 3,
1462d5517017SDavid Wu 		.pin = 12,
1463d5517017SDavid Wu 		.func = 4,
1464d5517017SDavid Wu 		.route_offset = 0x314,
1465d5517017SDavid Wu 		.route_val = BIT(16 + 15),
1466d5517017SDavid Wu 	}, {
1467d5517017SDavid Wu 		/* uart3_rx_m1 */
1468d5517017SDavid Wu 		.bank_num = 0,
1469d5517017SDavid Wu 		.pin = 17,
1470d5517017SDavid Wu 		.func = 3,
1471d5517017SDavid Wu 		.route_offset = 0x314,
1472d5517017SDavid Wu 		.route_val = BIT(16 + 15) | BIT(15),
1473b3077611SDavid Wu 	},
1474b3077611SDavid Wu };
1475b3077611SDavid Wu 
147649c55878SDavid Wu static struct rockchip_mux_route_data rk3328_mux_route_data[] = {
147749c55878SDavid Wu 	{
147849c55878SDavid Wu 		/* uart2dbg_rxm0 */
147949c55878SDavid Wu 		.bank_num = 1,
148049c55878SDavid Wu 		.pin = 1,
148149c55878SDavid Wu 		.func = 2,
148249c55878SDavid Wu 		.route_offset = 0x50,
148349c55878SDavid Wu 		.route_val = BIT(16) | BIT(16 + 1),
148449c55878SDavid Wu 	}, {
148549c55878SDavid Wu 		/* uart2dbg_rxm1 */
148649c55878SDavid Wu 		.bank_num = 2,
148749c55878SDavid Wu 		.pin = 1,
148849c55878SDavid Wu 		.func = 1,
148949c55878SDavid Wu 		.route_offset = 0x50,
149049c55878SDavid Wu 		.route_val = BIT(16) | BIT(16 + 1) | BIT(0),
149149c55878SDavid Wu 	}, {
149249c55878SDavid Wu 		/* gmac-m1_rxd0 */
149349c55878SDavid Wu 		.bank_num = 1,
149449c55878SDavid Wu 		.pin = 11,
149549c55878SDavid Wu 		.func = 2,
149649c55878SDavid Wu 		.route_offset = 0x50,
149749c55878SDavid Wu 		.route_val = BIT(16 + 2) | BIT(2),
149849c55878SDavid Wu 	}, {
149949c55878SDavid Wu 		/* gmac-m1-optimized_rxd3 */
150049c55878SDavid Wu 		.bank_num = 1,
150149c55878SDavid Wu 		.pin = 14,
150249c55878SDavid Wu 		.func = 2,
150349c55878SDavid Wu 		.route_offset = 0x50,
150449c55878SDavid Wu 		.route_val = BIT(16 + 10) | BIT(10),
150549c55878SDavid Wu 	}, {
150649c55878SDavid Wu 		/* pdm_sdi0m0 */
150749c55878SDavid Wu 		.bank_num = 2,
150849c55878SDavid Wu 		.pin = 19,
150949c55878SDavid Wu 		.func = 2,
151049c55878SDavid Wu 		.route_offset = 0x50,
151149c55878SDavid Wu 		.route_val = BIT(16 + 3),
151249c55878SDavid Wu 	}, {
151349c55878SDavid Wu 		/* pdm_sdi0m1 */
151449c55878SDavid Wu 		.bank_num = 1,
151549c55878SDavid Wu 		.pin = 23,
151649c55878SDavid Wu 		.func = 3,
151749c55878SDavid Wu 		.route_offset = 0x50,
151849c55878SDavid Wu 		.route_val =  BIT(16 + 3) | BIT(3),
151949c55878SDavid Wu 	}, {
152049c55878SDavid Wu 		/* spi_rxdm2 */
152149c55878SDavid Wu 		.bank_num = 3,
152249c55878SDavid Wu 		.pin = 2,
152349c55878SDavid Wu 		.func = 4,
152449c55878SDavid Wu 		.route_offset = 0x50,
152549c55878SDavid Wu 		.route_val =  BIT(16 + 4) | BIT(16 + 5) | BIT(5),
152649c55878SDavid Wu 	}, {
152749c55878SDavid Wu 		/* i2s2_sdim0 */
152849c55878SDavid Wu 		.bank_num = 1,
152949c55878SDavid Wu 		.pin = 24,
153049c55878SDavid Wu 		.func = 1,
153149c55878SDavid Wu 		.route_offset = 0x50,
153249c55878SDavid Wu 		.route_val = BIT(16 + 6),
153349c55878SDavid Wu 	}, {
153449c55878SDavid Wu 		/* i2s2_sdim1 */
153549c55878SDavid Wu 		.bank_num = 3,
153649c55878SDavid Wu 		.pin = 2,
153749c55878SDavid Wu 		.func = 6,
153849c55878SDavid Wu 		.route_offset = 0x50,
153949c55878SDavid Wu 		.route_val =  BIT(16 + 6) | BIT(6),
154049c55878SDavid Wu 	}, {
154149c55878SDavid Wu 		/* card_iom1 */
154249c55878SDavid Wu 		.bank_num = 2,
154349c55878SDavid Wu 		.pin = 22,
154449c55878SDavid Wu 		.func = 3,
154549c55878SDavid Wu 		.route_offset = 0x50,
154649c55878SDavid Wu 		.route_val =  BIT(16 + 7) | BIT(7),
154749c55878SDavid Wu 	}, {
154849c55878SDavid Wu 		/* tsp_d5m1 */
154949c55878SDavid Wu 		.bank_num = 2,
155049c55878SDavid Wu 		.pin = 16,
155149c55878SDavid Wu 		.func = 3,
155249c55878SDavid Wu 		.route_offset = 0x50,
155349c55878SDavid Wu 		.route_val =  BIT(16 + 8) | BIT(8),
155449c55878SDavid Wu 	}, {
155549c55878SDavid Wu 		/* cif_data5m1 */
155649c55878SDavid Wu 		.bank_num = 2,
155749c55878SDavid Wu 		.pin = 16,
155849c55878SDavid Wu 		.func = 4,
155949c55878SDavid Wu 		.route_offset = 0x50,
156049c55878SDavid Wu 		.route_val =  BIT(16 + 9) | BIT(9),
156149c55878SDavid Wu 	},
156249c55878SDavid Wu };
156349c55878SDavid Wu 
156449c55878SDavid Wu static struct rockchip_mux_route_data rk3399_mux_route_data[] = {
156549c55878SDavid Wu 	{
156649c55878SDavid Wu 		/* uart2dbga_rx */
156749c55878SDavid Wu 		.bank_num = 4,
156849c55878SDavid Wu 		.pin = 8,
156949c55878SDavid Wu 		.func = 2,
157049c55878SDavid Wu 		.route_offset = 0xe21c,
157149c55878SDavid Wu 		.route_val = BIT(16 + 10) | BIT(16 + 11),
157249c55878SDavid Wu 	}, {
157349c55878SDavid Wu 		/* uart2dbgb_rx */
157449c55878SDavid Wu 		.bank_num = 4,
157549c55878SDavid Wu 		.pin = 16,
157649c55878SDavid Wu 		.func = 2,
157749c55878SDavid Wu 		.route_offset = 0xe21c,
157849c55878SDavid Wu 		.route_val = BIT(16 + 10) | BIT(16 + 11) | BIT(10),
157949c55878SDavid Wu 	}, {
158049c55878SDavid Wu 		/* uart2dbgc_rx */
158149c55878SDavid Wu 		.bank_num = 4,
158249c55878SDavid Wu 		.pin = 19,
158349c55878SDavid Wu 		.func = 1,
158449c55878SDavid Wu 		.route_offset = 0xe21c,
158549c55878SDavid Wu 		.route_val = BIT(16 + 10) | BIT(16 + 11) | BIT(11),
158649c55878SDavid Wu 	}, {
158749c55878SDavid Wu 		/* pcie_clkreqn */
158849c55878SDavid Wu 		.bank_num = 2,
158949c55878SDavid Wu 		.pin = 26,
159049c55878SDavid Wu 		.func = 2,
159149c55878SDavid Wu 		.route_offset = 0xe21c,
159249c55878SDavid Wu 		.route_val = BIT(16 + 14),
159349c55878SDavid Wu 	}, {
159449c55878SDavid Wu 		/* pcie_clkreqnb */
159549c55878SDavid Wu 		.bank_num = 4,
159649c55878SDavid Wu 		.pin = 24,
159749c55878SDavid Wu 		.func = 1,
159849c55878SDavid Wu 		.route_offset = 0xe21c,
159949c55878SDavid Wu 		.route_val = BIT(16 + 14) | BIT(14),
160049c55878SDavid Wu 	},
160149c55878SDavid Wu };
160249c55878SDavid Wu 
160349e04eddSJianqun Xu static enum rockchip_pin_route_type
rockchip_get_mux_route(struct rockchip_pin_bank * bank,int pin,int mux,u32 * reg,u32 * value)160449e04eddSJianqun Xu rockchip_get_mux_route(struct rockchip_pin_bank *bank, int pin,
160549c55878SDavid Wu 		       int mux, u32 *reg, u32 *value)
160649c55878SDavid Wu {
160749c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
160849c55878SDavid Wu 	struct rockchip_pin_ctrl *ctrl = priv->ctrl;
160949c55878SDavid Wu 	struct rockchip_mux_route_data *data;
161049c55878SDavid Wu 	int i;
161149c55878SDavid Wu 
161249c55878SDavid Wu 	for (i = 0; i < ctrl->niomux_routes; i++) {
161349c55878SDavid Wu 		data = &ctrl->iomux_routes[i];
161449c55878SDavid Wu 		if ((data->bank_num == bank->bank_num) &&
161549c55878SDavid Wu 		    (data->pin == pin) && (data->func == mux))
161649c55878SDavid Wu 			break;
161749c55878SDavid Wu 	}
161849c55878SDavid Wu 
161949c55878SDavid Wu 	if (i >= ctrl->niomux_routes)
162049e04eddSJianqun Xu 		return ROUTE_TYPE_INVALID;
162149c55878SDavid Wu 
162249c55878SDavid Wu 	*reg = data->route_offset;
162349c55878SDavid Wu 	*value = data->route_val;
162449c55878SDavid Wu 
162549e04eddSJianqun Xu 	return data->route_type;
162649c55878SDavid Wu }
162749c55878SDavid Wu 
rockchip_get_mux(struct rockchip_pin_bank * bank,int pin)162849c55878SDavid Wu static int rockchip_get_mux(struct rockchip_pin_bank *bank, int pin)
162949c55878SDavid Wu {
163049c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
163149c55878SDavid Wu 	int iomux_num = (pin / 8);
163249c55878SDavid Wu 	struct regmap *regmap;
163349c55878SDavid Wu 	unsigned int val;
163449c55878SDavid Wu 	int reg, ret, mask, mux_type;
163549c55878SDavid Wu 	u8 bit;
163649c55878SDavid Wu 
163749c55878SDavid Wu 	if (iomux_num > 3)
163849c55878SDavid Wu 		return -EINVAL;
163949c55878SDavid Wu 
164049c55878SDavid Wu 	if (bank->iomux[iomux_num].type & IOMUX_UNROUTED) {
164149c55878SDavid Wu 		debug("pin %d is unrouted\n", pin);
164249c55878SDavid Wu 		return -EINVAL;
164349c55878SDavid Wu 	}
164449c55878SDavid Wu 
164549c55878SDavid Wu 	if (bank->iomux[iomux_num].type & IOMUX_GPIO_ONLY)
164649c55878SDavid Wu 		return RK_FUNC_GPIO;
164749c55878SDavid Wu 
1648cf04a17bSJianqun Xu 	if (bank->iomux[iomux_num].type & IOMUX_SOURCE_PMU)
1649cf04a17bSJianqun Xu 		regmap = priv->regmap_pmu;
1650cf04a17bSJianqun Xu 	else if (bank->iomux[iomux_num].type & IOMUX_L_SOURCE_PMU)
1651cf04a17bSJianqun Xu 		regmap = (pin % 8 < 4) ? priv->regmap_pmu : priv->regmap_base;
1652cf04a17bSJianqun Xu 	else
1653cf04a17bSJianqun Xu 		regmap = priv->regmap_base;
165449c55878SDavid Wu 
165549c55878SDavid Wu 	/* get basic quadrupel of mux registers and the correct reg inside */
165649c55878SDavid Wu 	mux_type = bank->iomux[iomux_num].type;
165749c55878SDavid Wu 	reg = bank->iomux[iomux_num].offset;
165849c55878SDavid Wu 	if (mux_type & IOMUX_WIDTH_4BIT) {
165949c55878SDavid Wu 		if ((pin % 8) >= 4)
166049c55878SDavid Wu 			reg += 0x4;
166149c55878SDavid Wu 		bit = (pin % 4) * 4;
166249c55878SDavid Wu 		mask = 0xf;
166349c55878SDavid Wu 	} else if (mux_type & IOMUX_WIDTH_3BIT) {
166449c55878SDavid Wu 		if ((pin % 8) >= 5)
166549c55878SDavid Wu 			reg += 0x4;
166649c55878SDavid Wu 		bit = (pin % 8 % 5) * 3;
166749c55878SDavid Wu 		mask = 0x7;
166849c55878SDavid Wu 	} else {
166949c55878SDavid Wu 		bit = (pin % 8) * 2;
167049c55878SDavid Wu 		mask = 0x3;
167149c55878SDavid Wu 	}
167249c55878SDavid Wu 
167349c55878SDavid Wu 	if (bank->recalced_mask & BIT(pin))
167449c55878SDavid Wu 		rockchip_get_recalced_mux(bank, pin, &reg, &bit, &mask);
167549c55878SDavid Wu 
167649c55878SDavid Wu 	ret = regmap_read(regmap, reg, &val);
167749c55878SDavid Wu 	if (ret)
167849c55878SDavid Wu 		return ret;
167949c55878SDavid Wu 
168049c55878SDavid Wu 	return ((val >> bit) & mask);
168149c55878SDavid Wu }
168249c55878SDavid Wu 
rockchip_pinctrl_get_gpio_mux(struct udevice * dev,int banknum,int index)168349c55878SDavid Wu static int rockchip_pinctrl_get_gpio_mux(struct udevice *dev, int banknum,
168449c55878SDavid Wu 					 int index)
168549c55878SDavid Wu {	struct rockchip_pinctrl_priv *priv = dev_get_priv(dev);
168649c55878SDavid Wu 	struct rockchip_pin_ctrl *ctrl = priv->ctrl;
168749c55878SDavid Wu 
168849c55878SDavid Wu 	return rockchip_get_mux(&ctrl->pin_banks[banknum], index);
168949c55878SDavid Wu }
169049c55878SDavid Wu 
rockchip_verify_mux(struct rockchip_pin_bank * bank,int pin,int mux)169149c55878SDavid Wu static int rockchip_verify_mux(struct rockchip_pin_bank *bank,
169249c55878SDavid Wu 			       int pin, int mux)
169349c55878SDavid Wu {
169449c55878SDavid Wu 	int iomux_num = (pin / 8);
169549c55878SDavid Wu 
169649c55878SDavid Wu 	if (iomux_num > 3)
169749c55878SDavid Wu 		return -EINVAL;
169849c55878SDavid Wu 
169949c55878SDavid Wu 	if (bank->iomux[iomux_num].type & IOMUX_UNROUTED) {
170049c55878SDavid Wu 		debug("pin %d is unrouted\n", pin);
170149c55878SDavid Wu 		return -EINVAL;
170249c55878SDavid Wu 	}
170349c55878SDavid Wu 
170449c55878SDavid Wu 	if (bank->iomux[iomux_num].type & IOMUX_GPIO_ONLY) {
170549c55878SDavid Wu 		if (mux != IOMUX_GPIO_ONLY) {
170649c55878SDavid Wu 			debug("pin %d only supports a gpio mux\n", pin);
170749c55878SDavid Wu 			return -ENOTSUPP;
170849c55878SDavid Wu 		}
170949c55878SDavid Wu 	}
171049c55878SDavid Wu 
171149c55878SDavid Wu 	return 0;
171249c55878SDavid Wu }
171349c55878SDavid Wu 
171449c55878SDavid Wu /*
171549c55878SDavid Wu  * Set a new mux function for a pin.
171649c55878SDavid Wu  *
171749c55878SDavid Wu  * The register is divided into the upper and lower 16 bit. When changing
171849c55878SDavid Wu  * a value, the previous register value is not read and changed. Instead
171949c55878SDavid Wu  * it seems the changed bits are marked in the upper 16 bit, while the
172049c55878SDavid Wu  * changed value gets set in the same offset in the lower 16 bit.
172149c55878SDavid Wu  * All pin settings seem to be 2 bit wide in both the upper and lower
172249c55878SDavid Wu  * parts.
172349c55878SDavid Wu  * @bank: pin bank to change
172449c55878SDavid Wu  * @pin: pin to change
172549c55878SDavid Wu  * @mux: new mux function to set
172649c55878SDavid Wu  */
rockchip_set_mux(struct rockchip_pin_bank * bank,int pin,int mux)172749c55878SDavid Wu static int rockchip_set_mux(struct rockchip_pin_bank *bank, int pin, int mux)
172849c55878SDavid Wu {
172949c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
173049c55878SDavid Wu 	int iomux_num = (pin / 8);
173149c55878SDavid Wu 	struct regmap *regmap;
173249c55878SDavid Wu 	int reg, ret, mask, mux_type;
173349c55878SDavid Wu 	u8 bit;
173449e04eddSJianqun Xu 	u32 data;
173549c55878SDavid Wu 
173649c55878SDavid Wu 	ret = rockchip_verify_mux(bank, pin, mux);
173749c55878SDavid Wu 	if (ret < 0)
173849c55878SDavid Wu 		return ret;
173949c55878SDavid Wu 
174049c55878SDavid Wu 	if (bank->iomux[iomux_num].type & IOMUX_GPIO_ONLY)
174149c55878SDavid Wu 		return 0;
174249c55878SDavid Wu 
174349c55878SDavid Wu 	debug("setting mux of GPIO%d-%d to %d\n", bank->bank_num, pin, mux);
174449c55878SDavid Wu 
1745cf04a17bSJianqun Xu 	if (bank->iomux[iomux_num].type & IOMUX_SOURCE_PMU)
1746cf04a17bSJianqun Xu 		regmap = priv->regmap_pmu;
1747cf04a17bSJianqun Xu 	else if (bank->iomux[iomux_num].type & IOMUX_L_SOURCE_PMU)
1748cf04a17bSJianqun Xu 		regmap = (pin % 8 < 4) ? priv->regmap_pmu : priv->regmap_base;
1749cf04a17bSJianqun Xu 	else
1750cf04a17bSJianqun Xu 		regmap = priv->regmap_base;
175149c55878SDavid Wu 
175249c55878SDavid Wu 	/* get basic quadrupel of mux registers and the correct reg inside */
175349c55878SDavid Wu 	mux_type = bank->iomux[iomux_num].type;
175449c55878SDavid Wu 	reg = bank->iomux[iomux_num].offset;
175549c55878SDavid Wu 	if (mux_type & IOMUX_WIDTH_4BIT) {
175649c55878SDavid Wu 		if ((pin % 8) >= 4)
175749c55878SDavid Wu 			reg += 0x4;
175849c55878SDavid Wu 		bit = (pin % 4) * 4;
175949c55878SDavid Wu 		mask = 0xf;
176049c55878SDavid Wu 	} else if (mux_type & IOMUX_WIDTH_3BIT) {
176149c55878SDavid Wu 		if ((pin % 8) >= 5)
176249c55878SDavid Wu 			reg += 0x4;
176349c55878SDavid Wu 		bit = (pin % 8 % 5) * 3;
176449c55878SDavid Wu 		mask = 0x7;
176549c55878SDavid Wu 	} else {
176649c55878SDavid Wu 		bit = (pin % 8) * 2;
176749c55878SDavid Wu 		mask = 0x3;
176849c55878SDavid Wu 	}
176949c55878SDavid Wu 
177049c55878SDavid Wu 	if (bank->recalced_mask & BIT(pin))
177149c55878SDavid Wu 		rockchip_get_recalced_mux(bank, pin, &reg, &bit, &mask);
177249c55878SDavid Wu 
177349c55878SDavid Wu 	if (bank->route_mask & BIT(pin)) {
177449e04eddSJianqun Xu 		u32 route_reg = 0, route_val = 0;
177549e04eddSJianqun Xu 
177649e04eddSJianqun Xu 		ret = rockchip_get_mux_route(bank, pin, mux,
177749e04eddSJianqun Xu 					     &route_reg, &route_val);
177849e04eddSJianqun Xu 		switch (ret) {
177949e04eddSJianqun Xu 		case ROUTE_TYPE_DEFAULT:
178049e04eddSJianqun Xu 			regmap_write(regmap, route_reg, route_val);
178149e04eddSJianqun Xu 			break;
178249e04eddSJianqun Xu 		case ROUTE_TYPE_TOPGRF:
178349e04eddSJianqun Xu 			regmap_write(priv->regmap_base, route_reg, route_val);
178449e04eddSJianqun Xu 			break;
178549e04eddSJianqun Xu 		case ROUTE_TYPE_PMUGRF:
178649e04eddSJianqun Xu 			regmap_write(priv->regmap_pmu, route_reg, route_val);
178749e04eddSJianqun Xu 			break;
178849e04eddSJianqun Xu 		case ROUTE_TYPE_INVALID: /* Fall through */
178949e04eddSJianqun Xu 		default:
179049e04eddSJianqun Xu 			break;
179149c55878SDavid Wu 		}
179249c55878SDavid Wu 	}
179349c55878SDavid Wu 
17944bafc2daSDavid Wu 	if (mux_type & IOMUX_WRITABLE_32BIT) {
17958bf1bc66SDavid Wu 		regmap_read(regmap, reg, &data);
17964bafc2daSDavid Wu 		data &= ~(mask << bit);
17974bafc2daSDavid Wu 	} else {
179849c55878SDavid Wu 		data = (mask << (bit + 16));
17994bafc2daSDavid Wu 	}
18008bf1bc66SDavid Wu 
180149c55878SDavid Wu 	data |= (mux & mask) << bit;
180249c55878SDavid Wu 	ret = regmap_write(regmap, reg, data);
180349c55878SDavid Wu 
180449c55878SDavid Wu 	return ret;
180549c55878SDavid Wu }
180649c55878SDavid Wu 
180749c55878SDavid Wu #define PX30_PULL_PMU_OFFSET		0x10
180849c55878SDavid Wu #define PX30_PULL_GRF_OFFSET		0x60
180949c55878SDavid Wu #define PX30_PULL_BITS_PER_PIN		2
181049c55878SDavid Wu #define PX30_PULL_PINS_PER_REG		8
181149c55878SDavid Wu #define PX30_PULL_BANK_STRIDE		16
181249c55878SDavid Wu 
px30_calc_pull_reg_and_bit(struct rockchip_pin_bank * bank,int pin_num,struct regmap ** regmap,int * reg,u8 * bit)181349c55878SDavid Wu static void px30_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
181449c55878SDavid Wu 				       int pin_num, struct regmap **regmap,
181549c55878SDavid Wu 				       int *reg, u8 *bit)
181649c55878SDavid Wu {
181749c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
181849c55878SDavid Wu 
181949c55878SDavid Wu 	/* The first 32 pins of the first bank are located in PMU */
182049c55878SDavid Wu 	if (bank->bank_num == 0) {
182149c55878SDavid Wu 		*regmap = priv->regmap_pmu;
182249c55878SDavid Wu 		*reg = PX30_PULL_PMU_OFFSET;
182349c55878SDavid Wu 	} else {
182449c55878SDavid Wu 		*regmap = priv->regmap_base;
182549c55878SDavid Wu 		*reg = PX30_PULL_GRF_OFFSET;
182649c55878SDavid Wu 
182749c55878SDavid Wu 		/* correct the offset, as we're starting with the 2nd bank */
182849c55878SDavid Wu 		*reg -= 0x10;
182949c55878SDavid Wu 		*reg += bank->bank_num * PX30_PULL_BANK_STRIDE;
183049c55878SDavid Wu 	}
183149c55878SDavid Wu 
183249c55878SDavid Wu 	*reg += ((pin_num / PX30_PULL_PINS_PER_REG) * 4);
183349c55878SDavid Wu 	*bit = (pin_num % PX30_PULL_PINS_PER_REG);
183449c55878SDavid Wu 	*bit *= PX30_PULL_BITS_PER_PIN;
183549c55878SDavid Wu }
183649c55878SDavid Wu 
183749c55878SDavid Wu #define PX30_DRV_PMU_OFFSET		0x20
183849c55878SDavid Wu #define PX30_DRV_GRF_OFFSET		0xf0
183949c55878SDavid Wu #define PX30_DRV_BITS_PER_PIN		2
184049c55878SDavid Wu #define PX30_DRV_PINS_PER_REG		8
184149c55878SDavid Wu #define PX30_DRV_BANK_STRIDE		16
184249c55878SDavid Wu 
px30_calc_drv_reg_and_bit(struct rockchip_pin_bank * bank,int pin_num,struct regmap ** regmap,int * reg,u8 * bit)184349c55878SDavid Wu static void px30_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
184449c55878SDavid Wu 				      int pin_num, struct regmap **regmap,
184549c55878SDavid Wu 				      int *reg, u8 *bit)
184649c55878SDavid Wu {
184749c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
184849c55878SDavid Wu 
184949c55878SDavid Wu 	/* The first 32 pins of the first bank are located in PMU */
185049c55878SDavid Wu 	if (bank->bank_num == 0) {
185149c55878SDavid Wu 		*regmap = priv->regmap_pmu;
185249c55878SDavid Wu 		*reg = PX30_DRV_PMU_OFFSET;
185349c55878SDavid Wu 	} else {
185449c55878SDavid Wu 		*regmap = priv->regmap_base;
185549c55878SDavid Wu 		*reg = PX30_DRV_GRF_OFFSET;
185649c55878SDavid Wu 
185749c55878SDavid Wu 		/* correct the offset, as we're starting with the 2nd bank */
185849c55878SDavid Wu 		*reg -= 0x10;
185949c55878SDavid Wu 		*reg += bank->bank_num * PX30_DRV_BANK_STRIDE;
186049c55878SDavid Wu 	}
186149c55878SDavid Wu 
186249c55878SDavid Wu 	*reg += ((pin_num / PX30_DRV_PINS_PER_REG) * 4);
186349c55878SDavid Wu 	*bit = (pin_num % PX30_DRV_PINS_PER_REG);
186449c55878SDavid Wu 	*bit *= PX30_DRV_BITS_PER_PIN;
186549c55878SDavid Wu }
186649c55878SDavid Wu 
186749c55878SDavid Wu #define PX30_SCHMITT_PMU_OFFSET			0x38
186849c55878SDavid Wu #define PX30_SCHMITT_GRF_OFFSET			0xc0
186949c55878SDavid Wu #define PX30_SCHMITT_PINS_PER_PMU_REG		16
187049c55878SDavid Wu #define PX30_SCHMITT_BANK_STRIDE		16
187149c55878SDavid Wu #define PX30_SCHMITT_PINS_PER_GRF_REG		8
187249c55878SDavid Wu 
px30_calc_schmitt_reg_and_bit(struct rockchip_pin_bank * bank,int pin_num,struct regmap ** regmap,int * reg,u8 * bit)187349c55878SDavid Wu static int px30_calc_schmitt_reg_and_bit(struct rockchip_pin_bank *bank,
187449c55878SDavid Wu 					 int pin_num,
187549c55878SDavid Wu 					 struct regmap **regmap,
187649c55878SDavid Wu 					 int *reg, u8 *bit)
187749c55878SDavid Wu {
187849c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
187949c55878SDavid Wu 	int pins_per_reg;
188049c55878SDavid Wu 
188149c55878SDavid Wu 	if (bank->bank_num == 0) {
188249c55878SDavid Wu 		*regmap = priv->regmap_pmu;
188349c55878SDavid Wu 		*reg = PX30_SCHMITT_PMU_OFFSET;
188449c55878SDavid Wu 		pins_per_reg = PX30_SCHMITT_PINS_PER_PMU_REG;
188549c55878SDavid Wu 	} else {
188649c55878SDavid Wu 		*regmap = priv->regmap_base;
188749c55878SDavid Wu 		*reg = PX30_SCHMITT_GRF_OFFSET;
188849c55878SDavid Wu 		pins_per_reg = PX30_SCHMITT_PINS_PER_GRF_REG;
188949c55878SDavid Wu 		*reg += (bank->bank_num - 1) * PX30_SCHMITT_BANK_STRIDE;
189049c55878SDavid Wu 	}
189149c55878SDavid Wu 	*reg += ((pin_num / pins_per_reg) * 4);
189249c55878SDavid Wu 	*bit = pin_num % pins_per_reg;
189349c55878SDavid Wu 
189449c55878SDavid Wu 	return 0;
189549c55878SDavid Wu }
189649c55878SDavid Wu 
189749c55878SDavid Wu #define RV1108_PULL_PMU_OFFSET		0x10
189849c55878SDavid Wu #define RV1108_PULL_OFFSET		0x110
189949c55878SDavid Wu #define RV1108_PULL_PINS_PER_REG	8
190049c55878SDavid Wu #define RV1108_PULL_BITS_PER_PIN	2
190149c55878SDavid Wu #define RV1108_PULL_BANK_STRIDE		16
190249c55878SDavid Wu 
rv1108_calc_pull_reg_and_bit(struct rockchip_pin_bank * bank,int pin_num,struct regmap ** regmap,int * reg,u8 * bit)190349c55878SDavid Wu static void rv1108_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
190449c55878SDavid Wu 					 int pin_num, struct regmap **regmap,
190549c55878SDavid Wu 					 int *reg, u8 *bit)
190649c55878SDavid Wu {
190749c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
190849c55878SDavid Wu 
190949c55878SDavid Wu 	/* The first 24 pins of the first bank are located in PMU */
191049c55878SDavid Wu 	if (bank->bank_num == 0) {
191149c55878SDavid Wu 		*regmap = priv->regmap_pmu;
191249c55878SDavid Wu 		*reg = RV1108_PULL_PMU_OFFSET;
191349c55878SDavid Wu 	} else {
191449c55878SDavid Wu 		*reg = RV1108_PULL_OFFSET;
191549c55878SDavid Wu 		*regmap = priv->regmap_base;
191649c55878SDavid Wu 		/* correct the offset, as we're starting with the 2nd bank */
191749c55878SDavid Wu 		*reg -= 0x10;
191849c55878SDavid Wu 		*reg += bank->bank_num * RV1108_PULL_BANK_STRIDE;
191949c55878SDavid Wu 	}
192049c55878SDavid Wu 
192149c55878SDavid Wu 	*reg += ((pin_num / RV1108_PULL_PINS_PER_REG) * 4);
192249c55878SDavid Wu 	*bit = (pin_num % RV1108_PULL_PINS_PER_REG);
192349c55878SDavid Wu 	*bit *= RV1108_PULL_BITS_PER_PIN;
192449c55878SDavid Wu }
192549c55878SDavid Wu 
192649c55878SDavid Wu #define RV1108_DRV_PMU_OFFSET		0x20
192749c55878SDavid Wu #define RV1108_DRV_GRF_OFFSET		0x210
192849c55878SDavid Wu #define RV1108_DRV_BITS_PER_PIN		2
192949c55878SDavid Wu #define RV1108_DRV_PINS_PER_REG		8
193049c55878SDavid Wu #define RV1108_DRV_BANK_STRIDE		16
193149c55878SDavid Wu 
rv1108_calc_drv_reg_and_bit(struct rockchip_pin_bank * bank,int pin_num,struct regmap ** regmap,int * reg,u8 * bit)193249c55878SDavid Wu static void rv1108_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
193349c55878SDavid Wu 					int pin_num, struct regmap **regmap,
193449c55878SDavid Wu 					int *reg, u8 *bit)
193549c55878SDavid Wu {
193649c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
193749c55878SDavid Wu 
193849c55878SDavid Wu 	/* The first 24 pins of the first bank are located in PMU */
193949c55878SDavid Wu 	if (bank->bank_num == 0) {
194049c55878SDavid Wu 		*regmap = priv->regmap_pmu;
194149c55878SDavid Wu 		*reg = RV1108_DRV_PMU_OFFSET;
194249c55878SDavid Wu 	} else {
194349c55878SDavid Wu 		*regmap = priv->regmap_base;
194449c55878SDavid Wu 		*reg = RV1108_DRV_GRF_OFFSET;
194549c55878SDavid Wu 
194649c55878SDavid Wu 		/* correct the offset, as we're starting with the 2nd bank */
194749c55878SDavid Wu 		*reg -= 0x10;
194849c55878SDavid Wu 		*reg += bank->bank_num * RV1108_DRV_BANK_STRIDE;
194949c55878SDavid Wu 	}
195049c55878SDavid Wu 
195149c55878SDavid Wu 	*reg += ((pin_num / RV1108_DRV_PINS_PER_REG) * 4);
195249c55878SDavid Wu 	*bit = pin_num % RV1108_DRV_PINS_PER_REG;
195349c55878SDavid Wu 	*bit *= RV1108_DRV_BITS_PER_PIN;
195449c55878SDavid Wu }
195549c55878SDavid Wu 
195649c55878SDavid Wu #define RV1108_SCHMITT_PMU_OFFSET		0x30
195749c55878SDavid Wu #define RV1108_SCHMITT_GRF_OFFSET		0x388
195849c55878SDavid Wu #define RV1108_SCHMITT_BANK_STRIDE		8
195949c55878SDavid Wu #define RV1108_SCHMITT_PINS_PER_GRF_REG		16
196049c55878SDavid Wu #define RV1108_SCHMITT_PINS_PER_PMU_REG		8
196149c55878SDavid Wu 
rv1108_calc_schmitt_reg_and_bit(struct rockchip_pin_bank * bank,int pin_num,struct regmap ** regmap,int * reg,u8 * bit)196249c55878SDavid Wu static int rv1108_calc_schmitt_reg_and_bit(struct rockchip_pin_bank *bank,
196349c55878SDavid Wu 					   int pin_num,
196449c55878SDavid Wu 					   struct regmap **regmap,
196549c55878SDavid Wu 					   int *reg, u8 *bit)
196649c55878SDavid Wu {
196749c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
196849c55878SDavid Wu 	int pins_per_reg;
196949c55878SDavid Wu 
197049c55878SDavid Wu 	if (bank->bank_num == 0) {
197149c55878SDavid Wu 		*regmap = priv->regmap_pmu;
197249c55878SDavid Wu 		*reg = RV1108_SCHMITT_PMU_OFFSET;
197349c55878SDavid Wu 		pins_per_reg = RV1108_SCHMITT_PINS_PER_PMU_REG;
197449c55878SDavid Wu 	} else {
197549c55878SDavid Wu 		*regmap = priv->regmap_base;
197649c55878SDavid Wu 		*reg = RV1108_SCHMITT_GRF_OFFSET;
197749c55878SDavid Wu 		pins_per_reg = RV1108_SCHMITT_PINS_PER_GRF_REG;
197849c55878SDavid Wu 		*reg += (bank->bank_num  - 1) * RV1108_SCHMITT_BANK_STRIDE;
197949c55878SDavid Wu 	}
198049c55878SDavid Wu 	*reg += ((pin_num / pins_per_reg) * 4);
198149c55878SDavid Wu 	*bit = pin_num % pins_per_reg;
198249c55878SDavid Wu 
198349c55878SDavid Wu 	return 0;
198449c55878SDavid Wu }
198549c55878SDavid Wu 
1986cf04a17bSJianqun Xu #define RV1126_PULL_PMU_OFFSET		0x40
1987cf04a17bSJianqun Xu #define RV1126_PULL_GRF_GPIO1A0_OFFSET		0x10108
1988cf04a17bSJianqun Xu #define RV1126_PULL_PINS_PER_REG	8
1989cf04a17bSJianqun Xu #define RV1126_PULL_BITS_PER_PIN	2
1990cf04a17bSJianqun Xu #define RV1126_PULL_BANK_STRIDE		16
1991cf04a17bSJianqun Xu #define RV1126_GPIO_C4_D7(p)	(p >= 20 && p <= 31) /* GPIO0_C4 ~ GPIO0_D7 */
1992cf04a17bSJianqun Xu 
rv1126_calc_pull_reg_and_bit(struct rockchip_pin_bank * bank,int pin_num,struct regmap ** regmap,int * reg,u8 * bit)1993cf04a17bSJianqun Xu static void rv1126_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
1994cf04a17bSJianqun Xu 					 int pin_num, struct regmap **regmap,
1995cf04a17bSJianqun Xu 					 int *reg, u8 *bit)
1996cf04a17bSJianqun Xu {
1997cf04a17bSJianqun Xu 	struct rockchip_pinctrl_priv *priv = bank->priv;
1998cf04a17bSJianqun Xu 
1999cf04a17bSJianqun Xu 	/* The first 24 pins of the first bank are located in PMU */
2000cf04a17bSJianqun Xu 	if (bank->bank_num == 0) {
2001cf04a17bSJianqun Xu 		if (RV1126_GPIO_C4_D7(pin_num)) {
2002cf04a17bSJianqun Xu 			*regmap = priv->regmap_base;
2003cf04a17bSJianqun Xu 			*reg = RV1126_PULL_GRF_GPIO1A0_OFFSET;
2004cf04a17bSJianqun Xu 			*reg -= (((31 - pin_num) / RV1126_PULL_PINS_PER_REG + 1) * 4);
2005cf04a17bSJianqun Xu 			*bit = pin_num % RV1126_PULL_PINS_PER_REG;
2006cf04a17bSJianqun Xu 			*bit *= RV1126_PULL_BITS_PER_PIN;
2007cf04a17bSJianqun Xu 			return;
2008cf04a17bSJianqun Xu 		}
2009cf04a17bSJianqun Xu 		*regmap = priv->regmap_pmu;
2010cf04a17bSJianqun Xu 		*reg = RV1126_PULL_PMU_OFFSET;
2011cf04a17bSJianqun Xu 	} else {
2012cf04a17bSJianqun Xu 		*reg = RV1126_PULL_GRF_GPIO1A0_OFFSET;
2013cf04a17bSJianqun Xu 		*regmap = priv->regmap_base;
2014d499d466SJianqun Xu 		*reg += (bank->bank_num - 1) * RV1126_PULL_BANK_STRIDE;
2015cf04a17bSJianqun Xu 	}
2016cf04a17bSJianqun Xu 
2017cf04a17bSJianqun Xu 	*reg += ((pin_num / RV1126_PULL_PINS_PER_REG) * 4);
2018cf04a17bSJianqun Xu 	*bit = (pin_num % RV1126_PULL_PINS_PER_REG);
2019cf04a17bSJianqun Xu 	*bit *= RV1126_PULL_BITS_PER_PIN;
2020cf04a17bSJianqun Xu }
2021cf04a17bSJianqun Xu 
2022cf04a17bSJianqun Xu #define RV1126_DRV_PMU_OFFSET		0x20
2023cf04a17bSJianqun Xu #define RV1126_DRV_GRF_GPIO1A0_OFFSET		0x10090
2024cf04a17bSJianqun Xu #define RV1126_DRV_BITS_PER_PIN		4
2025cf04a17bSJianqun Xu #define RV1126_DRV_PINS_PER_REG		4
2026cf04a17bSJianqun Xu #define RV1126_DRV_BANK_STRIDE		32
2027cf04a17bSJianqun Xu 
rv1126_calc_drv_reg_and_bit(struct rockchip_pin_bank * bank,int pin_num,struct regmap ** regmap,int * reg,u8 * bit)2028cf04a17bSJianqun Xu static void rv1126_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
2029cf04a17bSJianqun Xu 					int pin_num, struct regmap **regmap,
2030cf04a17bSJianqun Xu 					int *reg, u8 *bit)
2031cf04a17bSJianqun Xu {
2032cf04a17bSJianqun Xu 	struct rockchip_pinctrl_priv *priv = bank->priv;
2033cf04a17bSJianqun Xu 
2034cf04a17bSJianqun Xu 	/* The first 24 pins of the first bank are located in PMU */
2035cf04a17bSJianqun Xu 	if (bank->bank_num == 0) {
2036cf04a17bSJianqun Xu 		if (RV1126_GPIO_C4_D7(pin_num)) {
2037cf04a17bSJianqun Xu 			*regmap = priv->regmap_base;
2038cf04a17bSJianqun Xu 			*reg = RV1126_DRV_GRF_GPIO1A0_OFFSET;
2039cf04a17bSJianqun Xu 			*reg -= (((31 - pin_num) / RV1126_DRV_PINS_PER_REG + 1) * 4);
2040d499d466SJianqun Xu 			*reg -= 0x4;
2041cf04a17bSJianqun Xu 			*bit = pin_num % RV1126_DRV_PINS_PER_REG;
2042cf04a17bSJianqun Xu 			*bit *= RV1126_DRV_BITS_PER_PIN;
2043cf04a17bSJianqun Xu 			return;
2044cf04a17bSJianqun Xu 		}
2045cf04a17bSJianqun Xu 		*regmap = priv->regmap_pmu;
2046cf04a17bSJianqun Xu 		*reg = RV1126_DRV_PMU_OFFSET;
2047cf04a17bSJianqun Xu 	} else {
2048cf04a17bSJianqun Xu 		*regmap = priv->regmap_base;
2049cf04a17bSJianqun Xu 		*reg = RV1126_DRV_GRF_GPIO1A0_OFFSET;
2050d499d466SJianqun Xu 		*reg += (bank->bank_num - 1) * RV1126_DRV_BANK_STRIDE;
2051cf04a17bSJianqun Xu 	}
2052cf04a17bSJianqun Xu 
2053cf04a17bSJianqun Xu 	*reg += ((pin_num / RV1126_DRV_PINS_PER_REG) * 4);
2054cf04a17bSJianqun Xu 	*bit = pin_num % RV1126_DRV_PINS_PER_REG;
2055cf04a17bSJianqun Xu 	*bit *= RV1126_DRV_BITS_PER_PIN;
2056cf04a17bSJianqun Xu }
2057cf04a17bSJianqun Xu 
2058cf04a17bSJianqun Xu #define RV1126_SCHMITT_PMU_OFFSET		0x60
2059cf04a17bSJianqun Xu #define RV1126_SCHMITT_GRF_GPIO1A0_OFFSET		0x10188
2060cf04a17bSJianqun Xu #define RV1126_SCHMITT_BANK_STRIDE		16
2061cf04a17bSJianqun Xu #define RV1126_SCHMITT_PINS_PER_GRF_REG		8
2062cf04a17bSJianqun Xu #define RV1126_SCHMITT_PINS_PER_PMU_REG		8
2063cf04a17bSJianqun Xu 
rv1126_calc_schmitt_reg_and_bit(struct rockchip_pin_bank * bank,int pin_num,struct regmap ** regmap,int * reg,u8 * bit)2064cf04a17bSJianqun Xu static int rv1126_calc_schmitt_reg_and_bit(struct rockchip_pin_bank *bank,
2065cf04a17bSJianqun Xu 					   int pin_num,
2066cf04a17bSJianqun Xu 					   struct regmap **regmap,
2067cf04a17bSJianqun Xu 					   int *reg, u8 *bit)
2068cf04a17bSJianqun Xu {
2069cf04a17bSJianqun Xu 	struct rockchip_pinctrl_priv *priv = bank->priv;
2070cf04a17bSJianqun Xu 	int pins_per_reg;
2071cf04a17bSJianqun Xu 
2072cf04a17bSJianqun Xu 	if (bank->bank_num == 0) {
2073cf04a17bSJianqun Xu 		if (RV1126_GPIO_C4_D7(pin_num)) {
2074cf04a17bSJianqun Xu 			*regmap = priv->regmap_base;
2075cf04a17bSJianqun Xu 			*reg = RV1126_SCHMITT_GRF_GPIO1A0_OFFSET;
2076cf04a17bSJianqun Xu 			*reg -= (((31 - pin_num) / RV1126_SCHMITT_PINS_PER_GRF_REG + 1) * 4);
2077cf04a17bSJianqun Xu 			*bit = pin_num % RV1126_SCHMITT_PINS_PER_GRF_REG;
2078cf04a17bSJianqun Xu 			return 0;
2079cf04a17bSJianqun Xu 		}
2080cf04a17bSJianqun Xu 		*regmap = priv->regmap_pmu;
2081cf04a17bSJianqun Xu 		*reg = RV1126_SCHMITT_PMU_OFFSET;
2082cf04a17bSJianqun Xu 		pins_per_reg = RV1126_SCHMITT_PINS_PER_PMU_REG;
2083cf04a17bSJianqun Xu 	} else {
2084cf04a17bSJianqun Xu 		*regmap = priv->regmap_base;
2085cf04a17bSJianqun Xu 		*reg = RV1126_SCHMITT_GRF_GPIO1A0_OFFSET;
2086cf04a17bSJianqun Xu 		pins_per_reg = RV1126_SCHMITT_PINS_PER_GRF_REG;
2087d499d466SJianqun Xu 		*reg += (bank->bank_num - 1) * RV1126_SCHMITT_BANK_STRIDE;
2088cf04a17bSJianqun Xu 	}
2089cf04a17bSJianqun Xu 	*reg += ((pin_num / pins_per_reg) * 4);
2090cf04a17bSJianqun Xu 	*bit = pin_num % pins_per_reg;
2091cf04a17bSJianqun Xu 
2092cf04a17bSJianqun Xu 	return 0;
2093cf04a17bSJianqun Xu }
2094cf04a17bSJianqun Xu 
2095a2a3fc8fSJianqun Xu #define RK1808_PULL_PMU_OFFSET		0x10
2096a2a3fc8fSJianqun Xu #define RK1808_PULL_GRF_OFFSET		0x80
2097a2a3fc8fSJianqun Xu #define RK1808_PULL_PINS_PER_REG	8
2098a2a3fc8fSJianqun Xu #define RK1808_PULL_BITS_PER_PIN	2
2099a2a3fc8fSJianqun Xu #define RK1808_PULL_BANK_STRIDE		16
2100a2a3fc8fSJianqun Xu 
rk1808_calc_pull_reg_and_bit(struct rockchip_pin_bank * bank,int pin_num,struct regmap ** regmap,int * reg,u8 * bit)2101a2a3fc8fSJianqun Xu static void rk1808_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
2102a2a3fc8fSJianqun Xu 					 int pin_num,
2103a2a3fc8fSJianqun Xu 					 struct regmap **regmap,
2104a2a3fc8fSJianqun Xu 					 int *reg, u8 *bit)
2105a2a3fc8fSJianqun Xu {
2106a2a3fc8fSJianqun Xu 	struct rockchip_pinctrl_priv *priv = bank->priv;
2107a2a3fc8fSJianqun Xu 
2108a2a3fc8fSJianqun Xu 	if (bank->bank_num == 0) {
2109a2a3fc8fSJianqun Xu 		*regmap = priv->regmap_pmu;
2110a2a3fc8fSJianqun Xu 		*reg = RK1808_PULL_PMU_OFFSET;
2111a2a3fc8fSJianqun Xu 	} else {
2112a2a3fc8fSJianqun Xu 		*reg = RK1808_PULL_GRF_OFFSET;
2113a2a3fc8fSJianqun Xu 		*regmap = priv->regmap_base;
2114a2a3fc8fSJianqun Xu 	}
2115a2a3fc8fSJianqun Xu 
2116a2a3fc8fSJianqun Xu 	*reg += ((pin_num / RK1808_PULL_PINS_PER_REG) * 4);
2117a2a3fc8fSJianqun Xu 	*bit = (pin_num % RK1808_PULL_PINS_PER_REG);
2118a2a3fc8fSJianqun Xu 	*bit *= RK1808_PULL_BITS_PER_PIN;
2119a2a3fc8fSJianqun Xu }
2120a2a3fc8fSJianqun Xu 
2121a2a3fc8fSJianqun Xu #define RK1808_DRV_PMU_OFFSET		0x20
2122a2a3fc8fSJianqun Xu #define RK1808_DRV_GRF_OFFSET		0x140
2123a2a3fc8fSJianqun Xu #define RK1808_DRV_BITS_PER_PIN		2
2124a2a3fc8fSJianqun Xu #define RK1808_DRV_PINS_PER_REG		8
2125a2a3fc8fSJianqun Xu #define RK1808_DRV_BANK_STRIDE		16
2126a2a3fc8fSJianqun Xu 
rk1808_calc_drv_reg_and_bit(struct rockchip_pin_bank * bank,int pin_num,struct regmap ** regmap,int * reg,u8 * bit)2127a2a3fc8fSJianqun Xu static void rk1808_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
2128a2a3fc8fSJianqun Xu 					int pin_num,
2129a2a3fc8fSJianqun Xu 					struct regmap **regmap,
2130a2a3fc8fSJianqun Xu 					int *reg, u8 *bit)
2131a2a3fc8fSJianqun Xu {
2132a2a3fc8fSJianqun Xu 	struct rockchip_pinctrl_priv *priv = bank->priv;
2133a2a3fc8fSJianqun Xu 
2134a2a3fc8fSJianqun Xu 	if (bank->bank_num == 0) {
2135a2a3fc8fSJianqun Xu 		*regmap = priv->regmap_pmu;
2136a2a3fc8fSJianqun Xu 		*reg = RK1808_DRV_PMU_OFFSET;
2137a2a3fc8fSJianqun Xu 	} else {
2138a2a3fc8fSJianqun Xu 		*regmap = priv->regmap_base;
2139a2a3fc8fSJianqun Xu 		*reg = RK1808_DRV_GRF_OFFSET;
2140a2a3fc8fSJianqun Xu 	}
2141a2a3fc8fSJianqun Xu 
2142a2a3fc8fSJianqun Xu 	*reg += ((pin_num / RK1808_DRV_PINS_PER_REG) * 4);
2143a2a3fc8fSJianqun Xu 	*bit = pin_num % RK1808_DRV_PINS_PER_REG;
2144a2a3fc8fSJianqun Xu 	*bit *= RK1808_DRV_BITS_PER_PIN;
2145a2a3fc8fSJianqun Xu }
2146a2a3fc8fSJianqun Xu 
2147a2a3fc8fSJianqun Xu #define RK1808_SCHMITT_PMU_OFFSET		0x0040
2148a2a3fc8fSJianqun Xu #define RK1808_SCHMITT_GRF_OFFSET		0x0100
2149a2a3fc8fSJianqun Xu #define RK1808_SCHMITT_BANK_STRIDE		16
2150a2a3fc8fSJianqun Xu #define RK1808_SCHMITT_PINS_PER_REG		8
2151a2a3fc8fSJianqun Xu 
rk1808_calc_schmitt_reg_and_bit(struct rockchip_pin_bank * bank,int pin_num,struct regmap ** regmap,int * reg,u8 * bit)2152a2a3fc8fSJianqun Xu static int rk1808_calc_schmitt_reg_and_bit(struct rockchip_pin_bank *bank,
2153a2a3fc8fSJianqun Xu 					   int pin_num,
2154a2a3fc8fSJianqun Xu 					   struct regmap **regmap,
2155a2a3fc8fSJianqun Xu 					   int *reg, u8 *bit)
2156a2a3fc8fSJianqun Xu {
2157a2a3fc8fSJianqun Xu 	struct rockchip_pinctrl_priv *priv = bank->priv;
2158a2a3fc8fSJianqun Xu 
2159a2a3fc8fSJianqun Xu 	if (bank->bank_num == 0) {
2160a2a3fc8fSJianqun Xu 		*regmap = priv->regmap_pmu;
2161a2a3fc8fSJianqun Xu 		*reg = RK1808_SCHMITT_PMU_OFFSET;
2162a2a3fc8fSJianqun Xu 	} else {
2163a2a3fc8fSJianqun Xu 		*regmap = priv->regmap_base;
2164a2a3fc8fSJianqun Xu 		*reg = RK1808_SCHMITT_GRF_OFFSET;
2165a2a3fc8fSJianqun Xu 		*reg += (bank->bank_num  - 1) * RK1808_SCHMITT_BANK_STRIDE;
2166a2a3fc8fSJianqun Xu 	}
2167a2a3fc8fSJianqun Xu 	*reg += ((pin_num / RK1808_SCHMITT_PINS_PER_REG) * 4);
2168a2a3fc8fSJianqun Xu 	*bit = pin_num % RK1808_SCHMITT_PINS_PER_REG;
2169a2a3fc8fSJianqun Xu 
2170a2a3fc8fSJianqun Xu 	return 0;
2171a2a3fc8fSJianqun Xu }
2172a2a3fc8fSJianqun Xu 
217349c55878SDavid Wu #define RK2928_PULL_OFFSET		0x118
217449c55878SDavid Wu #define RK2928_PULL_PINS_PER_REG	16
217549c55878SDavid Wu #define RK2928_PULL_BANK_STRIDE		8
217649c55878SDavid Wu 
rk2928_calc_pull_reg_and_bit(struct rockchip_pin_bank * bank,int pin_num,struct regmap ** regmap,int * reg,u8 * bit)217749c55878SDavid Wu static void rk2928_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
217849c55878SDavid Wu 					 int pin_num, struct regmap **regmap,
217949c55878SDavid Wu 					 int *reg, u8 *bit)
218049c55878SDavid Wu {
218149c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
218249c55878SDavid Wu 
218349c55878SDavid Wu 	*regmap = priv->regmap_base;
218449c55878SDavid Wu 	*reg = RK2928_PULL_OFFSET;
218549c55878SDavid Wu 	*reg += bank->bank_num * RK2928_PULL_BANK_STRIDE;
218649c55878SDavid Wu 	*reg += (pin_num / RK2928_PULL_PINS_PER_REG) * 4;
218749c55878SDavid Wu 
218849c55878SDavid Wu 	*bit = pin_num % RK2928_PULL_PINS_PER_REG;
218949c55878SDavid Wu };
219049c55878SDavid Wu 
219149c55878SDavid Wu #define RK3128_PULL_OFFSET	0x118
219249c55878SDavid Wu 
rk3128_calc_pull_reg_and_bit(struct rockchip_pin_bank * bank,int pin_num,struct regmap ** regmap,int * reg,u8 * bit)219349c55878SDavid Wu static void rk3128_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
219449c55878SDavid Wu 					 int pin_num, struct regmap **regmap,
219549c55878SDavid Wu 					 int *reg, u8 *bit)
219649c55878SDavid Wu {
219749c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
219849c55878SDavid Wu 
219949c55878SDavid Wu 	*regmap = priv->regmap_base;
220049c55878SDavid Wu 	*reg = RK3128_PULL_OFFSET;
220149c55878SDavid Wu 	*reg += bank->bank_num * RK2928_PULL_BANK_STRIDE;
220249c55878SDavid Wu 	*reg += ((pin_num / RK2928_PULL_PINS_PER_REG) * 4);
220349c55878SDavid Wu 
220449c55878SDavid Wu 	*bit = pin_num % RK2928_PULL_PINS_PER_REG;
220549c55878SDavid Wu }
220649c55878SDavid Wu 
220749c55878SDavid Wu #define RK3188_PULL_OFFSET		0x164
220849c55878SDavid Wu #define RK3188_PULL_BITS_PER_PIN	2
220949c55878SDavid Wu #define RK3188_PULL_PINS_PER_REG	8
221049c55878SDavid Wu #define RK3188_PULL_BANK_STRIDE		16
221149c55878SDavid Wu #define RK3188_PULL_PMU_OFFSET		0x64
221249c55878SDavid Wu 
rk3188_calc_pull_reg_and_bit(struct rockchip_pin_bank * bank,int pin_num,struct regmap ** regmap,int * reg,u8 * bit)221349c55878SDavid Wu static void rk3188_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
221449c55878SDavid Wu 					 int pin_num, struct regmap **regmap,
221549c55878SDavid Wu 					 int *reg, u8 *bit)
221649c55878SDavid Wu {
221749c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
221849c55878SDavid Wu 
221949c55878SDavid Wu 	/* The first 12 pins of the first bank are located elsewhere */
222049c55878SDavid Wu 	if (bank->bank_num == 0 && pin_num < 12) {
222149c55878SDavid Wu 		*regmap = priv->regmap_pmu;
222249c55878SDavid Wu 		*reg = RK3188_PULL_PMU_OFFSET;
222349c55878SDavid Wu 
222449c55878SDavid Wu 		*reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4);
222549c55878SDavid Wu 		*bit = pin_num % RK3188_PULL_PINS_PER_REG;
222649c55878SDavid Wu 		*bit *= RK3188_PULL_BITS_PER_PIN;
222749c55878SDavid Wu 	} else {
222849c55878SDavid Wu 		*regmap = priv->regmap_base;
222949c55878SDavid Wu 		*reg = RK3188_PULL_OFFSET;
223049c55878SDavid Wu 
223149c55878SDavid Wu 		/* correct the offset, as it is the 2nd pull register */
223249c55878SDavid Wu 		*reg -= 4;
223349c55878SDavid Wu 		*reg += bank->bank_num * RK3188_PULL_BANK_STRIDE;
223449c55878SDavid Wu 		*reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4);
223549c55878SDavid Wu 
223649c55878SDavid Wu 		/*
223749c55878SDavid Wu 		 * The bits in these registers have an inverse ordering
223849c55878SDavid Wu 		 * with the lowest pin being in bits 15:14 and the highest
223949c55878SDavid Wu 		 * pin in bits 1:0
224049c55878SDavid Wu 		 */
224149c55878SDavid Wu 		*bit = 7 - (pin_num % RK3188_PULL_PINS_PER_REG);
224249c55878SDavid Wu 		*bit *= RK3188_PULL_BITS_PER_PIN;
224349c55878SDavid Wu 	}
224449c55878SDavid Wu }
224549c55878SDavid Wu 
224649c55878SDavid Wu #define RK3288_PULL_OFFSET		0x140
rk3288_calc_pull_reg_and_bit(struct rockchip_pin_bank * bank,int pin_num,struct regmap ** regmap,int * reg,u8 * bit)224749c55878SDavid Wu static void rk3288_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
224849c55878SDavid Wu 					 int pin_num, struct regmap **regmap,
224949c55878SDavid Wu 					 int *reg, u8 *bit)
225049c55878SDavid Wu {
225149c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
225249c55878SDavid Wu 
225349c55878SDavid Wu 	/* The first 24 pins of the first bank are located in PMU */
225449c55878SDavid Wu 	if (bank->bank_num == 0) {
225549c55878SDavid Wu 		*regmap = priv->regmap_pmu;
225649c55878SDavid Wu 		*reg = RK3188_PULL_PMU_OFFSET;
225749c55878SDavid Wu 
225849c55878SDavid Wu 		*reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4);
225949c55878SDavid Wu 		*bit = pin_num % RK3188_PULL_PINS_PER_REG;
226049c55878SDavid Wu 		*bit *= RK3188_PULL_BITS_PER_PIN;
226149c55878SDavid Wu 	} else {
226249c55878SDavid Wu 		*regmap = priv->regmap_base;
226349c55878SDavid Wu 		*reg = RK3288_PULL_OFFSET;
226449c55878SDavid Wu 
226549c55878SDavid Wu 		/* correct the offset, as we're starting with the 2nd bank */
226649c55878SDavid Wu 		*reg -= 0x10;
226749c55878SDavid Wu 		*reg += bank->bank_num * RK3188_PULL_BANK_STRIDE;
226849c55878SDavid Wu 		*reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4);
226949c55878SDavid Wu 
227049c55878SDavid Wu 		*bit = (pin_num % RK3188_PULL_PINS_PER_REG);
227149c55878SDavid Wu 		*bit *= RK3188_PULL_BITS_PER_PIN;
227249c55878SDavid Wu 	}
227349c55878SDavid Wu }
227449c55878SDavid Wu 
227549c55878SDavid Wu #define RK3288_DRV_PMU_OFFSET		0x70
227649c55878SDavid Wu #define RK3288_DRV_GRF_OFFSET		0x1c0
227749c55878SDavid Wu #define RK3288_DRV_BITS_PER_PIN		2
227849c55878SDavid Wu #define RK3288_DRV_PINS_PER_REG		8
227949c55878SDavid Wu #define RK3288_DRV_BANK_STRIDE		16
228049c55878SDavid Wu 
rk3288_calc_drv_reg_and_bit(struct rockchip_pin_bank * bank,int pin_num,struct regmap ** regmap,int * reg,u8 * bit)228149c55878SDavid Wu static void rk3288_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 	/* The first 24 pins of the first bank are located in PMU */
228849c55878SDavid Wu 	if (bank->bank_num == 0) {
228949c55878SDavid Wu 		*regmap = priv->regmap_pmu;
229049c55878SDavid Wu 		*reg = RK3288_DRV_PMU_OFFSET;
229149c55878SDavid Wu 
229249c55878SDavid Wu 		*reg += ((pin_num / RK3288_DRV_PINS_PER_REG) * 4);
229349c55878SDavid Wu 		*bit = pin_num % RK3288_DRV_PINS_PER_REG;
229449c55878SDavid Wu 		*bit *= RK3288_DRV_BITS_PER_PIN;
229549c55878SDavid Wu 	} else {
229649c55878SDavid Wu 		*regmap = priv->regmap_base;
229749c55878SDavid Wu 		*reg = RK3288_DRV_GRF_OFFSET;
229849c55878SDavid Wu 
229949c55878SDavid Wu 		/* correct the offset, as we're starting with the 2nd bank */
230049c55878SDavid Wu 		*reg -= 0x10;
230149c55878SDavid Wu 		*reg += bank->bank_num * RK3288_DRV_BANK_STRIDE;
230249c55878SDavid Wu 		*reg += ((pin_num / RK3288_DRV_PINS_PER_REG) * 4);
230349c55878SDavid Wu 
230449c55878SDavid Wu 		*bit = (pin_num % RK3288_DRV_PINS_PER_REG);
230549c55878SDavid Wu 		*bit *= RK3288_DRV_BITS_PER_PIN;
230649c55878SDavid Wu 	}
230749c55878SDavid Wu }
230849c55878SDavid Wu 
230949c55878SDavid Wu #define RK3228_PULL_OFFSET		0x100
231049c55878SDavid Wu 
rk3228_calc_pull_reg_and_bit(struct rockchip_pin_bank * bank,int pin_num,struct regmap ** regmap,int * reg,u8 * bit)231149c55878SDavid Wu static void rk3228_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
231249c55878SDavid Wu 					 int pin_num, struct regmap **regmap,
231349c55878SDavid Wu 					 int *reg, u8 *bit)
231449c55878SDavid Wu {
231549c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
231649c55878SDavid Wu 
231749c55878SDavid Wu 	*regmap = priv->regmap_base;
231849c55878SDavid Wu 	*reg = RK3228_PULL_OFFSET;
231949c55878SDavid Wu 	*reg += bank->bank_num * RK3188_PULL_BANK_STRIDE;
232049c55878SDavid Wu 	*reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4);
232149c55878SDavid Wu 
232249c55878SDavid Wu 	*bit = (pin_num % RK3188_PULL_PINS_PER_REG);
232349c55878SDavid Wu 	*bit *= RK3188_PULL_BITS_PER_PIN;
232449c55878SDavid Wu }
232549c55878SDavid Wu 
232649c55878SDavid Wu #define RK3228_DRV_GRF_OFFSET		0x200
232749c55878SDavid Wu 
rk3228_calc_drv_reg_and_bit(struct rockchip_pin_bank * bank,int pin_num,struct regmap ** regmap,int * reg,u8 * bit)232849c55878SDavid Wu static void rk3228_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
232949c55878SDavid Wu 					int pin_num, struct regmap **regmap,
233049c55878SDavid Wu 					int *reg, u8 *bit)
233149c55878SDavid Wu {
233249c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
233349c55878SDavid Wu 
233449c55878SDavid Wu 	*regmap = priv->regmap_base;
233549c55878SDavid Wu 	*reg = RK3228_DRV_GRF_OFFSET;
233649c55878SDavid Wu 	*reg += bank->bank_num * RK3288_DRV_BANK_STRIDE;
233749c55878SDavid Wu 	*reg += ((pin_num / RK3288_DRV_PINS_PER_REG) * 4);
233849c55878SDavid Wu 
233949c55878SDavid Wu 	*bit = (pin_num % RK3288_DRV_PINS_PER_REG);
234049c55878SDavid Wu 	*bit *= RK3288_DRV_BITS_PER_PIN;
234149c55878SDavid Wu }
234249c55878SDavid Wu 
2343b3077611SDavid Wu #define RK3308_PULL_OFFSET		0xa0
2344b3077611SDavid Wu 
rk3308_calc_pull_reg_and_bit(struct rockchip_pin_bank * bank,int pin_num,struct regmap ** regmap,int * reg,u8 * bit)2345b3077611SDavid Wu static void rk3308_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
2346b3077611SDavid Wu 					 int pin_num, struct regmap **regmap,
2347b3077611SDavid Wu 					 int *reg, u8 *bit)
2348b3077611SDavid Wu {
2349b3077611SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
2350b3077611SDavid Wu 
2351b3077611SDavid Wu 	*regmap = priv->regmap_base;
2352b3077611SDavid Wu 	*reg = RK3308_PULL_OFFSET;
2353b3077611SDavid Wu 	*reg += bank->bank_num * RK3188_PULL_BANK_STRIDE;
2354b3077611SDavid Wu 	*reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4);
2355b3077611SDavid Wu 
2356b3077611SDavid Wu 	*bit = (pin_num % RK3188_PULL_PINS_PER_REG);
2357b3077611SDavid Wu 	*bit *= RK3188_PULL_BITS_PER_PIN;
2358b3077611SDavid Wu }
2359b3077611SDavid Wu 
2360b3077611SDavid Wu #define RK3308_DRV_GRF_OFFSET		0x100
2361b3077611SDavid Wu 
rk3308_calc_drv_reg_and_bit(struct rockchip_pin_bank * bank,int pin_num,struct regmap ** regmap,int * reg,u8 * bit)2362b3077611SDavid Wu static void rk3308_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
2363b3077611SDavid Wu 					int pin_num, struct regmap **regmap,
2364b3077611SDavid Wu 					int *reg, u8 *bit)
2365b3077611SDavid Wu {
2366b3077611SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
2367b3077611SDavid Wu 
2368b3077611SDavid Wu 	*regmap = priv->regmap_base;
2369b3077611SDavid Wu 	*reg = RK3308_DRV_GRF_OFFSET;
2370b3077611SDavid Wu 	*reg += bank->bank_num * RK3288_DRV_BANK_STRIDE;
2371b3077611SDavid Wu 	*reg += ((pin_num / RK3288_DRV_PINS_PER_REG) * 4);
2372b3077611SDavid Wu 
2373b3077611SDavid Wu 	*bit = (pin_num % RK3288_DRV_PINS_PER_REG);
2374b3077611SDavid Wu 	*bit *= RK3288_DRV_BITS_PER_PIN;
2375b3077611SDavid Wu }
2376b3077611SDavid Wu 
2377b3077611SDavid Wu #define RK3308_SCHMITT_PINS_PER_REG	8
2378b3077611SDavid Wu #define RK3308_SCHMITT_BANK_STRIDE	16
2379b3077611SDavid Wu #define RK3308_SCHMITT_GRF_OFFSET	0x1a0
2380b3077611SDavid Wu 
rk3308_calc_schmitt_reg_and_bit(struct rockchip_pin_bank * bank,int pin_num,struct regmap ** regmap,int * reg,u8 * bit)2381b3077611SDavid Wu static int rk3308_calc_schmitt_reg_and_bit(struct rockchip_pin_bank *bank,
2382b3077611SDavid Wu 					   int pin_num,
2383b3077611SDavid Wu 					   struct regmap **regmap,
2384b3077611SDavid Wu 					   int *reg, u8 *bit)
2385b3077611SDavid Wu {
2386b3077611SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
2387b3077611SDavid Wu 
2388b3077611SDavid Wu 	*regmap = priv->regmap_base;
2389b3077611SDavid Wu 	*reg = RK3308_SCHMITT_GRF_OFFSET;
2390b3077611SDavid Wu 
2391b3077611SDavid Wu 	*reg += bank->bank_num * RK3308_SCHMITT_BANK_STRIDE;
2392b3077611SDavid Wu 	*reg += ((pin_num / RK3308_SCHMITT_PINS_PER_REG) * 4);
2393b3077611SDavid Wu 	*bit = pin_num % RK3308_SCHMITT_PINS_PER_REG;
2394b3077611SDavid Wu 
2395b3077611SDavid Wu 	return 0;
2396b3077611SDavid Wu }
2397b3077611SDavid Wu 
239849c55878SDavid Wu #define RK3368_PULL_GRF_OFFSET		0x100
239949c55878SDavid Wu #define RK3368_PULL_PMU_OFFSET		0x10
240049c55878SDavid Wu 
rk3368_calc_pull_reg_and_bit(struct rockchip_pin_bank * bank,int pin_num,struct regmap ** regmap,int * reg,u8 * bit)240149c55878SDavid Wu static void rk3368_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
240249c55878SDavid Wu 					 int pin_num, struct regmap **regmap,
240349c55878SDavid Wu 					 int *reg, u8 *bit)
240449c55878SDavid Wu {
240549c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
240649c55878SDavid Wu 
240749c55878SDavid Wu 	/* The first 32 pins of the first bank are located in PMU */
240849c55878SDavid Wu 	if (bank->bank_num == 0) {
240949c55878SDavid Wu 		*regmap = priv->regmap_pmu;
241049c55878SDavid Wu 		*reg = RK3368_PULL_PMU_OFFSET;
241149c55878SDavid Wu 
241249c55878SDavid Wu 		*reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4);
241349c55878SDavid Wu 		*bit = pin_num % RK3188_PULL_PINS_PER_REG;
241449c55878SDavid Wu 		*bit *= RK3188_PULL_BITS_PER_PIN;
241549c55878SDavid Wu 	} else {
241649c55878SDavid Wu 		*regmap = priv->regmap_base;
241749c55878SDavid Wu 		*reg = RK3368_PULL_GRF_OFFSET;
241849c55878SDavid Wu 
241949c55878SDavid Wu 		/* correct the offset, as we're starting with the 2nd bank */
242049c55878SDavid Wu 		*reg -= 0x10;
242149c55878SDavid Wu 		*reg += bank->bank_num * RK3188_PULL_BANK_STRIDE;
242249c55878SDavid Wu 		*reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4);
242349c55878SDavid Wu 
242449c55878SDavid Wu 		*bit = (pin_num % RK3188_PULL_PINS_PER_REG);
242549c55878SDavid Wu 		*bit *= RK3188_PULL_BITS_PER_PIN;
242649c55878SDavid Wu 	}
242749c55878SDavid Wu }
242849c55878SDavid Wu 
242949c55878SDavid Wu #define RK3368_DRV_PMU_OFFSET		0x20
243049c55878SDavid Wu #define RK3368_DRV_GRF_OFFSET		0x200
243149c55878SDavid Wu 
rk3368_calc_drv_reg_and_bit(struct rockchip_pin_bank * bank,int pin_num,struct regmap ** regmap,int * reg,u8 * bit)243249c55878SDavid Wu static void rk3368_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
243349c55878SDavid Wu 					int pin_num, struct regmap **regmap,
243449c55878SDavid Wu 					int *reg, u8 *bit)
243549c55878SDavid Wu {
243649c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
243749c55878SDavid Wu 
243849c55878SDavid Wu 	/* The first 32 pins of the first bank are located in PMU */
243949c55878SDavid Wu 	if (bank->bank_num == 0) {
244049c55878SDavid Wu 		*regmap = priv->regmap_pmu;
244149c55878SDavid Wu 		*reg = RK3368_DRV_PMU_OFFSET;
244249c55878SDavid Wu 
244349c55878SDavid Wu 		*reg += ((pin_num / RK3288_DRV_PINS_PER_REG) * 4);
244449c55878SDavid Wu 		*bit = pin_num % RK3288_DRV_PINS_PER_REG;
244549c55878SDavid Wu 		*bit *= RK3288_DRV_BITS_PER_PIN;
244649c55878SDavid Wu 	} else {
244749c55878SDavid Wu 		*regmap = priv->regmap_base;
244849c55878SDavid Wu 		*reg = RK3368_DRV_GRF_OFFSET;
244949c55878SDavid Wu 
245049c55878SDavid Wu 		/* correct the offset, as we're starting with the 2nd bank */
245149c55878SDavid Wu 		*reg -= 0x10;
245249c55878SDavid Wu 		*reg += bank->bank_num * RK3288_DRV_BANK_STRIDE;
245349c55878SDavid Wu 		*reg += ((pin_num / RK3288_DRV_PINS_PER_REG) * 4);
245449c55878SDavid Wu 
245549c55878SDavid Wu 		*bit = (pin_num % RK3288_DRV_PINS_PER_REG);
245649c55878SDavid Wu 		*bit *= RK3288_DRV_BITS_PER_PIN;
245749c55878SDavid Wu 	}
245849c55878SDavid Wu }
245949c55878SDavid Wu 
246049c55878SDavid Wu #define RK3399_PULL_GRF_OFFSET		0xe040
246149c55878SDavid Wu #define RK3399_PULL_PMU_OFFSET		0x40
246249c55878SDavid Wu #define RK3399_DRV_3BITS_PER_PIN	3
246349c55878SDavid Wu 
rk3399_calc_pull_reg_and_bit(struct rockchip_pin_bank * bank,int pin_num,struct regmap ** regmap,int * reg,u8 * bit)246449c55878SDavid Wu static void rk3399_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
246549c55878SDavid Wu 					 int pin_num, struct regmap **regmap,
246649c55878SDavid Wu 					 int *reg, u8 *bit)
246749c55878SDavid Wu {
246849c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
246949c55878SDavid Wu 
247049c55878SDavid Wu 	/* The bank0:16 and bank1:32 pins are located in PMU */
247149c55878SDavid Wu 	if ((bank->bank_num == 0) || (bank->bank_num == 1)) {
247249c55878SDavid Wu 		*regmap = priv->regmap_pmu;
247349c55878SDavid Wu 		*reg = RK3399_PULL_PMU_OFFSET;
247449c55878SDavid Wu 
247549c55878SDavid Wu 		*reg += bank->bank_num * RK3188_PULL_BANK_STRIDE;
247649c55878SDavid Wu 
247749c55878SDavid Wu 		*reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4);
247849c55878SDavid Wu 		*bit = pin_num % RK3188_PULL_PINS_PER_REG;
247949c55878SDavid Wu 		*bit *= RK3188_PULL_BITS_PER_PIN;
248049c55878SDavid Wu 	} else {
248149c55878SDavid Wu 		*regmap = priv->regmap_base;
248249c55878SDavid Wu 		*reg = RK3399_PULL_GRF_OFFSET;
248349c55878SDavid Wu 
248449c55878SDavid Wu 		/* correct the offset, as we're starting with the 3rd bank */
248549c55878SDavid Wu 		*reg -= 0x20;
248649c55878SDavid Wu 		*reg += bank->bank_num * RK3188_PULL_BANK_STRIDE;
248749c55878SDavid Wu 		*reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4);
248849c55878SDavid Wu 
248949c55878SDavid Wu 		*bit = (pin_num % RK3188_PULL_PINS_PER_REG);
249049c55878SDavid Wu 		*bit *= RK3188_PULL_BITS_PER_PIN;
249149c55878SDavid Wu 	}
249249c55878SDavid Wu }
249349c55878SDavid Wu 
rk3399_calc_drv_reg_and_bit(struct rockchip_pin_bank * bank,int pin_num,struct regmap ** regmap,int * reg,u8 * bit)249449c55878SDavid Wu static void rk3399_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
249549c55878SDavid Wu 					int pin_num, struct regmap **regmap,
249649c55878SDavid Wu 					int *reg, u8 *bit)
249749c55878SDavid Wu {
249849c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
249949c55878SDavid Wu 	int drv_num = (pin_num / 8);
250049c55878SDavid Wu 
250149c55878SDavid Wu 	/*  The bank0:16 and bank1:32 pins are located in PMU */
250249c55878SDavid Wu 	if ((bank->bank_num == 0) || (bank->bank_num == 1))
250349c55878SDavid Wu 		*regmap = priv->regmap_pmu;
250449c55878SDavid Wu 	else
250549c55878SDavid Wu 		*regmap = priv->regmap_base;
250649c55878SDavid Wu 
250749c55878SDavid Wu 	*reg = bank->drv[drv_num].offset;
250849c55878SDavid Wu 	if ((bank->drv[drv_num].drv_type == DRV_TYPE_IO_1V8_3V0_AUTO) ||
250949c55878SDavid Wu 	    (bank->drv[drv_num].drv_type == DRV_TYPE_IO_3V3_ONLY))
251049c55878SDavid Wu 		*bit = (pin_num % 8) * 3;
251149c55878SDavid Wu 	else
251249c55878SDavid Wu 		*bit = (pin_num % 8) * 2;
251349c55878SDavid Wu }
251449c55878SDavid Wu 
2515c066e3f7SJianqun Xu #define RK3308_SLEW_RATE_GRF_OFFSET		0x150
2516c066e3f7SJianqun Xu #define RK3308_SLEW_RATE_BANK_STRIDE		16
2517c066e3f7SJianqun Xu #define RK3308_SLEW_RATE_PINS_PER_GRF_REG	8
2518c066e3f7SJianqun Xu 
rk3308_calc_slew_rate_reg_and_bit(struct rockchip_pin_bank * bank,int pin_num,struct regmap ** regmap,int * reg,u8 * bit)2519c066e3f7SJianqun Xu static void rk3308_calc_slew_rate_reg_and_bit(struct rockchip_pin_bank *bank,
2520c066e3f7SJianqun Xu 					      int pin_num,
2521c066e3f7SJianqun Xu 					      struct regmap **regmap,
2522c066e3f7SJianqun Xu 					      int *reg, u8 *bit)
2523c066e3f7SJianqun Xu {
2524c066e3f7SJianqun Xu 	struct rockchip_pinctrl_priv *priv = bank->priv;
2525c066e3f7SJianqun Xu 	int pins_per_reg;
2526c066e3f7SJianqun Xu 
2527c066e3f7SJianqun Xu 	*regmap = priv->regmap_base;
2528c066e3f7SJianqun Xu 	*reg = RK3308_SLEW_RATE_GRF_OFFSET;
2529c066e3f7SJianqun Xu 	*reg += (bank->bank_num) * RK3308_SLEW_RATE_BANK_STRIDE;
2530c066e3f7SJianqun Xu 	pins_per_reg = RK3308_SLEW_RATE_PINS_PER_GRF_REG;
2531c066e3f7SJianqun Xu 
2532c066e3f7SJianqun Xu 	*reg += ((pin_num / pins_per_reg) * 4);
2533c066e3f7SJianqun Xu 	*bit = pin_num % pins_per_reg;
2534c066e3f7SJianqun Xu }
2535c066e3f7SJianqun Xu 
253649c55878SDavid Wu static int rockchip_perpin_drv_list[DRV_TYPE_MAX][8] = {
253749c55878SDavid Wu 	{ 2, 4, 8, 12, -1, -1, -1, -1 },
253849c55878SDavid Wu 	{ 3, 6, 9, 12, -1, -1, -1, -1 },
253949c55878SDavid Wu 	{ 5, 10, 15, 20, -1, -1, -1, -1 },
254049c55878SDavid Wu 	{ 4, 6, 8, 10, 12, 14, 16, 18 },
2541c066e3f7SJianqun Xu 	{ 4, 7, 10, 13, 16, 19, 22, 26 },
2542c066e3f7SJianqun Xu 	{ 0, 2, 4, 6, 6, 8, 10, 12 }
254349c55878SDavid Wu };
254449c55878SDavid Wu 
rockchip_set_drive_perpin(struct rockchip_pin_bank * bank,int pin_num,int strength)254549c55878SDavid Wu static int rockchip_set_drive_perpin(struct rockchip_pin_bank *bank,
254649c55878SDavid Wu 				     int pin_num, int strength)
254749c55878SDavid Wu {
254849c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
254949c55878SDavid Wu 	struct rockchip_pin_ctrl *ctrl = priv->ctrl;
255049c55878SDavid Wu 	struct regmap *regmap;
255149c55878SDavid Wu 	int reg, ret, i;
255249c55878SDavid Wu 	u32 data, rmask_bits, temp;
255349c55878SDavid Wu 	u8 bit;
25542c16899dSDavid.Wu 	/* Where need to clean the special mask for rockchip_perpin_drv_list */
25552c16899dSDavid.Wu 	int drv_type = bank->drv[pin_num / 8].drv_type & (~DRV_TYPE_IO_MASK);
255649c55878SDavid Wu 
255749c55878SDavid Wu 	debug("setting drive of GPIO%d-%d to %d\n", bank->bank_num,
255849c55878SDavid Wu 	      pin_num, strength);
255949c55878SDavid Wu 
256049c55878SDavid Wu 	ctrl->drv_calc_reg(bank, pin_num, &regmap, &reg, &bit);
2561d499d466SJianqun Xu 	if (ctrl->type == RV1126) {
2562d499d466SJianqun Xu 		rmask_bits = RV1126_DRV_BITS_PER_PIN;
2563d499d466SJianqun Xu 		ret = strength;
2564d499d466SJianqun Xu 		goto config;
2565d499d466SJianqun Xu 	}
2566c066e3f7SJianqun Xu 	if (soc_is_rk3308bs())
2567c066e3f7SJianqun Xu 		drv_type = DRV_TYPE_IO_SMIC;
256849c55878SDavid Wu 
256949c55878SDavid Wu 	ret = -EINVAL;
257049c55878SDavid Wu 	for (i = 0; i < ARRAY_SIZE(rockchip_perpin_drv_list[drv_type]); i++) {
257149c55878SDavid Wu 		if (rockchip_perpin_drv_list[drv_type][i] == strength) {
257249c55878SDavid Wu 			ret = i;
257349c55878SDavid Wu 			break;
257449c55878SDavid Wu 		} else if (rockchip_perpin_drv_list[drv_type][i] < 0) {
257549c55878SDavid Wu 			ret = rockchip_perpin_drv_list[drv_type][i];
257649c55878SDavid Wu 			break;
257749c55878SDavid Wu 		}
257849c55878SDavid Wu 	}
257949c55878SDavid Wu 
258049c55878SDavid Wu 	if (ret < 0) {
258149c55878SDavid Wu 		debug("unsupported driver strength %d\n", strength);
258249c55878SDavid Wu 		return ret;
258349c55878SDavid Wu 	}
258449c55878SDavid Wu 
258549c55878SDavid Wu 	switch (drv_type) {
2586c066e3f7SJianqun Xu 	case DRV_TYPE_IO_SMIC:
2587c066e3f7SJianqun Xu 		if (ctrl->type == RK3308) { /* RK3308B-S */
2588c066e3f7SJianqun Xu 			int regval = ret;
2589c066e3f7SJianqun Xu 
2590c066e3f7SJianqun Xu 			data = 0x3 << (bit + 16);
2591c066e3f7SJianqun Xu 			data |= ((regval & 0x3) << bit);
2592c066e3f7SJianqun Xu 
2593c066e3f7SJianqun Xu 			ret = regmap_write(regmap, reg, data);
2594c066e3f7SJianqun Xu 			if (ret < 0)
2595c066e3f7SJianqun Xu 				return ret;
2596c066e3f7SJianqun Xu 
2597c066e3f7SJianqun Xu 			rk3308_calc_slew_rate_reg_and_bit(bank, pin_num, &regmap, &reg, &bit);
2598c066e3f7SJianqun Xu 			data = BIT(bit + 16) | (((regval > 3) ? 1 : 0) << bit);
2599c066e3f7SJianqun Xu 
2600c066e3f7SJianqun Xu 			return regmap_write(regmap, reg, data);
2601c066e3f7SJianqun Xu 		}
2602c066e3f7SJianqun Xu 
2603c066e3f7SJianqun Xu 		dev_err(info->dev, "unsupported type DRV_TYPE_IO_SMIC\n");
2604c066e3f7SJianqun Xu 		return -EINVAL;
260549c55878SDavid Wu 	case DRV_TYPE_IO_1V8_3V0_AUTO:
260649c55878SDavid Wu 	case DRV_TYPE_IO_3V3_ONLY:
260749c55878SDavid Wu 		rmask_bits = RK3399_DRV_3BITS_PER_PIN;
260849c55878SDavid Wu 		switch (bit) {
260949c55878SDavid Wu 		case 0 ... 12:
261049c55878SDavid Wu 			/* regular case, nothing to do */
261149c55878SDavid Wu 			break;
261249c55878SDavid Wu 		case 15:
261349c55878SDavid Wu 			/*
261449c55878SDavid Wu 			 * drive-strength offset is special, as it is spread
261549c55878SDavid Wu 			 * over 2 registers, the bit data[15] contains bit 0
261649c55878SDavid Wu 			 * of the value while temp[1:0] contains bits 2 and 1
261749c55878SDavid Wu 			 */
261849c55878SDavid Wu 			data = (ret & 0x1) << 15;
261949c55878SDavid Wu 			temp = (ret >> 0x1) & 0x3;
262049c55878SDavid Wu 
262149c55878SDavid Wu 			data |= BIT(31);
262249c55878SDavid Wu 			ret = regmap_write(regmap, reg, data);
262349c55878SDavid Wu 			if (ret)
262449c55878SDavid Wu 				return ret;
262549c55878SDavid Wu 
262649c55878SDavid Wu 			temp |= (0x3 << 16);
262749c55878SDavid Wu 			reg += 0x4;
262849c55878SDavid Wu 			ret = regmap_write(regmap, reg, temp);
262949c55878SDavid Wu 
263049c55878SDavid Wu 			return ret;
263149c55878SDavid Wu 		case 18 ... 21:
263249c55878SDavid Wu 			/* setting fully enclosed in the second register */
263349c55878SDavid Wu 			reg += 4;
263449c55878SDavid Wu 			bit -= 16;
263549c55878SDavid Wu 			break;
263649c55878SDavid Wu 		default:
263749c55878SDavid Wu 			debug("unsupported bit: %d for pinctrl drive type: %d\n",
263849c55878SDavid Wu 			      bit, drv_type);
263949c55878SDavid Wu 			return -EINVAL;
264049c55878SDavid Wu 		}
264149c55878SDavid Wu 		break;
264249c55878SDavid Wu 	case DRV_TYPE_IO_DEFAULT:
264349c55878SDavid Wu 	case DRV_TYPE_IO_1V8_OR_3V0:
264449c55878SDavid Wu 	case DRV_TYPE_IO_1V8_ONLY:
264549c55878SDavid Wu 		rmask_bits = RK3288_DRV_BITS_PER_PIN;
264649c55878SDavid Wu 		break;
264749c55878SDavid Wu 	default:
264849c55878SDavid Wu 		debug("unsupported pinctrl drive type: %d\n",
264949c55878SDavid Wu 		      drv_type);
265049c55878SDavid Wu 		return -EINVAL;
265149c55878SDavid Wu 	}
265249c55878SDavid Wu 
2653d499d466SJianqun Xu config:
265455a89bc6SDavid Wu 	if (bank->drv[pin_num / 8].drv_type & DRV_TYPE_WRITABLE_32BIT) {
265555a89bc6SDavid Wu 		regmap_read(regmap, reg, &data);
265655a89bc6SDavid Wu 		data &= ~(((1 << rmask_bits) - 1) << bit);
265755a89bc6SDavid Wu 	} else {
265849c55878SDavid Wu 		/* enable the write to the equivalent lower bits */
265949c55878SDavid Wu 		data = ((1 << rmask_bits) - 1) << (bit + 16);
266055a89bc6SDavid Wu 	}
266149c55878SDavid Wu 
266255a89bc6SDavid Wu 	data |= (ret << bit);
266349c55878SDavid Wu 	ret = regmap_write(regmap, reg, data);
266449c55878SDavid Wu 	return ret;
266549c55878SDavid Wu }
266649c55878SDavid Wu 
266749c55878SDavid Wu static int rockchip_pull_list[PULL_TYPE_MAX][4] = {
266849c55878SDavid Wu 	{
266949c55878SDavid Wu 		PIN_CONFIG_BIAS_DISABLE,
267049c55878SDavid Wu 		PIN_CONFIG_BIAS_PULL_UP,
267149c55878SDavid Wu 		PIN_CONFIG_BIAS_PULL_DOWN,
267249c55878SDavid Wu 		PIN_CONFIG_BIAS_BUS_HOLD
267349c55878SDavid Wu 	},
267449c55878SDavid Wu 	{
267549c55878SDavid Wu 		PIN_CONFIG_BIAS_DISABLE,
267649c55878SDavid Wu 		PIN_CONFIG_BIAS_PULL_DOWN,
267749c55878SDavid Wu 		PIN_CONFIG_BIAS_DISABLE,
267849c55878SDavid Wu 		PIN_CONFIG_BIAS_PULL_UP
267949c55878SDavid Wu 	},
268049c55878SDavid Wu };
268149c55878SDavid Wu 
rockchip_set_pull(struct rockchip_pin_bank * bank,int pin_num,int pull)268249c55878SDavid Wu static int rockchip_set_pull(struct rockchip_pin_bank *bank,
268349c55878SDavid Wu 			     int pin_num, int pull)
268449c55878SDavid Wu {
268549c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
268649c55878SDavid Wu 	struct rockchip_pin_ctrl *ctrl = priv->ctrl;
268749c55878SDavid Wu 	struct regmap *regmap;
268849c55878SDavid Wu 	int reg, ret, i, pull_type;
268949c55878SDavid Wu 	u8 bit;
269049c55878SDavid Wu 	u32 data;
269149c55878SDavid Wu 
269249c55878SDavid Wu 	debug("setting pull of GPIO%d-%d to %d\n", bank->bank_num,
269349c55878SDavid Wu 	      pin_num, pull);
269449c55878SDavid Wu 
269549c55878SDavid Wu 	/* rk3066b does support any pulls */
269649c55878SDavid Wu 	if (ctrl->type == RK3066B)
269749c55878SDavid Wu 		return pull ? -EINVAL : 0;
269849c55878SDavid Wu 
269949c55878SDavid Wu 	ctrl->pull_calc_reg(bank, pin_num, &regmap, &reg, &bit);
270049c55878SDavid Wu 
270149c55878SDavid Wu 	switch (ctrl->type) {
270249c55878SDavid Wu 	case RK2928:
270349c55878SDavid Wu 	case RK3128:
270449c55878SDavid Wu 		data = BIT(bit + 16);
270549c55878SDavid Wu 		if (pull == PIN_CONFIG_BIAS_DISABLE)
270649c55878SDavid Wu 			data |= BIT(bit);
270749c55878SDavid Wu 		ret = regmap_write(regmap, reg, data);
270849c55878SDavid Wu 		break;
270949c55878SDavid Wu 	case PX30:
271049c55878SDavid Wu 	case RV1108:
2711cf04a17bSJianqun Xu 	case RV1126:
2712a2a3fc8fSJianqun Xu 	case RK1808:
271349c55878SDavid Wu 	case RK3188:
271449c55878SDavid Wu 	case RK3288:
2715b3077611SDavid Wu 	case RK3308:
271649c55878SDavid Wu 	case RK3368:
271749c55878SDavid Wu 	case RK3399:
27182c16899dSDavid.Wu 		/*
27192c16899dSDavid.Wu 		 * Where need to clean the special mask for
27202c16899dSDavid.Wu 		 * rockchip_pull_list.
27212c16899dSDavid.Wu 		 */
27222c16899dSDavid.Wu 		pull_type = bank->pull_type[pin_num / 8] & (~PULL_TYPE_IO_MASK);
272349c55878SDavid Wu 		ret = -EINVAL;
272449c55878SDavid Wu 		for (i = 0; i < ARRAY_SIZE(rockchip_pull_list[pull_type]);
272549c55878SDavid Wu 			i++) {
272649c55878SDavid Wu 			if (rockchip_pull_list[pull_type][i] == pull) {
272749c55878SDavid Wu 				ret = i;
272849c55878SDavid Wu 				break;
272949c55878SDavid Wu 			}
273049c55878SDavid Wu 		}
273149c55878SDavid Wu 
273249c55878SDavid Wu 		if (ret < 0) {
273349c55878SDavid Wu 			debug("unsupported pull setting %d\n", pull);
273449c55878SDavid Wu 			return ret;
273549c55878SDavid Wu 		}
273649c55878SDavid Wu 
273755a89bc6SDavid Wu 		if (bank->pull_type[pin_num / 8] & PULL_TYPE_WRITABLE_32BIT) {
273855a89bc6SDavid Wu 			regmap_read(regmap, reg, &data);
273955a89bc6SDavid Wu 			data &= ~(((1 << RK3188_PULL_BITS_PER_PIN) - 1) << bit);
274055a89bc6SDavid Wu 		} else {
274149c55878SDavid Wu 			/* enable the write to the equivalent lower bits */
274249c55878SDavid Wu 			data = ((1 << RK3188_PULL_BITS_PER_PIN) - 1) << (bit + 16);
274355a89bc6SDavid Wu 		}
274449c55878SDavid Wu 
274555a89bc6SDavid Wu 		data |= (ret << bit);
274649c55878SDavid Wu 		ret = regmap_write(regmap, reg, data);
274749c55878SDavid Wu 		break;
274849c55878SDavid Wu 	default:
274949c55878SDavid Wu 		debug("unsupported pinctrl type\n");
275049c55878SDavid Wu 		return -EINVAL;
275149c55878SDavid Wu 	}
275249c55878SDavid Wu 
275349c55878SDavid Wu 	return ret;
275449c55878SDavid Wu }
275549c55878SDavid Wu 
275649c55878SDavid Wu #define RK3328_SCHMITT_BITS_PER_PIN		1
275749c55878SDavid Wu #define RK3328_SCHMITT_PINS_PER_REG		16
275849c55878SDavid Wu #define RK3328_SCHMITT_BANK_STRIDE		8
275949c55878SDavid Wu #define RK3328_SCHMITT_GRF_OFFSET		0x380
276049c55878SDavid Wu 
rk3328_calc_schmitt_reg_and_bit(struct rockchip_pin_bank * bank,int pin_num,struct regmap ** regmap,int * reg,u8 * bit)276149c55878SDavid Wu static int rk3328_calc_schmitt_reg_and_bit(struct rockchip_pin_bank *bank,
276249c55878SDavid Wu 					   int pin_num,
276349c55878SDavid Wu 					   struct regmap **regmap,
276449c55878SDavid Wu 					   int *reg, u8 *bit)
276549c55878SDavid Wu {
276649c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
276749c55878SDavid Wu 
276849c55878SDavid Wu 	*regmap = priv->regmap_base;
276949c55878SDavid Wu 	*reg = RK3328_SCHMITT_GRF_OFFSET;
277049c55878SDavid Wu 
277149c55878SDavid Wu 	*reg += bank->bank_num * RK3328_SCHMITT_BANK_STRIDE;
277249c55878SDavid Wu 	*reg += ((pin_num / RK3328_SCHMITT_PINS_PER_REG) * 4);
277349c55878SDavid Wu 	*bit = pin_num % RK3328_SCHMITT_PINS_PER_REG;
277449c55878SDavid Wu 
277549c55878SDavid Wu 	return 0;
277649c55878SDavid Wu }
277749c55878SDavid Wu 
rockchip_set_schmitt(struct rockchip_pin_bank * bank,int pin_num,int enable)277849c55878SDavid Wu static int rockchip_set_schmitt(struct rockchip_pin_bank *bank,
277949c55878SDavid Wu 				int pin_num, int enable)
278049c55878SDavid Wu {
278149c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
278249c55878SDavid Wu 	struct rockchip_pin_ctrl *ctrl = priv->ctrl;
278349c55878SDavid Wu 	struct regmap *regmap;
278449c55878SDavid Wu 	int reg, ret;
278549c55878SDavid Wu 	u8 bit;
278649c55878SDavid Wu 	u32 data;
278749c55878SDavid Wu 
278849c55878SDavid Wu 	debug("setting input schmitt of GPIO%d-%d to %d\n", bank->bank_num,
278949c55878SDavid Wu 	      pin_num, enable);
279049c55878SDavid Wu 
279149c55878SDavid Wu 	ret = ctrl->schmitt_calc_reg(bank, pin_num, &regmap, &reg, &bit);
279249c55878SDavid Wu 	if (ret)
279349c55878SDavid Wu 		return ret;
279449c55878SDavid Wu 
279549c55878SDavid Wu 	/* enable the write to the equivalent lower bits */
279649c55878SDavid Wu 	data = BIT(bit + 16) | (enable << bit);
279749c55878SDavid Wu 
279849c55878SDavid Wu 	return regmap_write(regmap, reg, data);
279949c55878SDavid Wu }
280049c55878SDavid Wu 
280132c25d1fSDavid Wu #define PX30_SLEW_RATE_PMU_OFFSET		0x30
280232c25d1fSDavid Wu #define PX30_SLEW_RATE_GRF_OFFSET		0x90
280332c25d1fSDavid Wu #define PX30_SLEW_RATE_PINS_PER_PMU_REG		16
280432c25d1fSDavid Wu #define PX30_SLEW_RATE_BANK_STRIDE		16
280532c25d1fSDavid Wu #define PX30_SLEW_RATE_PINS_PER_GRF_REG		8
280632c25d1fSDavid Wu 
px30_calc_slew_rate_reg_and_bit(struct rockchip_pin_bank * bank,int pin_num,struct regmap ** regmap,int * reg,u8 * bit)280732c25d1fSDavid Wu static int px30_calc_slew_rate_reg_and_bit(struct rockchip_pin_bank *bank,
280832c25d1fSDavid Wu 					   int pin_num,
280932c25d1fSDavid Wu 					   struct regmap **regmap,
281032c25d1fSDavid Wu 					   int *reg, u8 *bit)
281132c25d1fSDavid Wu {
281232c25d1fSDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
281332c25d1fSDavid Wu 	int pins_per_reg;
281432c25d1fSDavid Wu 
281532c25d1fSDavid Wu 	if (bank->bank_num == 0) {
281632c25d1fSDavid Wu 		*regmap = priv->regmap_pmu;
281732c25d1fSDavid Wu 		*reg = PX30_SLEW_RATE_PMU_OFFSET;
281832c25d1fSDavid Wu 		pins_per_reg = PX30_SCHMITT_PINS_PER_PMU_REG;
281932c25d1fSDavid Wu 	} else {
282032c25d1fSDavid Wu 		*regmap = priv->regmap_base;
282132c25d1fSDavid Wu 		*reg = PX30_SCHMITT_GRF_OFFSET;
282232c25d1fSDavid Wu 		pins_per_reg = PX30_SCHMITT_PINS_PER_GRF_REG;
282332c25d1fSDavid Wu 		*reg += (bank->bank_num  - 1) * PX30_SCHMITT_BANK_STRIDE;
282432c25d1fSDavid Wu 	}
282532c25d1fSDavid Wu 	*reg += ((pin_num / pins_per_reg) * 4);
282632c25d1fSDavid Wu 	*bit = pin_num % pins_per_reg;
282732c25d1fSDavid Wu 
282832c25d1fSDavid Wu 	return 0;
282932c25d1fSDavid Wu }
283032c25d1fSDavid Wu 
rockchip_set_slew_rate(struct rockchip_pin_bank * bank,int pin_num,int speed)283132c25d1fSDavid Wu static int rockchip_set_slew_rate(struct rockchip_pin_bank *bank,
283232c25d1fSDavid Wu 				  int pin_num, int speed)
283332c25d1fSDavid Wu {
283432c25d1fSDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
283532c25d1fSDavid Wu 	struct rockchip_pin_ctrl *ctrl = priv->ctrl;
283632c25d1fSDavid Wu 	struct regmap *regmap;
283732c25d1fSDavid Wu 	int reg, ret;
283832c25d1fSDavid Wu 	u8 bit;
283932c25d1fSDavid Wu 	u32 data;
284032c25d1fSDavid Wu 
284132c25d1fSDavid Wu 	debug("setting slew rate of GPIO%d-%d to %d\n", bank->bank_num,
284232c25d1fSDavid Wu 	      pin_num, speed);
284332c25d1fSDavid Wu 
284432c25d1fSDavid Wu 	ret = ctrl->slew_rate_calc_reg(bank, pin_num, &regmap, &reg, &bit);
284532c25d1fSDavid Wu 	if (ret)
284632c25d1fSDavid Wu 		return ret;
284732c25d1fSDavid Wu 
284832c25d1fSDavid Wu 	/* enable the write to the equivalent lower bits */
284932c25d1fSDavid Wu 	data = BIT(bit + 16) | (speed << bit);
285032c25d1fSDavid Wu 
285132c25d1fSDavid Wu 	return regmap_write(regmap, reg, data);
285232c25d1fSDavid Wu }
285332c25d1fSDavid Wu 
285449c55878SDavid Wu /*
285549c55878SDavid Wu  * Pinconf_ops handling
285649c55878SDavid Wu  */
rockchip_pinconf_pull_valid(struct rockchip_pin_ctrl * ctrl,unsigned int pull)285749c55878SDavid Wu static bool rockchip_pinconf_pull_valid(struct rockchip_pin_ctrl *ctrl,
285849c55878SDavid Wu 					unsigned int pull)
285949c55878SDavid Wu {
286049c55878SDavid Wu 	switch (ctrl->type) {
286149c55878SDavid Wu 	case RK2928:
286249c55878SDavid Wu 	case RK3128:
286349c55878SDavid Wu 		return (pull == PIN_CONFIG_BIAS_PULL_PIN_DEFAULT ||
286449c55878SDavid Wu 			pull == PIN_CONFIG_BIAS_DISABLE);
286549c55878SDavid Wu 	case RK3066B:
286649c55878SDavid Wu 		return pull ? false : true;
286749c55878SDavid Wu 	case PX30:
286849c55878SDavid Wu 	case RV1108:
2869cf04a17bSJianqun Xu 	case RV1126:
2870a2a3fc8fSJianqun Xu 	case RK1808:
287149c55878SDavid Wu 	case RK3188:
287249c55878SDavid Wu 	case RK3288:
2873b3077611SDavid Wu 	case RK3308:
287449c55878SDavid Wu 	case RK3368:
287549c55878SDavid Wu 	case RK3399:
287649c55878SDavid Wu 		return (pull != PIN_CONFIG_BIAS_PULL_PIN_DEFAULT);
287749c55878SDavid Wu 	}
287849c55878SDavid Wu 
287949c55878SDavid Wu 	return false;
288049c55878SDavid Wu }
288149c55878SDavid Wu 
288249c55878SDavid Wu /* set the pin config settings for a specified pin */
rockchip_pinconf_set(struct rockchip_pin_bank * bank,u32 pin,u32 param,u32 arg)288349c55878SDavid Wu static int rockchip_pinconf_set(struct rockchip_pin_bank *bank,
288449c55878SDavid Wu 				u32 pin, u32 param, u32 arg)
288549c55878SDavid Wu {
288649c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
288749c55878SDavid Wu 	struct rockchip_pin_ctrl *ctrl = priv->ctrl;
288849c55878SDavid Wu 	int rc;
288949c55878SDavid Wu 
289049c55878SDavid Wu 	switch (param) {
289149c55878SDavid Wu 	case PIN_CONFIG_BIAS_DISABLE:
289249c55878SDavid Wu 		rc =  rockchip_set_pull(bank, pin, param);
289349c55878SDavid Wu 		if (rc)
289449c55878SDavid Wu 			return rc;
289549c55878SDavid Wu 		break;
289649c55878SDavid Wu 
289749c55878SDavid Wu 	case PIN_CONFIG_BIAS_PULL_UP:
289849c55878SDavid Wu 	case PIN_CONFIG_BIAS_PULL_DOWN:
289949c55878SDavid Wu 	case PIN_CONFIG_BIAS_PULL_PIN_DEFAULT:
290049c55878SDavid Wu 	case PIN_CONFIG_BIAS_BUS_HOLD:
290149c55878SDavid Wu 		if (!rockchip_pinconf_pull_valid(ctrl, param))
290249c55878SDavid Wu 			return -ENOTSUPP;
290349c55878SDavid Wu 
290449c55878SDavid Wu 		if (!arg)
290549c55878SDavid Wu 			return -EINVAL;
290649c55878SDavid Wu 
290749c55878SDavid Wu 		rc = rockchip_set_pull(bank, pin, param);
290849c55878SDavid Wu 		if (rc)
290949c55878SDavid Wu 			return rc;
291049c55878SDavid Wu 		break;
291149c55878SDavid Wu 
291249c55878SDavid Wu 	case PIN_CONFIG_DRIVE_STRENGTH:
291349c55878SDavid Wu 		if (!ctrl->drv_calc_reg)
291449c55878SDavid Wu 			return -ENOTSUPP;
291549c55878SDavid Wu 
291649c55878SDavid Wu 		rc = rockchip_set_drive_perpin(bank, pin, arg);
291749c55878SDavid Wu 		if (rc < 0)
291849c55878SDavid Wu 			return rc;
291949c55878SDavid Wu 		break;
292049c55878SDavid Wu 
292149c55878SDavid Wu 	case PIN_CONFIG_INPUT_SCHMITT_ENABLE:
292249c55878SDavid Wu 		if (!ctrl->schmitt_calc_reg)
292349c55878SDavid Wu 			return -ENOTSUPP;
292449c55878SDavid Wu 
292549c55878SDavid Wu 		rc = rockchip_set_schmitt(bank, pin, arg);
292649c55878SDavid Wu 		if (rc < 0)
292749c55878SDavid Wu 			return rc;
292849c55878SDavid Wu 		break;
292949c55878SDavid Wu 
293032c25d1fSDavid Wu 	case PIN_CONFIG_SLEW_RATE:
293132c25d1fSDavid Wu 		if (!ctrl->slew_rate_calc_reg)
293232c25d1fSDavid Wu 			return -ENOTSUPP;
293332c25d1fSDavid Wu 
293432c25d1fSDavid Wu 		rc = rockchip_set_slew_rate(bank,
293532c25d1fSDavid Wu 					    pin - bank->pin_base, arg);
293632c25d1fSDavid Wu 		if (rc < 0)
293732c25d1fSDavid Wu 			return rc;
293832c25d1fSDavid Wu 		break;
293932c25d1fSDavid Wu 
294049c55878SDavid Wu 	default:
294149c55878SDavid Wu 		break;
294249c55878SDavid Wu 	}
294349c55878SDavid Wu 
294449c55878SDavid Wu 	return 0;
294549c55878SDavid Wu }
294649c55878SDavid Wu 
294749c55878SDavid Wu static const struct pinconf_param rockchip_conf_params[] = {
294849c55878SDavid Wu 	{ "bias-disable", PIN_CONFIG_BIAS_DISABLE, 0 },
294949c55878SDavid Wu 	{ "bias-bus-hold", PIN_CONFIG_BIAS_BUS_HOLD, 0 },
295049c55878SDavid Wu 	{ "bias-pull-up", PIN_CONFIG_BIAS_PULL_UP, 1 },
295149c55878SDavid Wu 	{ "bias-pull-down", PIN_CONFIG_BIAS_PULL_DOWN, 1 },
295249c55878SDavid Wu 	{ "drive-strength", PIN_CONFIG_DRIVE_STRENGTH, 0 },
295349c55878SDavid Wu 	{ "input-enable", PIN_CONFIG_INPUT_ENABLE, 1 },
295449c55878SDavid Wu 	{ "input-disable", PIN_CONFIG_INPUT_ENABLE, 0 },
295549c55878SDavid Wu 	{ "input-schmitt-disable", PIN_CONFIG_INPUT_SCHMITT_ENABLE, 0 },
295649c55878SDavid Wu 	{ "input-schmitt-enable", PIN_CONFIG_INPUT_SCHMITT_ENABLE, 1 },
295732c25d1fSDavid Wu 	{ "slew-rate", PIN_CONFIG_SLEW_RATE, 0 },
295849c55878SDavid Wu };
295949c55878SDavid Wu 
rockchip_pinconf_prop_name_to_param(const char * property,u32 * default_value)296049c55878SDavid Wu static int rockchip_pinconf_prop_name_to_param(const char *property,
296149c55878SDavid Wu 					       u32 *default_value)
296249c55878SDavid Wu {
296349c55878SDavid Wu 	const struct pinconf_param *p, *end;
296449c55878SDavid Wu 
296549c55878SDavid Wu 	p = rockchip_conf_params;
296649c55878SDavid Wu 	end = p + sizeof(rockchip_conf_params) / sizeof(struct pinconf_param);
296749c55878SDavid Wu 
296849c55878SDavid Wu 	/* See if this pctldev supports this parameter */
296949c55878SDavid Wu 	for (; p < end; p++) {
297049c55878SDavid Wu 		if (!strcmp(property, p->property)) {
297149c55878SDavid Wu 			*default_value = p->default_value;
297249c55878SDavid Wu 			return p->param;
297349c55878SDavid Wu 		}
297449c55878SDavid Wu 	}
297549c55878SDavid Wu 
297649c55878SDavid Wu 	*default_value = 0;
297749c55878SDavid Wu 	return -EPERM;
297849c55878SDavid Wu }
297949c55878SDavid Wu 
rockchip_pinctrl_set_state(struct udevice * dev,struct udevice * config)298049c55878SDavid Wu static int rockchip_pinctrl_set_state(struct udevice *dev,
298149c55878SDavid Wu 				      struct udevice *config)
298249c55878SDavid Wu {
298349c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = dev_get_priv(dev);
298449c55878SDavid Wu 	struct rockchip_pin_ctrl *ctrl = priv->ctrl;
298549c55878SDavid Wu 	u32 cells[MAX_ROCKCHIP_PINS_ENTRIES * 4];
298649c55878SDavid Wu 	u32 bank, pin, mux, conf, arg, default_val;
298749c55878SDavid Wu 	int ret, count, i;
298849c55878SDavid Wu 	const char *prop_name;
298949c55878SDavid Wu 	const void *value;
29902208cfa9SKever Yang 	int prop_len, param;
29912208cfa9SKever Yang 	const u32 *data;
29922208cfa9SKever Yang 	ofnode node;
2993d2e2dbd6SJason Zhu #if defined(CONFIG_OF_LIVE) && !defined(CONFIG_SPL_BUILD)
29942208cfa9SKever Yang 	const struct device_node *np;
29952208cfa9SKever Yang 	struct property *pp;
29962208cfa9SKever Yang #else
29972208cfa9SKever Yang 	int property_offset, pcfg_node;
29982208cfa9SKever Yang 	const void *blob = gd->fdt_blob;
29992208cfa9SKever Yang #endif
30002208cfa9SKever Yang 	data = dev_read_prop(config, "rockchip,pins", &count);
300149c55878SDavid Wu 	if (count < 0) {
300287f0ac57SDavid Wu 		debug("%s: bad array size %d\n", __func__, count);
300349c55878SDavid Wu 		return -EINVAL;
300449c55878SDavid Wu 	}
300549c55878SDavid Wu 
300687f0ac57SDavid Wu 	count /= sizeof(u32);
300749c55878SDavid Wu 	if (count > MAX_ROCKCHIP_PINS_ENTRIES * 4) {
300849c55878SDavid Wu 		debug("%s: unsupported pins array count %d\n",
300949c55878SDavid Wu 		      __func__, count);
301049c55878SDavid Wu 		return -EINVAL;
301149c55878SDavid Wu 	}
301249c55878SDavid Wu 
301387f0ac57SDavid Wu 	for (i = 0; i < count; i++)
301487f0ac57SDavid Wu 		cells[i] = fdt32_to_cpu(data[i]);
301587f0ac57SDavid Wu 
301649c55878SDavid Wu 	for (i = 0; i < (count >> 2); i++) {
301749c55878SDavid Wu 		bank = cells[4 * i + 0];
301849c55878SDavid Wu 		pin = cells[4 * i + 1];
301949c55878SDavid Wu 		mux = cells[4 * i + 2];
302049c55878SDavid Wu 		conf = cells[4 * i + 3];
302149c55878SDavid Wu 
302249c55878SDavid Wu 		ret = rockchip_verify_config(dev, bank, pin);
302349c55878SDavid Wu 		if (ret)
302449c55878SDavid Wu 			return ret;
302549c55878SDavid Wu 
302649c55878SDavid Wu 		ret = rockchip_set_mux(&ctrl->pin_banks[bank], pin, mux);
302749c55878SDavid Wu 		if (ret)
302849c55878SDavid Wu 			return ret;
302949c55878SDavid Wu 
30302208cfa9SKever Yang 		node = ofnode_get_by_phandle(conf);
30312208cfa9SKever Yang 		if (!ofnode_valid(node))
303249c55878SDavid Wu 			return -ENODEV;
3033d2e2dbd6SJason Zhu #if defined(CONFIG_OF_LIVE) && !defined(CONFIG_SPL_BUILD)
30342208cfa9SKever Yang 		np = ofnode_to_np(node);
30352208cfa9SKever Yang 		for (pp = np->properties; pp; pp = pp->next) {
30362208cfa9SKever Yang 			prop_name = pp->name;
30372208cfa9SKever Yang 			prop_len = pp->length;
30382208cfa9SKever Yang 			value = pp->value;
30392208cfa9SKever Yang #else
30402208cfa9SKever Yang 		pcfg_node = ofnode_to_offset(node);
304149c55878SDavid Wu 		fdt_for_each_property_offset(property_offset, blob, pcfg_node) {
304249c55878SDavid Wu 			value = fdt_getprop_by_offset(blob, property_offset,
304349c55878SDavid Wu 						      &prop_name, &prop_len);
304449c55878SDavid Wu 			if (!value)
304549c55878SDavid Wu 				return -ENOENT;
30462208cfa9SKever Yang #endif
304749c55878SDavid Wu 			param = rockchip_pinconf_prop_name_to_param(prop_name,
304849c55878SDavid Wu 								    &default_val);
304949c55878SDavid Wu 			if (param < 0)
305049c55878SDavid Wu 				break;
305149c55878SDavid Wu 
305249c55878SDavid Wu 			if (prop_len >= sizeof(fdt32_t))
305349c55878SDavid Wu 				arg = fdt32_to_cpu(*(fdt32_t *)value);
305449c55878SDavid Wu 			else
305549c55878SDavid Wu 				arg = default_val;
305649c55878SDavid Wu 
305749c55878SDavid Wu 			ret = rockchip_pinconf_set(&ctrl->pin_banks[bank], pin,
305849c55878SDavid Wu 						   param, arg);
305949c55878SDavid Wu 			if (ret) {
306049c55878SDavid Wu 				debug("%s: rockchip_pinconf_set fail: %d\n",
306149c55878SDavid Wu 				      __func__, ret);
306249c55878SDavid Wu 				return ret;
306349c55878SDavid Wu 			}
306449c55878SDavid Wu 		}
306549c55878SDavid Wu 	}
306649c55878SDavid Wu 
306749c55878SDavid Wu 	return 0;
306849c55878SDavid Wu }
306949c55878SDavid Wu 
307009989a56SJianqun Xu static int rockchip_pinctrl_get_pins_count(struct udevice *dev)
307109989a56SJianqun Xu {
307209989a56SJianqun Xu 	struct rockchip_pinctrl_priv *priv = dev_get_priv(dev);
307309989a56SJianqun Xu 	struct rockchip_pin_ctrl *ctrl = priv->ctrl;
307409989a56SJianqun Xu 
307509989a56SJianqun Xu 	return ctrl->nr_pins;
307609989a56SJianqun Xu }
307709989a56SJianqun Xu 
307849c55878SDavid Wu static struct pinctrl_ops rockchip_pinctrl_ops = {
307909989a56SJianqun Xu 	.get_pins_count			= rockchip_pinctrl_get_pins_count,
308049c55878SDavid Wu 	.set_state			= rockchip_pinctrl_set_state,
308149c55878SDavid Wu 	.get_gpio_mux			= rockchip_pinctrl_get_gpio_mux,
308249c55878SDavid Wu };
308349c55878SDavid Wu 
308413c03cb6SJianqun Xu static const struct rockchip_pin_ctrl rk3308b_pin_ctrl;
3085d5517017SDavid Wu 
308649c55878SDavid Wu /* retrieve the soc specific data */
308713c03cb6SJianqun Xu static const struct rockchip_pin_ctrl *
308813c03cb6SJianqun Xu rockchip_pinctrl_get_soc_data(struct udevice *dev)
308949c55878SDavid Wu {
309049c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = dev_get_priv(dev);
309113c03cb6SJianqun Xu 	const struct rockchip_pin_ctrl *ctrl =
309213c03cb6SJianqun Xu 		(const struct rockchip_pin_ctrl *)dev_get_driver_data(dev);
309349c55878SDavid Wu 	struct rockchip_pin_bank *bank;
309449c55878SDavid Wu 	int grf_offs, pmu_offs, drv_grf_offs, drv_pmu_offs, i, j;
309513c03cb6SJianqun Xu 	u32 nr_pins;
309613c03cb6SJianqun Xu 
3097c066e3f7SJianqun Xu 	if (soc_is_rk3308b() || soc_is_rk3308bs())
309813c03cb6SJianqun Xu 		ctrl = &rk3308b_pin_ctrl;
309949c55878SDavid Wu 
310049c55878SDavid Wu 	grf_offs = ctrl->grf_mux_offset;
310149c55878SDavid Wu 	pmu_offs = ctrl->pmu_mux_offset;
310249c55878SDavid Wu 	drv_pmu_offs = ctrl->pmu_drv_offset;
310349c55878SDavid Wu 	drv_grf_offs = ctrl->grf_drv_offset;
310449c55878SDavid Wu 	bank = ctrl->pin_banks;
310549c55878SDavid Wu 
3106d5517017SDavid Wu 	/* Ctrl data re-initialize for some Socs */
3107d5517017SDavid Wu 	if (ctrl->ctrl_data_re_init) {
3108d5517017SDavid Wu 		if (ctrl->ctrl_data_re_init(ctrl))
3109d5517017SDavid Wu 			return NULL;
3110d5517017SDavid Wu 	}
3111d5517017SDavid Wu 
311213c03cb6SJianqun Xu 	nr_pins = 0;
311349c55878SDavid Wu 	for (i = 0; i < ctrl->nr_banks; ++i, ++bank) {
311449c55878SDavid Wu 		int bank_pins = 0;
311549c55878SDavid Wu 
311649c55878SDavid Wu 		bank->priv = priv;
311713c03cb6SJianqun Xu 		bank->pin_base = nr_pins;
311813c03cb6SJianqun Xu 		nr_pins += bank->nr_pins;
311949c55878SDavid Wu 
312049c55878SDavid Wu 		/* calculate iomux and drv offsets */
312149c55878SDavid Wu 		for (j = 0; j < 4; j++) {
312249c55878SDavid Wu 			struct rockchip_iomux *iom = &bank->iomux[j];
312349c55878SDavid Wu 			struct rockchip_drv *drv = &bank->drv[j];
312449c55878SDavid Wu 			int inc;
312549c55878SDavid Wu 
312649c55878SDavid Wu 			if (bank_pins >= bank->nr_pins)
312749c55878SDavid Wu 				break;
312849c55878SDavid Wu 
312949c55878SDavid Wu 			/* preset iomux offset value, set new start value */
313049c55878SDavid Wu 			if (iom->offset >= 0) {
3131d499d466SJianqun Xu 				if ((iom->type & IOMUX_SOURCE_PMU) || (iom->type & IOMUX_L_SOURCE_PMU))
313249c55878SDavid Wu 					pmu_offs = iom->offset;
313349c55878SDavid Wu 				else
313449c55878SDavid Wu 					grf_offs = iom->offset;
313549c55878SDavid Wu 			} else { /* set current iomux offset */
3136d499d466SJianqun Xu 				iom->offset = ((iom->type & IOMUX_SOURCE_PMU) ||
3137d499d466SJianqun Xu 					       (iom->type & IOMUX_L_SOURCE_PMU)) ?
313849c55878SDavid Wu 							pmu_offs : grf_offs;
313949c55878SDavid Wu 			}
314049c55878SDavid Wu 
314149c55878SDavid Wu 			/* preset drv offset value, set new start value */
314249c55878SDavid Wu 			if (drv->offset >= 0) {
314349c55878SDavid Wu 				if (iom->type & IOMUX_SOURCE_PMU)
314449c55878SDavid Wu 					drv_pmu_offs = drv->offset;
314549c55878SDavid Wu 				else
314649c55878SDavid Wu 					drv_grf_offs = drv->offset;
314749c55878SDavid Wu 			} else { /* set current drv offset */
314849c55878SDavid Wu 				drv->offset = (iom->type & IOMUX_SOURCE_PMU) ?
314949c55878SDavid Wu 						drv_pmu_offs : drv_grf_offs;
315049c55878SDavid Wu 			}
315149c55878SDavid Wu 
315249c55878SDavid Wu 			debug("bank %d, iomux %d has iom_offset 0x%x drv_offset 0x%x\n",
315349c55878SDavid Wu 			      i, j, iom->offset, drv->offset);
315449c55878SDavid Wu 
315549c55878SDavid Wu 			/*
315649c55878SDavid Wu 			 * Increase offset according to iomux width.
315749c55878SDavid Wu 			 * 4bit iomux'es are spread over two registers.
315849c55878SDavid Wu 			 */
315949c55878SDavid Wu 			inc = (iom->type & (IOMUX_WIDTH_4BIT |
316088a1f7ffSDavid Wu 					    IOMUX_WIDTH_3BIT |
316188a1f7ffSDavid Wu 					    IOMUX_8WIDTH_2BIT)) ? 8 : 4;
3162d499d466SJianqun Xu 			if ((iom->type & IOMUX_SOURCE_PMU) || (iom->type & IOMUX_L_SOURCE_PMU))
316349c55878SDavid Wu 				pmu_offs += inc;
316449c55878SDavid Wu 			else
316549c55878SDavid Wu 				grf_offs += inc;
316649c55878SDavid Wu 
316749c55878SDavid Wu 			/*
316849c55878SDavid Wu 			 * Increase offset according to drv width.
316949c55878SDavid Wu 			 * 3bit drive-strenth'es are spread over two registers.
317049c55878SDavid Wu 			 */
317149c55878SDavid Wu 			if ((drv->drv_type == DRV_TYPE_IO_1V8_3V0_AUTO) ||
317249c55878SDavid Wu 			    (drv->drv_type == DRV_TYPE_IO_3V3_ONLY))
317349c55878SDavid Wu 				inc = 8;
317449c55878SDavid Wu 			else
317549c55878SDavid Wu 				inc = 4;
317649c55878SDavid Wu 
317749c55878SDavid Wu 			if (iom->type & IOMUX_SOURCE_PMU)
317849c55878SDavid Wu 				drv_pmu_offs += inc;
317949c55878SDavid Wu 			else
318049c55878SDavid Wu 				drv_grf_offs += inc;
318149c55878SDavid Wu 
318249c55878SDavid Wu 			bank_pins += 8;
318349c55878SDavid Wu 		}
318449c55878SDavid Wu 
318549c55878SDavid Wu 		/* calculate the per-bank recalced_mask */
318649c55878SDavid Wu 		for (j = 0; j < ctrl->niomux_recalced; j++) {
318749c55878SDavid Wu 			int pin = 0;
318849c55878SDavid Wu 
318949c55878SDavid Wu 			if (ctrl->iomux_recalced[j].num == bank->bank_num) {
319049c55878SDavid Wu 				pin = ctrl->iomux_recalced[j].pin;
319149c55878SDavid Wu 				bank->recalced_mask |= BIT(pin);
319249c55878SDavid Wu 			}
319349c55878SDavid Wu 		}
319449c55878SDavid Wu 
319549c55878SDavid Wu 		/* calculate the per-bank route_mask */
319649c55878SDavid Wu 		for (j = 0; j < ctrl->niomux_routes; j++) {
319749c55878SDavid Wu 			int pin = 0;
319849c55878SDavid Wu 
319949c55878SDavid Wu 			if (ctrl->iomux_routes[j].bank_num == bank->bank_num) {
320049c55878SDavid Wu 				pin = ctrl->iomux_routes[j].pin;
320149c55878SDavid Wu 				bank->route_mask |= BIT(pin);
320249c55878SDavid Wu 			}
320349c55878SDavid Wu 		}
320449c55878SDavid Wu 	}
320549c55878SDavid Wu 
320613c03cb6SJianqun Xu 	WARN_ON(nr_pins != ctrl->nr_pins);
320713c03cb6SJianqun Xu 
320849c55878SDavid Wu 	return ctrl;
320949c55878SDavid Wu }
321049c55878SDavid Wu 
3211d5517017SDavid Wu /* SoC data specially handle */
3212d5517017SDavid Wu 
3213d5517017SDavid Wu /* rk3308b SoC data initialize */
3214d5517017SDavid Wu #define RK3308B_GRF_SOC_CON13			0x608
3215d5517017SDavid Wu #define RK3308B_GRF_SOC_CON15			0x610
3216d5517017SDavid Wu 
3217d5517017SDavid Wu /* RK3308B_GRF_SOC_CON13 */
3218d5517017SDavid Wu #define RK3308B_GRF_I2C3_IOFUNC_SRC_CTRL	(BIT(16 + 10) | BIT(10))
3219d5517017SDavid Wu #define RK3308B_GRF_GPIO2A3_SEL_SRC_CTRL	(BIT(16 + 7)  | BIT(7))
3220d5517017SDavid Wu #define RK3308B_GRF_GPIO2A2_SEL_SRC_CTRL	(BIT(16 + 3)  | BIT(3))
3221d5517017SDavid Wu 
3222d5517017SDavid Wu /* RK3308B_GRF_SOC_CON15 */
3223d5517017SDavid Wu #define RK3308B_GRF_GPIO2C0_SEL_SRC_CTRL	(BIT(16 + 11) | BIT(11))
3224d5517017SDavid Wu #define RK3308B_GRF_GPIO3B3_SEL_SRC_CTRL	(BIT(16 + 7)  | BIT(7))
3225d5517017SDavid Wu #define RK3308B_GRF_GPIO3B2_SEL_SRC_CTRL	(BIT(16 + 3)  | BIT(3))
3226d5517017SDavid Wu 
3227d5517017SDavid Wu static int rk3308b_soc_data_init(struct rockchip_pinctrl_priv *priv)
3228d5517017SDavid Wu {
3229d5517017SDavid Wu 	int ret;
3230d5517017SDavid Wu 
3231d5517017SDavid Wu 	/*
3232d5517017SDavid Wu 	 * Enable the special ctrl  of selected sources.
3233d5517017SDavid Wu 	 */
3234d5517017SDavid Wu 	ret = regmap_write(priv->regmap_base, RK3308B_GRF_SOC_CON13,
3235d5517017SDavid Wu 			   RK3308B_GRF_I2C3_IOFUNC_SRC_CTRL |
3236d5517017SDavid Wu 			   RK3308B_GRF_GPIO2A3_SEL_SRC_CTRL |
3237d5517017SDavid Wu 			   RK3308B_GRF_GPIO2A2_SEL_SRC_CTRL);
3238d5517017SDavid Wu 	if (ret)
3239d5517017SDavid Wu 		return ret;
3240d5517017SDavid Wu 
3241d5517017SDavid Wu 	ret = regmap_write(priv->regmap_base, RK3308B_GRF_SOC_CON15,
3242d5517017SDavid Wu 			   RK3308B_GRF_GPIO2C0_SEL_SRC_CTRL |
3243d5517017SDavid Wu 			   RK3308B_GRF_GPIO3B3_SEL_SRC_CTRL |
3244d5517017SDavid Wu 			   RK3308B_GRF_GPIO3B2_SEL_SRC_CTRL);
3245d5517017SDavid Wu 	if (ret)
3246d5517017SDavid Wu 		return ret;
3247d5517017SDavid Wu 
3248d5517017SDavid Wu 	return 0;
3249d5517017SDavid Wu }
3250d5517017SDavid Wu 
325149c55878SDavid Wu static int rockchip_pinctrl_probe(struct udevice *dev)
325249c55878SDavid Wu {
325349c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = dev_get_priv(dev);
325413c03cb6SJianqun Xu 	const struct rockchip_pin_ctrl *ctrl;
325549c55878SDavid Wu 	struct udevice *syscon;
325649c55878SDavid Wu 	struct regmap *regmap;
325749c55878SDavid Wu 	int ret = 0;
325849c55878SDavid Wu 
325949c55878SDavid Wu 	/* get rockchip grf syscon phandle */
326049c55878SDavid Wu 	ret = uclass_get_device_by_phandle(UCLASS_SYSCON, dev, "rockchip,grf",
326149c55878SDavid Wu 					   &syscon);
326249c55878SDavid Wu 	if (ret) {
326349c55878SDavid Wu 		debug("unable to find rockchip,grf syscon device (%d)\n", ret);
326449c55878SDavid Wu 		return ret;
326549c55878SDavid Wu 	}
326649c55878SDavid Wu 
326749c55878SDavid Wu 	/* get grf-reg base address */
326849c55878SDavid Wu 	regmap = syscon_get_regmap(syscon);
326949c55878SDavid Wu 	if (!regmap) {
327049c55878SDavid Wu 		debug("unable to find rockchip grf regmap\n");
327149c55878SDavid Wu 		return -ENODEV;
327249c55878SDavid Wu 	}
327349c55878SDavid Wu 	priv->regmap_base = regmap;
327449c55878SDavid Wu 
327549c55878SDavid Wu 	/* option: get pmu-reg base address */
327649c55878SDavid Wu 	ret = uclass_get_device_by_phandle(UCLASS_SYSCON, dev, "rockchip,pmu",
327749c55878SDavid Wu 					   &syscon);
327849c55878SDavid Wu 	if (!ret) {
327949c55878SDavid Wu 		/* get pmugrf-reg base address */
328049c55878SDavid Wu 		regmap = syscon_get_regmap(syscon);
328149c55878SDavid Wu 		if (!regmap) {
328249c55878SDavid Wu 			debug("unable to find rockchip pmu regmap\n");
328349c55878SDavid Wu 			return -ENODEV;
328449c55878SDavid Wu 		}
328549c55878SDavid Wu 		priv->regmap_pmu = regmap;
328649c55878SDavid Wu 	}
328749c55878SDavid Wu 
328849c55878SDavid Wu 	ctrl = rockchip_pinctrl_get_soc_data(dev);
328949c55878SDavid Wu 	if (!ctrl) {
329049c55878SDavid Wu 		debug("driver data not available\n");
329149c55878SDavid Wu 		return -EINVAL;
329249c55878SDavid Wu 	}
329349c55878SDavid Wu 
3294d5517017SDavid Wu 	/* Special handle for some Socs */
3295d5517017SDavid Wu 	if (ctrl->soc_data_init) {
3296d5517017SDavid Wu 		ret = ctrl->soc_data_init(priv);
3297d5517017SDavid Wu 		if (ret)
3298d5517017SDavid Wu 			return ret;
3299d5517017SDavid Wu 	}
3300d5517017SDavid Wu 
330113c03cb6SJianqun Xu 	priv->ctrl = (struct rockchip_pin_ctrl *)ctrl;
330249c55878SDavid Wu 	return 0;
330349c55878SDavid Wu }
330449c55878SDavid Wu 
330549c55878SDavid Wu static struct rockchip_pin_bank px30_pin_banks[] = {
330649c55878SDavid Wu 	PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0", IOMUX_SOURCE_PMU,
330749c55878SDavid Wu 					     IOMUX_SOURCE_PMU,
330849c55878SDavid Wu 					     IOMUX_SOURCE_PMU,
330949c55878SDavid Wu 					     IOMUX_SOURCE_PMU
331049c55878SDavid Wu 			    ),
331149c55878SDavid Wu 	PIN_BANK_IOMUX_FLAGS(1, 32, "gpio1", IOMUX_WIDTH_4BIT,
331249c55878SDavid Wu 					     IOMUX_WIDTH_4BIT,
331349c55878SDavid Wu 					     IOMUX_WIDTH_4BIT,
331449c55878SDavid Wu 					     IOMUX_WIDTH_4BIT
331549c55878SDavid Wu 			    ),
331649c55878SDavid Wu 	PIN_BANK_IOMUX_FLAGS(2, 32, "gpio2", IOMUX_WIDTH_4BIT,
331749c55878SDavid Wu 					     IOMUX_WIDTH_4BIT,
331849c55878SDavid Wu 					     IOMUX_WIDTH_4BIT,
331949c55878SDavid Wu 					     IOMUX_WIDTH_4BIT
332049c55878SDavid Wu 			    ),
332149c55878SDavid Wu 	PIN_BANK_IOMUX_FLAGS(3, 32, "gpio3", IOMUX_WIDTH_4BIT,
332249c55878SDavid Wu 					     IOMUX_WIDTH_4BIT,
332349c55878SDavid Wu 					     IOMUX_WIDTH_4BIT,
332449c55878SDavid Wu 					     IOMUX_WIDTH_4BIT
332549c55878SDavid Wu 			    ),
332649c55878SDavid Wu };
332749c55878SDavid Wu 
332813c03cb6SJianqun Xu static const struct rockchip_pin_ctrl px30_pin_ctrl = {
332949c55878SDavid Wu 	.pin_banks		= px30_pin_banks,
333049c55878SDavid Wu 	.nr_banks		= ARRAY_SIZE(px30_pin_banks),
333113c03cb6SJianqun Xu 	.nr_pins		= 128,
333249c55878SDavid Wu 	.label			= "PX30-GPIO",
333349c55878SDavid Wu 	.type			= PX30,
333449c55878SDavid Wu 	.grf_mux_offset		= 0x0,
333549c55878SDavid Wu 	.pmu_mux_offset		= 0x0,
333649c55878SDavid Wu 	.iomux_routes		= px30_mux_route_data,
333749c55878SDavid Wu 	.niomux_routes		= ARRAY_SIZE(px30_mux_route_data),
333849c55878SDavid Wu 	.pull_calc_reg		= px30_calc_pull_reg_and_bit,
333949c55878SDavid Wu 	.drv_calc_reg		= px30_calc_drv_reg_and_bit,
334049c55878SDavid Wu 	.schmitt_calc_reg	= px30_calc_schmitt_reg_and_bit,
334132c25d1fSDavid Wu 	.slew_rate_calc_reg	= px30_calc_slew_rate_reg_and_bit,
334249c55878SDavid Wu };
334349c55878SDavid Wu 
334449c55878SDavid Wu static struct rockchip_pin_bank rv1108_pin_banks[] = {
334549c55878SDavid Wu 	PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0", IOMUX_SOURCE_PMU,
334649c55878SDavid Wu 					     IOMUX_SOURCE_PMU,
334749c55878SDavid Wu 					     IOMUX_SOURCE_PMU,
334849c55878SDavid Wu 					     IOMUX_SOURCE_PMU),
334949c55878SDavid Wu 	PIN_BANK_IOMUX_FLAGS(1, 32, "gpio1", 0, 0, 0, 0),
335049c55878SDavid Wu 	PIN_BANK_IOMUX_FLAGS(2, 32, "gpio2", 0, 0, 0, 0),
335149c55878SDavid Wu 	PIN_BANK_IOMUX_FLAGS(3, 32, "gpio3", 0, 0, 0, 0),
335249c55878SDavid Wu };
335349c55878SDavid Wu 
335413c03cb6SJianqun Xu static const struct rockchip_pin_ctrl rv1108_pin_ctrl = {
335549c55878SDavid Wu 	.pin_banks		= rv1108_pin_banks,
335649c55878SDavid Wu 	.nr_banks		= ARRAY_SIZE(rv1108_pin_banks),
335713c03cb6SJianqun Xu 	.nr_pins		= 128,
335849c55878SDavid Wu 	.label			= "RV1108-GPIO",
335949c55878SDavid Wu 	.type			= RV1108,
336049c55878SDavid Wu 	.grf_mux_offset		= 0x10,
336149c55878SDavid Wu 	.pmu_mux_offset		= 0x0,
336249c55878SDavid Wu 	.iomux_recalced		= rv1108_mux_recalced_data,
336349c55878SDavid Wu 	.niomux_recalced	= ARRAY_SIZE(rv1108_mux_recalced_data),
336449c55878SDavid Wu 	.pull_calc_reg		= rv1108_calc_pull_reg_and_bit,
336549c55878SDavid Wu 	.drv_calc_reg		= rv1108_calc_drv_reg_and_bit,
336649c55878SDavid Wu 	.schmitt_calc_reg	= rv1108_calc_schmitt_reg_and_bit,
336749c55878SDavid Wu };
336849c55878SDavid Wu 
3369cf04a17bSJianqun Xu static struct rockchip_pin_bank rv1126_pin_banks[] = {
3370cf04a17bSJianqun Xu 	PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0",
3371cf04a17bSJianqun Xu 			     IOMUX_WIDTH_4BIT | IOMUX_SOURCE_PMU,
3372cf04a17bSJianqun Xu 			     IOMUX_WIDTH_4BIT | IOMUX_SOURCE_PMU,
3373cf04a17bSJianqun Xu 			     IOMUX_WIDTH_4BIT | IOMUX_L_SOURCE_PMU,
3374cf04a17bSJianqun Xu 			     IOMUX_WIDTH_4BIT),
3375d499d466SJianqun Xu 	PIN_BANK_IOMUX_FLAGS_OFFSET(1, 32, "gpio1",
3376cf04a17bSJianqun Xu 			     IOMUX_WIDTH_4BIT,
3377cf04a17bSJianqun Xu 			     IOMUX_WIDTH_4BIT,
3378cf04a17bSJianqun Xu 			     IOMUX_WIDTH_4BIT,
3379d499d466SJianqun Xu 			     IOMUX_WIDTH_4BIT,
3380d499d466SJianqun Xu 			     0x10010, 0x10018, 0x10020, 0x10028),
3381cf04a17bSJianqun Xu 	PIN_BANK_IOMUX_FLAGS(2, 32, "gpio2",
3382cf04a17bSJianqun Xu 			     IOMUX_WIDTH_4BIT,
3383cf04a17bSJianqun Xu 			     IOMUX_WIDTH_4BIT,
3384cf04a17bSJianqun Xu 			     IOMUX_WIDTH_4BIT,
3385cf04a17bSJianqun Xu 			     IOMUX_WIDTH_4BIT),
3386cf04a17bSJianqun Xu 	PIN_BANK_IOMUX_FLAGS(3, 32, "gpio3",
3387cf04a17bSJianqun Xu 			     IOMUX_WIDTH_4BIT,
3388cf04a17bSJianqun Xu 			     IOMUX_WIDTH_4BIT,
3389cf04a17bSJianqun Xu 			     IOMUX_WIDTH_4BIT,
3390cf04a17bSJianqun Xu 			     IOMUX_WIDTH_4BIT),
3391cf04a17bSJianqun Xu 	PIN_BANK_IOMUX_FLAGS(4, 2, "gpio4",
3392cf04a17bSJianqun Xu 			     IOMUX_WIDTH_4BIT, 0, 0, 0),
3393cf04a17bSJianqun Xu };
3394cf04a17bSJianqun Xu 
339513c03cb6SJianqun Xu static const struct rockchip_pin_ctrl rv1126_pin_ctrl = {
3396cf04a17bSJianqun Xu 	.pin_banks		= rv1126_pin_banks,
3397cf04a17bSJianqun Xu 	.nr_banks		= ARRAY_SIZE(rv1126_pin_banks),
339813c03cb6SJianqun Xu 	.nr_pins		= 130,
3399cf04a17bSJianqun Xu 	.label			= "RV1126-GPIO",
3400cf04a17bSJianqun Xu 	.type			= RV1126,
3401cf04a17bSJianqun Xu 	.grf_mux_offset		= 0x10004, /* mux offset from GPIO0_D0 */
3402cf04a17bSJianqun Xu 	.pmu_mux_offset		= 0x0,
3403d499d466SJianqun Xu 	.iomux_routes		= rv1126_mux_route_data,
3404d499d466SJianqun Xu 	.niomux_routes		= ARRAY_SIZE(rv1126_mux_route_data),
3405cf04a17bSJianqun Xu 	.iomux_recalced		= rv1126_mux_recalced_data,
3406cf04a17bSJianqun Xu 	.niomux_recalced	= ARRAY_SIZE(rv1126_mux_recalced_data),
3407cf04a17bSJianqun Xu 	.pull_calc_reg		= rv1126_calc_pull_reg_and_bit,
3408cf04a17bSJianqun Xu 	.drv_calc_reg		= rv1126_calc_drv_reg_and_bit,
3409cf04a17bSJianqun Xu 	.schmitt_calc_reg	= rv1126_calc_schmitt_reg_and_bit,
3410cf04a17bSJianqun Xu };
3411cf04a17bSJianqun Xu 
3412a2a3fc8fSJianqun Xu static struct rockchip_pin_bank rk1808_pin_banks[] = {
3413a2a3fc8fSJianqun Xu 	PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0",
3414a2a3fc8fSJianqun Xu 			     IOMUX_SOURCE_PMU,
3415a2a3fc8fSJianqun Xu 			     IOMUX_SOURCE_PMU,
3416a2a3fc8fSJianqun Xu 			     IOMUX_SOURCE_PMU,
3417a2a3fc8fSJianqun Xu 			     IOMUX_SOURCE_PMU),
3418a2a3fc8fSJianqun Xu 	PIN_BANK_IOMUX_FLAGS(1, 32, "gpio1",
3419a2a3fc8fSJianqun Xu 			     IOMUX_WIDTH_4BIT,
3420a2a3fc8fSJianqun Xu 			     IOMUX_WIDTH_4BIT,
3421a2a3fc8fSJianqun Xu 			     IOMUX_WIDTH_4BIT,
3422a2a3fc8fSJianqun Xu 			     IOMUX_WIDTH_4BIT),
3423a2a3fc8fSJianqun Xu 	PIN_BANK_IOMUX_FLAGS(2, 32, "gpio2",
3424a2a3fc8fSJianqun Xu 			     IOMUX_WIDTH_4BIT,
3425a2a3fc8fSJianqun Xu 			     IOMUX_WIDTH_4BIT,
3426a2a3fc8fSJianqun Xu 			     IOMUX_WIDTH_4BIT,
3427a2a3fc8fSJianqun Xu 			     IOMUX_WIDTH_4BIT),
3428a2a3fc8fSJianqun Xu 	PIN_BANK_IOMUX_FLAGS(3, 32, "gpio3",
3429a2a3fc8fSJianqun Xu 			     IOMUX_WIDTH_4BIT,
3430a2a3fc8fSJianqun Xu 			     IOMUX_WIDTH_4BIT,
3431a2a3fc8fSJianqun Xu 			     IOMUX_WIDTH_4BIT,
3432a2a3fc8fSJianqun Xu 			     IOMUX_WIDTH_4BIT),
3433a2a3fc8fSJianqun Xu 	PIN_BANK_IOMUX_FLAGS(4, 32, "gpio4",
3434a2a3fc8fSJianqun Xu 			     IOMUX_WIDTH_4BIT,
3435a2a3fc8fSJianqun Xu 			     IOMUX_WIDTH_4BIT,
3436a2a3fc8fSJianqun Xu 			     IOMUX_WIDTH_4BIT,
3437a2a3fc8fSJianqun Xu 			     IOMUX_WIDTH_4BIT),
3438a2a3fc8fSJianqun Xu };
3439a2a3fc8fSJianqun Xu 
344013c03cb6SJianqun Xu static const struct rockchip_pin_ctrl rk1808_pin_ctrl = {
3441a2a3fc8fSJianqun Xu 	.pin_banks		= rk1808_pin_banks,
3442a2a3fc8fSJianqun Xu 	.nr_banks		= ARRAY_SIZE(rk1808_pin_banks),
344313c03cb6SJianqun Xu 	.nr_pins		= 160,
3444a2a3fc8fSJianqun Xu 	.label			= "RK1808-GPIO",
3445a2a3fc8fSJianqun Xu 	.type			= RK1808,
3446a2a3fc8fSJianqun Xu 	.iomux_routes		= rk1808_mux_route_data,
3447a2a3fc8fSJianqun Xu 	.niomux_routes		= ARRAY_SIZE(rk1808_mux_route_data),
3448a2a3fc8fSJianqun Xu 	.grf_mux_offset		= 0x0,
3449a2a3fc8fSJianqun Xu 	.pmu_mux_offset		= 0x0,
3450a2a3fc8fSJianqun Xu 	.pull_calc_reg		= rk1808_calc_pull_reg_and_bit,
3451a2a3fc8fSJianqun Xu 	.drv_calc_reg		= rk1808_calc_drv_reg_and_bit,
3452a2a3fc8fSJianqun Xu 	.schmitt_calc_reg	= rk1808_calc_schmitt_reg_and_bit,
3453a2a3fc8fSJianqun Xu };
3454a2a3fc8fSJianqun Xu 
345549c55878SDavid Wu static struct rockchip_pin_bank rk2928_pin_banks[] = {
345649c55878SDavid Wu 	PIN_BANK(0, 32, "gpio0"),
345749c55878SDavid Wu 	PIN_BANK(1, 32, "gpio1"),
345849c55878SDavid Wu 	PIN_BANK(2, 32, "gpio2"),
345949c55878SDavid Wu 	PIN_BANK(3, 32, "gpio3"),
346049c55878SDavid Wu };
346149c55878SDavid Wu 
346213c03cb6SJianqun Xu static const struct rockchip_pin_ctrl rk2928_pin_ctrl = {
346349c55878SDavid Wu 	.pin_banks		= rk2928_pin_banks,
346449c55878SDavid Wu 	.nr_banks		= ARRAY_SIZE(rk2928_pin_banks),
346513c03cb6SJianqun Xu 	.nr_pins		= 128,
346649c55878SDavid Wu 	.label			= "RK2928-GPIO",
346749c55878SDavid Wu 	.type			= RK2928,
346849c55878SDavid Wu 	.grf_mux_offset		= 0xa8,
346949c55878SDavid Wu 	.pull_calc_reg		= rk2928_calc_pull_reg_and_bit,
347049c55878SDavid Wu };
347149c55878SDavid Wu 
347249c55878SDavid Wu static struct rockchip_pin_bank rk3036_pin_banks[] = {
347349c55878SDavid Wu 	PIN_BANK(0, 32, "gpio0"),
347449c55878SDavid Wu 	PIN_BANK(1, 32, "gpio1"),
347549c55878SDavid Wu 	PIN_BANK(2, 32, "gpio2"),
347649c55878SDavid Wu };
347749c55878SDavid Wu 
347813c03cb6SJianqun Xu static const struct rockchip_pin_ctrl rk3036_pin_ctrl = {
347949c55878SDavid Wu 	.pin_banks		= rk3036_pin_banks,
348049c55878SDavid Wu 	.nr_banks		= ARRAY_SIZE(rk3036_pin_banks),
348113c03cb6SJianqun Xu 	.nr_pins		= 96,
348249c55878SDavid Wu 	.label			= "RK3036-GPIO",
348349c55878SDavid Wu 	.type			= RK2928,
348449c55878SDavid Wu 	.grf_mux_offset		= 0xa8,
348549c55878SDavid Wu 	.pull_calc_reg		= rk2928_calc_pull_reg_and_bit,
348649c55878SDavid Wu };
348749c55878SDavid Wu 
348849c55878SDavid Wu static struct rockchip_pin_bank rk3066a_pin_banks[] = {
348949c55878SDavid Wu 	PIN_BANK(0, 32, "gpio0"),
349049c55878SDavid Wu 	PIN_BANK(1, 32, "gpio1"),
349149c55878SDavid Wu 	PIN_BANK(2, 32, "gpio2"),
349249c55878SDavid Wu 	PIN_BANK(3, 32, "gpio3"),
349349c55878SDavid Wu 	PIN_BANK(4, 32, "gpio4"),
349449c55878SDavid Wu 	PIN_BANK(6, 16, "gpio6"),
349549c55878SDavid Wu };
349649c55878SDavid Wu 
349713c03cb6SJianqun Xu static const struct rockchip_pin_ctrl rk3066a_pin_ctrl = {
349849c55878SDavid Wu 	.pin_banks		= rk3066a_pin_banks,
349949c55878SDavid Wu 	.nr_banks		= ARRAY_SIZE(rk3066a_pin_banks),
350013c03cb6SJianqun Xu 	.nr_pins		= 176,
350149c55878SDavid Wu 	.label			= "RK3066a-GPIO",
350249c55878SDavid Wu 	.type			= RK2928,
350349c55878SDavid Wu 	.grf_mux_offset		= 0xa8,
350449c55878SDavid Wu 	.pull_calc_reg		= rk2928_calc_pull_reg_and_bit,
350549c55878SDavid Wu };
350649c55878SDavid Wu 
350749c55878SDavid Wu static struct rockchip_pin_bank rk3066b_pin_banks[] = {
350849c55878SDavid Wu 	PIN_BANK(0, 32, "gpio0"),
350949c55878SDavid Wu 	PIN_BANK(1, 32, "gpio1"),
351049c55878SDavid Wu 	PIN_BANK(2, 32, "gpio2"),
351149c55878SDavid Wu 	PIN_BANK(3, 32, "gpio3"),
351249c55878SDavid Wu };
351349c55878SDavid Wu 
351413c03cb6SJianqun Xu static const struct rockchip_pin_ctrl rk3066b_pin_ctrl = {
351549c55878SDavid Wu 	.pin_banks		= rk3066b_pin_banks,
351649c55878SDavid Wu 	.nr_banks		= ARRAY_SIZE(rk3066b_pin_banks),
351713c03cb6SJianqun Xu 	.nr_pins		= 128,
351849c55878SDavid Wu 	.label			= "RK3066b-GPIO",
351949c55878SDavid Wu 	.type			= RK3066B,
352049c55878SDavid Wu 	.grf_mux_offset		= 0x60,
352149c55878SDavid Wu };
352249c55878SDavid Wu 
352349c55878SDavid Wu static struct rockchip_pin_bank rk3128_pin_banks[] = {
352449c55878SDavid Wu 	PIN_BANK(0, 32, "gpio0"),
352549c55878SDavid Wu 	PIN_BANK(1, 32, "gpio1"),
352649c55878SDavid Wu 	PIN_BANK(2, 32, "gpio2"),
352749c55878SDavid Wu 	PIN_BANK(3, 32, "gpio3"),
352849c55878SDavid Wu };
352949c55878SDavid Wu 
353013c03cb6SJianqun Xu static const struct rockchip_pin_ctrl rk3128_pin_ctrl = {
353149c55878SDavid Wu 	.pin_banks		= rk3128_pin_banks,
353249c55878SDavid Wu 	.nr_banks		= ARRAY_SIZE(rk3128_pin_banks),
353313c03cb6SJianqun Xu 	.nr_pins		= 128,
353449c55878SDavid Wu 	.label			= "RK3128-GPIO",
353549c55878SDavid Wu 	.type			= RK3128,
353649c55878SDavid Wu 	.grf_mux_offset		= 0xa8,
353749c55878SDavid Wu 	.iomux_recalced		= rk3128_mux_recalced_data,
353849c55878SDavid Wu 	.niomux_recalced	= ARRAY_SIZE(rk3128_mux_recalced_data),
353949c55878SDavid Wu 	.iomux_routes		= rk3128_mux_route_data,
354049c55878SDavid Wu 	.niomux_routes		= ARRAY_SIZE(rk3128_mux_route_data),
354149c55878SDavid Wu 	.pull_calc_reg		= rk3128_calc_pull_reg_and_bit,
354249c55878SDavid Wu };
354349c55878SDavid Wu 
354449c55878SDavid Wu static struct rockchip_pin_bank rk3188_pin_banks[] = {
354549c55878SDavid Wu 	PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0", IOMUX_GPIO_ONLY, 0, 0, 0),
354649c55878SDavid Wu 	PIN_BANK(1, 32, "gpio1"),
354749c55878SDavid Wu 	PIN_BANK(2, 32, "gpio2"),
354849c55878SDavid Wu 	PIN_BANK(3, 32, "gpio3"),
354949c55878SDavid Wu };
355049c55878SDavid Wu 
355113c03cb6SJianqun Xu static const struct rockchip_pin_ctrl rk3188_pin_ctrl = {
355249c55878SDavid Wu 	.pin_banks		= rk3188_pin_banks,
355349c55878SDavid Wu 	.nr_banks		= ARRAY_SIZE(rk3188_pin_banks),
355413c03cb6SJianqun Xu 	.nr_pins		= 128,
355549c55878SDavid Wu 	.label			= "RK3188-GPIO",
355649c55878SDavid Wu 	.type			= RK3188,
355749c55878SDavid Wu 	.grf_mux_offset		= 0x60,
355849c55878SDavid Wu 	.pull_calc_reg		= rk3188_calc_pull_reg_and_bit,
355949c55878SDavid Wu };
356049c55878SDavid Wu 
356149c55878SDavid Wu static struct rockchip_pin_bank rk3228_pin_banks[] = {
356249c55878SDavid Wu 	PIN_BANK(0, 32, "gpio0"),
356349c55878SDavid Wu 	PIN_BANK(1, 32, "gpio1"),
356449c55878SDavid Wu 	PIN_BANK(2, 32, "gpio2"),
356549c55878SDavid Wu 	PIN_BANK(3, 32, "gpio3"),
356649c55878SDavid Wu };
356749c55878SDavid Wu 
356813c03cb6SJianqun Xu static const struct rockchip_pin_ctrl rk3228_pin_ctrl = {
356949c55878SDavid Wu 	.pin_banks		= rk3228_pin_banks,
357049c55878SDavid Wu 	.nr_banks		= ARRAY_SIZE(rk3228_pin_banks),
357113c03cb6SJianqun Xu 	.nr_pins		= 128,
357249c55878SDavid Wu 	.label			= "RK3228-GPIO",
357349c55878SDavid Wu 	.type			= RK3288,
357449c55878SDavid Wu 	.grf_mux_offset		= 0x0,
357549c55878SDavid Wu 	.iomux_routes		= rk3228_mux_route_data,
357649c55878SDavid Wu 	.niomux_routes		= ARRAY_SIZE(rk3228_mux_route_data),
357749c55878SDavid Wu 	.pull_calc_reg		= rk3228_calc_pull_reg_and_bit,
357849c55878SDavid Wu 	.drv_calc_reg		= rk3228_calc_drv_reg_and_bit,
357949c55878SDavid Wu };
358049c55878SDavid Wu 
358149c55878SDavid Wu static struct rockchip_pin_bank rk3288_pin_banks[] = {
358255a89bc6SDavid Wu 	PIN_BANK_IOMUX_DRV_PULL_FLAGS(0, 24, "gpio0",
35834bafc2daSDavid Wu 				      IOMUX_SOURCE_PMU | IOMUX_WRITABLE_32BIT,
35844bafc2daSDavid Wu 				      IOMUX_SOURCE_PMU | IOMUX_WRITABLE_32BIT,
358555a89bc6SDavid Wu 				      IOMUX_SOURCE_PMU | IOMUX_WRITABLE_32BIT,
358655a89bc6SDavid Wu 				      IOMUX_UNROUTED,
358755a89bc6SDavid Wu 				      DRV_TYPE_WRITABLE_32BIT,
358855a89bc6SDavid Wu 				      DRV_TYPE_WRITABLE_32BIT,
358955a89bc6SDavid Wu 				      DRV_TYPE_WRITABLE_32BIT,
359055a89bc6SDavid Wu 				      0,
359155a89bc6SDavid Wu 				      PULL_TYPE_WRITABLE_32BIT,
359255a89bc6SDavid Wu 				      PULL_TYPE_WRITABLE_32BIT,
359355a89bc6SDavid Wu 				      PULL_TYPE_WRITABLE_32BIT,
359455a89bc6SDavid Wu 				      0
359549c55878SDavid Wu 			    ),
359649c55878SDavid Wu 	PIN_BANK_IOMUX_FLAGS(1, 32, "gpio1", IOMUX_UNROUTED,
359749c55878SDavid Wu 					     IOMUX_UNROUTED,
359849c55878SDavid Wu 					     IOMUX_UNROUTED,
359949c55878SDavid Wu 					     0
360049c55878SDavid Wu 			    ),
360149c55878SDavid Wu 	PIN_BANK_IOMUX_FLAGS(2, 32, "gpio2", 0, 0, 0, IOMUX_UNROUTED),
360249c55878SDavid Wu 	PIN_BANK_IOMUX_FLAGS(3, 32, "gpio3", 0, 0, 0, IOMUX_WIDTH_4BIT),
360349c55878SDavid Wu 	PIN_BANK_IOMUX_FLAGS(4, 32, "gpio4", IOMUX_WIDTH_4BIT,
360449c55878SDavid Wu 					     IOMUX_WIDTH_4BIT,
360549c55878SDavid Wu 					     0,
360649c55878SDavid Wu 					     0
360749c55878SDavid Wu 			    ),
360849c55878SDavid Wu 	PIN_BANK_IOMUX_FLAGS(5, 32, "gpio5", IOMUX_UNROUTED,
360949c55878SDavid Wu 					     0,
361049c55878SDavid Wu 					     0,
361149c55878SDavid Wu 					     IOMUX_UNROUTED
361249c55878SDavid Wu 			    ),
361349c55878SDavid Wu 	PIN_BANK_IOMUX_FLAGS(6, 32, "gpio6", 0, 0, 0, IOMUX_UNROUTED),
361449c55878SDavid Wu 	PIN_BANK_IOMUX_FLAGS(7, 32, "gpio7", 0,
361549c55878SDavid Wu 					     0,
361649c55878SDavid Wu 					     IOMUX_WIDTH_4BIT,
361749c55878SDavid Wu 					     IOMUX_UNROUTED
361849c55878SDavid Wu 			    ),
361949c55878SDavid Wu 	PIN_BANK(8, 16, "gpio8"),
362049c55878SDavid Wu };
362149c55878SDavid Wu 
362213c03cb6SJianqun Xu static const struct rockchip_pin_ctrl rk3288_pin_ctrl = {
362349c55878SDavid Wu 	.pin_banks		= rk3288_pin_banks,
362449c55878SDavid Wu 	.nr_banks		= ARRAY_SIZE(rk3288_pin_banks),
36252f6aff58SJianqun Xu 	.nr_pins		= 264,
362649c55878SDavid Wu 	.label			= "RK3288-GPIO",
362749c55878SDavid Wu 	.type			= RK3288,
362849c55878SDavid Wu 	.grf_mux_offset		= 0x0,
362949c55878SDavid Wu 	.pmu_mux_offset		= 0x84,
363049c55878SDavid Wu 	.iomux_routes		= rk3288_mux_route_data,
363149c55878SDavid Wu 	.niomux_routes		= ARRAY_SIZE(rk3288_mux_route_data),
363249c55878SDavid Wu 	.pull_calc_reg		= rk3288_calc_pull_reg_and_bit,
363349c55878SDavid Wu 	.drv_calc_reg		= rk3288_calc_drv_reg_and_bit,
363449c55878SDavid Wu };
363549c55878SDavid Wu 
3636b3077611SDavid Wu static struct rockchip_pin_bank rk3308_pin_banks[] = {
3637b3077611SDavid Wu 	PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0", IOMUX_8WIDTH_2BIT,
3638b3077611SDavid Wu 					     IOMUX_8WIDTH_2BIT,
3639b3077611SDavid Wu 					     IOMUX_8WIDTH_2BIT,
3640b3077611SDavid Wu 					     IOMUX_8WIDTH_2BIT),
3641b3077611SDavid Wu 	PIN_BANK_IOMUX_FLAGS(1, 32, "gpio1", IOMUX_8WIDTH_2BIT,
3642b3077611SDavid Wu 					     IOMUX_8WIDTH_2BIT,
3643b3077611SDavid Wu 					     IOMUX_8WIDTH_2BIT,
3644b3077611SDavid Wu 					     IOMUX_8WIDTH_2BIT),
3645b3077611SDavid Wu 	PIN_BANK_IOMUX_FLAGS(2, 32, "gpio2", IOMUX_8WIDTH_2BIT,
3646b3077611SDavid Wu 					     IOMUX_8WIDTH_2BIT,
3647b3077611SDavid Wu 					     IOMUX_8WIDTH_2BIT,
3648b3077611SDavid Wu 					     IOMUX_8WIDTH_2BIT),
3649b3077611SDavid Wu 	PIN_BANK_IOMUX_FLAGS(3, 32, "gpio3", IOMUX_8WIDTH_2BIT,
3650b3077611SDavid Wu 					     IOMUX_8WIDTH_2BIT,
3651b3077611SDavid Wu 					     IOMUX_8WIDTH_2BIT,
3652b3077611SDavid Wu 					     IOMUX_8WIDTH_2BIT),
3653b3077611SDavid Wu 	PIN_BANK_IOMUX_FLAGS(4, 32, "gpio4", IOMUX_8WIDTH_2BIT,
3654b3077611SDavid Wu 					     IOMUX_8WIDTH_2BIT,
3655b3077611SDavid Wu 					     IOMUX_8WIDTH_2BIT,
3656b3077611SDavid Wu 					     IOMUX_8WIDTH_2BIT),
3657b3077611SDavid Wu };
3658b3077611SDavid Wu 
3659b3077611SDavid Wu static struct rockchip_pin_ctrl rk3308_pin_ctrl = {
3660b3077611SDavid Wu 		.pin_banks		= rk3308_pin_banks,
3661b3077611SDavid Wu 		.nr_banks		= ARRAY_SIZE(rk3308_pin_banks),
3662e21613fbSJianqun Xu 		.nr_pins		= 160,
3663b3077611SDavid Wu 		.label			= "RK3308-GPIO",
3664b3077611SDavid Wu 		.type			= RK3308,
3665b3077611SDavid Wu 		.grf_mux_offset		= 0x0,
3666b3077611SDavid Wu 		.iomux_recalced		= rk3308_mux_recalced_data,
3667b3077611SDavid Wu 		.niomux_recalced	= ARRAY_SIZE(rk3308_mux_recalced_data),
3668b3077611SDavid Wu 		.iomux_routes		= rk3308_mux_route_data,
3669b3077611SDavid Wu 		.niomux_routes		= ARRAY_SIZE(rk3308_mux_route_data),
367013c03cb6SJianqun Xu 		.pull_calc_reg		= rk3308_calc_pull_reg_and_bit,
367113c03cb6SJianqun Xu 		.drv_calc_reg		= rk3308_calc_drv_reg_and_bit,
367213c03cb6SJianqun Xu 		.schmitt_calc_reg	= rk3308_calc_schmitt_reg_and_bit,
367313c03cb6SJianqun Xu };
367413c03cb6SJianqun Xu 
367513c03cb6SJianqun Xu static const struct rockchip_pin_ctrl rk3308b_pin_ctrl = {
367613c03cb6SJianqun Xu 	.pin_banks		= rk3308_pin_banks,
367713c03cb6SJianqun Xu 	.nr_banks		= ARRAY_SIZE(rk3308_pin_banks),
367813c03cb6SJianqun Xu 	.nr_pins		= 160,
367913c03cb6SJianqun Xu 	.label			= "RK3308-GPIO",
368013c03cb6SJianqun Xu 	.type			= RK3308,
368113c03cb6SJianqun Xu 	.grf_mux_offset		= 0x0,
368213c03cb6SJianqun Xu 	.iomux_recalced		= rk3308b_mux_recalced_data,
368313c03cb6SJianqun Xu 	.niomux_recalced	= ARRAY_SIZE(rk3308b_mux_recalced_data),
368413c03cb6SJianqun Xu 	.iomux_routes		= rk3308b_mux_route_data,
368513c03cb6SJianqun Xu 	.niomux_routes		= ARRAY_SIZE(rk3308b_mux_route_data),
3686d5517017SDavid Wu 	.soc_data_init		= rk3308b_soc_data_init,
3687b3077611SDavid Wu 	.pull_calc_reg		= rk3308_calc_pull_reg_and_bit,
3688b3077611SDavid Wu 	.drv_calc_reg		= rk3308_calc_drv_reg_and_bit,
3689b3077611SDavid Wu 	.schmitt_calc_reg	= rk3308_calc_schmitt_reg_and_bit,
3690b3077611SDavid Wu };
3691b3077611SDavid Wu 
369249c55878SDavid Wu static struct rockchip_pin_bank rk3328_pin_banks[] = {
369349c55878SDavid Wu 	PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0", 0, 0, 0, 0),
369449c55878SDavid Wu 	PIN_BANK_IOMUX_FLAGS(1, 32, "gpio1", 0, 0, 0, 0),
369549c55878SDavid Wu 	PIN_BANK_IOMUX_FLAGS(2, 32, "gpio2", 0,
3696*878372faSYe Zhang 			     IOMUX_8WIDTH_2BIT,
369749c55878SDavid Wu 			     IOMUX_WIDTH_3BIT,
369849c55878SDavid Wu 			     0),
369949c55878SDavid Wu 	PIN_BANK_IOMUX_FLAGS(3, 32, "gpio3",
370049c55878SDavid Wu 			     IOMUX_WIDTH_3BIT,
370149c55878SDavid Wu 			     IOMUX_WIDTH_3BIT,
370249c55878SDavid Wu 			     0,
370349c55878SDavid Wu 			     0),
370449c55878SDavid Wu };
370549c55878SDavid Wu 
370613c03cb6SJianqun Xu static const struct rockchip_pin_ctrl rk3328_pin_ctrl = {
370749c55878SDavid Wu 	.pin_banks		= rk3328_pin_banks,
370849c55878SDavid Wu 	.nr_banks		= ARRAY_SIZE(rk3328_pin_banks),
370913c03cb6SJianqun Xu 	.nr_pins		= 128,
371049c55878SDavid Wu 	.label			= "RK3328-GPIO",
371149c55878SDavid Wu 	.type			= RK3288,
371249c55878SDavid Wu 	.grf_mux_offset		= 0x0,
371349c55878SDavid Wu 	.iomux_recalced		= rk3328_mux_recalced_data,
371449c55878SDavid Wu 	.niomux_recalced	= ARRAY_SIZE(rk3328_mux_recalced_data),
371549c55878SDavid Wu 	.iomux_routes		= rk3328_mux_route_data,
371649c55878SDavid Wu 	.niomux_routes		= ARRAY_SIZE(rk3328_mux_route_data),
371749c55878SDavid Wu 	.pull_calc_reg		= rk3228_calc_pull_reg_and_bit,
371849c55878SDavid Wu 	.drv_calc_reg		= rk3228_calc_drv_reg_and_bit,
371949c55878SDavid Wu 	.schmitt_calc_reg	= rk3328_calc_schmitt_reg_and_bit,
372049c55878SDavid Wu };
372149c55878SDavid Wu 
372249c55878SDavid Wu static struct rockchip_pin_bank rk3368_pin_banks[] = {
372349c55878SDavid Wu 	PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0", IOMUX_SOURCE_PMU,
372449c55878SDavid Wu 					     IOMUX_SOURCE_PMU,
372549c55878SDavid Wu 					     IOMUX_SOURCE_PMU,
372649c55878SDavid Wu 					     IOMUX_SOURCE_PMU
372749c55878SDavid Wu 			    ),
372849c55878SDavid Wu 	PIN_BANK(1, 32, "gpio1"),
372949c55878SDavid Wu 	PIN_BANK(2, 32, "gpio2"),
373049c55878SDavid Wu 	PIN_BANK(3, 32, "gpio3"),
373149c55878SDavid Wu };
373249c55878SDavid Wu 
373313c03cb6SJianqun Xu static const struct rockchip_pin_ctrl rk3368_pin_ctrl = {
373449c55878SDavid Wu 	.pin_banks		= rk3368_pin_banks,
373549c55878SDavid Wu 	.nr_banks		= ARRAY_SIZE(rk3368_pin_banks),
373613c03cb6SJianqun Xu 	.nr_pins		= 128,
373749c55878SDavid Wu 	.label			= "RK3368-GPIO",
373849c55878SDavid Wu 	.type			= RK3368,
373949c55878SDavid Wu 	.grf_mux_offset		= 0x0,
374049c55878SDavid Wu 	.pmu_mux_offset		= 0x0,
374149c55878SDavid Wu 	.pull_calc_reg		= rk3368_calc_pull_reg_and_bit,
374249c55878SDavid Wu 	.drv_calc_reg		= rk3368_calc_drv_reg_and_bit,
374349c55878SDavid Wu };
374449c55878SDavid Wu 
374549c55878SDavid Wu static struct rockchip_pin_bank rk3399_pin_banks[] = {
374649c55878SDavid Wu 	PIN_BANK_IOMUX_FLAGS_DRV_FLAGS_OFFSET_PULL_FLAGS(0, 32, "gpio0",
374749c55878SDavid Wu 							 IOMUX_SOURCE_PMU,
374849c55878SDavid Wu 							 IOMUX_SOURCE_PMU,
374949c55878SDavid Wu 							 IOMUX_SOURCE_PMU,
375049c55878SDavid Wu 							 IOMUX_SOURCE_PMU,
375149c55878SDavid Wu 							 DRV_TYPE_IO_1V8_ONLY,
375249c55878SDavid Wu 							 DRV_TYPE_IO_1V8_ONLY,
375349c55878SDavid Wu 							 DRV_TYPE_IO_DEFAULT,
375449c55878SDavid Wu 							 DRV_TYPE_IO_DEFAULT,
375549c55878SDavid Wu 							 0x80,
375649c55878SDavid Wu 							 0x88,
375749c55878SDavid Wu 							 -1,
375849c55878SDavid Wu 							 -1,
375949c55878SDavid Wu 							 PULL_TYPE_IO_1V8_ONLY,
376049c55878SDavid Wu 							 PULL_TYPE_IO_1V8_ONLY,
376149c55878SDavid Wu 							 PULL_TYPE_IO_DEFAULT,
376249c55878SDavid Wu 							 PULL_TYPE_IO_DEFAULT
376349c55878SDavid Wu 							),
376449c55878SDavid Wu 	PIN_BANK_IOMUX_DRV_FLAGS_OFFSET(1, 32, "gpio1", IOMUX_SOURCE_PMU,
376549c55878SDavid Wu 					IOMUX_SOURCE_PMU,
376649c55878SDavid Wu 					IOMUX_SOURCE_PMU,
376749c55878SDavid Wu 					IOMUX_SOURCE_PMU,
376849c55878SDavid Wu 					DRV_TYPE_IO_1V8_OR_3V0,
376949c55878SDavid Wu 					DRV_TYPE_IO_1V8_OR_3V0,
377049c55878SDavid Wu 					DRV_TYPE_IO_1V8_OR_3V0,
377149c55878SDavid Wu 					DRV_TYPE_IO_1V8_OR_3V0,
377249c55878SDavid Wu 					0xa0,
377349c55878SDavid Wu 					0xa8,
377449c55878SDavid Wu 					0xb0,
377549c55878SDavid Wu 					0xb8
377649c55878SDavid Wu 					),
377749c55878SDavid Wu 	PIN_BANK_DRV_FLAGS_PULL_FLAGS(2, 32, "gpio2", DRV_TYPE_IO_1V8_OR_3V0,
377849c55878SDavid Wu 				      DRV_TYPE_IO_1V8_OR_3V0,
377949c55878SDavid Wu 				      DRV_TYPE_IO_1V8_ONLY,
378049c55878SDavid Wu 				      DRV_TYPE_IO_1V8_ONLY,
378149c55878SDavid Wu 				      PULL_TYPE_IO_DEFAULT,
378249c55878SDavid Wu 				      PULL_TYPE_IO_DEFAULT,
378349c55878SDavid Wu 				      PULL_TYPE_IO_1V8_ONLY,
378449c55878SDavid Wu 				      PULL_TYPE_IO_1V8_ONLY
378549c55878SDavid Wu 				      ),
378649c55878SDavid Wu 	PIN_BANK_DRV_FLAGS(3, 32, "gpio3", DRV_TYPE_IO_3V3_ONLY,
378749c55878SDavid Wu 			   DRV_TYPE_IO_3V3_ONLY,
378849c55878SDavid Wu 			   DRV_TYPE_IO_3V3_ONLY,
378949c55878SDavid Wu 			   DRV_TYPE_IO_1V8_OR_3V0
379049c55878SDavid Wu 			   ),
379149c55878SDavid Wu 	PIN_BANK_DRV_FLAGS(4, 32, "gpio4", DRV_TYPE_IO_1V8_OR_3V0,
379249c55878SDavid Wu 			   DRV_TYPE_IO_1V8_3V0_AUTO,
379349c55878SDavid Wu 			   DRV_TYPE_IO_1V8_OR_3V0,
379449c55878SDavid Wu 			   DRV_TYPE_IO_1V8_OR_3V0
379549c55878SDavid Wu 			   ),
379649c55878SDavid Wu };
379749c55878SDavid Wu 
379813c03cb6SJianqun Xu static const struct rockchip_pin_ctrl rk3399_pin_ctrl = {
379949c55878SDavid Wu 	.pin_banks		= rk3399_pin_banks,
380049c55878SDavid Wu 	.nr_banks		= ARRAY_SIZE(rk3399_pin_banks),
380113c03cb6SJianqun Xu 	.nr_pins		= 160,
380249c55878SDavid Wu 	.label			= "RK3399-GPIO",
380349c55878SDavid Wu 	.type			= RK3399,
380449c55878SDavid Wu 	.grf_mux_offset		= 0xe000,
380549c55878SDavid Wu 	.pmu_mux_offset		= 0x0,
380649c55878SDavid Wu 	.grf_drv_offset		= 0xe100,
380749c55878SDavid Wu 	.pmu_drv_offset		= 0x80,
380849c55878SDavid Wu 	.iomux_routes		= rk3399_mux_route_data,
380949c55878SDavid Wu 	.niomux_routes		= ARRAY_SIZE(rk3399_mux_route_data),
381049c55878SDavid Wu 	.pull_calc_reg		= rk3399_calc_pull_reg_and_bit,
381149c55878SDavid Wu 	.drv_calc_reg		= rk3399_calc_drv_reg_and_bit,
381249c55878SDavid Wu };
381349c55878SDavid Wu 
381449c55878SDavid Wu static const struct udevice_id rockchip_pinctrl_dt_match[] = {
381549c55878SDavid Wu 	{ .compatible = "rockchip,px30-pinctrl",
381649c55878SDavid Wu 		.data = (ulong)&px30_pin_ctrl },
381749c55878SDavid Wu 	{ .compatible = "rockchip,rv1108-pinctrl",
381849c55878SDavid Wu 		.data = (ulong)&rv1108_pin_ctrl },
381992b1d31aSJianqun Xu 	{ .compatible = "rockchip,rv1126-pinctrl-legency",
3820cf04a17bSJianqun Xu 		.data = (ulong)&rv1126_pin_ctrl },
3821a2a3fc8fSJianqun Xu 	{ .compatible = "rockchip,rk1808-pinctrl",
3822a2a3fc8fSJianqun Xu 		.data = (ulong)&rk1808_pin_ctrl },
382349c55878SDavid Wu 	{ .compatible = "rockchip,rk2928-pinctrl",
382449c55878SDavid Wu 		.data = (ulong)&rk2928_pin_ctrl },
382549c55878SDavid Wu 	{ .compatible = "rockchip,rk3036-pinctrl",
382649c55878SDavid Wu 		.data = (ulong)&rk3036_pin_ctrl },
382749c55878SDavid Wu 	{ .compatible = "rockchip,rk3066a-pinctrl",
382849c55878SDavid Wu 		.data = (ulong)&rk3066a_pin_ctrl },
382949c55878SDavid Wu 	{ .compatible = "rockchip,rk3066b-pinctrl",
383049c55878SDavid Wu 		.data = (ulong)&rk3066b_pin_ctrl },
383149c55878SDavid Wu 	{ .compatible = "rockchip,rk3128-pinctrl",
383249c55878SDavid Wu 		.data = (ulong)&rk3128_pin_ctrl },
383349c55878SDavid Wu 	{ .compatible = "rockchip,rk3188-pinctrl",
383449c55878SDavid Wu 		.data = (ulong)&rk3188_pin_ctrl },
383549c55878SDavid Wu 	{ .compatible = "rockchip,rk3228-pinctrl",
383649c55878SDavid Wu 		.data = (ulong)&rk3228_pin_ctrl },
383749c55878SDavid Wu 	{ .compatible = "rockchip,rk3288-pinctrl",
383849c55878SDavid Wu 		.data = (ulong)&rk3288_pin_ctrl },
3839b3077611SDavid Wu 	{ .compatible = "rockchip,rk3308-pinctrl",
3840b3077611SDavid Wu 		.data = (ulong)&rk3308_pin_ctrl },
384149c55878SDavid Wu 	{ .compatible = "rockchip,rk3328-pinctrl",
384249c55878SDavid Wu 		.data = (ulong)&rk3328_pin_ctrl },
384349c55878SDavid Wu 	{ .compatible = "rockchip,rk3368-pinctrl",
384449c55878SDavid Wu 		.data = (ulong)&rk3368_pin_ctrl },
384549c55878SDavid Wu 	{ .compatible = "rockchip,rk3399-pinctrl",
384649c55878SDavid Wu 		.data = (ulong)&rk3399_pin_ctrl },
384749c55878SDavid Wu 	{},
384849c55878SDavid Wu };
384949c55878SDavid Wu 
385049c55878SDavid Wu U_BOOT_DRIVER(pinctrl_rockchip) = {
385149c55878SDavid Wu 	.name		= "rockchip_pinctrl",
385249c55878SDavid Wu 	.id		= UCLASS_PINCTRL,
385349c55878SDavid Wu 	.of_match	= rockchip_pinctrl_dt_match,
385449c55878SDavid Wu 	.priv_auto_alloc_size = sizeof(struct rockchip_pinctrl_priv),
385549c55878SDavid Wu 	.ops		= &rockchip_pinctrl_ops,
385649c55878SDavid Wu #if !CONFIG_IS_ENABLED(OF_PLATDATA)
385749c55878SDavid Wu 	.bind		= dm_scan_fdt_dev,
385849c55878SDavid Wu #endif
385949c55878SDavid Wu 	.probe		= rockchip_pinctrl_probe,
386049c55878SDavid Wu };
3861