xref: /rk3399_rockchip-uboot/drivers/pinctrl/pinctrl-rockchip.c (revision cef897f0d41f4e6896ca7ca17195afec38923ac0)
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 
36*cef897f0SJianqun Xu #define RK_GENMASK_VAL(h, l, v) \
37*cef897f0SJianqun Xu 	(GENMASK(((h) + 16), ((l) + 16)) | (((v) << (l)) & GENMASK((h), (l))))
38d499d466SJianqun Xu 
3949c55878SDavid Wu /**
4049c55878SDavid Wu  * Encode variants of iomux registers into a type variable
4149c55878SDavid Wu  */
4249c55878SDavid Wu #define IOMUX_GPIO_ONLY		BIT(0)
4349c55878SDavid Wu #define IOMUX_WIDTH_4BIT	BIT(1)
4449c55878SDavid Wu #define IOMUX_SOURCE_PMU	BIT(2)
4549c55878SDavid Wu #define IOMUX_UNROUTED		BIT(3)
4649c55878SDavid Wu #define IOMUX_WIDTH_3BIT	BIT(4)
47b3077611SDavid Wu #define IOMUX_8WIDTH_2BIT	BIT(5)
484bafc2daSDavid Wu #define IOMUX_WRITABLE_32BIT	BIT(6)
49cf04a17bSJianqun Xu #define IOMUX_L_SOURCE_PMU	BIT(7)
5049c55878SDavid Wu 
5149c55878SDavid Wu /**
5249c55878SDavid Wu  * @type: iomux variant using IOMUX_* constants
5349c55878SDavid Wu  * @offset: if initialized to -1 it will be autocalculated, by specifying
5449c55878SDavid Wu  *	    an initial offset value the relevant source offset can be reset
5549c55878SDavid Wu  *	    to a new value for autocalculating the following iomux registers.
5649c55878SDavid Wu  */
5749c55878SDavid Wu struct rockchip_iomux {
5849c55878SDavid Wu 	int				type;
5949c55878SDavid Wu 	int				offset;
6049c55878SDavid Wu };
6149c55878SDavid Wu 
6255a89bc6SDavid Wu #define DRV_TYPE_IO_MASK		GENMASK(31, 16)
6355a89bc6SDavid Wu #define DRV_TYPE_WRITABLE_32BIT		BIT(31)
6455a89bc6SDavid Wu 
6549c55878SDavid Wu /**
6649c55878SDavid Wu  * enum type index corresponding to rockchip_perpin_drv_list arrays index.
6749c55878SDavid Wu  */
6849c55878SDavid Wu enum rockchip_pin_drv_type {
6949c55878SDavid Wu 	DRV_TYPE_IO_DEFAULT = 0,
7049c55878SDavid Wu 	DRV_TYPE_IO_1V8_OR_3V0,
7149c55878SDavid Wu 	DRV_TYPE_IO_1V8_ONLY,
7249c55878SDavid Wu 	DRV_TYPE_IO_1V8_3V0_AUTO,
7349c55878SDavid Wu 	DRV_TYPE_IO_3V3_ONLY,
7449c55878SDavid Wu 	DRV_TYPE_MAX
7549c55878SDavid Wu };
7649c55878SDavid Wu 
7755a89bc6SDavid Wu #define PULL_TYPE_IO_MASK		GENMASK(31, 16)
7855a89bc6SDavid Wu #define PULL_TYPE_WRITABLE_32BIT	BIT(31)
7955a89bc6SDavid Wu 
8049c55878SDavid Wu /**
8149c55878SDavid Wu  * enum type index corresponding to rockchip_pull_list arrays index.
8249c55878SDavid Wu  */
8349c55878SDavid Wu enum rockchip_pin_pull_type {
8449c55878SDavid Wu 	PULL_TYPE_IO_DEFAULT = 0,
8549c55878SDavid Wu 	PULL_TYPE_IO_1V8_ONLY,
8649c55878SDavid Wu 	PULL_TYPE_MAX
8749c55878SDavid Wu };
8849c55878SDavid Wu 
8949c55878SDavid Wu /**
9049c55878SDavid Wu  * @drv_type: drive strength variant using rockchip_perpin_drv_type
9149c55878SDavid Wu  * @offset: if initialized to -1 it will be autocalculated, by specifying
9249c55878SDavid Wu  *	    an initial offset value the relevant source offset can be reset
9349c55878SDavid Wu  *	    to a new value for autocalculating the following drive strength
9449c55878SDavid Wu  *	    registers. if used chips own cal_drv func instead to calculate
9549c55878SDavid Wu  *	    registers offset, the variant could be ignored.
9649c55878SDavid Wu  */
9749c55878SDavid Wu struct rockchip_drv {
9849c55878SDavid Wu 	enum rockchip_pin_drv_type	drv_type;
9949c55878SDavid Wu 	int				offset;
10049c55878SDavid Wu };
10149c55878SDavid Wu 
10249c55878SDavid Wu /**
10349c55878SDavid Wu  * @priv: common pinctrl private basedata
10449c55878SDavid Wu  * @pin_base: first pin number
10549c55878SDavid Wu  * @nr_pins: number of pins in this bank
10649c55878SDavid Wu  * @name: name of the bank
10749c55878SDavid Wu  * @bank_num: number of the bank, to account for holes
10849c55878SDavid Wu  * @iomux: array describing the 4 iomux sources of the bank
10949c55878SDavid Wu  * @drv: array describing the 4 drive strength sources of the bank
11049c55878SDavid Wu  * @pull_type: array describing the 4 pull type sources of the bank
11149c55878SDavid Wu  * @recalced_mask: bits describing the mux recalced pins of per bank
11249c55878SDavid Wu  * @route_mask: bits describing the routing pins of per bank
11349c55878SDavid Wu  */
11449c55878SDavid Wu struct rockchip_pin_bank {
11549c55878SDavid Wu 	struct rockchip_pinctrl_priv	*priv;
11649c55878SDavid Wu 	u32				pin_base;
11749c55878SDavid Wu 	u8				nr_pins;
11849c55878SDavid Wu 	char				*name;
11949c55878SDavid Wu 	u8				bank_num;
12049c55878SDavid Wu 	struct rockchip_iomux		iomux[4];
12149c55878SDavid Wu 	struct rockchip_drv		drv[4];
12249c55878SDavid Wu 	enum rockchip_pin_pull_type	pull_type[4];
12349c55878SDavid Wu 	u32				recalced_mask;
12449c55878SDavid Wu 	u32				route_mask;
12549c55878SDavid Wu };
12649c55878SDavid Wu 
12749c55878SDavid Wu #define PIN_BANK(id, pins, label)			\
12849c55878SDavid Wu 	{						\
12949c55878SDavid Wu 		.bank_num	= id,			\
13049c55878SDavid Wu 		.nr_pins	= pins,			\
13149c55878SDavid Wu 		.name		= label,		\
13249c55878SDavid Wu 		.iomux		= {			\
13349c55878SDavid Wu 			{ .offset = -1 },		\
13449c55878SDavid Wu 			{ .offset = -1 },		\
13549c55878SDavid Wu 			{ .offset = -1 },		\
13649c55878SDavid Wu 			{ .offset = -1 },		\
13749c55878SDavid Wu 		},					\
13849c55878SDavid Wu 	}
13949c55878SDavid Wu 
14049c55878SDavid Wu #define PIN_BANK_IOMUX_FLAGS(id, pins, label, iom0, iom1, iom2, iom3)	\
14149c55878SDavid Wu 	{								\
14249c55878SDavid Wu 		.bank_num	= id,					\
14349c55878SDavid Wu 		.nr_pins	= pins,					\
14449c55878SDavid Wu 		.name		= label,				\
14549c55878SDavid Wu 		.iomux		= {					\
14649c55878SDavid Wu 			{ .type = iom0, .offset = -1 },			\
14749c55878SDavid Wu 			{ .type = iom1, .offset = -1 },			\
14849c55878SDavid Wu 			{ .type = iom2, .offset = -1 },			\
14949c55878SDavid Wu 			{ .type = iom3, .offset = -1 },			\
15049c55878SDavid Wu 		},							\
15149c55878SDavid Wu 	}
15249c55878SDavid Wu 
153d499d466SJianqun Xu #define PIN_BANK_IOMUX_FLAGS_OFFSET(id, pins, label, iom0, iom1, iom2,	\
154d499d466SJianqun Xu 				    iom3, offset0, offset1, offset2,	\
155d499d466SJianqun Xu 				    offset3)				\
156d499d466SJianqun Xu 	{								\
157d499d466SJianqun Xu 		.bank_num	= id,					\
158d499d466SJianqun Xu 		.nr_pins	= pins,					\
159d499d466SJianqun Xu 		.name		= label,				\
160d499d466SJianqun Xu 		.iomux		= {					\
161d499d466SJianqun Xu 			{ .type = iom0, .offset = offset0 },		\
162d499d466SJianqun Xu 			{ .type = iom1, .offset = offset1 },		\
163d499d466SJianqun Xu 			{ .type = iom2, .offset = offset2 },		\
164d499d466SJianqun Xu 			{ .type = iom3, .offset = offset3 },		\
165d499d466SJianqun Xu 		},							\
166d499d466SJianqun Xu 	}
167d499d466SJianqun Xu 
16849c55878SDavid Wu #define PIN_BANK_DRV_FLAGS(id, pins, label, type0, type1, type2, type3) \
16949c55878SDavid Wu 	{								\
17049c55878SDavid Wu 		.bank_num	= id,					\
17149c55878SDavid Wu 		.nr_pins	= pins,					\
17249c55878SDavid Wu 		.name		= label,				\
17349c55878SDavid Wu 		.iomux		= {					\
17449c55878SDavid Wu 			{ .offset = -1 },				\
17549c55878SDavid Wu 			{ .offset = -1 },				\
17649c55878SDavid Wu 			{ .offset = -1 },				\
17749c55878SDavid Wu 			{ .offset = -1 },				\
17849c55878SDavid Wu 		},							\
17949c55878SDavid Wu 		.drv		= {					\
18049c55878SDavid Wu 			{ .drv_type = type0, .offset = -1 },		\
18149c55878SDavid Wu 			{ .drv_type = type1, .offset = -1 },		\
18249c55878SDavid Wu 			{ .drv_type = type2, .offset = -1 },		\
18349c55878SDavid Wu 			{ .drv_type = type3, .offset = -1 },		\
18449c55878SDavid Wu 		},							\
18549c55878SDavid Wu 	}
18649c55878SDavid Wu 
18749c55878SDavid Wu #define PIN_BANK_DRV_FLAGS_PULL_FLAGS(id, pins, label, drv0, drv1,	\
18849c55878SDavid Wu 				      drv2, drv3, pull0, pull1,		\
18949c55878SDavid Wu 				      pull2, pull3)			\
19049c55878SDavid Wu 	{								\
19149c55878SDavid Wu 		.bank_num	= id,					\
19249c55878SDavid Wu 		.nr_pins	= pins,					\
19349c55878SDavid Wu 		.name		= label,				\
19449c55878SDavid Wu 		.iomux		= {					\
19549c55878SDavid Wu 			{ .offset = -1 },				\
19649c55878SDavid Wu 			{ .offset = -1 },				\
19749c55878SDavid Wu 			{ .offset = -1 },				\
19849c55878SDavid Wu 			{ .offset = -1 },				\
19949c55878SDavid Wu 		},							\
20049c55878SDavid Wu 		.drv		= {					\
20149c55878SDavid Wu 			{ .drv_type = drv0, .offset = -1 },		\
20249c55878SDavid Wu 			{ .drv_type = drv1, .offset = -1 },		\
20349c55878SDavid Wu 			{ .drv_type = drv2, .offset = -1 },		\
20449c55878SDavid Wu 			{ .drv_type = drv3, .offset = -1 },		\
20549c55878SDavid Wu 		},							\
20649c55878SDavid Wu 		.pull_type[0] = pull0,					\
20749c55878SDavid Wu 		.pull_type[1] = pull1,					\
20849c55878SDavid Wu 		.pull_type[2] = pull2,					\
20949c55878SDavid Wu 		.pull_type[3] = pull3,					\
21049c55878SDavid Wu 	}
21149c55878SDavid Wu 
21249c55878SDavid Wu #define PIN_BANK_IOMUX_DRV_FLAGS_OFFSET(id, pins, label, iom0, iom1,	\
21349c55878SDavid Wu 					iom2, iom3, drv0, drv1, drv2,	\
21449c55878SDavid Wu 					drv3, offset0, offset1,		\
21549c55878SDavid Wu 					offset2, offset3)		\
21649c55878SDavid Wu 	{								\
21749c55878SDavid Wu 		.bank_num	= id,					\
21849c55878SDavid Wu 		.nr_pins	= pins,					\
21949c55878SDavid Wu 		.name		= label,				\
22049c55878SDavid Wu 		.iomux		= {					\
22149c55878SDavid Wu 			{ .type = iom0, .offset = -1 },			\
22249c55878SDavid Wu 			{ .type = iom1, .offset = -1 },			\
22349c55878SDavid Wu 			{ .type = iom2, .offset = -1 },			\
22449c55878SDavid Wu 			{ .type = iom3, .offset = -1 },			\
22549c55878SDavid Wu 		},							\
22649c55878SDavid Wu 		.drv		= {					\
22749c55878SDavid Wu 			{ .drv_type = drv0, .offset = offset0 },	\
22849c55878SDavid Wu 			{ .drv_type = drv1, .offset = offset1 },	\
22949c55878SDavid Wu 			{ .drv_type = drv2, .offset = offset2 },	\
23049c55878SDavid Wu 			{ .drv_type = drv3, .offset = offset3 },	\
23149c55878SDavid Wu 		},							\
23249c55878SDavid Wu 	}
23349c55878SDavid Wu 
23455a89bc6SDavid Wu #define PIN_BANK_IOMUX_DRV_PULL_FLAGS(id, pins, label, iom0, iom1,	\
23555a89bc6SDavid Wu 				      iom2, iom3, drv0, drv1, drv2,	\
23655a89bc6SDavid Wu 				      drv3, pull0, pull1, pull2,	\
23755a89bc6SDavid Wu 				      pull3)				\
23855a89bc6SDavid Wu 	{								\
23955a89bc6SDavid Wu 		.bank_num	= id,					\
24055a89bc6SDavid Wu 		.nr_pins	= pins,					\
24155a89bc6SDavid Wu 		.name		= label,				\
24255a89bc6SDavid Wu 		.iomux		= {					\
24355a89bc6SDavid Wu 			{ .type = iom0, .offset = -1 },			\
24455a89bc6SDavid Wu 			{ .type = iom1, .offset = -1 },			\
24555a89bc6SDavid Wu 			{ .type = iom2, .offset = -1 },			\
24655a89bc6SDavid Wu 			{ .type = iom3, .offset = -1 },			\
24755a89bc6SDavid Wu 		},							\
24855a89bc6SDavid Wu 		.drv		= {					\
24955a89bc6SDavid Wu 			{ .drv_type = drv0, .offset = -1 },		\
25055a89bc6SDavid Wu 			{ .drv_type = drv1, .offset = -1 },		\
25155a89bc6SDavid Wu 			{ .drv_type = drv2, .offset = -1 },		\
25255a89bc6SDavid Wu 			{ .drv_type = drv3, .offset = -1 },		\
25355a89bc6SDavid Wu 		},							\
25455a89bc6SDavid Wu 		.pull_type[0] = pull0,					\
25555a89bc6SDavid Wu 		.pull_type[1] = pull1,					\
25655a89bc6SDavid Wu 		.pull_type[2] = pull2,					\
25755a89bc6SDavid Wu 		.pull_type[3] = pull3,					\
25855a89bc6SDavid Wu 	}
25955a89bc6SDavid Wu 
26049c55878SDavid Wu #define PIN_BANK_IOMUX_FLAGS_DRV_FLAGS_OFFSET_PULL_FLAGS(id, pins,	\
26149c55878SDavid Wu 					      label, iom0, iom1, iom2,  \
26249c55878SDavid Wu 					      iom3, drv0, drv1, drv2,   \
26349c55878SDavid Wu 					      drv3, offset0, offset1,   \
26449c55878SDavid Wu 					      offset2, offset3, pull0,  \
26549c55878SDavid Wu 					      pull1, pull2, pull3)	\
26649c55878SDavid Wu 	{								\
26749c55878SDavid Wu 		.bank_num	= id,					\
26849c55878SDavid Wu 		.nr_pins	= pins,					\
26949c55878SDavid Wu 		.name		= label,				\
27049c55878SDavid Wu 		.iomux		= {					\
27149c55878SDavid Wu 			{ .type = iom0, .offset = -1 },			\
27249c55878SDavid Wu 			{ .type = iom1, .offset = -1 },			\
27349c55878SDavid Wu 			{ .type = iom2, .offset = -1 },			\
27449c55878SDavid Wu 			{ .type = iom3, .offset = -1 },			\
27549c55878SDavid Wu 		},							\
27649c55878SDavid Wu 		.drv		= {					\
27749c55878SDavid Wu 			{ .drv_type = drv0, .offset = offset0 },	\
27849c55878SDavid Wu 			{ .drv_type = drv1, .offset = offset1 },	\
27949c55878SDavid Wu 			{ .drv_type = drv2, .offset = offset2 },	\
28049c55878SDavid Wu 			{ .drv_type = drv3, .offset = offset3 },	\
28149c55878SDavid Wu 		},							\
28249c55878SDavid Wu 		.pull_type[0] = pull0,					\
28349c55878SDavid Wu 		.pull_type[1] = pull1,					\
28449c55878SDavid Wu 		.pull_type[2] = pull2,					\
28549c55878SDavid Wu 		.pull_type[3] = pull3,					\
28649c55878SDavid Wu 	}
28749c55878SDavid Wu 
288d499d466SJianqun Xu #define PIN_BANK_MUX_ROUTE_FLAGS(ID, PIN, FUNC, REG, VAL)	\
289d499d466SJianqun Xu 	{								\
290d499d466SJianqun Xu 		.bank_num	= ID,					\
291d499d466SJianqun Xu 		.pin		= PIN,					\
292d499d466SJianqun Xu 		.func		= FUNC,				\
293d499d466SJianqun Xu 		.route_offset	= REG,				\
294d499d466SJianqun Xu 		.route_val	= VAL,				\
295d499d466SJianqun Xu 	}
296d499d466SJianqun Xu 
29749c55878SDavid Wu /**
29849c55878SDavid Wu  * struct rockchip_mux_recalced_data: represent a pin iomux data.
29949c55878SDavid Wu  * @num: bank number.
30049c55878SDavid Wu  * @pin: pin number.
30149c55878SDavid Wu  * @bit: index at register.
30249c55878SDavid Wu  * @reg: register offset.
30349c55878SDavid Wu  * @mask: mask bit
30449c55878SDavid Wu  */
30549c55878SDavid Wu struct rockchip_mux_recalced_data {
30649c55878SDavid Wu 	u8 num;
30749c55878SDavid Wu 	u8 pin;
30849c55878SDavid Wu 	u32 reg;
30949c55878SDavid Wu 	u8 bit;
31049c55878SDavid Wu 	u8 mask;
31149c55878SDavid Wu };
31249c55878SDavid Wu 
31349c55878SDavid Wu /**
31449c55878SDavid Wu  * struct rockchip_mux_recalced_data: represent a pin iomux data.
31549c55878SDavid Wu  * @bank_num: bank number.
31649c55878SDavid Wu  * @pin: index at register or used to calc index.
31749c55878SDavid Wu  * @func: the min pin.
31849c55878SDavid Wu  * @route_offset: the max pin.
31949c55878SDavid Wu  * @route_val: the register offset.
32049c55878SDavid Wu  */
32149c55878SDavid Wu struct rockchip_mux_route_data {
32249c55878SDavid Wu 	u8 bank_num;
32349c55878SDavid Wu 	u8 pin;
32449c55878SDavid Wu 	u8 func;
32549c55878SDavid Wu 	u32 route_offset;
32649c55878SDavid Wu 	u32 route_val;
32749c55878SDavid Wu };
32849c55878SDavid Wu 
32949c55878SDavid Wu /**
33049c55878SDavid Wu  */
33149c55878SDavid Wu struct rockchip_pin_ctrl {
33249c55878SDavid Wu 	struct rockchip_pin_bank	*pin_banks;
33349c55878SDavid Wu 	u32				nr_banks;
33449c55878SDavid Wu 	u32				nr_pins;
33549c55878SDavid Wu 	char				*label;
33649c55878SDavid Wu 	enum rockchip_pinctrl_type	type;
33749c55878SDavid Wu 	int				grf_mux_offset;
33849c55878SDavid Wu 	int				pmu_mux_offset;
33949c55878SDavid Wu 	int				grf_drv_offset;
34049c55878SDavid Wu 	int				pmu_drv_offset;
34149c55878SDavid Wu 	struct rockchip_mux_recalced_data *iomux_recalced;
34249c55878SDavid Wu 	u32				niomux_recalced;
34349c55878SDavid Wu 	struct rockchip_mux_route_data *iomux_routes;
34449c55878SDavid Wu 	u32				niomux_routes;
34549c55878SDavid Wu 
346d5517017SDavid Wu 	int	(*ctrl_data_re_init)(struct rockchip_pin_ctrl *ctrl);
347d5517017SDavid Wu 
348d5517017SDavid Wu 	int	(*soc_data_init)(struct rockchip_pinctrl_priv *info);
349d5517017SDavid Wu 
35049c55878SDavid Wu 	void	(*pull_calc_reg)(struct rockchip_pin_bank *bank,
35149c55878SDavid Wu 				 int pin_num, struct regmap **regmap,
35249c55878SDavid Wu 				 int *reg, u8 *bit);
35349c55878SDavid Wu 	void	(*drv_calc_reg)(struct rockchip_pin_bank *bank,
35449c55878SDavid Wu 				int pin_num, struct regmap **regmap,
35549c55878SDavid Wu 				int *reg, u8 *bit);
35649c55878SDavid Wu 	int	(*schmitt_calc_reg)(struct rockchip_pin_bank *bank,
35749c55878SDavid Wu 				    int pin_num, struct regmap **regmap,
35849c55878SDavid Wu 				    int *reg, u8 *bit);
35932c25d1fSDavid Wu 	int	(*slew_rate_calc_reg)(struct rockchip_pin_bank *bank,
36032c25d1fSDavid Wu 				      int pin_num, struct regmap **regmap,
36132c25d1fSDavid Wu 				      int *reg, u8 *bit);
36249c55878SDavid Wu };
36349c55878SDavid Wu 
36449c55878SDavid Wu /**
36549c55878SDavid Wu  */
36649c55878SDavid Wu struct rockchip_pinctrl_priv {
36749c55878SDavid Wu 	struct rockchip_pin_ctrl	*ctrl;
36849c55878SDavid Wu 	struct regmap			*regmap_base;
36949c55878SDavid Wu 	struct regmap			*regmap_pmu;
37049c55878SDavid Wu 
37149c55878SDavid Wu };
37249c55878SDavid Wu 
37349c55878SDavid Wu static int rockchip_verify_config(struct udevice *dev, u32 bank, u32 pin)
37449c55878SDavid Wu {
37549c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = dev_get_priv(dev);
37649c55878SDavid Wu 	struct rockchip_pin_ctrl *ctrl = priv->ctrl;
37749c55878SDavid Wu 
37849c55878SDavid Wu 	if (bank >= ctrl->nr_banks) {
37949c55878SDavid Wu 		debug("pin conf bank %d >= nbanks %d\n", bank, ctrl->nr_banks);
38049c55878SDavid Wu 		return -EINVAL;
38149c55878SDavid Wu 	}
38249c55878SDavid Wu 
38349c55878SDavid Wu 	if (pin >= MAX_ROCKCHIP_GPIO_PER_BANK) {
38449c55878SDavid Wu 		debug("pin conf pin %d >= %d\n", pin,
38549c55878SDavid Wu 		      MAX_ROCKCHIP_GPIO_PER_BANK);
38649c55878SDavid Wu 		return -EINVAL;
38749c55878SDavid Wu 	}
38849c55878SDavid Wu 
38949c55878SDavid Wu 	return 0;
39049c55878SDavid Wu }
39149c55878SDavid Wu 
39249c55878SDavid Wu static struct rockchip_mux_recalced_data rv1108_mux_recalced_data[] = {
39349c55878SDavid Wu 	{
39449c55878SDavid Wu 		.num = 1,
39549c55878SDavid Wu 		.pin = 0,
39649c55878SDavid Wu 		.reg = 0x418,
39749c55878SDavid Wu 		.bit = 0,
39849c55878SDavid Wu 		.mask = 0x3
39949c55878SDavid Wu 	}, {
40049c55878SDavid Wu 		.num = 1,
40149c55878SDavid Wu 		.pin = 1,
40249c55878SDavid Wu 		.reg = 0x418,
40349c55878SDavid Wu 		.bit = 2,
40449c55878SDavid Wu 		.mask = 0x3
40549c55878SDavid Wu 	}, {
40649c55878SDavid Wu 		.num = 1,
40749c55878SDavid Wu 		.pin = 2,
40849c55878SDavid Wu 		.reg = 0x418,
40949c55878SDavid Wu 		.bit = 4,
41049c55878SDavid Wu 		.mask = 0x3
41149c55878SDavid Wu 	}, {
41249c55878SDavid Wu 		.num = 1,
41349c55878SDavid Wu 		.pin = 3,
41449c55878SDavid Wu 		.reg = 0x418,
41549c55878SDavid Wu 		.bit = 6,
41649c55878SDavid Wu 		.mask = 0x3
41749c55878SDavid Wu 	}, {
41849c55878SDavid Wu 		.num = 1,
41949c55878SDavid Wu 		.pin = 4,
42049c55878SDavid Wu 		.reg = 0x418,
42149c55878SDavid Wu 		.bit = 8,
42249c55878SDavid Wu 		.mask = 0x3
42349c55878SDavid Wu 	}, {
42449c55878SDavid Wu 		.num = 1,
42549c55878SDavid Wu 		.pin = 5,
42649c55878SDavid Wu 		.reg = 0x418,
42749c55878SDavid Wu 		.bit = 10,
42849c55878SDavid Wu 		.mask = 0x3
42949c55878SDavid Wu 	}, {
43049c55878SDavid Wu 		.num = 1,
43149c55878SDavid Wu 		.pin = 6,
43249c55878SDavid Wu 		.reg = 0x418,
43349c55878SDavid Wu 		.bit = 12,
43449c55878SDavid Wu 		.mask = 0x3
43549c55878SDavid Wu 	}, {
43649c55878SDavid Wu 		.num = 1,
43749c55878SDavid Wu 		.pin = 7,
43849c55878SDavid Wu 		.reg = 0x418,
43949c55878SDavid Wu 		.bit = 14,
44049c55878SDavid Wu 		.mask = 0x3
44149c55878SDavid Wu 	}, {
44249c55878SDavid Wu 		.num = 1,
44349c55878SDavid Wu 		.pin = 8,
44449c55878SDavid Wu 		.reg = 0x41c,
44549c55878SDavid Wu 		.bit = 0,
44649c55878SDavid Wu 		.mask = 0x3
44749c55878SDavid Wu 	}, {
44849c55878SDavid Wu 		.num = 1,
44949c55878SDavid Wu 		.pin = 9,
45049c55878SDavid Wu 		.reg = 0x41c,
45149c55878SDavid Wu 		.bit = 2,
45249c55878SDavid Wu 		.mask = 0x3
45349c55878SDavid Wu 	},
45449c55878SDavid Wu };
45549c55878SDavid Wu 
456cf04a17bSJianqun Xu static struct rockchip_mux_recalced_data rv1126_mux_recalced_data[] = {
457cf04a17bSJianqun Xu 	{
458cf04a17bSJianqun Xu 		.num = 0,
459cf04a17bSJianqun Xu 		.pin = 20,
460cf04a17bSJianqun Xu 		.reg = 0x10000,
461cf04a17bSJianqun Xu 		.bit = 0,
462cf04a17bSJianqun Xu 		.mask = 0xf
463cf04a17bSJianqun Xu 	},
464cf04a17bSJianqun Xu 	{
465cf04a17bSJianqun Xu 		.num = 0,
466cf04a17bSJianqun Xu 		.pin = 21,
467cf04a17bSJianqun Xu 		.reg = 0x10000,
468cf04a17bSJianqun Xu 		.bit = 4,
469cf04a17bSJianqun Xu 		.mask = 0xf
470cf04a17bSJianqun Xu 	},
471cf04a17bSJianqun Xu 	{
472cf04a17bSJianqun Xu 		.num = 0,
473cf04a17bSJianqun Xu 		.pin = 22,
474cf04a17bSJianqun Xu 		.reg = 0x10000,
475cf04a17bSJianqun Xu 		.bit = 8,
476cf04a17bSJianqun Xu 		.mask = 0xf
477cf04a17bSJianqun Xu 	},
478cf04a17bSJianqun Xu 	{
479cf04a17bSJianqun Xu 		.num = 0,
480cf04a17bSJianqun Xu 		.pin = 23,
481cf04a17bSJianqun Xu 		.reg = 0x10000,
482cf04a17bSJianqun Xu 		.bit = 12,
483cf04a17bSJianqun Xu 		.mask = 0xf
484cf04a17bSJianqun Xu 	},
485cf04a17bSJianqun Xu };
486cf04a17bSJianqun Xu 
48749c55878SDavid Wu static  struct rockchip_mux_recalced_data rk3128_mux_recalced_data[] = {
48849c55878SDavid Wu 	{
48949c55878SDavid Wu 		.num = 2,
49049c55878SDavid Wu 		.pin = 20,
49149c55878SDavid Wu 		.reg = 0xe8,
49249c55878SDavid Wu 		.bit = 0,
49349c55878SDavid Wu 		.mask = 0x7
49449c55878SDavid Wu 	}, {
49549c55878SDavid Wu 		.num = 2,
49649c55878SDavid Wu 		.pin = 21,
49749c55878SDavid Wu 		.reg = 0xe8,
49849c55878SDavid Wu 		.bit = 4,
49949c55878SDavid Wu 		.mask = 0x7
50049c55878SDavid Wu 	}, {
50149c55878SDavid Wu 		.num = 2,
50249c55878SDavid Wu 		.pin = 22,
50349c55878SDavid Wu 		.reg = 0xe8,
50449c55878SDavid Wu 		.bit = 8,
50549c55878SDavid Wu 		.mask = 0x7
50649c55878SDavid Wu 	}, {
50749c55878SDavid Wu 		.num = 2,
50849c55878SDavid Wu 		.pin = 23,
50949c55878SDavid Wu 		.reg = 0xe8,
51049c55878SDavid Wu 		.bit = 12,
51149c55878SDavid Wu 		.mask = 0x7
51249c55878SDavid Wu 	}, {
51349c55878SDavid Wu 		.num = 2,
51449c55878SDavid Wu 		.pin = 24,
51549c55878SDavid Wu 		.reg = 0xd4,
51649c55878SDavid Wu 		.bit = 12,
51749c55878SDavid Wu 		.mask = 0x7
51849c55878SDavid Wu 	},
51949c55878SDavid Wu };
52049c55878SDavid Wu 
521b3077611SDavid Wu static struct rockchip_mux_recalced_data rk3308_mux_recalced_data[] = {
522b3077611SDavid Wu 	{
523b3077611SDavid Wu 		.num = 1,
524b3077611SDavid Wu 		.pin = 14,
525b3077611SDavid Wu 		.reg = 0x28,
526b3077611SDavid Wu 		.bit = 12,
527b3077611SDavid Wu 		.mask = 0x7
528b3077611SDavid Wu 	}, {
529b3077611SDavid Wu 		.num = 1,
530b3077611SDavid Wu 		.pin = 15,
531b3077611SDavid Wu 		.reg = 0x2c,
532b3077611SDavid Wu 		.bit = 0,
533b3077611SDavid Wu 		.mask = 0x3
534b3077611SDavid Wu 	}, {
535b3077611SDavid Wu 		.num = 1,
536b3077611SDavid Wu 		.pin = 18,
537b3077611SDavid Wu 		.reg = 0x30,
538b3077611SDavid Wu 		.bit = 4,
539b3077611SDavid Wu 		.mask = 0x7
540b3077611SDavid Wu 	}, {
541b3077611SDavid Wu 		.num = 1,
542b3077611SDavid Wu 		.pin = 19,
543b3077611SDavid Wu 		.reg = 0x30,
544b3077611SDavid Wu 		.bit = 8,
545b3077611SDavid Wu 		.mask = 0x7
546b3077611SDavid Wu 	}, {
547b3077611SDavid Wu 		.num = 1,
548b3077611SDavid Wu 		.pin = 20,
549b3077611SDavid Wu 		.reg = 0x30,
550b3077611SDavid Wu 		.bit = 12,
551b3077611SDavid Wu 		.mask = 0x7
552b3077611SDavid Wu 	}, {
553b3077611SDavid Wu 		.num = 1,
554b3077611SDavid Wu 		.pin = 21,
555b3077611SDavid Wu 		.reg = 0x34,
556b3077611SDavid Wu 		.bit = 0,
557b3077611SDavid Wu 		.mask = 0x7
558b3077611SDavid Wu 	}, {
559b3077611SDavid Wu 		.num = 1,
560b3077611SDavid Wu 		.pin = 22,
561b3077611SDavid Wu 		.reg = 0x34,
562b3077611SDavid Wu 		.bit = 4,
563b3077611SDavid Wu 		.mask = 0x7
564b3077611SDavid Wu 	}, {
565b3077611SDavid Wu 		.num = 1,
566b3077611SDavid Wu 		.pin = 23,
567b3077611SDavid Wu 		.reg = 0x34,
568b3077611SDavid Wu 		.bit = 8,
569b3077611SDavid Wu 		.mask = 0x7
570b3077611SDavid Wu 	}, {
571b3077611SDavid Wu 		.num = 3,
572b3077611SDavid Wu 		.pin = 12,
573b3077611SDavid Wu 		.reg = 0x68,
574b3077611SDavid Wu 		.bit = 8,
575b3077611SDavid Wu 		.mask = 0x7
576b3077611SDavid Wu 	}, {
577b3077611SDavid Wu 		.num = 3,
578b3077611SDavid Wu 		.pin = 13,
579b3077611SDavid Wu 		.reg = 0x68,
580b3077611SDavid Wu 		.bit = 12,
581b3077611SDavid Wu 		.mask = 0x7
582b3077611SDavid Wu 	},
583b3077611SDavid Wu };
584b3077611SDavid Wu 
585d5517017SDavid Wu static struct rockchip_mux_recalced_data rk3308b_mux_recalced_data[] = {
586d5517017SDavid Wu 	{
587d5517017SDavid Wu 		.num = 1,
588d5517017SDavid Wu 		.pin = 14,
589d5517017SDavid Wu 		.reg = 0x28,
590d5517017SDavid Wu 		.bit = 12,
591d5517017SDavid Wu 		.mask = 0xf
592d5517017SDavid Wu 	}, {
593d5517017SDavid Wu 		.num = 1,
594d5517017SDavid Wu 		.pin = 15,
595d5517017SDavid Wu 		.reg = 0x2c,
596d5517017SDavid Wu 		.bit = 0,
597d5517017SDavid Wu 		.mask = 0x3
598d5517017SDavid Wu 	}, {
599d5517017SDavid Wu 		.num = 1,
600d5517017SDavid Wu 		.pin = 18,
601d5517017SDavid Wu 		.reg = 0x30,
602d5517017SDavid Wu 		.bit = 4,
603d5517017SDavid Wu 		.mask = 0xf
604d5517017SDavid Wu 	}, {
605d5517017SDavid Wu 		.num = 1,
606d5517017SDavid Wu 		.pin = 19,
607d5517017SDavid Wu 		.reg = 0x30,
608d5517017SDavid Wu 		.bit = 8,
609d5517017SDavid Wu 		.mask = 0xf
610d5517017SDavid Wu 	}, {
611d5517017SDavid Wu 		.num = 1,
612d5517017SDavid Wu 		.pin = 20,
613d5517017SDavid Wu 		.reg = 0x30,
614d5517017SDavid Wu 		.bit = 12,
615d5517017SDavid Wu 		.mask = 0xf
616d5517017SDavid Wu 	}, {
617d5517017SDavid Wu 		.num = 1,
618d5517017SDavid Wu 		.pin = 21,
619d5517017SDavid Wu 		.reg = 0x34,
620d5517017SDavid Wu 		.bit = 0,
621d5517017SDavid Wu 		.mask = 0xf
622d5517017SDavid Wu 	}, {
623d5517017SDavid Wu 		.num = 1,
624d5517017SDavid Wu 		.pin = 22,
625d5517017SDavid Wu 		.reg = 0x34,
626d5517017SDavid Wu 		.bit = 4,
627d5517017SDavid Wu 		.mask = 0xf
628d5517017SDavid Wu 	}, {
629d5517017SDavid Wu 		.num = 1,
630d5517017SDavid Wu 		.pin = 23,
631d5517017SDavid Wu 		.reg = 0x34,
632d5517017SDavid Wu 		.bit = 8,
633d5517017SDavid Wu 		.mask = 0xf
634d5517017SDavid Wu 	}, {
635d5517017SDavid Wu 		.num = 3,
636752032c9SDavid.Wu 		.pin = 12,
637752032c9SDavid.Wu 		.reg = 0x68,
638752032c9SDavid.Wu 		.bit = 8,
639752032c9SDavid.Wu 		.mask = 0xf
640752032c9SDavid.Wu 	}, {
641752032c9SDavid.Wu 		.num = 3,
642d5517017SDavid Wu 		.pin = 13,
643d5517017SDavid Wu 		.reg = 0x68,
644d5517017SDavid Wu 		.bit = 12,
645d5517017SDavid Wu 		.mask = 0xf
646d5517017SDavid Wu 	}, {
647d5517017SDavid Wu 		.num = 2,
648d5517017SDavid Wu 		.pin = 2,
649d5517017SDavid Wu 		.reg = 0x608,
650d5517017SDavid Wu 		.bit = 0,
651d5517017SDavid Wu 		.mask = 0x7
652d5517017SDavid Wu 	}, {
653d5517017SDavid Wu 		.num = 2,
654d5517017SDavid Wu 		.pin = 3,
655d5517017SDavid Wu 		.reg = 0x608,
656d5517017SDavid Wu 		.bit = 4,
657d5517017SDavid Wu 		.mask = 0x7
658d5517017SDavid Wu 	}, {
659d5517017SDavid Wu 		.num = 2,
660d5517017SDavid Wu 		.pin = 16,
661d5517017SDavid Wu 		.reg = 0x610,
662d5517017SDavid Wu 		.bit = 8,
663d5517017SDavid Wu 		.mask = 0x7
664d5517017SDavid Wu 	}, {
665d5517017SDavid Wu 		.num = 3,
666d5517017SDavid Wu 		.pin = 10,
667d5517017SDavid Wu 		.reg = 0x610,
668d5517017SDavid Wu 		.bit = 0,
669d5517017SDavid Wu 		.mask = 0x7
670d5517017SDavid Wu 	}, {
671d5517017SDavid Wu 		.num = 3,
672d5517017SDavid Wu 		.pin = 11,
673d5517017SDavid Wu 		.reg = 0x610,
674d5517017SDavid Wu 		.bit = 4,
675d5517017SDavid Wu 		.mask = 0x7
676d5517017SDavid Wu 	},
677d5517017SDavid Wu };
678d5517017SDavid Wu 
67949c55878SDavid Wu static struct rockchip_mux_recalced_data rk3328_mux_recalced_data[] = {
68049c55878SDavid Wu 	{
68149c55878SDavid Wu 		.num = 2,
68249c55878SDavid Wu 		.pin = 12,
68349c55878SDavid Wu 		.reg = 0x24,
68449c55878SDavid Wu 		.bit = 8,
68549c55878SDavid Wu 		.mask = 0x3
68649c55878SDavid Wu 	}, {
68749c55878SDavid Wu 		.num = 2,
68849c55878SDavid Wu 		.pin = 15,
68949c55878SDavid Wu 		.reg = 0x28,
69049c55878SDavid Wu 		.bit = 0,
69149c55878SDavid Wu 		.mask = 0x7
69249c55878SDavid Wu 	}, {
69349c55878SDavid Wu 		.num = 2,
69449c55878SDavid Wu 		.pin = 23,
69549c55878SDavid Wu 		.reg = 0x30,
69649c55878SDavid Wu 		.bit = 14,
69749c55878SDavid Wu 		.mask = 0x3
69849c55878SDavid Wu 	},
69949c55878SDavid Wu };
70049c55878SDavid Wu 
701d499d466SJianqun Xu static struct rockchip_mux_route_data rv1126_mux_route_data[] = {
702d499d466SJianqun Xu 	PIN_BANK_MUX_ROUTE_FLAGS(RK_GPIO3, RK_PD2, RK_FUNC_1, 0x10260, RK_GENMASK_VAL(0, 0, 0)), /* I2S0_MCLK_M0 */
703d499d466SJianqun Xu 	PIN_BANK_MUX_ROUTE_FLAGS(RK_GPIO3, RK_PB0, RK_FUNC_3, 0x10260, RK_GENMASK_VAL(0, 0, 1)), /* I2S0_MCLK_M1 */
704d499d466SJianqun Xu 
705d499d466SJianqun Xu 	PIN_BANK_MUX_ROUTE_FLAGS(RK_GPIO0, RK_PD4, RK_FUNC_4, 0x10260, RK_GENMASK_VAL(2, 3, 0)), /* I2S1_MCLK_M0 */
706d499d466SJianqun Xu 	PIN_BANK_MUX_ROUTE_FLAGS(RK_GPIO1, RK_PD5, RK_FUNC_2, 0x10260, RK_GENMASK_VAL(2, 3, 1)), /* I2S1_MCLK_M1 */
707d499d466SJianqun Xu 	PIN_BANK_MUX_ROUTE_FLAGS(RK_GPIO2, RK_PC7, RK_FUNC_6, 0x10260, RK_GENMASK_VAL(2, 3, 2)), /* I2S1_MCLK_M2 */
708d499d466SJianqun Xu 
709d499d466SJianqun Xu 	PIN_BANK_MUX_ROUTE_FLAGS(RK_GPIO1, RK_PD0, RK_FUNC_1, 0x10260, RK_GENMASK_VAL(4, 4, 0)), /* I2S2_MCLK_M0 */
710d499d466SJianqun Xu 	PIN_BANK_MUX_ROUTE_FLAGS(RK_GPIO2, RK_PB3, RK_FUNC_2, 0x10260, RK_GENMASK_VAL(4, 4, 1)), /* I2S2_MCLK_M1 */
711d499d466SJianqun Xu 
712d499d466SJianqun Xu 	PIN_BANK_MUX_ROUTE_FLAGS(RK_GPIO3, RK_PD4, RK_FUNC_2, 0x10260, RK_GENMASK_VAL(12, 12, 0)), /* PDM_CLK0_M0 */
713d499d466SJianqun Xu 	PIN_BANK_MUX_ROUTE_FLAGS(RK_GPIO3, RK_PC0, RK_FUNC_3, 0x10260, RK_GENMASK_VAL(12, 12, 1)), /* PDM_CLK0_M1 */
714d499d466SJianqun Xu 
715d499d466SJianqun Xu 	PIN_BANK_MUX_ROUTE_FLAGS(RK_GPIO3, RK_PC6, RK_FUNC_1, 0x10264, RK_GENMASK_VAL(0, 0, 0)), /* CIF_CLKOUT_M0 */
716d499d466SJianqun Xu 	PIN_BANK_MUX_ROUTE_FLAGS(RK_GPIO2, RK_PD1, RK_FUNC_3, 0x10264, RK_GENMASK_VAL(0, 0, 1)), /* CIF_CLKOUT_M1 */
717d499d466SJianqun Xu 
718d499d466SJianqun Xu 	PIN_BANK_MUX_ROUTE_FLAGS(RK_GPIO3, RK_PA4, RK_FUNC_5, 0x10264, RK_GENMASK_VAL(4, 5, 0)), /* I2C3_SCL_M0 */
719d499d466SJianqun Xu 	PIN_BANK_MUX_ROUTE_FLAGS(RK_GPIO2, RK_PD4, RK_FUNC_7, 0x10264, RK_GENMASK_VAL(4, 5, 1)), /* I2C3_SCL_M1 */
720d499d466SJianqun Xu 	PIN_BANK_MUX_ROUTE_FLAGS(RK_GPIO1, RK_PD6, RK_FUNC_3, 0x10264, RK_GENMASK_VAL(4, 5, 2)), /* I2C3_SCL_M2 */
721d499d466SJianqun Xu 
722d499d466SJianqun Xu 	PIN_BANK_MUX_ROUTE_FLAGS(RK_GPIO3, RK_PA0, RK_FUNC_7, 0x10264, RK_GENMASK_VAL(6, 6, 0)), /* I2C4_SCL_M0 */
723d499d466SJianqun Xu 	PIN_BANK_MUX_ROUTE_FLAGS(RK_GPIO4, RK_PA0, RK_FUNC_4, 0x10264, RK_GENMASK_VAL(6, 6, 1)), /* I2C4_SCL_M1 */
724d499d466SJianqun Xu 
725d499d466SJianqun Xu 	PIN_BANK_MUX_ROUTE_FLAGS(RK_GPIO2, RK_PA5, RK_FUNC_7, 0x10264, RK_GENMASK_VAL(8, 9, 0)), /* I2C5_SCL_M0 */
726d499d466SJianqun Xu 	PIN_BANK_MUX_ROUTE_FLAGS(RK_GPIO3, RK_PB0, RK_FUNC_5, 0x10264, RK_GENMASK_VAL(8, 9, 1)), /* I2C5_SCL_M1 */
727d499d466SJianqun Xu 	PIN_BANK_MUX_ROUTE_FLAGS(RK_GPIO1, RK_PD0, RK_FUNC_4, 0x10264, RK_GENMASK_VAL(8, 9, 2)), /* I2C5_SCL_M2 */
728d499d466SJianqun Xu 
729d499d466SJianqun Xu 	PIN_BANK_MUX_ROUTE_FLAGS(RK_GPIO3, RK_PC0, RK_FUNC_5, 0x10264, RK_GENMASK_VAL(10, 11, 0)), /* SPI1_CLK_M0 */
730d499d466SJianqun Xu 	PIN_BANK_MUX_ROUTE_FLAGS(RK_GPIO1, RK_PC6, RK_FUNC_3, 0x10264, RK_GENMASK_VAL(10, 11, 1)), /* SPI1_CLK_M1 */
731d499d466SJianqun Xu 	PIN_BANK_MUX_ROUTE_FLAGS(RK_GPIO2, RK_PD5, RK_FUNC_6, 0x10264, RK_GENMASK_VAL(10, 11, 2)), /* SPI1_CLK_M2 */
732d499d466SJianqun Xu 
733d499d466SJianqun Xu 	PIN_BANK_MUX_ROUTE_FLAGS(RK_GPIO3, RK_PC0, RK_FUNC_2, 0x10264, RK_GENMASK_VAL(12, 12, 0)), /* RGMII_CLK_M0 */
734d499d466SJianqun Xu 	PIN_BANK_MUX_ROUTE_FLAGS(RK_GPIO2, RK_PB7, RK_FUNC_2, 0x10264, RK_GENMASK_VAL(12, 12, 1)), /* RGMII_CLK_M1 */
735d499d466SJianqun Xu 
736d499d466SJianqun Xu 	PIN_BANK_MUX_ROUTE_FLAGS(RK_GPIO3, RK_PA1, RK_FUNC_3, 0x10264, RK_GENMASK_VAL(13, 13, 0)), /* CAN_TXD_M0 */
737d499d466SJianqun Xu 	PIN_BANK_MUX_ROUTE_FLAGS(RK_GPIO3, RK_PA7, RK_FUNC_5, 0x10264, RK_GENMASK_VAL(13, 13, 1)), /* CAN_TXD_M1 */
738d499d466SJianqun Xu 
739d499d466SJianqun Xu 	PIN_BANK_MUX_ROUTE_FLAGS(RK_GPIO3, RK_PA4, RK_FUNC_6, 0x10268, RK_GENMASK_VAL(0, 0, 0)), /* PWM8_M0 */
740d499d466SJianqun Xu 	PIN_BANK_MUX_ROUTE_FLAGS(RK_GPIO2, RK_PD7, RK_FUNC_5, 0x10268, RK_GENMASK_VAL(0, 0, 1)), /* PWM8_M1 */
741d499d466SJianqun Xu 
742d499d466SJianqun Xu 	PIN_BANK_MUX_ROUTE_FLAGS(RK_GPIO3, RK_PA5, RK_FUNC_6, 0x10268, RK_GENMASK_VAL(2, 2, 0)), /* PWM9_M0 */
743d499d466SJianqun Xu 	PIN_BANK_MUX_ROUTE_FLAGS(RK_GPIO2, RK_PD6, RK_FUNC_5, 0x10268, RK_GENMASK_VAL(2, 2, 1)), /* PWM9_M1 */
744d499d466SJianqun Xu 
745d499d466SJianqun Xu 	PIN_BANK_MUX_ROUTE_FLAGS(RK_GPIO3, RK_PA6, RK_FUNC_6, 0x10268, RK_GENMASK_VAL(4, 4, 0)), /* PWM10_M0 */
746d499d466SJianqun Xu 	PIN_BANK_MUX_ROUTE_FLAGS(RK_GPIO2, RK_PD5, RK_FUNC_5, 0x10268, RK_GENMASK_VAL(4, 4, 1)), /* PWM10_M1 */
747d499d466SJianqun Xu 
748d499d466SJianqun Xu 	PIN_BANK_MUX_ROUTE_FLAGS(RK_GPIO3, RK_PA7, RK_FUNC_6, 0x10268, RK_GENMASK_VAL(6, 6, 0)), /* PWM11_IR_M0 */
749d499d466SJianqun Xu 	PIN_BANK_MUX_ROUTE_FLAGS(RK_GPIO3, RK_PA1, RK_FUNC_5, 0x10268, RK_GENMASK_VAL(6, 6, 1)), /* PWM11_IR_M1 */
750d499d466SJianqun Xu 
751d499d466SJianqun Xu 	PIN_BANK_MUX_ROUTE_FLAGS(RK_GPIO1, RK_PA5, RK_FUNC_3, 0x10268, RK_GENMASK_VAL(8, 8, 0)), /* UART2_TX_M0 */
752d499d466SJianqun Xu 	PIN_BANK_MUX_ROUTE_FLAGS(RK_GPIO3, RK_PA2, RK_FUNC_1, 0x10268, RK_GENMASK_VAL(8, 8, 1)), /* UART2_TX_M1 */
753d499d466SJianqun Xu 
754d499d466SJianqun Xu 	PIN_BANK_MUX_ROUTE_FLAGS(RK_GPIO3, RK_PC6, RK_FUNC_3, 0x10268, RK_GENMASK_VAL(10, 11, 0)), /* UART3_TX_M0 */
755d499d466SJianqun Xu 	PIN_BANK_MUX_ROUTE_FLAGS(RK_GPIO1, RK_PA7, RK_FUNC_2, 0x10268, RK_GENMASK_VAL(10, 11, 1)), /* UART3_TX_M1 */
756d499d466SJianqun Xu 	PIN_BANK_MUX_ROUTE_FLAGS(RK_GPIO3, RK_PA0, RK_FUNC_4, 0x10268, RK_GENMASK_VAL(10, 11, 2)), /* UART3_TX_M2 */
757d499d466SJianqun Xu 
758d499d466SJianqun Xu 	PIN_BANK_MUX_ROUTE_FLAGS(RK_GPIO3, RK_PA4, RK_FUNC_4, 0x10268, RK_GENMASK_VAL(12, 13, 0)), /* UART4_TX_M0 */
759d499d466SJianqun Xu 	PIN_BANK_MUX_ROUTE_FLAGS(RK_GPIO2, RK_PA6, RK_FUNC_4, 0x10268, RK_GENMASK_VAL(12, 13, 1)), /* UART4_TX_M1 */
760d499d466SJianqun Xu 	PIN_BANK_MUX_ROUTE_FLAGS(RK_GPIO1, RK_PD5, RK_FUNC_3, 0x10268, RK_GENMASK_VAL(12, 13, 2)), /* UART4_TX_M2 */
761d499d466SJianqun Xu 
762d499d466SJianqun Xu 	PIN_BANK_MUX_ROUTE_FLAGS(RK_GPIO3, RK_PA6, RK_FUNC_4, 0x10268, RK_GENMASK_VAL(14, 15, 0)), /* UART5_TX_M0 */
763d499d466SJianqun Xu 	PIN_BANK_MUX_ROUTE_FLAGS(RK_GPIO2, RK_PB0, RK_FUNC_4, 0x10268, RK_GENMASK_VAL(14, 15, 1)), /* UART5_TX_M1 */
764d499d466SJianqun Xu 	PIN_BANK_MUX_ROUTE_FLAGS(RK_GPIO2, RK_PA0, RK_FUNC_3, 0x10268, RK_GENMASK_VAL(14, 15, 2)), /* UART5_TX_M2 */
765d499d466SJianqun Xu };
766d499d466SJianqun Xu 
76749c55878SDavid Wu static void rockchip_get_recalced_mux(struct rockchip_pin_bank *bank, int pin,
76849c55878SDavid Wu 				      int *reg, u8 *bit, int *mask)
76949c55878SDavid Wu {
77049c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
77149c55878SDavid Wu 	struct rockchip_pin_ctrl *ctrl = priv->ctrl;
77249c55878SDavid Wu 	struct rockchip_mux_recalced_data *data;
77349c55878SDavid Wu 	int i;
77449c55878SDavid Wu 
77549c55878SDavid Wu 	for (i = 0; i < ctrl->niomux_recalced; i++) {
77649c55878SDavid Wu 		data = &ctrl->iomux_recalced[i];
77749c55878SDavid Wu 		if (data->num == bank->bank_num &&
77849c55878SDavid Wu 		    data->pin == pin)
77949c55878SDavid Wu 			break;
78049c55878SDavid Wu 	}
78149c55878SDavid Wu 
78249c55878SDavid Wu 	if (i >= ctrl->niomux_recalced)
78349c55878SDavid Wu 		return;
78449c55878SDavid Wu 
78549c55878SDavid Wu 	*reg = data->reg;
78649c55878SDavid Wu 	*mask = data->mask;
78749c55878SDavid Wu 	*bit = data->bit;
78849c55878SDavid Wu }
78949c55878SDavid Wu 
79049c55878SDavid Wu static struct rockchip_mux_route_data px30_mux_route_data[] = {
79149c55878SDavid Wu 	{
79249c55878SDavid Wu 		/* cif-d2m0 */
79349c55878SDavid Wu 		.bank_num = 2,
79449c55878SDavid Wu 		.pin = 0,
79549c55878SDavid Wu 		.func = 1,
79649c55878SDavid Wu 		.route_offset = 0x184,
79749c55878SDavid Wu 		.route_val = BIT(16 + 7),
79849c55878SDavid Wu 	}, {
79949c55878SDavid Wu 		/* cif-d2m1 */
80049c55878SDavid Wu 		.bank_num = 3,
80149c55878SDavid Wu 		.pin = 3,
80249c55878SDavid Wu 		.func = 3,
80349c55878SDavid Wu 		.route_offset = 0x184,
80449c55878SDavid Wu 		.route_val = BIT(16 + 7) | BIT(7),
80549c55878SDavid Wu 	}, {
80649c55878SDavid Wu 		/* pdm-m0 */
80749c55878SDavid Wu 		.bank_num = 3,
80849c55878SDavid Wu 		.pin = 22,
80949c55878SDavid Wu 		.func = 2,
81049c55878SDavid Wu 		.route_offset = 0x184,
81149c55878SDavid Wu 		.route_val = BIT(16 + 8),
81249c55878SDavid Wu 	}, {
81349c55878SDavid Wu 		/* pdm-m1 */
81449c55878SDavid Wu 		.bank_num = 2,
81549c55878SDavid Wu 		.pin = 22,
81649c55878SDavid Wu 		.func = 1,
81749c55878SDavid Wu 		.route_offset = 0x184,
81849c55878SDavid Wu 		.route_val = BIT(16 + 8) | BIT(8),
81949c55878SDavid Wu 	}, {
82049c55878SDavid Wu 		/* uart2-rxm0 */
82149c55878SDavid Wu 		.bank_num = 1,
822793770dfSDavid Wu 		.pin = 27,
82349c55878SDavid Wu 		.func = 2,
82449c55878SDavid Wu 		.route_offset = 0x184,
825793770dfSDavid Wu 		.route_val = BIT(16 + 10),
82649c55878SDavid Wu 	}, {
82749c55878SDavid Wu 		/* uart2-rxm1 */
82849c55878SDavid Wu 		.bank_num = 2,
82949c55878SDavid Wu 		.pin = 14,
83049c55878SDavid Wu 		.func = 2,
83149c55878SDavid Wu 		.route_offset = 0x184,
832793770dfSDavid Wu 		.route_val = BIT(16 + 10) | BIT(10),
83349c55878SDavid Wu 	}, {
83449c55878SDavid Wu 		/* uart3-rxm0 */
83549c55878SDavid Wu 		.bank_num = 0,
83649c55878SDavid Wu 		.pin = 17,
83749c55878SDavid Wu 		.func = 2,
83849c55878SDavid Wu 		.route_offset = 0x184,
839793770dfSDavid Wu 		.route_val = BIT(16 + 9),
84049c55878SDavid Wu 	}, {
84149c55878SDavid Wu 		/* uart3-rxm1 */
84249c55878SDavid Wu 		.bank_num = 1,
843793770dfSDavid Wu 		.pin = 15,
84449c55878SDavid Wu 		.func = 2,
84549c55878SDavid Wu 		.route_offset = 0x184,
846793770dfSDavid Wu 		.route_val = BIT(16 + 9) | BIT(9),
84749c55878SDavid Wu 	},
84849c55878SDavid Wu };
84949c55878SDavid Wu 
850a2a3fc8fSJianqun Xu static struct rockchip_mux_route_data rk1808_mux_route_data[] = {
851a2a3fc8fSJianqun Xu 	{
852a2a3fc8fSJianqun Xu 		/* i2c2m0_sda */
853a2a3fc8fSJianqun Xu 		.bank_num = 3,
854a2a3fc8fSJianqun Xu 		.pin = 12,
855a2a3fc8fSJianqun Xu 		.func = 2,
856a2a3fc8fSJianqun Xu 		.route_offset = 0x190,
857a2a3fc8fSJianqun Xu 		.route_val = BIT(16 + 3),
858a2a3fc8fSJianqun Xu 	}, {
859a2a3fc8fSJianqun Xu 		/* i2c2m1_sda */
860a2a3fc8fSJianqun Xu 		.bank_num = 1,
861a2a3fc8fSJianqun Xu 		.pin = 13,
862a2a3fc8fSJianqun Xu 		.func = 2,
863a2a3fc8fSJianqun Xu 		.route_offset = 0x190,
864a2a3fc8fSJianqun Xu 		.route_val = BIT(16 + 3) | BIT(3),
865a2a3fc8fSJianqun Xu 	}, {
866a2a3fc8fSJianqun Xu 		/* uart2_rxm0 */
867a2a3fc8fSJianqun Xu 		.bank_num = 4,
868a2a3fc8fSJianqun Xu 		.pin = 3,
869a2a3fc8fSJianqun Xu 		.func = 2,
870a2a3fc8fSJianqun Xu 		.route_offset = 0x190,
871a2a3fc8fSJianqun Xu 		.route_val = BIT(16 + 14) | BIT(16 + 15),
872a2a3fc8fSJianqun Xu 	}, {
873a2a3fc8fSJianqun Xu 		/* uart2_rxm1 */
874a2a3fc8fSJianqun Xu 		.bank_num = 2,
875a2a3fc8fSJianqun Xu 		.pin = 25,
876a2a3fc8fSJianqun Xu 		.func = 2,
877a2a3fc8fSJianqun Xu 		.route_offset = 0x190,
878a2a3fc8fSJianqun Xu 		.route_val = BIT(16 + 14) | BIT(14) | BIT(16 + 15),
879a2a3fc8fSJianqun Xu 	}, {
880a2a3fc8fSJianqun Xu 		/* uart2_rxm2 */
881a2a3fc8fSJianqun Xu 		.bank_num = 3,
882a2a3fc8fSJianqun Xu 		.pin = 4,
883a2a3fc8fSJianqun Xu 		.func = 2,
884a2a3fc8fSJianqun Xu 		.route_offset = 0x190,
885a2a3fc8fSJianqun Xu 		.route_val = BIT(16 + 14) | BIT(16 + 15) | BIT(15),
886a2a3fc8fSJianqun Xu 	},
887a2a3fc8fSJianqun Xu };
888a2a3fc8fSJianqun Xu 
88949c55878SDavid Wu static struct rockchip_mux_route_data rk3128_mux_route_data[] = {
89049c55878SDavid Wu 	{
89149c55878SDavid Wu 		/* spi-0 */
89249c55878SDavid Wu 		.bank_num = 1,
89349c55878SDavid Wu 		.pin = 10,
89449c55878SDavid Wu 		.func = 1,
89549c55878SDavid Wu 		.route_offset = 0x144,
89649c55878SDavid Wu 		.route_val = BIT(16 + 3) | BIT(16 + 4),
89749c55878SDavid Wu 	}, {
89849c55878SDavid Wu 		/* spi-1 */
89949c55878SDavid Wu 		.bank_num = 1,
90049c55878SDavid Wu 		.pin = 27,
90149c55878SDavid Wu 		.func = 3,
90249c55878SDavid Wu 		.route_offset = 0x144,
90349c55878SDavid Wu 		.route_val = BIT(16 + 3) | BIT(16 + 4) | BIT(3),
90449c55878SDavid Wu 	}, {
90549c55878SDavid Wu 		/* spi-2 */
90649c55878SDavid Wu 		.bank_num = 0,
90749c55878SDavid Wu 		.pin = 13,
90849c55878SDavid Wu 		.func = 2,
90949c55878SDavid Wu 		.route_offset = 0x144,
91049c55878SDavid Wu 		.route_val = BIT(16 + 3) | BIT(16 + 4) | BIT(4),
91149c55878SDavid Wu 	}, {
91249c55878SDavid Wu 		/* i2s-0 */
91349c55878SDavid Wu 		.bank_num = 1,
91449c55878SDavid Wu 		.pin = 5,
91549c55878SDavid Wu 		.func = 1,
91649c55878SDavid Wu 		.route_offset = 0x144,
91749c55878SDavid Wu 		.route_val = BIT(16 + 5),
91849c55878SDavid Wu 	}, {
91949c55878SDavid Wu 		/* i2s-1 */
92049c55878SDavid Wu 		.bank_num = 0,
92149c55878SDavid Wu 		.pin = 14,
92249c55878SDavid Wu 		.func = 1,
92349c55878SDavid Wu 		.route_offset = 0x144,
92449c55878SDavid Wu 		.route_val = BIT(16 + 5) | BIT(5),
92549c55878SDavid Wu 	}, {
92649c55878SDavid Wu 		/* emmc-0 */
92749c55878SDavid Wu 		.bank_num = 1,
92849c55878SDavid Wu 		.pin = 22,
92949c55878SDavid Wu 		.func = 2,
93049c55878SDavid Wu 		.route_offset = 0x144,
93149c55878SDavid Wu 		.route_val = BIT(16 + 6),
93249c55878SDavid Wu 	}, {
93349c55878SDavid Wu 		/* emmc-1 */
93449c55878SDavid Wu 		.bank_num = 2,
93549c55878SDavid Wu 		.pin = 4,
93649c55878SDavid Wu 		.func = 2,
93749c55878SDavid Wu 		.route_offset = 0x144,
93849c55878SDavid Wu 		.route_val = BIT(16 + 6) | BIT(6),
93949c55878SDavid Wu 	},
94049c55878SDavid Wu };
94149c55878SDavid Wu 
94249c55878SDavid Wu static struct rockchip_mux_route_data rk3228_mux_route_data[] = {
94349c55878SDavid Wu 	{
94449c55878SDavid Wu 		/* pwm0-0 */
94549c55878SDavid Wu 		.bank_num = 0,
94649c55878SDavid Wu 		.pin = 26,
94749c55878SDavid Wu 		.func = 1,
94849c55878SDavid Wu 		.route_offset = 0x50,
94949c55878SDavid Wu 		.route_val = BIT(16),
95049c55878SDavid Wu 	}, {
95149c55878SDavid Wu 		/* pwm0-1 */
95249c55878SDavid Wu 		.bank_num = 3,
95349c55878SDavid Wu 		.pin = 21,
95449c55878SDavid Wu 		.func = 1,
95549c55878SDavid Wu 		.route_offset = 0x50,
95649c55878SDavid Wu 		.route_val = BIT(16) | BIT(0),
95749c55878SDavid Wu 	}, {
95849c55878SDavid Wu 		/* pwm1-0 */
95949c55878SDavid Wu 		.bank_num = 0,
96049c55878SDavid Wu 		.pin = 27,
96149c55878SDavid Wu 		.func = 1,
96249c55878SDavid Wu 		.route_offset = 0x50,
96349c55878SDavid Wu 		.route_val = BIT(16 + 1),
96449c55878SDavid Wu 	}, {
96549c55878SDavid Wu 		/* pwm1-1 */
96649c55878SDavid Wu 		.bank_num = 0,
96749c55878SDavid Wu 		.pin = 30,
96849c55878SDavid Wu 		.func = 2,
96949c55878SDavid Wu 		.route_offset = 0x50,
97049c55878SDavid Wu 		.route_val = BIT(16 + 1) | BIT(1),
97149c55878SDavid Wu 	}, {
97249c55878SDavid Wu 		/* pwm2-0 */
97349c55878SDavid Wu 		.bank_num = 0,
97449c55878SDavid Wu 		.pin = 28,
97549c55878SDavid Wu 		.func = 1,
97649c55878SDavid Wu 		.route_offset = 0x50,
97749c55878SDavid Wu 		.route_val = BIT(16 + 2),
97849c55878SDavid Wu 	}, {
97949c55878SDavid Wu 		/* pwm2-1 */
98049c55878SDavid Wu 		.bank_num = 1,
98149c55878SDavid Wu 		.pin = 12,
98249c55878SDavid Wu 		.func = 2,
98349c55878SDavid Wu 		.route_offset = 0x50,
98449c55878SDavid Wu 		.route_val = BIT(16 + 2) | BIT(2),
98549c55878SDavid Wu 	}, {
98649c55878SDavid Wu 		/* pwm3-0 */
98749c55878SDavid Wu 		.bank_num = 3,
98849c55878SDavid Wu 		.pin = 26,
98949c55878SDavid Wu 		.func = 1,
99049c55878SDavid Wu 		.route_offset = 0x50,
99149c55878SDavid Wu 		.route_val = BIT(16 + 3),
99249c55878SDavid Wu 	}, {
99349c55878SDavid Wu 		/* pwm3-1 */
99449c55878SDavid Wu 		.bank_num = 1,
99549c55878SDavid Wu 		.pin = 11,
99649c55878SDavid Wu 		.func = 2,
99749c55878SDavid Wu 		.route_offset = 0x50,
99849c55878SDavid Wu 		.route_val = BIT(16 + 3) | BIT(3),
99949c55878SDavid Wu 	}, {
100049c55878SDavid Wu 		/* sdio-0_d0 */
100149c55878SDavid Wu 		.bank_num = 1,
100249c55878SDavid Wu 		.pin = 1,
100349c55878SDavid Wu 		.func = 1,
100449c55878SDavid Wu 		.route_offset = 0x50,
100549c55878SDavid Wu 		.route_val = BIT(16 + 4),
100649c55878SDavid Wu 	}, {
100749c55878SDavid Wu 		/* sdio-1_d0 */
100849c55878SDavid Wu 		.bank_num = 3,
100949c55878SDavid Wu 		.pin = 2,
101049c55878SDavid Wu 		.func = 1,
101149c55878SDavid Wu 		.route_offset = 0x50,
101249c55878SDavid Wu 		.route_val = BIT(16 + 4) | BIT(4),
101349c55878SDavid Wu 	}, {
101449c55878SDavid Wu 		/* spi-0_rx */
101549c55878SDavid Wu 		.bank_num = 0,
101649c55878SDavid Wu 		.pin = 13,
101749c55878SDavid Wu 		.func = 2,
101849c55878SDavid Wu 		.route_offset = 0x50,
101949c55878SDavid Wu 		.route_val = BIT(16 + 5),
102049c55878SDavid Wu 	}, {
102149c55878SDavid Wu 		/* spi-1_rx */
102249c55878SDavid Wu 		.bank_num = 2,
102349c55878SDavid Wu 		.pin = 0,
102449c55878SDavid Wu 		.func = 2,
102549c55878SDavid Wu 		.route_offset = 0x50,
102649c55878SDavid Wu 		.route_val = BIT(16 + 5) | BIT(5),
102749c55878SDavid Wu 	}, {
102849c55878SDavid Wu 		/* emmc-0_cmd */
102949c55878SDavid Wu 		.bank_num = 1,
103049c55878SDavid Wu 		.pin = 22,
103149c55878SDavid Wu 		.func = 2,
103249c55878SDavid Wu 		.route_offset = 0x50,
103349c55878SDavid Wu 		.route_val = BIT(16 + 7),
103449c55878SDavid Wu 	}, {
103549c55878SDavid Wu 		/* emmc-1_cmd */
103649c55878SDavid Wu 		.bank_num = 2,
103749c55878SDavid Wu 		.pin = 4,
103849c55878SDavid Wu 		.func = 2,
103949c55878SDavid Wu 		.route_offset = 0x50,
104049c55878SDavid Wu 		.route_val = BIT(16 + 7) | BIT(7),
104149c55878SDavid Wu 	}, {
104249c55878SDavid Wu 		/* uart2-0_rx */
104349c55878SDavid Wu 		.bank_num = 1,
104449c55878SDavid Wu 		.pin = 19,
104549c55878SDavid Wu 		.func = 2,
104649c55878SDavid Wu 		.route_offset = 0x50,
104749c55878SDavid Wu 		.route_val = BIT(16 + 8),
104849c55878SDavid Wu 	}, {
104949c55878SDavid Wu 		/* uart2-1_rx */
105049c55878SDavid Wu 		.bank_num = 1,
105149c55878SDavid Wu 		.pin = 10,
105249c55878SDavid Wu 		.func = 2,
105349c55878SDavid Wu 		.route_offset = 0x50,
105449c55878SDavid Wu 		.route_val = BIT(16 + 8) | BIT(8),
105549c55878SDavid Wu 	}, {
105649c55878SDavid Wu 		/* uart1-0_rx */
105749c55878SDavid Wu 		.bank_num = 1,
105849c55878SDavid Wu 		.pin = 10,
105949c55878SDavid Wu 		.func = 1,
106049c55878SDavid Wu 		.route_offset = 0x50,
106149c55878SDavid Wu 		.route_val = BIT(16 + 11),
106249c55878SDavid Wu 	}, {
106349c55878SDavid Wu 		/* uart1-1_rx */
106449c55878SDavid Wu 		.bank_num = 3,
106549c55878SDavid Wu 		.pin = 13,
106649c55878SDavid Wu 		.func = 1,
106749c55878SDavid Wu 		.route_offset = 0x50,
106849c55878SDavid Wu 		.route_val = BIT(16 + 11) | BIT(11),
106949c55878SDavid Wu 	},
107049c55878SDavid Wu };
107149c55878SDavid Wu 
107249c55878SDavid Wu static struct rockchip_mux_route_data rk3288_mux_route_data[] = {
107349c55878SDavid Wu 	{
107449c55878SDavid Wu 		/* edphdmi_cecinoutt1 */
107549c55878SDavid Wu 		.bank_num = 7,
107649c55878SDavid Wu 		.pin = 16,
107749c55878SDavid Wu 		.func = 2,
107849c55878SDavid Wu 		.route_offset = 0x264,
107949c55878SDavid Wu 		.route_val = BIT(16 + 12) | BIT(12),
108049c55878SDavid Wu 	}, {
108149c55878SDavid Wu 		/* edphdmi_cecinout */
108249c55878SDavid Wu 		.bank_num = 7,
108349c55878SDavid Wu 		.pin = 23,
108449c55878SDavid Wu 		.func = 4,
108549c55878SDavid Wu 		.route_offset = 0x264,
108649c55878SDavid Wu 		.route_val = BIT(16 + 12),
108749c55878SDavid Wu 	},
108849c55878SDavid Wu };
108949c55878SDavid Wu 
1090b3077611SDavid Wu static struct rockchip_mux_route_data rk3308_mux_route_data[] = {
1091b3077611SDavid Wu 	{
1092d5517017SDavid Wu 		/* rtc_clk */
1093d5517017SDavid Wu 		.bank_num = 0,
1094d5517017SDavid Wu 		.pin = 19,
1095d5517017SDavid Wu 		.func = 1,
1096d5517017SDavid Wu 		.route_offset = 0x314,
1097d5517017SDavid Wu 		.route_val = BIT(16 + 0) | BIT(0),
1098d5517017SDavid Wu 	}, {
1099b3077611SDavid Wu 		/* uart2_rxm0 */
1100b3077611SDavid Wu 		.bank_num = 1,
1101b3077611SDavid Wu 		.pin = 22,
1102b3077611SDavid Wu 		.func = 2,
1103b3077611SDavid Wu 		.route_offset = 0x314,
1104b3077611SDavid Wu 		.route_val = BIT(16 + 2) | BIT(16 + 3),
1105b3077611SDavid Wu 	}, {
1106b3077611SDavid Wu 		/* uart2_rxm1 */
1107b3077611SDavid Wu 		.bank_num = 4,
1108b3077611SDavid Wu 		.pin = 26,
1109b3077611SDavid Wu 		.func = 2,
1110b3077611SDavid Wu 		.route_offset = 0x314,
1111b3077611SDavid Wu 		.route_val = BIT(16 + 2) | BIT(16 + 3) | BIT(2),
1112b3077611SDavid Wu 	}, {
1113b3077611SDavid Wu 		/* i2c3_sdam0 */
1114b3077611SDavid Wu 		.bank_num = 0,
1115b3077611SDavid Wu 		.pin = 23,
1116b3077611SDavid Wu 		.func = 2,
1117b3077611SDavid Wu 		.route_offset = 0x314,
1118b3077611SDavid Wu 		.route_val = BIT(16 + 4),
1119b3077611SDavid Wu 	}, {
1120b3077611SDavid Wu 		/* i2c3_sdam1 */
1121b3077611SDavid Wu 		.bank_num = 3,
1122b3077611SDavid Wu 		.pin = 12,
1123b3077611SDavid Wu 		.func = 2,
1124b3077611SDavid Wu 		.route_offset = 0x314,
1125b3077611SDavid Wu 		.route_val = BIT(16 + 4) | BIT(4),
1126d5517017SDavid Wu 	}, {
1127d5517017SDavid Wu 		/* i2s-8ch-1-sclktxm0 */
1128d5517017SDavid Wu 		.bank_num = 1,
1129d5517017SDavid Wu 		.pin = 3,
1130d5517017SDavid Wu 		.func = 2,
1131d5517017SDavid Wu 		.route_offset = 0x308,
1132d5517017SDavid Wu 		.route_val = BIT(16 + 3),
1133d5517017SDavid Wu 	}, {
1134d5517017SDavid Wu 		/* i2s-8ch-1-sclkrxm0 */
1135d5517017SDavid Wu 		.bank_num = 1,
1136d5517017SDavid Wu 		.pin = 4,
1137d5517017SDavid Wu 		.func = 2,
1138d5517017SDavid Wu 		.route_offset = 0x308,
1139d5517017SDavid Wu 		.route_val = BIT(16 + 3),
1140d5517017SDavid Wu 	}, {
1141d5517017SDavid Wu 		/* i2s-8ch-1-sclktxm1 */
1142d5517017SDavid Wu 		.bank_num = 1,
1143d5517017SDavid Wu 		.pin = 13,
1144d5517017SDavid Wu 		.func = 2,
1145d5517017SDavid Wu 		.route_offset = 0x308,
1146d5517017SDavid Wu 		.route_val = BIT(16 + 3) | BIT(3),
1147d5517017SDavid Wu 	}, {
1148d5517017SDavid Wu 		/* i2s-8ch-1-sclkrxm1 */
1149d5517017SDavid Wu 		.bank_num = 1,
1150d5517017SDavid Wu 		.pin = 14,
1151d5517017SDavid Wu 		.func = 2,
1152d5517017SDavid Wu 		.route_offset = 0x308,
1153d5517017SDavid Wu 		.route_val = BIT(16 + 3) | BIT(3),
1154d5517017SDavid Wu 	}, {
1155d5517017SDavid Wu 		/* pdm-clkm0 */
1156d5517017SDavid Wu 		.bank_num = 1,
1157d5517017SDavid Wu 		.pin = 4,
1158d5517017SDavid Wu 		.func = 3,
1159d5517017SDavid Wu 		.route_offset = 0x308,
1160d5517017SDavid Wu 		.route_val = BIT(16 + 12) | BIT(16 + 13),
1161d5517017SDavid Wu 	}, {
1162d5517017SDavid Wu 		/* pdm-clkm1 */
1163d5517017SDavid Wu 		.bank_num = 1,
1164d5517017SDavid Wu 		.pin = 14,
1165d5517017SDavid Wu 		.func = 4,
1166d5517017SDavid Wu 		.route_offset = 0x308,
1167d5517017SDavid Wu 		.route_val = BIT(16 + 12) | BIT(16 + 13) | BIT(12),
1168d5517017SDavid Wu 	}, {
1169d5517017SDavid Wu 		/* pdm-clkm2 */
1170d5517017SDavid Wu 		.bank_num = 2,
1171d5517017SDavid Wu 		.pin = 6,
1172d5517017SDavid Wu 		.func = 2,
1173d5517017SDavid Wu 		.route_offset = 0x308,
1174d5517017SDavid Wu 		.route_val = BIT(16 + 12) | BIT(16 + 13) | BIT(13),
1175d5517017SDavid Wu 	}, {
1176d5517017SDavid Wu 		/* pdm-clkm-m2 */
1177d5517017SDavid Wu 		.bank_num = 2,
1178d5517017SDavid Wu 		.pin = 4,
1179d5517017SDavid Wu 		.func = 3,
1180d5517017SDavid Wu 		.route_offset = 0x600,
1181d5517017SDavid Wu 		.route_val = BIT(16 + 2) | BIT(2),
1182d5517017SDavid Wu 	},
1183d5517017SDavid Wu };
1184d5517017SDavid Wu 
1185d5517017SDavid Wu static struct rockchip_mux_route_data rk3308b_mux_route_data[] = {
1186d5517017SDavid Wu 	{
1187d5517017SDavid Wu 		/* rtc_clk */
1188d5517017SDavid Wu 		.bank_num = 0,
1189d5517017SDavid Wu 		.pin = 19,
1190d5517017SDavid Wu 		.func = 1,
1191d5517017SDavid Wu 		.route_offset = 0x314,
1192d5517017SDavid Wu 		.route_val = BIT(16 + 0) | BIT(0),
1193d5517017SDavid Wu 	}, {
1194d5517017SDavid Wu 		/* uart2_rxm0 */
1195d5517017SDavid Wu 		.bank_num = 1,
1196d5517017SDavid Wu 		.pin = 22,
1197d5517017SDavid Wu 		.func = 2,
1198d5517017SDavid Wu 		.route_offset = 0x314,
1199d5517017SDavid Wu 		.route_val = BIT(16 + 2) | BIT(16 + 3),
1200d5517017SDavid Wu 	}, {
1201d5517017SDavid Wu 		/* uart2_rxm1 */
1202d5517017SDavid Wu 		.bank_num = 4,
1203d5517017SDavid Wu 		.pin = 26,
1204d5517017SDavid Wu 		.func = 2,
1205d5517017SDavid Wu 		.route_offset = 0x314,
1206d5517017SDavid Wu 		.route_val = BIT(16 + 2) | BIT(16 + 3) | BIT(2),
1207d5517017SDavid Wu 	}, {
1208d5517017SDavid Wu 		/* i2c3_sdam0 */
1209d5517017SDavid Wu 		.bank_num = 0,
1210d5517017SDavid Wu 		.pin = 15,
1211d5517017SDavid Wu 		.func = 2,
1212d5517017SDavid Wu 		.route_offset = 0x608,
1213d5517017SDavid Wu 		.route_val = BIT(16 + 8) | BIT(16 + 9),
1214d5517017SDavid Wu 	}, {
1215d5517017SDavid Wu 		/* i2c3_sdam1 */
1216d5517017SDavid Wu 		.bank_num = 3,
1217d5517017SDavid Wu 		.pin = 12,
1218d5517017SDavid Wu 		.func = 2,
1219d5517017SDavid Wu 		.route_offset = 0x608,
1220d5517017SDavid Wu 		.route_val = BIT(16 + 8) | BIT(16 + 9) | BIT(8),
1221d5517017SDavid Wu 	}, {
1222d5517017SDavid Wu 		/* i2c3_sdam2 */
1223d5517017SDavid Wu 		.bank_num = 2,
1224d5517017SDavid Wu 		.pin = 0,
1225d5517017SDavid Wu 		.func = 3,
1226d5517017SDavid Wu 		.route_offset = 0x608,
1227d5517017SDavid Wu 		.route_val = BIT(16 + 8) | BIT(16 + 9) | BIT(9),
1228d5517017SDavid Wu 	}, {
1229d5517017SDavid Wu 		/* i2s-8ch-1-sclktxm0 */
1230d5517017SDavid Wu 		.bank_num = 1,
1231d5517017SDavid Wu 		.pin = 3,
1232d5517017SDavid Wu 		.func = 2,
1233d5517017SDavid Wu 		.route_offset = 0x308,
1234d5517017SDavid Wu 		.route_val = BIT(16 + 3),
1235d5517017SDavid Wu 	}, {
1236d5517017SDavid Wu 		/* i2s-8ch-1-sclkrxm0 */
1237d5517017SDavid Wu 		.bank_num = 1,
1238d5517017SDavid Wu 		.pin = 4,
1239d5517017SDavid Wu 		.func = 2,
1240d5517017SDavid Wu 		.route_offset = 0x308,
1241d5517017SDavid Wu 		.route_val = BIT(16 + 3),
1242d5517017SDavid Wu 	}, {
1243d5517017SDavid Wu 		/* i2s-8ch-1-sclktxm1 */
1244d5517017SDavid Wu 		.bank_num = 1,
1245d5517017SDavid Wu 		.pin = 13,
1246d5517017SDavid Wu 		.func = 2,
1247d5517017SDavid Wu 		.route_offset = 0x308,
1248d5517017SDavid Wu 		.route_val = BIT(16 + 3) | BIT(3),
1249d5517017SDavid Wu 	}, {
1250d5517017SDavid Wu 		/* i2s-8ch-1-sclkrxm1 */
1251d5517017SDavid Wu 		.bank_num = 1,
1252d5517017SDavid Wu 		.pin = 14,
1253d5517017SDavid Wu 		.func = 2,
1254d5517017SDavid Wu 		.route_offset = 0x308,
1255d5517017SDavid Wu 		.route_val = BIT(16 + 3) | BIT(3),
1256d5517017SDavid Wu 	}, {
1257d5517017SDavid Wu 		/* pdm-clkm0 */
1258d5517017SDavid Wu 		.bank_num = 1,
1259d5517017SDavid Wu 		.pin = 4,
1260d5517017SDavid Wu 		.func = 3,
1261d5517017SDavid Wu 		.route_offset = 0x308,
1262d5517017SDavid Wu 		.route_val =  BIT(16 + 12) | BIT(16 + 13),
1263d5517017SDavid Wu 	}, {
1264d5517017SDavid Wu 		/* pdm-clkm1 */
1265d5517017SDavid Wu 		.bank_num = 1,
1266d5517017SDavid Wu 		.pin = 14,
1267d5517017SDavid Wu 		.func = 4,
1268d5517017SDavid Wu 		.route_offset = 0x308,
1269d5517017SDavid Wu 		.route_val = BIT(16 + 12) | BIT(16 + 13) | BIT(12),
1270d5517017SDavid Wu 	}, {
1271d5517017SDavid Wu 		/* pdm-clkm2 */
1272d5517017SDavid Wu 		.bank_num = 2,
1273d5517017SDavid Wu 		.pin = 6,
1274d5517017SDavid Wu 		.func = 2,
1275d5517017SDavid Wu 		.route_offset = 0x308,
1276d5517017SDavid Wu 		.route_val = BIT(16 + 12) | BIT(16 + 13) | BIT(13),
1277d5517017SDavid Wu 	}, {
1278d5517017SDavid Wu 		/* pdm-clkm-m2 */
1279d5517017SDavid Wu 		.bank_num = 2,
1280d5517017SDavid Wu 		.pin = 4,
1281d5517017SDavid Wu 		.func = 3,
1282d5517017SDavid Wu 		.route_offset = 0x600,
1283d5517017SDavid Wu 		.route_val = BIT(16 + 2) | BIT(2),
1284d5517017SDavid Wu 	}, {
1285d5517017SDavid Wu 		/* spi1_miso */
1286d5517017SDavid Wu 		.bank_num = 3,
1287d5517017SDavid Wu 		.pin = 10,
1288d5517017SDavid Wu 		.func = 3,
1289d5517017SDavid Wu 		.route_offset = 0x314,
1290d5517017SDavid Wu 		.route_val = BIT(16 + 9),
1291d5517017SDavid Wu 	}, {
1292d5517017SDavid Wu 		/* spi1_miso_m1 */
1293d5517017SDavid Wu 		.bank_num = 2,
1294d5517017SDavid Wu 		.pin = 4,
1295d5517017SDavid Wu 		.func = 2,
1296d5517017SDavid Wu 		.route_offset = 0x314,
1297d5517017SDavid Wu 		.route_val = BIT(16 + 9) | BIT(9),
1298d5517017SDavid Wu 	}, {
1299d5517017SDavid Wu 		/* owire_m0 */
1300d5517017SDavid Wu 		.bank_num = 0,
1301d5517017SDavid Wu 		.pin = 11,
1302d5517017SDavid Wu 		.func = 3,
1303d5517017SDavid Wu 		.route_offset = 0x314,
1304d5517017SDavid Wu 		.route_val = BIT(16 + 10) | BIT(16 + 11),
1305d5517017SDavid Wu 	}, {
1306d5517017SDavid Wu 		/* owire_m1 */
1307d5517017SDavid Wu 		.bank_num = 1,
1308d5517017SDavid Wu 		.pin = 22,
1309d5517017SDavid Wu 		.func = 7,
1310d5517017SDavid Wu 		.route_offset = 0x314,
1311d5517017SDavid Wu 		.route_val = BIT(16 + 10) | BIT(16 + 11) | BIT(10),
1312d5517017SDavid Wu 	}, {
1313d5517017SDavid Wu 		/* owire_m2 */
1314d5517017SDavid Wu 		.bank_num = 2,
1315d5517017SDavid Wu 		.pin = 2,
1316d5517017SDavid Wu 		.func = 5,
1317d5517017SDavid Wu 		.route_offset = 0x314,
1318d5517017SDavid Wu 		.route_val = BIT(16 + 10) | BIT(16 + 11) | BIT(11),
1319d5517017SDavid Wu 	}, {
1320d5517017SDavid Wu 		/* can_rxd_m0 */
1321d5517017SDavid Wu 		.bank_num = 0,
1322d5517017SDavid Wu 		.pin = 11,
1323d5517017SDavid Wu 		.func = 2,
1324d5517017SDavid Wu 		.route_offset = 0x314,
1325d5517017SDavid Wu 		.route_val = BIT(16 + 12) | BIT(16 + 13),
1326d5517017SDavid Wu 	}, {
1327d5517017SDavid Wu 		/* can_rxd_m1 */
1328d5517017SDavid Wu 		.bank_num = 1,
1329d5517017SDavid Wu 		.pin = 22,
1330d5517017SDavid Wu 		.func = 5,
1331d5517017SDavid Wu 		.route_offset = 0x314,
1332d5517017SDavid Wu 		.route_val = BIT(16 + 12) | BIT(16 + 13) | BIT(12),
1333d5517017SDavid Wu 	}, {
1334d5517017SDavid Wu 		/* can_rxd_m2 */
1335d5517017SDavid Wu 		.bank_num = 2,
1336d5517017SDavid Wu 		.pin = 2,
1337d5517017SDavid Wu 		.func = 4,
1338d5517017SDavid Wu 		.route_offset = 0x314,
1339d5517017SDavid Wu 		.route_val = BIT(16 + 12) | BIT(16 + 13) | BIT(13),
1340d5517017SDavid Wu 	}, {
1341d5517017SDavid Wu 		/* mac_rxd0_m0 */
1342d5517017SDavid Wu 		.bank_num = 1,
1343d5517017SDavid Wu 		.pin = 20,
1344d5517017SDavid Wu 		.func = 3,
1345d5517017SDavid Wu 		.route_offset = 0x314,
1346d5517017SDavid Wu 		.route_val = BIT(16 + 14),
1347d5517017SDavid Wu 	}, {
1348d5517017SDavid Wu 		/* mac_rxd0_m1 */
1349d5517017SDavid Wu 		.bank_num = 4,
1350d5517017SDavid Wu 		.pin = 2,
1351d5517017SDavid Wu 		.func = 2,
1352d5517017SDavid Wu 		.route_offset = 0x314,
1353d5517017SDavid Wu 		.route_val = BIT(16 + 14) | BIT(14),
1354d5517017SDavid Wu 	}, {
1355d5517017SDavid Wu 		/* uart3_rx */
1356d5517017SDavid Wu 		.bank_num = 3,
1357d5517017SDavid Wu 		.pin = 12,
1358d5517017SDavid Wu 		.func = 4,
1359d5517017SDavid Wu 		.route_offset = 0x314,
1360d5517017SDavid Wu 		.route_val = BIT(16 + 15),
1361d5517017SDavid Wu 	}, {
1362d5517017SDavid Wu 		/* uart3_rx_m1 */
1363d5517017SDavid Wu 		.bank_num = 0,
1364d5517017SDavid Wu 		.pin = 17,
1365d5517017SDavid Wu 		.func = 3,
1366d5517017SDavid Wu 		.route_offset = 0x314,
1367d5517017SDavid Wu 		.route_val = BIT(16 + 15) | BIT(15),
1368b3077611SDavid Wu 	},
1369b3077611SDavid Wu };
1370b3077611SDavid Wu 
137149c55878SDavid Wu static struct rockchip_mux_route_data rk3328_mux_route_data[] = {
137249c55878SDavid Wu 	{
137349c55878SDavid Wu 		/* uart2dbg_rxm0 */
137449c55878SDavid Wu 		.bank_num = 1,
137549c55878SDavid Wu 		.pin = 1,
137649c55878SDavid Wu 		.func = 2,
137749c55878SDavid Wu 		.route_offset = 0x50,
137849c55878SDavid Wu 		.route_val = BIT(16) | BIT(16 + 1),
137949c55878SDavid Wu 	}, {
138049c55878SDavid Wu 		/* uart2dbg_rxm1 */
138149c55878SDavid Wu 		.bank_num = 2,
138249c55878SDavid Wu 		.pin = 1,
138349c55878SDavid Wu 		.func = 1,
138449c55878SDavid Wu 		.route_offset = 0x50,
138549c55878SDavid Wu 		.route_val = BIT(16) | BIT(16 + 1) | BIT(0),
138649c55878SDavid Wu 	}, {
138749c55878SDavid Wu 		/* gmac-m1_rxd0 */
138849c55878SDavid Wu 		.bank_num = 1,
138949c55878SDavid Wu 		.pin = 11,
139049c55878SDavid Wu 		.func = 2,
139149c55878SDavid Wu 		.route_offset = 0x50,
139249c55878SDavid Wu 		.route_val = BIT(16 + 2) | BIT(2),
139349c55878SDavid Wu 	}, {
139449c55878SDavid Wu 		/* gmac-m1-optimized_rxd3 */
139549c55878SDavid Wu 		.bank_num = 1,
139649c55878SDavid Wu 		.pin = 14,
139749c55878SDavid Wu 		.func = 2,
139849c55878SDavid Wu 		.route_offset = 0x50,
139949c55878SDavid Wu 		.route_val = BIT(16 + 10) | BIT(10),
140049c55878SDavid Wu 	}, {
140149c55878SDavid Wu 		/* pdm_sdi0m0 */
140249c55878SDavid Wu 		.bank_num = 2,
140349c55878SDavid Wu 		.pin = 19,
140449c55878SDavid Wu 		.func = 2,
140549c55878SDavid Wu 		.route_offset = 0x50,
140649c55878SDavid Wu 		.route_val = BIT(16 + 3),
140749c55878SDavid Wu 	}, {
140849c55878SDavid Wu 		/* pdm_sdi0m1 */
140949c55878SDavid Wu 		.bank_num = 1,
141049c55878SDavid Wu 		.pin = 23,
141149c55878SDavid Wu 		.func = 3,
141249c55878SDavid Wu 		.route_offset = 0x50,
141349c55878SDavid Wu 		.route_val =  BIT(16 + 3) | BIT(3),
141449c55878SDavid Wu 	}, {
141549c55878SDavid Wu 		/* spi_rxdm2 */
141649c55878SDavid Wu 		.bank_num = 3,
141749c55878SDavid Wu 		.pin = 2,
141849c55878SDavid Wu 		.func = 4,
141949c55878SDavid Wu 		.route_offset = 0x50,
142049c55878SDavid Wu 		.route_val =  BIT(16 + 4) | BIT(16 + 5) | BIT(5),
142149c55878SDavid Wu 	}, {
142249c55878SDavid Wu 		/* i2s2_sdim0 */
142349c55878SDavid Wu 		.bank_num = 1,
142449c55878SDavid Wu 		.pin = 24,
142549c55878SDavid Wu 		.func = 1,
142649c55878SDavid Wu 		.route_offset = 0x50,
142749c55878SDavid Wu 		.route_val = BIT(16 + 6),
142849c55878SDavid Wu 	}, {
142949c55878SDavid Wu 		/* i2s2_sdim1 */
143049c55878SDavid Wu 		.bank_num = 3,
143149c55878SDavid Wu 		.pin = 2,
143249c55878SDavid Wu 		.func = 6,
143349c55878SDavid Wu 		.route_offset = 0x50,
143449c55878SDavid Wu 		.route_val =  BIT(16 + 6) | BIT(6),
143549c55878SDavid Wu 	}, {
143649c55878SDavid Wu 		/* card_iom1 */
143749c55878SDavid Wu 		.bank_num = 2,
143849c55878SDavid Wu 		.pin = 22,
143949c55878SDavid Wu 		.func = 3,
144049c55878SDavid Wu 		.route_offset = 0x50,
144149c55878SDavid Wu 		.route_val =  BIT(16 + 7) | BIT(7),
144249c55878SDavid Wu 	}, {
144349c55878SDavid Wu 		/* tsp_d5m1 */
144449c55878SDavid Wu 		.bank_num = 2,
144549c55878SDavid Wu 		.pin = 16,
144649c55878SDavid Wu 		.func = 3,
144749c55878SDavid Wu 		.route_offset = 0x50,
144849c55878SDavid Wu 		.route_val =  BIT(16 + 8) | BIT(8),
144949c55878SDavid Wu 	}, {
145049c55878SDavid Wu 		/* cif_data5m1 */
145149c55878SDavid Wu 		.bank_num = 2,
145249c55878SDavid Wu 		.pin = 16,
145349c55878SDavid Wu 		.func = 4,
145449c55878SDavid Wu 		.route_offset = 0x50,
145549c55878SDavid Wu 		.route_val =  BIT(16 + 9) | BIT(9),
145649c55878SDavid Wu 	},
145749c55878SDavid Wu };
145849c55878SDavid Wu 
145949c55878SDavid Wu static struct rockchip_mux_route_data rk3399_mux_route_data[] = {
146049c55878SDavid Wu 	{
146149c55878SDavid Wu 		/* uart2dbga_rx */
146249c55878SDavid Wu 		.bank_num = 4,
146349c55878SDavid Wu 		.pin = 8,
146449c55878SDavid Wu 		.func = 2,
146549c55878SDavid Wu 		.route_offset = 0xe21c,
146649c55878SDavid Wu 		.route_val = BIT(16 + 10) | BIT(16 + 11),
146749c55878SDavid Wu 	}, {
146849c55878SDavid Wu 		/* uart2dbgb_rx */
146949c55878SDavid Wu 		.bank_num = 4,
147049c55878SDavid Wu 		.pin = 16,
147149c55878SDavid Wu 		.func = 2,
147249c55878SDavid Wu 		.route_offset = 0xe21c,
147349c55878SDavid Wu 		.route_val = BIT(16 + 10) | BIT(16 + 11) | BIT(10),
147449c55878SDavid Wu 	}, {
147549c55878SDavid Wu 		/* uart2dbgc_rx */
147649c55878SDavid Wu 		.bank_num = 4,
147749c55878SDavid Wu 		.pin = 19,
147849c55878SDavid Wu 		.func = 1,
147949c55878SDavid Wu 		.route_offset = 0xe21c,
148049c55878SDavid Wu 		.route_val = BIT(16 + 10) | BIT(16 + 11) | BIT(11),
148149c55878SDavid Wu 	}, {
148249c55878SDavid Wu 		/* pcie_clkreqn */
148349c55878SDavid Wu 		.bank_num = 2,
148449c55878SDavid Wu 		.pin = 26,
148549c55878SDavid Wu 		.func = 2,
148649c55878SDavid Wu 		.route_offset = 0xe21c,
148749c55878SDavid Wu 		.route_val = BIT(16 + 14),
148849c55878SDavid Wu 	}, {
148949c55878SDavid Wu 		/* pcie_clkreqnb */
149049c55878SDavid Wu 		.bank_num = 4,
149149c55878SDavid Wu 		.pin = 24,
149249c55878SDavid Wu 		.func = 1,
149349c55878SDavid Wu 		.route_offset = 0xe21c,
149449c55878SDavid Wu 		.route_val = BIT(16 + 14) | BIT(14),
149549c55878SDavid Wu 	},
149649c55878SDavid Wu };
149749c55878SDavid Wu 
149849c55878SDavid Wu static bool rockchip_get_mux_route(struct rockchip_pin_bank *bank, int pin,
149949c55878SDavid Wu 				   int mux, u32 *reg, u32 *value)
150049c55878SDavid Wu {
150149c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
150249c55878SDavid Wu 	struct rockchip_pin_ctrl *ctrl = priv->ctrl;
150349c55878SDavid Wu 	struct rockchip_mux_route_data *data;
150449c55878SDavid Wu 	int i;
150549c55878SDavid Wu 
150649c55878SDavid Wu 	for (i = 0; i < ctrl->niomux_routes; i++) {
150749c55878SDavid Wu 		data = &ctrl->iomux_routes[i];
150849c55878SDavid Wu 		if ((data->bank_num == bank->bank_num) &&
150949c55878SDavid Wu 		    (data->pin == pin) && (data->func == mux))
151049c55878SDavid Wu 			break;
151149c55878SDavid Wu 	}
151249c55878SDavid Wu 
151349c55878SDavid Wu 	if (i >= ctrl->niomux_routes)
151449c55878SDavid Wu 		return false;
151549c55878SDavid Wu 
151649c55878SDavid Wu 	*reg = data->route_offset;
151749c55878SDavid Wu 	*value = data->route_val;
151849c55878SDavid Wu 
151949c55878SDavid Wu 	return true;
152049c55878SDavid Wu }
152149c55878SDavid Wu 
152249c55878SDavid Wu static int rockchip_get_mux(struct rockchip_pin_bank *bank, int pin)
152349c55878SDavid Wu {
152449c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
152549c55878SDavid Wu 	int iomux_num = (pin / 8);
152649c55878SDavid Wu 	struct regmap *regmap;
152749c55878SDavid Wu 	unsigned int val;
152849c55878SDavid Wu 	int reg, ret, mask, mux_type;
152949c55878SDavid Wu 	u8 bit;
153049c55878SDavid Wu 
153149c55878SDavid Wu 	if (iomux_num > 3)
153249c55878SDavid Wu 		return -EINVAL;
153349c55878SDavid Wu 
153449c55878SDavid Wu 	if (bank->iomux[iomux_num].type & IOMUX_UNROUTED) {
153549c55878SDavid Wu 		debug("pin %d is unrouted\n", pin);
153649c55878SDavid Wu 		return -EINVAL;
153749c55878SDavid Wu 	}
153849c55878SDavid Wu 
153949c55878SDavid Wu 	if (bank->iomux[iomux_num].type & IOMUX_GPIO_ONLY)
154049c55878SDavid Wu 		return RK_FUNC_GPIO;
154149c55878SDavid Wu 
1542cf04a17bSJianqun Xu 	if (bank->iomux[iomux_num].type & IOMUX_SOURCE_PMU)
1543cf04a17bSJianqun Xu 		regmap = priv->regmap_pmu;
1544cf04a17bSJianqun Xu 	else if (bank->iomux[iomux_num].type & IOMUX_L_SOURCE_PMU)
1545cf04a17bSJianqun Xu 		regmap = (pin % 8 < 4) ? priv->regmap_pmu : priv->regmap_base;
1546cf04a17bSJianqun Xu 	else
1547cf04a17bSJianqun Xu 		regmap = priv->regmap_base;
154849c55878SDavid Wu 
154949c55878SDavid Wu 	/* get basic quadrupel of mux registers and the correct reg inside */
155049c55878SDavid Wu 	mux_type = bank->iomux[iomux_num].type;
155149c55878SDavid Wu 	reg = bank->iomux[iomux_num].offset;
155249c55878SDavid Wu 	if (mux_type & IOMUX_WIDTH_4BIT) {
155349c55878SDavid Wu 		if ((pin % 8) >= 4)
155449c55878SDavid Wu 			reg += 0x4;
155549c55878SDavid Wu 		bit = (pin % 4) * 4;
155649c55878SDavid Wu 		mask = 0xf;
155749c55878SDavid Wu 	} else if (mux_type & IOMUX_WIDTH_3BIT) {
155849c55878SDavid Wu 		if ((pin % 8) >= 5)
155949c55878SDavid Wu 			reg += 0x4;
156049c55878SDavid Wu 		bit = (pin % 8 % 5) * 3;
156149c55878SDavid Wu 		mask = 0x7;
156249c55878SDavid Wu 	} else {
156349c55878SDavid Wu 		bit = (pin % 8) * 2;
156449c55878SDavid Wu 		mask = 0x3;
156549c55878SDavid Wu 	}
156649c55878SDavid Wu 
156749c55878SDavid Wu 	if (bank->recalced_mask & BIT(pin))
156849c55878SDavid Wu 		rockchip_get_recalced_mux(bank, pin, &reg, &bit, &mask);
156949c55878SDavid Wu 
157049c55878SDavid Wu 	ret = regmap_read(regmap, reg, &val);
157149c55878SDavid Wu 	if (ret)
157249c55878SDavid Wu 		return ret;
157349c55878SDavid Wu 
157449c55878SDavid Wu 	return ((val >> bit) & mask);
157549c55878SDavid Wu }
157649c55878SDavid Wu 
157749c55878SDavid Wu static int rockchip_pinctrl_get_gpio_mux(struct udevice *dev, int banknum,
157849c55878SDavid Wu 					 int index)
157949c55878SDavid Wu {	struct rockchip_pinctrl_priv *priv = dev_get_priv(dev);
158049c55878SDavid Wu 	struct rockchip_pin_ctrl *ctrl = priv->ctrl;
158149c55878SDavid Wu 
158249c55878SDavid Wu 	return rockchip_get_mux(&ctrl->pin_banks[banknum], index);
158349c55878SDavid Wu }
158449c55878SDavid Wu 
158549c55878SDavid Wu static int rockchip_verify_mux(struct rockchip_pin_bank *bank,
158649c55878SDavid Wu 			       int pin, int mux)
158749c55878SDavid Wu {
158849c55878SDavid Wu 	int iomux_num = (pin / 8);
158949c55878SDavid Wu 
159049c55878SDavid Wu 	if (iomux_num > 3)
159149c55878SDavid Wu 		return -EINVAL;
159249c55878SDavid Wu 
159349c55878SDavid Wu 	if (bank->iomux[iomux_num].type & IOMUX_UNROUTED) {
159449c55878SDavid Wu 		debug("pin %d is unrouted\n", pin);
159549c55878SDavid Wu 		return -EINVAL;
159649c55878SDavid Wu 	}
159749c55878SDavid Wu 
159849c55878SDavid Wu 	if (bank->iomux[iomux_num].type & IOMUX_GPIO_ONLY) {
159949c55878SDavid Wu 		if (mux != IOMUX_GPIO_ONLY) {
160049c55878SDavid Wu 			debug("pin %d only supports a gpio mux\n", pin);
160149c55878SDavid Wu 			return -ENOTSUPP;
160249c55878SDavid Wu 		}
160349c55878SDavid Wu 	}
160449c55878SDavid Wu 
160549c55878SDavid Wu 	return 0;
160649c55878SDavid Wu }
160749c55878SDavid Wu 
160849c55878SDavid Wu /*
160949c55878SDavid Wu  * Set a new mux function for a pin.
161049c55878SDavid Wu  *
161149c55878SDavid Wu  * The register is divided into the upper and lower 16 bit. When changing
161249c55878SDavid Wu  * a value, the previous register value is not read and changed. Instead
161349c55878SDavid Wu  * it seems the changed bits are marked in the upper 16 bit, while the
161449c55878SDavid Wu  * changed value gets set in the same offset in the lower 16 bit.
161549c55878SDavid Wu  * All pin settings seem to be 2 bit wide in both the upper and lower
161649c55878SDavid Wu  * parts.
161749c55878SDavid Wu  * @bank: pin bank to change
161849c55878SDavid Wu  * @pin: pin to change
161949c55878SDavid Wu  * @mux: new mux function to set
162049c55878SDavid Wu  */
162149c55878SDavid Wu static int rockchip_set_mux(struct rockchip_pin_bank *bank, int pin, int mux)
162249c55878SDavid Wu {
162349c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
162449c55878SDavid Wu 	int iomux_num = (pin / 8);
162549c55878SDavid Wu 	struct regmap *regmap;
162649c55878SDavid Wu 	int reg, ret, mask, mux_type;
162749c55878SDavid Wu 	u8 bit;
162849c55878SDavid Wu 	u32 data, route_reg, route_val;
162949c55878SDavid Wu 
163049c55878SDavid Wu 	ret = rockchip_verify_mux(bank, pin, mux);
163149c55878SDavid Wu 	if (ret < 0)
163249c55878SDavid Wu 		return ret;
163349c55878SDavid Wu 
163449c55878SDavid Wu 	if (bank->iomux[iomux_num].type & IOMUX_GPIO_ONLY)
163549c55878SDavid Wu 		return 0;
163649c55878SDavid Wu 
163749c55878SDavid Wu 	debug("setting mux of GPIO%d-%d to %d\n", bank->bank_num, pin, mux);
163849c55878SDavid Wu 
1639cf04a17bSJianqun Xu 	if (bank->iomux[iomux_num].type & IOMUX_SOURCE_PMU)
1640cf04a17bSJianqun Xu 		regmap = priv->regmap_pmu;
1641cf04a17bSJianqun Xu 	else if (bank->iomux[iomux_num].type & IOMUX_L_SOURCE_PMU)
1642cf04a17bSJianqun Xu 		regmap = (pin % 8 < 4) ? priv->regmap_pmu : priv->regmap_base;
1643cf04a17bSJianqun Xu 	else
1644cf04a17bSJianqun Xu 		regmap = priv->regmap_base;
164549c55878SDavid Wu 
164649c55878SDavid Wu 	/* get basic quadrupel of mux registers and the correct reg inside */
164749c55878SDavid Wu 	mux_type = bank->iomux[iomux_num].type;
164849c55878SDavid Wu 	reg = bank->iomux[iomux_num].offset;
164949c55878SDavid Wu 	if (mux_type & IOMUX_WIDTH_4BIT) {
165049c55878SDavid Wu 		if ((pin % 8) >= 4)
165149c55878SDavid Wu 			reg += 0x4;
165249c55878SDavid Wu 		bit = (pin % 4) * 4;
165349c55878SDavid Wu 		mask = 0xf;
165449c55878SDavid Wu 	} else if (mux_type & IOMUX_WIDTH_3BIT) {
165549c55878SDavid Wu 		if ((pin % 8) >= 5)
165649c55878SDavid Wu 			reg += 0x4;
165749c55878SDavid Wu 		bit = (pin % 8 % 5) * 3;
165849c55878SDavid Wu 		mask = 0x7;
165949c55878SDavid Wu 	} else {
166049c55878SDavid Wu 		bit = (pin % 8) * 2;
166149c55878SDavid Wu 		mask = 0x3;
166249c55878SDavid Wu 	}
166349c55878SDavid Wu 
166449c55878SDavid Wu 	if (bank->recalced_mask & BIT(pin))
166549c55878SDavid Wu 		rockchip_get_recalced_mux(bank, pin, &reg, &bit, &mask);
166649c55878SDavid Wu 
166749c55878SDavid Wu 	if (bank->route_mask & BIT(pin)) {
166849c55878SDavid Wu 		if (rockchip_get_mux_route(bank, pin, mux, &route_reg,
166949c55878SDavid Wu 					   &route_val)) {
167049c55878SDavid Wu 			ret = regmap_write(regmap, route_reg, route_val);
167149c55878SDavid Wu 			if (ret)
167249c55878SDavid Wu 				return ret;
167349c55878SDavid Wu 		}
167449c55878SDavid Wu 	}
167549c55878SDavid Wu 
16764bafc2daSDavid Wu 	if (mux_type & IOMUX_WRITABLE_32BIT) {
16778bf1bc66SDavid Wu 		regmap_read(regmap, reg, &data);
16784bafc2daSDavid Wu 		data &= ~(mask << bit);
16794bafc2daSDavid Wu 	} else {
168049c55878SDavid Wu 		data = (mask << (bit + 16));
16814bafc2daSDavid Wu 	}
16828bf1bc66SDavid Wu 
168349c55878SDavid Wu 	data |= (mux & mask) << bit;
168449c55878SDavid Wu 	ret = regmap_write(regmap, reg, data);
168549c55878SDavid Wu 
168649c55878SDavid Wu 	return ret;
168749c55878SDavid Wu }
168849c55878SDavid Wu 
168949c55878SDavid Wu #define PX30_PULL_PMU_OFFSET		0x10
169049c55878SDavid Wu #define PX30_PULL_GRF_OFFSET		0x60
169149c55878SDavid Wu #define PX30_PULL_BITS_PER_PIN		2
169249c55878SDavid Wu #define PX30_PULL_PINS_PER_REG		8
169349c55878SDavid Wu #define PX30_PULL_BANK_STRIDE		16
169449c55878SDavid Wu 
169549c55878SDavid Wu static void px30_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
169649c55878SDavid Wu 				       int pin_num, struct regmap **regmap,
169749c55878SDavid Wu 				       int *reg, u8 *bit)
169849c55878SDavid Wu {
169949c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
170049c55878SDavid Wu 
170149c55878SDavid Wu 	/* The first 32 pins of the first bank are located in PMU */
170249c55878SDavid Wu 	if (bank->bank_num == 0) {
170349c55878SDavid Wu 		*regmap = priv->regmap_pmu;
170449c55878SDavid Wu 		*reg = PX30_PULL_PMU_OFFSET;
170549c55878SDavid Wu 	} else {
170649c55878SDavid Wu 		*regmap = priv->regmap_base;
170749c55878SDavid Wu 		*reg = PX30_PULL_GRF_OFFSET;
170849c55878SDavid Wu 
170949c55878SDavid Wu 		/* correct the offset, as we're starting with the 2nd bank */
171049c55878SDavid Wu 		*reg -= 0x10;
171149c55878SDavid Wu 		*reg += bank->bank_num * PX30_PULL_BANK_STRIDE;
171249c55878SDavid Wu 	}
171349c55878SDavid Wu 
171449c55878SDavid Wu 	*reg += ((pin_num / PX30_PULL_PINS_PER_REG) * 4);
171549c55878SDavid Wu 	*bit = (pin_num % PX30_PULL_PINS_PER_REG);
171649c55878SDavid Wu 	*bit *= PX30_PULL_BITS_PER_PIN;
171749c55878SDavid Wu }
171849c55878SDavid Wu 
171949c55878SDavid Wu #define PX30_DRV_PMU_OFFSET		0x20
172049c55878SDavid Wu #define PX30_DRV_GRF_OFFSET		0xf0
172149c55878SDavid Wu #define PX30_DRV_BITS_PER_PIN		2
172249c55878SDavid Wu #define PX30_DRV_PINS_PER_REG		8
172349c55878SDavid Wu #define PX30_DRV_BANK_STRIDE		16
172449c55878SDavid Wu 
172549c55878SDavid Wu static void px30_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
172649c55878SDavid Wu 				      int pin_num, struct regmap **regmap,
172749c55878SDavid Wu 				      int *reg, u8 *bit)
172849c55878SDavid Wu {
172949c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
173049c55878SDavid Wu 
173149c55878SDavid Wu 	/* The first 32 pins of the first bank are located in PMU */
173249c55878SDavid Wu 	if (bank->bank_num == 0) {
173349c55878SDavid Wu 		*regmap = priv->regmap_pmu;
173449c55878SDavid Wu 		*reg = PX30_DRV_PMU_OFFSET;
173549c55878SDavid Wu 	} else {
173649c55878SDavid Wu 		*regmap = priv->regmap_base;
173749c55878SDavid Wu 		*reg = PX30_DRV_GRF_OFFSET;
173849c55878SDavid Wu 
173949c55878SDavid Wu 		/* correct the offset, as we're starting with the 2nd bank */
174049c55878SDavid Wu 		*reg -= 0x10;
174149c55878SDavid Wu 		*reg += bank->bank_num * PX30_DRV_BANK_STRIDE;
174249c55878SDavid Wu 	}
174349c55878SDavid Wu 
174449c55878SDavid Wu 	*reg += ((pin_num / PX30_DRV_PINS_PER_REG) * 4);
174549c55878SDavid Wu 	*bit = (pin_num % PX30_DRV_PINS_PER_REG);
174649c55878SDavid Wu 	*bit *= PX30_DRV_BITS_PER_PIN;
174749c55878SDavid Wu }
174849c55878SDavid Wu 
174949c55878SDavid Wu #define PX30_SCHMITT_PMU_OFFSET			0x38
175049c55878SDavid Wu #define PX30_SCHMITT_GRF_OFFSET			0xc0
175149c55878SDavid Wu #define PX30_SCHMITT_PINS_PER_PMU_REG		16
175249c55878SDavid Wu #define PX30_SCHMITT_BANK_STRIDE		16
175349c55878SDavid Wu #define PX30_SCHMITT_PINS_PER_GRF_REG		8
175449c55878SDavid Wu 
175549c55878SDavid Wu static int px30_calc_schmitt_reg_and_bit(struct rockchip_pin_bank *bank,
175649c55878SDavid Wu 					 int pin_num,
175749c55878SDavid Wu 					 struct regmap **regmap,
175849c55878SDavid Wu 					 int *reg, u8 *bit)
175949c55878SDavid Wu {
176049c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
176149c55878SDavid Wu 	int pins_per_reg;
176249c55878SDavid Wu 
176349c55878SDavid Wu 	if (bank->bank_num == 0) {
176449c55878SDavid Wu 		*regmap = priv->regmap_pmu;
176549c55878SDavid Wu 		*reg = PX30_SCHMITT_PMU_OFFSET;
176649c55878SDavid Wu 		pins_per_reg = PX30_SCHMITT_PINS_PER_PMU_REG;
176749c55878SDavid Wu 	} else {
176849c55878SDavid Wu 		*regmap = priv->regmap_base;
176949c55878SDavid Wu 		*reg = PX30_SCHMITT_GRF_OFFSET;
177049c55878SDavid Wu 		pins_per_reg = PX30_SCHMITT_PINS_PER_GRF_REG;
177149c55878SDavid Wu 		*reg += (bank->bank_num - 1) * PX30_SCHMITT_BANK_STRIDE;
177249c55878SDavid Wu 	}
177349c55878SDavid Wu 	*reg += ((pin_num / pins_per_reg) * 4);
177449c55878SDavid Wu 	*bit = pin_num % pins_per_reg;
177549c55878SDavid Wu 
177649c55878SDavid Wu 	return 0;
177749c55878SDavid Wu }
177849c55878SDavid Wu 
177949c55878SDavid Wu #define RV1108_PULL_PMU_OFFSET		0x10
178049c55878SDavid Wu #define RV1108_PULL_OFFSET		0x110
178149c55878SDavid Wu #define RV1108_PULL_PINS_PER_REG	8
178249c55878SDavid Wu #define RV1108_PULL_BITS_PER_PIN	2
178349c55878SDavid Wu #define RV1108_PULL_BANK_STRIDE		16
178449c55878SDavid Wu 
178549c55878SDavid Wu static void rv1108_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
178649c55878SDavid Wu 					 int pin_num, struct regmap **regmap,
178749c55878SDavid Wu 					 int *reg, u8 *bit)
178849c55878SDavid Wu {
178949c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
179049c55878SDavid Wu 
179149c55878SDavid Wu 	/* The first 24 pins of the first bank are located in PMU */
179249c55878SDavid Wu 	if (bank->bank_num == 0) {
179349c55878SDavid Wu 		*regmap = priv->regmap_pmu;
179449c55878SDavid Wu 		*reg = RV1108_PULL_PMU_OFFSET;
179549c55878SDavid Wu 	} else {
179649c55878SDavid Wu 		*reg = RV1108_PULL_OFFSET;
179749c55878SDavid Wu 		*regmap = priv->regmap_base;
179849c55878SDavid Wu 		/* correct the offset, as we're starting with the 2nd bank */
179949c55878SDavid Wu 		*reg -= 0x10;
180049c55878SDavid Wu 		*reg += bank->bank_num * RV1108_PULL_BANK_STRIDE;
180149c55878SDavid Wu 	}
180249c55878SDavid Wu 
180349c55878SDavid Wu 	*reg += ((pin_num / RV1108_PULL_PINS_PER_REG) * 4);
180449c55878SDavid Wu 	*bit = (pin_num % RV1108_PULL_PINS_PER_REG);
180549c55878SDavid Wu 	*bit *= RV1108_PULL_BITS_PER_PIN;
180649c55878SDavid Wu }
180749c55878SDavid Wu 
180849c55878SDavid Wu #define RV1108_DRV_PMU_OFFSET		0x20
180949c55878SDavid Wu #define RV1108_DRV_GRF_OFFSET		0x210
181049c55878SDavid Wu #define RV1108_DRV_BITS_PER_PIN		2
181149c55878SDavid Wu #define RV1108_DRV_PINS_PER_REG		8
181249c55878SDavid Wu #define RV1108_DRV_BANK_STRIDE		16
181349c55878SDavid Wu 
181449c55878SDavid Wu static void rv1108_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
181549c55878SDavid Wu 					int pin_num, struct regmap **regmap,
181649c55878SDavid Wu 					int *reg, u8 *bit)
181749c55878SDavid Wu {
181849c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
181949c55878SDavid Wu 
182049c55878SDavid Wu 	/* The first 24 pins of the first bank are located in PMU */
182149c55878SDavid Wu 	if (bank->bank_num == 0) {
182249c55878SDavid Wu 		*regmap = priv->regmap_pmu;
182349c55878SDavid Wu 		*reg = RV1108_DRV_PMU_OFFSET;
182449c55878SDavid Wu 	} else {
182549c55878SDavid Wu 		*regmap = priv->regmap_base;
182649c55878SDavid Wu 		*reg = RV1108_DRV_GRF_OFFSET;
182749c55878SDavid Wu 
182849c55878SDavid Wu 		/* correct the offset, as we're starting with the 2nd bank */
182949c55878SDavid Wu 		*reg -= 0x10;
183049c55878SDavid Wu 		*reg += bank->bank_num * RV1108_DRV_BANK_STRIDE;
183149c55878SDavid Wu 	}
183249c55878SDavid Wu 
183349c55878SDavid Wu 	*reg += ((pin_num / RV1108_DRV_PINS_PER_REG) * 4);
183449c55878SDavid Wu 	*bit = pin_num % RV1108_DRV_PINS_PER_REG;
183549c55878SDavid Wu 	*bit *= RV1108_DRV_BITS_PER_PIN;
183649c55878SDavid Wu }
183749c55878SDavid Wu 
183849c55878SDavid Wu #define RV1108_SCHMITT_PMU_OFFSET		0x30
183949c55878SDavid Wu #define RV1108_SCHMITT_GRF_OFFSET		0x388
184049c55878SDavid Wu #define RV1108_SCHMITT_BANK_STRIDE		8
184149c55878SDavid Wu #define RV1108_SCHMITT_PINS_PER_GRF_REG		16
184249c55878SDavid Wu #define RV1108_SCHMITT_PINS_PER_PMU_REG		8
184349c55878SDavid Wu 
184449c55878SDavid Wu static int rv1108_calc_schmitt_reg_and_bit(struct rockchip_pin_bank *bank,
184549c55878SDavid Wu 					   int pin_num,
184649c55878SDavid Wu 					   struct regmap **regmap,
184749c55878SDavid Wu 					   int *reg, u8 *bit)
184849c55878SDavid Wu {
184949c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
185049c55878SDavid Wu 	int pins_per_reg;
185149c55878SDavid Wu 
185249c55878SDavid Wu 	if (bank->bank_num == 0) {
185349c55878SDavid Wu 		*regmap = priv->regmap_pmu;
185449c55878SDavid Wu 		*reg = RV1108_SCHMITT_PMU_OFFSET;
185549c55878SDavid Wu 		pins_per_reg = RV1108_SCHMITT_PINS_PER_PMU_REG;
185649c55878SDavid Wu 	} else {
185749c55878SDavid Wu 		*regmap = priv->regmap_base;
185849c55878SDavid Wu 		*reg = RV1108_SCHMITT_GRF_OFFSET;
185949c55878SDavid Wu 		pins_per_reg = RV1108_SCHMITT_PINS_PER_GRF_REG;
186049c55878SDavid Wu 		*reg += (bank->bank_num  - 1) * RV1108_SCHMITT_BANK_STRIDE;
186149c55878SDavid Wu 	}
186249c55878SDavid Wu 	*reg += ((pin_num / pins_per_reg) * 4);
186349c55878SDavid Wu 	*bit = pin_num % pins_per_reg;
186449c55878SDavid Wu 
186549c55878SDavid Wu 	return 0;
186649c55878SDavid Wu }
186749c55878SDavid Wu 
1868cf04a17bSJianqun Xu #define RV1126_PULL_PMU_OFFSET		0x40
1869cf04a17bSJianqun Xu #define RV1126_PULL_GRF_GPIO1A0_OFFSET		0x10108
1870cf04a17bSJianqun Xu #define RV1126_PULL_PINS_PER_REG	8
1871cf04a17bSJianqun Xu #define RV1126_PULL_BITS_PER_PIN	2
1872cf04a17bSJianqun Xu #define RV1126_PULL_BANK_STRIDE		16
1873cf04a17bSJianqun Xu #define RV1126_GPIO_C4_D7(p)	(p >= 20 && p <= 31) /* GPIO0_C4 ~ GPIO0_D7 */
1874cf04a17bSJianqun Xu 
1875cf04a17bSJianqun Xu static void rv1126_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
1876cf04a17bSJianqun Xu 					 int pin_num, struct regmap **regmap,
1877cf04a17bSJianqun Xu 					 int *reg, u8 *bit)
1878cf04a17bSJianqun Xu {
1879cf04a17bSJianqun Xu 	struct rockchip_pinctrl_priv *priv = bank->priv;
1880cf04a17bSJianqun Xu 
1881cf04a17bSJianqun Xu 	/* The first 24 pins of the first bank are located in PMU */
1882cf04a17bSJianqun Xu 	if (bank->bank_num == 0) {
1883cf04a17bSJianqun Xu 		if (RV1126_GPIO_C4_D7(pin_num)) {
1884cf04a17bSJianqun Xu 			*regmap = priv->regmap_base;
1885cf04a17bSJianqun Xu 			*reg = RV1126_PULL_GRF_GPIO1A0_OFFSET;
1886cf04a17bSJianqun Xu 			*reg -= (((31 - pin_num) / RV1126_PULL_PINS_PER_REG + 1) * 4);
1887cf04a17bSJianqun Xu 			*bit = pin_num % RV1126_PULL_PINS_PER_REG;
1888cf04a17bSJianqun Xu 			*bit *= RV1126_PULL_BITS_PER_PIN;
1889cf04a17bSJianqun Xu 			return;
1890cf04a17bSJianqun Xu 		}
1891cf04a17bSJianqun Xu 		*regmap = priv->regmap_pmu;
1892cf04a17bSJianqun Xu 		*reg = RV1126_PULL_PMU_OFFSET;
1893cf04a17bSJianqun Xu 	} else {
1894cf04a17bSJianqun Xu 		*reg = RV1126_PULL_GRF_GPIO1A0_OFFSET;
1895cf04a17bSJianqun Xu 		*regmap = priv->regmap_base;
1896d499d466SJianqun Xu 		*reg += (bank->bank_num - 1) * RV1126_PULL_BANK_STRIDE;
1897cf04a17bSJianqun Xu 	}
1898cf04a17bSJianqun Xu 
1899cf04a17bSJianqun Xu 	*reg += ((pin_num / RV1126_PULL_PINS_PER_REG) * 4);
1900cf04a17bSJianqun Xu 	*bit = (pin_num % RV1126_PULL_PINS_PER_REG);
1901cf04a17bSJianqun Xu 	*bit *= RV1126_PULL_BITS_PER_PIN;
1902cf04a17bSJianqun Xu }
1903cf04a17bSJianqun Xu 
1904cf04a17bSJianqun Xu #define RV1126_DRV_PMU_OFFSET		0x20
1905cf04a17bSJianqun Xu #define RV1126_DRV_GRF_GPIO1A0_OFFSET		0x10090
1906cf04a17bSJianqun Xu #define RV1126_DRV_BITS_PER_PIN		4
1907cf04a17bSJianqun Xu #define RV1126_DRV_PINS_PER_REG		4
1908cf04a17bSJianqun Xu #define RV1126_DRV_BANK_STRIDE		32
1909cf04a17bSJianqun Xu 
1910cf04a17bSJianqun Xu static void rv1126_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
1911cf04a17bSJianqun Xu 					int pin_num, struct regmap **regmap,
1912cf04a17bSJianqun Xu 					int *reg, u8 *bit)
1913cf04a17bSJianqun Xu {
1914cf04a17bSJianqun Xu 	struct rockchip_pinctrl_priv *priv = bank->priv;
1915cf04a17bSJianqun Xu 
1916cf04a17bSJianqun Xu 	/* The first 24 pins of the first bank are located in PMU */
1917cf04a17bSJianqun Xu 	if (bank->bank_num == 0) {
1918cf04a17bSJianqun Xu 		if (RV1126_GPIO_C4_D7(pin_num)) {
1919cf04a17bSJianqun Xu 			*regmap = priv->regmap_base;
1920cf04a17bSJianqun Xu 			*reg = RV1126_DRV_GRF_GPIO1A0_OFFSET;
1921cf04a17bSJianqun Xu 			*reg -= (((31 - pin_num) / RV1126_DRV_PINS_PER_REG + 1) * 4);
1922d499d466SJianqun Xu 			*reg -= 0x4;
1923cf04a17bSJianqun Xu 			*bit = pin_num % RV1126_DRV_PINS_PER_REG;
1924cf04a17bSJianqun Xu 			*bit *= RV1126_DRV_BITS_PER_PIN;
1925cf04a17bSJianqun Xu 			return;
1926cf04a17bSJianqun Xu 		}
1927cf04a17bSJianqun Xu 		*regmap = priv->regmap_pmu;
1928cf04a17bSJianqun Xu 		*reg = RV1126_DRV_PMU_OFFSET;
1929cf04a17bSJianqun Xu 	} else {
1930cf04a17bSJianqun Xu 		*regmap = priv->regmap_base;
1931cf04a17bSJianqun Xu 		*reg = RV1126_DRV_GRF_GPIO1A0_OFFSET;
1932d499d466SJianqun Xu 		*reg += (bank->bank_num - 1) * RV1126_DRV_BANK_STRIDE;
1933cf04a17bSJianqun Xu 	}
1934cf04a17bSJianqun Xu 
1935cf04a17bSJianqun Xu 	*reg += ((pin_num / RV1126_DRV_PINS_PER_REG) * 4);
1936cf04a17bSJianqun Xu 	*bit = pin_num % RV1126_DRV_PINS_PER_REG;
1937cf04a17bSJianqun Xu 	*bit *= RV1126_DRV_BITS_PER_PIN;
1938cf04a17bSJianqun Xu }
1939cf04a17bSJianqun Xu 
1940cf04a17bSJianqun Xu #define RV1126_SCHMITT_PMU_OFFSET		0x60
1941cf04a17bSJianqun Xu #define RV1126_SCHMITT_GRF_GPIO1A0_OFFSET		0x10188
1942cf04a17bSJianqun Xu #define RV1126_SCHMITT_BANK_STRIDE		16
1943cf04a17bSJianqun Xu #define RV1126_SCHMITT_PINS_PER_GRF_REG		8
1944cf04a17bSJianqun Xu #define RV1126_SCHMITT_PINS_PER_PMU_REG		8
1945cf04a17bSJianqun Xu 
1946cf04a17bSJianqun Xu static int rv1126_calc_schmitt_reg_and_bit(struct rockchip_pin_bank *bank,
1947cf04a17bSJianqun Xu 					   int pin_num,
1948cf04a17bSJianqun Xu 					   struct regmap **regmap,
1949cf04a17bSJianqun Xu 					   int *reg, u8 *bit)
1950cf04a17bSJianqun Xu {
1951cf04a17bSJianqun Xu 	struct rockchip_pinctrl_priv *priv = bank->priv;
1952cf04a17bSJianqun Xu 	int pins_per_reg;
1953cf04a17bSJianqun Xu 
1954cf04a17bSJianqun Xu 	if (bank->bank_num == 0) {
1955cf04a17bSJianqun Xu 		if (RV1126_GPIO_C4_D7(pin_num)) {
1956cf04a17bSJianqun Xu 			*regmap = priv->regmap_base;
1957cf04a17bSJianqun Xu 			*reg = RV1126_SCHMITT_GRF_GPIO1A0_OFFSET;
1958cf04a17bSJianqun Xu 			*reg -= (((31 - pin_num) / RV1126_SCHMITT_PINS_PER_GRF_REG + 1) * 4);
1959cf04a17bSJianqun Xu 			*bit = pin_num % RV1126_SCHMITT_PINS_PER_GRF_REG;
1960cf04a17bSJianqun Xu 			return 0;
1961cf04a17bSJianqun Xu 		}
1962cf04a17bSJianqun Xu 		*regmap = priv->regmap_pmu;
1963cf04a17bSJianqun Xu 		*reg = RV1126_SCHMITT_PMU_OFFSET;
1964cf04a17bSJianqun Xu 		pins_per_reg = RV1126_SCHMITT_PINS_PER_PMU_REG;
1965cf04a17bSJianqun Xu 	} else {
1966cf04a17bSJianqun Xu 		*regmap = priv->regmap_base;
1967cf04a17bSJianqun Xu 		*reg = RV1126_SCHMITT_GRF_GPIO1A0_OFFSET;
1968cf04a17bSJianqun Xu 		pins_per_reg = RV1126_SCHMITT_PINS_PER_GRF_REG;
1969d499d466SJianqun Xu 		*reg += (bank->bank_num - 1) * RV1126_SCHMITT_BANK_STRIDE;
1970cf04a17bSJianqun Xu 	}
1971cf04a17bSJianqun Xu 	*reg += ((pin_num / pins_per_reg) * 4);
1972cf04a17bSJianqun Xu 	*bit = pin_num % pins_per_reg;
1973cf04a17bSJianqun Xu 
1974cf04a17bSJianqun Xu 	return 0;
1975cf04a17bSJianqun Xu }
1976cf04a17bSJianqun Xu 
1977a2a3fc8fSJianqun Xu #define RK1808_PULL_PMU_OFFSET		0x10
1978a2a3fc8fSJianqun Xu #define RK1808_PULL_GRF_OFFSET		0x80
1979a2a3fc8fSJianqun Xu #define RK1808_PULL_PINS_PER_REG	8
1980a2a3fc8fSJianqun Xu #define RK1808_PULL_BITS_PER_PIN	2
1981a2a3fc8fSJianqun Xu #define RK1808_PULL_BANK_STRIDE		16
1982a2a3fc8fSJianqun Xu 
1983a2a3fc8fSJianqun Xu static void rk1808_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
1984a2a3fc8fSJianqun Xu 					 int pin_num,
1985a2a3fc8fSJianqun Xu 					 struct regmap **regmap,
1986a2a3fc8fSJianqun Xu 					 int *reg, u8 *bit)
1987a2a3fc8fSJianqun Xu {
1988a2a3fc8fSJianqun Xu 	struct rockchip_pinctrl_priv *priv = bank->priv;
1989a2a3fc8fSJianqun Xu 
1990a2a3fc8fSJianqun Xu 	if (bank->bank_num == 0) {
1991a2a3fc8fSJianqun Xu 		*regmap = priv->regmap_pmu;
1992a2a3fc8fSJianqun Xu 		*reg = RK1808_PULL_PMU_OFFSET;
1993a2a3fc8fSJianqun Xu 	} else {
1994a2a3fc8fSJianqun Xu 		*reg = RK1808_PULL_GRF_OFFSET;
1995a2a3fc8fSJianqun Xu 		*regmap = priv->regmap_base;
1996a2a3fc8fSJianqun Xu 	}
1997a2a3fc8fSJianqun Xu 
1998a2a3fc8fSJianqun Xu 	*reg += ((pin_num / RK1808_PULL_PINS_PER_REG) * 4);
1999a2a3fc8fSJianqun Xu 	*bit = (pin_num % RK1808_PULL_PINS_PER_REG);
2000a2a3fc8fSJianqun Xu 	*bit *= RK1808_PULL_BITS_PER_PIN;
2001a2a3fc8fSJianqun Xu }
2002a2a3fc8fSJianqun Xu 
2003a2a3fc8fSJianqun Xu #define RK1808_DRV_PMU_OFFSET		0x20
2004a2a3fc8fSJianqun Xu #define RK1808_DRV_GRF_OFFSET		0x140
2005a2a3fc8fSJianqun Xu #define RK1808_DRV_BITS_PER_PIN		2
2006a2a3fc8fSJianqun Xu #define RK1808_DRV_PINS_PER_REG		8
2007a2a3fc8fSJianqun Xu #define RK1808_DRV_BANK_STRIDE		16
2008a2a3fc8fSJianqun Xu 
2009a2a3fc8fSJianqun Xu static void rk1808_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
2010a2a3fc8fSJianqun Xu 					int pin_num,
2011a2a3fc8fSJianqun Xu 					struct regmap **regmap,
2012a2a3fc8fSJianqun Xu 					int *reg, u8 *bit)
2013a2a3fc8fSJianqun Xu {
2014a2a3fc8fSJianqun Xu 	struct rockchip_pinctrl_priv *priv = bank->priv;
2015a2a3fc8fSJianqun Xu 
2016a2a3fc8fSJianqun Xu 	if (bank->bank_num == 0) {
2017a2a3fc8fSJianqun Xu 		*regmap = priv->regmap_pmu;
2018a2a3fc8fSJianqun Xu 		*reg = RK1808_DRV_PMU_OFFSET;
2019a2a3fc8fSJianqun Xu 	} else {
2020a2a3fc8fSJianqun Xu 		*regmap = priv->regmap_base;
2021a2a3fc8fSJianqun Xu 		*reg = RK1808_DRV_GRF_OFFSET;
2022a2a3fc8fSJianqun Xu 	}
2023a2a3fc8fSJianqun Xu 
2024a2a3fc8fSJianqun Xu 	*reg += ((pin_num / RK1808_DRV_PINS_PER_REG) * 4);
2025a2a3fc8fSJianqun Xu 	*bit = pin_num % RK1808_DRV_PINS_PER_REG;
2026a2a3fc8fSJianqun Xu 	*bit *= RK1808_DRV_BITS_PER_PIN;
2027a2a3fc8fSJianqun Xu }
2028a2a3fc8fSJianqun Xu 
2029a2a3fc8fSJianqun Xu #define RK1808_SCHMITT_PMU_OFFSET		0x0040
2030a2a3fc8fSJianqun Xu #define RK1808_SCHMITT_GRF_OFFSET		0x0100
2031a2a3fc8fSJianqun Xu #define RK1808_SCHMITT_BANK_STRIDE		16
2032a2a3fc8fSJianqun Xu #define RK1808_SCHMITT_PINS_PER_REG		8
2033a2a3fc8fSJianqun Xu 
2034a2a3fc8fSJianqun Xu static int rk1808_calc_schmitt_reg_and_bit(struct rockchip_pin_bank *bank,
2035a2a3fc8fSJianqun Xu 					   int pin_num,
2036a2a3fc8fSJianqun Xu 					   struct regmap **regmap,
2037a2a3fc8fSJianqun Xu 					   int *reg, u8 *bit)
2038a2a3fc8fSJianqun Xu {
2039a2a3fc8fSJianqun Xu 	struct rockchip_pinctrl_priv *priv = bank->priv;
2040a2a3fc8fSJianqun Xu 
2041a2a3fc8fSJianqun Xu 	if (bank->bank_num == 0) {
2042a2a3fc8fSJianqun Xu 		*regmap = priv->regmap_pmu;
2043a2a3fc8fSJianqun Xu 		*reg = RK1808_SCHMITT_PMU_OFFSET;
2044a2a3fc8fSJianqun Xu 	} else {
2045a2a3fc8fSJianqun Xu 		*regmap = priv->regmap_base;
2046a2a3fc8fSJianqun Xu 		*reg = RK1808_SCHMITT_GRF_OFFSET;
2047a2a3fc8fSJianqun Xu 		*reg += (bank->bank_num  - 1) * RK1808_SCHMITT_BANK_STRIDE;
2048a2a3fc8fSJianqun Xu 	}
2049a2a3fc8fSJianqun Xu 	*reg += ((pin_num / RK1808_SCHMITT_PINS_PER_REG) * 4);
2050a2a3fc8fSJianqun Xu 	*bit = pin_num % RK1808_SCHMITT_PINS_PER_REG;
2051a2a3fc8fSJianqun Xu 
2052a2a3fc8fSJianqun Xu 	return 0;
2053a2a3fc8fSJianqun Xu }
2054a2a3fc8fSJianqun Xu 
205549c55878SDavid Wu #define RK2928_PULL_OFFSET		0x118
205649c55878SDavid Wu #define RK2928_PULL_PINS_PER_REG	16
205749c55878SDavid Wu #define RK2928_PULL_BANK_STRIDE		8
205849c55878SDavid Wu 
205949c55878SDavid Wu static void rk2928_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
206049c55878SDavid Wu 					 int pin_num, struct regmap **regmap,
206149c55878SDavid Wu 					 int *reg, u8 *bit)
206249c55878SDavid Wu {
206349c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
206449c55878SDavid Wu 
206549c55878SDavid Wu 	*regmap = priv->regmap_base;
206649c55878SDavid Wu 	*reg = RK2928_PULL_OFFSET;
206749c55878SDavid Wu 	*reg += bank->bank_num * RK2928_PULL_BANK_STRIDE;
206849c55878SDavid Wu 	*reg += (pin_num / RK2928_PULL_PINS_PER_REG) * 4;
206949c55878SDavid Wu 
207049c55878SDavid Wu 	*bit = pin_num % RK2928_PULL_PINS_PER_REG;
207149c55878SDavid Wu };
207249c55878SDavid Wu 
207349c55878SDavid Wu #define RK3128_PULL_OFFSET	0x118
207449c55878SDavid Wu 
207549c55878SDavid Wu static void rk3128_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
207649c55878SDavid Wu 					 int pin_num, struct regmap **regmap,
207749c55878SDavid Wu 					 int *reg, u8 *bit)
207849c55878SDavid Wu {
207949c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
208049c55878SDavid Wu 
208149c55878SDavid Wu 	*regmap = priv->regmap_base;
208249c55878SDavid Wu 	*reg = RK3128_PULL_OFFSET;
208349c55878SDavid Wu 	*reg += bank->bank_num * RK2928_PULL_BANK_STRIDE;
208449c55878SDavid Wu 	*reg += ((pin_num / RK2928_PULL_PINS_PER_REG) * 4);
208549c55878SDavid Wu 
208649c55878SDavid Wu 	*bit = pin_num % RK2928_PULL_PINS_PER_REG;
208749c55878SDavid Wu }
208849c55878SDavid Wu 
208949c55878SDavid Wu #define RK3188_PULL_OFFSET		0x164
209049c55878SDavid Wu #define RK3188_PULL_BITS_PER_PIN	2
209149c55878SDavid Wu #define RK3188_PULL_PINS_PER_REG	8
209249c55878SDavid Wu #define RK3188_PULL_BANK_STRIDE		16
209349c55878SDavid Wu #define RK3188_PULL_PMU_OFFSET		0x64
209449c55878SDavid Wu 
209549c55878SDavid Wu static void rk3188_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
209649c55878SDavid Wu 					 int pin_num, struct regmap **regmap,
209749c55878SDavid Wu 					 int *reg, u8 *bit)
209849c55878SDavid Wu {
209949c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
210049c55878SDavid Wu 
210149c55878SDavid Wu 	/* The first 12 pins of the first bank are located elsewhere */
210249c55878SDavid Wu 	if (bank->bank_num == 0 && pin_num < 12) {
210349c55878SDavid Wu 		*regmap = priv->regmap_pmu;
210449c55878SDavid Wu 		*reg = RK3188_PULL_PMU_OFFSET;
210549c55878SDavid Wu 
210649c55878SDavid Wu 		*reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4);
210749c55878SDavid Wu 		*bit = pin_num % RK3188_PULL_PINS_PER_REG;
210849c55878SDavid Wu 		*bit *= RK3188_PULL_BITS_PER_PIN;
210949c55878SDavid Wu 	} else {
211049c55878SDavid Wu 		*regmap = priv->regmap_base;
211149c55878SDavid Wu 		*reg = RK3188_PULL_OFFSET;
211249c55878SDavid Wu 
211349c55878SDavid Wu 		/* correct the offset, as it is the 2nd pull register */
211449c55878SDavid Wu 		*reg -= 4;
211549c55878SDavid Wu 		*reg += bank->bank_num * RK3188_PULL_BANK_STRIDE;
211649c55878SDavid Wu 		*reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4);
211749c55878SDavid Wu 
211849c55878SDavid Wu 		/*
211949c55878SDavid Wu 		 * The bits in these registers have an inverse ordering
212049c55878SDavid Wu 		 * with the lowest pin being in bits 15:14 and the highest
212149c55878SDavid Wu 		 * pin in bits 1:0
212249c55878SDavid Wu 		 */
212349c55878SDavid Wu 		*bit = 7 - (pin_num % RK3188_PULL_PINS_PER_REG);
212449c55878SDavid Wu 		*bit *= RK3188_PULL_BITS_PER_PIN;
212549c55878SDavid Wu 	}
212649c55878SDavid Wu }
212749c55878SDavid Wu 
212849c55878SDavid Wu #define RK3288_PULL_OFFSET		0x140
212949c55878SDavid Wu static void rk3288_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
213049c55878SDavid Wu 					 int pin_num, struct regmap **regmap,
213149c55878SDavid Wu 					 int *reg, u8 *bit)
213249c55878SDavid Wu {
213349c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
213449c55878SDavid Wu 
213549c55878SDavid Wu 	/* The first 24 pins of the first bank are located in PMU */
213649c55878SDavid Wu 	if (bank->bank_num == 0) {
213749c55878SDavid Wu 		*regmap = priv->regmap_pmu;
213849c55878SDavid Wu 		*reg = RK3188_PULL_PMU_OFFSET;
213949c55878SDavid Wu 
214049c55878SDavid Wu 		*reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4);
214149c55878SDavid Wu 		*bit = pin_num % RK3188_PULL_PINS_PER_REG;
214249c55878SDavid Wu 		*bit *= RK3188_PULL_BITS_PER_PIN;
214349c55878SDavid Wu 	} else {
214449c55878SDavid Wu 		*regmap = priv->regmap_base;
214549c55878SDavid Wu 		*reg = RK3288_PULL_OFFSET;
214649c55878SDavid Wu 
214749c55878SDavid Wu 		/* correct the offset, as we're starting with the 2nd bank */
214849c55878SDavid Wu 		*reg -= 0x10;
214949c55878SDavid Wu 		*reg += bank->bank_num * RK3188_PULL_BANK_STRIDE;
215049c55878SDavid Wu 		*reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4);
215149c55878SDavid Wu 
215249c55878SDavid Wu 		*bit = (pin_num % RK3188_PULL_PINS_PER_REG);
215349c55878SDavid Wu 		*bit *= RK3188_PULL_BITS_PER_PIN;
215449c55878SDavid Wu 	}
215549c55878SDavid Wu }
215649c55878SDavid Wu 
215749c55878SDavid Wu #define RK3288_DRV_PMU_OFFSET		0x70
215849c55878SDavid Wu #define RK3288_DRV_GRF_OFFSET		0x1c0
215949c55878SDavid Wu #define RK3288_DRV_BITS_PER_PIN		2
216049c55878SDavid Wu #define RK3288_DRV_PINS_PER_REG		8
216149c55878SDavid Wu #define RK3288_DRV_BANK_STRIDE		16
216249c55878SDavid Wu 
216349c55878SDavid Wu static void rk3288_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
216449c55878SDavid Wu 					int pin_num, struct regmap **regmap,
216549c55878SDavid Wu 					int *reg, u8 *bit)
216649c55878SDavid Wu {
216749c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
216849c55878SDavid Wu 
216949c55878SDavid Wu 	/* The first 24 pins of the first bank are located in PMU */
217049c55878SDavid Wu 	if (bank->bank_num == 0) {
217149c55878SDavid Wu 		*regmap = priv->regmap_pmu;
217249c55878SDavid Wu 		*reg = RK3288_DRV_PMU_OFFSET;
217349c55878SDavid Wu 
217449c55878SDavid Wu 		*reg += ((pin_num / RK3288_DRV_PINS_PER_REG) * 4);
217549c55878SDavid Wu 		*bit = pin_num % RK3288_DRV_PINS_PER_REG;
217649c55878SDavid Wu 		*bit *= RK3288_DRV_BITS_PER_PIN;
217749c55878SDavid Wu 	} else {
217849c55878SDavid Wu 		*regmap = priv->regmap_base;
217949c55878SDavid Wu 		*reg = RK3288_DRV_GRF_OFFSET;
218049c55878SDavid Wu 
218149c55878SDavid Wu 		/* correct the offset, as we're starting with the 2nd bank */
218249c55878SDavid Wu 		*reg -= 0x10;
218349c55878SDavid Wu 		*reg += bank->bank_num * RK3288_DRV_BANK_STRIDE;
218449c55878SDavid Wu 		*reg += ((pin_num / RK3288_DRV_PINS_PER_REG) * 4);
218549c55878SDavid Wu 
218649c55878SDavid Wu 		*bit = (pin_num % RK3288_DRV_PINS_PER_REG);
218749c55878SDavid Wu 		*bit *= RK3288_DRV_BITS_PER_PIN;
218849c55878SDavid Wu 	}
218949c55878SDavid Wu }
219049c55878SDavid Wu 
219149c55878SDavid Wu #define RK3228_PULL_OFFSET		0x100
219249c55878SDavid Wu 
219349c55878SDavid Wu static void rk3228_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 = RK3228_PULL_OFFSET;
220149c55878SDavid Wu 	*reg += bank->bank_num * RK3188_PULL_BANK_STRIDE;
220249c55878SDavid Wu 	*reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4);
220349c55878SDavid Wu 
220449c55878SDavid Wu 	*bit = (pin_num % RK3188_PULL_PINS_PER_REG);
220549c55878SDavid Wu 	*bit *= RK3188_PULL_BITS_PER_PIN;
220649c55878SDavid Wu }
220749c55878SDavid Wu 
220849c55878SDavid Wu #define RK3228_DRV_GRF_OFFSET		0x200
220949c55878SDavid Wu 
221049c55878SDavid Wu static void rk3228_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
221149c55878SDavid Wu 					int pin_num, struct regmap **regmap,
221249c55878SDavid Wu 					int *reg, u8 *bit)
221349c55878SDavid Wu {
221449c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
221549c55878SDavid Wu 
221649c55878SDavid Wu 	*regmap = priv->regmap_base;
221749c55878SDavid Wu 	*reg = RK3228_DRV_GRF_OFFSET;
221849c55878SDavid Wu 	*reg += bank->bank_num * RK3288_DRV_BANK_STRIDE;
221949c55878SDavid Wu 	*reg += ((pin_num / RK3288_DRV_PINS_PER_REG) * 4);
222049c55878SDavid Wu 
222149c55878SDavid Wu 	*bit = (pin_num % RK3288_DRV_PINS_PER_REG);
222249c55878SDavid Wu 	*bit *= RK3288_DRV_BITS_PER_PIN;
222349c55878SDavid Wu }
222449c55878SDavid Wu 
2225b3077611SDavid Wu #define RK3308_PULL_OFFSET		0xa0
2226b3077611SDavid Wu 
2227b3077611SDavid Wu static void rk3308_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
2228b3077611SDavid Wu 					 int pin_num, struct regmap **regmap,
2229b3077611SDavid Wu 					 int *reg, u8 *bit)
2230b3077611SDavid Wu {
2231b3077611SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
2232b3077611SDavid Wu 
2233b3077611SDavid Wu 	*regmap = priv->regmap_base;
2234b3077611SDavid Wu 	*reg = RK3308_PULL_OFFSET;
2235b3077611SDavid Wu 	*reg += bank->bank_num * RK3188_PULL_BANK_STRIDE;
2236b3077611SDavid Wu 	*reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4);
2237b3077611SDavid Wu 
2238b3077611SDavid Wu 	*bit = (pin_num % RK3188_PULL_PINS_PER_REG);
2239b3077611SDavid Wu 	*bit *= RK3188_PULL_BITS_PER_PIN;
2240b3077611SDavid Wu }
2241b3077611SDavid Wu 
2242b3077611SDavid Wu #define RK3308_DRV_GRF_OFFSET		0x100
2243b3077611SDavid Wu 
2244b3077611SDavid Wu static void rk3308_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
2245b3077611SDavid Wu 					int pin_num, struct regmap **regmap,
2246b3077611SDavid Wu 					int *reg, u8 *bit)
2247b3077611SDavid Wu {
2248b3077611SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
2249b3077611SDavid Wu 
2250b3077611SDavid Wu 	*regmap = priv->regmap_base;
2251b3077611SDavid Wu 	*reg = RK3308_DRV_GRF_OFFSET;
2252b3077611SDavid Wu 	*reg += bank->bank_num * RK3288_DRV_BANK_STRIDE;
2253b3077611SDavid Wu 	*reg += ((pin_num / RK3288_DRV_PINS_PER_REG) * 4);
2254b3077611SDavid Wu 
2255b3077611SDavid Wu 	*bit = (pin_num % RK3288_DRV_PINS_PER_REG);
2256b3077611SDavid Wu 	*bit *= RK3288_DRV_BITS_PER_PIN;
2257b3077611SDavid Wu }
2258b3077611SDavid Wu 
2259b3077611SDavid Wu #define RK3308_SCHMITT_PINS_PER_REG	8
2260b3077611SDavid Wu #define RK3308_SCHMITT_BANK_STRIDE	16
2261b3077611SDavid Wu #define RK3308_SCHMITT_GRF_OFFSET	0x1a0
2262b3077611SDavid Wu 
2263b3077611SDavid Wu static int rk3308_calc_schmitt_reg_and_bit(struct rockchip_pin_bank *bank,
2264b3077611SDavid Wu 					   int pin_num,
2265b3077611SDavid Wu 					   struct regmap **regmap,
2266b3077611SDavid Wu 					   int *reg, u8 *bit)
2267b3077611SDavid Wu {
2268b3077611SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
2269b3077611SDavid Wu 
2270b3077611SDavid Wu 	*regmap = priv->regmap_base;
2271b3077611SDavid Wu 	*reg = RK3308_SCHMITT_GRF_OFFSET;
2272b3077611SDavid Wu 
2273b3077611SDavid Wu 	*reg += bank->bank_num * RK3308_SCHMITT_BANK_STRIDE;
2274b3077611SDavid Wu 	*reg += ((pin_num / RK3308_SCHMITT_PINS_PER_REG) * 4);
2275b3077611SDavid Wu 	*bit = pin_num % RK3308_SCHMITT_PINS_PER_REG;
2276b3077611SDavid Wu 
2277b3077611SDavid Wu 	return 0;
2278b3077611SDavid Wu }
2279b3077611SDavid Wu 
228049c55878SDavid Wu #define RK3368_PULL_GRF_OFFSET		0x100
228149c55878SDavid Wu #define RK3368_PULL_PMU_OFFSET		0x10
228249c55878SDavid Wu 
228349c55878SDavid Wu static void rk3368_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
228449c55878SDavid Wu 					 int pin_num, struct regmap **regmap,
228549c55878SDavid Wu 					 int *reg, u8 *bit)
228649c55878SDavid Wu {
228749c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
228849c55878SDavid Wu 
228949c55878SDavid Wu 	/* The first 32 pins of the first bank are located in PMU */
229049c55878SDavid Wu 	if (bank->bank_num == 0) {
229149c55878SDavid Wu 		*regmap = priv->regmap_pmu;
229249c55878SDavid Wu 		*reg = RK3368_PULL_PMU_OFFSET;
229349c55878SDavid Wu 
229449c55878SDavid Wu 		*reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4);
229549c55878SDavid Wu 		*bit = pin_num % RK3188_PULL_PINS_PER_REG;
229649c55878SDavid Wu 		*bit *= RK3188_PULL_BITS_PER_PIN;
229749c55878SDavid Wu 	} else {
229849c55878SDavid Wu 		*regmap = priv->regmap_base;
229949c55878SDavid Wu 		*reg = RK3368_PULL_GRF_OFFSET;
230049c55878SDavid Wu 
230149c55878SDavid Wu 		/* correct the offset, as we're starting with the 2nd bank */
230249c55878SDavid Wu 		*reg -= 0x10;
230349c55878SDavid Wu 		*reg += bank->bank_num * RK3188_PULL_BANK_STRIDE;
230449c55878SDavid Wu 		*reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4);
230549c55878SDavid Wu 
230649c55878SDavid Wu 		*bit = (pin_num % RK3188_PULL_PINS_PER_REG);
230749c55878SDavid Wu 		*bit *= RK3188_PULL_BITS_PER_PIN;
230849c55878SDavid Wu 	}
230949c55878SDavid Wu }
231049c55878SDavid Wu 
231149c55878SDavid Wu #define RK3368_DRV_PMU_OFFSET		0x20
231249c55878SDavid Wu #define RK3368_DRV_GRF_OFFSET		0x200
231349c55878SDavid Wu 
231449c55878SDavid Wu static void rk3368_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
231549c55878SDavid Wu 					int pin_num, struct regmap **regmap,
231649c55878SDavid Wu 					int *reg, u8 *bit)
231749c55878SDavid Wu {
231849c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
231949c55878SDavid Wu 
232049c55878SDavid Wu 	/* The first 32 pins of the first bank are located in PMU */
232149c55878SDavid Wu 	if (bank->bank_num == 0) {
232249c55878SDavid Wu 		*regmap = priv->regmap_pmu;
232349c55878SDavid Wu 		*reg = RK3368_DRV_PMU_OFFSET;
232449c55878SDavid Wu 
232549c55878SDavid Wu 		*reg += ((pin_num / RK3288_DRV_PINS_PER_REG) * 4);
232649c55878SDavid Wu 		*bit = pin_num % RK3288_DRV_PINS_PER_REG;
232749c55878SDavid Wu 		*bit *= RK3288_DRV_BITS_PER_PIN;
232849c55878SDavid Wu 	} else {
232949c55878SDavid Wu 		*regmap = priv->regmap_base;
233049c55878SDavid Wu 		*reg = RK3368_DRV_GRF_OFFSET;
233149c55878SDavid Wu 
233249c55878SDavid Wu 		/* correct the offset, as we're starting with the 2nd bank */
233349c55878SDavid Wu 		*reg -= 0x10;
233449c55878SDavid Wu 		*reg += bank->bank_num * RK3288_DRV_BANK_STRIDE;
233549c55878SDavid Wu 		*reg += ((pin_num / RK3288_DRV_PINS_PER_REG) * 4);
233649c55878SDavid Wu 
233749c55878SDavid Wu 		*bit = (pin_num % RK3288_DRV_PINS_PER_REG);
233849c55878SDavid Wu 		*bit *= RK3288_DRV_BITS_PER_PIN;
233949c55878SDavid Wu 	}
234049c55878SDavid Wu }
234149c55878SDavid Wu 
234249c55878SDavid Wu #define RK3399_PULL_GRF_OFFSET		0xe040
234349c55878SDavid Wu #define RK3399_PULL_PMU_OFFSET		0x40
234449c55878SDavid Wu #define RK3399_DRV_3BITS_PER_PIN	3
234549c55878SDavid Wu 
234649c55878SDavid Wu static void rk3399_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
234749c55878SDavid Wu 					 int pin_num, struct regmap **regmap,
234849c55878SDavid Wu 					 int *reg, u8 *bit)
234949c55878SDavid Wu {
235049c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
235149c55878SDavid Wu 
235249c55878SDavid Wu 	/* The bank0:16 and bank1:32 pins are located in PMU */
235349c55878SDavid Wu 	if ((bank->bank_num == 0) || (bank->bank_num == 1)) {
235449c55878SDavid Wu 		*regmap = priv->regmap_pmu;
235549c55878SDavid Wu 		*reg = RK3399_PULL_PMU_OFFSET;
235649c55878SDavid Wu 
235749c55878SDavid Wu 		*reg += bank->bank_num * RK3188_PULL_BANK_STRIDE;
235849c55878SDavid Wu 
235949c55878SDavid Wu 		*reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4);
236049c55878SDavid Wu 		*bit = pin_num % RK3188_PULL_PINS_PER_REG;
236149c55878SDavid Wu 		*bit *= RK3188_PULL_BITS_PER_PIN;
236249c55878SDavid Wu 	} else {
236349c55878SDavid Wu 		*regmap = priv->regmap_base;
236449c55878SDavid Wu 		*reg = RK3399_PULL_GRF_OFFSET;
236549c55878SDavid Wu 
236649c55878SDavid Wu 		/* correct the offset, as we're starting with the 3rd bank */
236749c55878SDavid Wu 		*reg -= 0x20;
236849c55878SDavid Wu 		*reg += bank->bank_num * RK3188_PULL_BANK_STRIDE;
236949c55878SDavid Wu 		*reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4);
237049c55878SDavid Wu 
237149c55878SDavid Wu 		*bit = (pin_num % RK3188_PULL_PINS_PER_REG);
237249c55878SDavid Wu 		*bit *= RK3188_PULL_BITS_PER_PIN;
237349c55878SDavid Wu 	}
237449c55878SDavid Wu }
237549c55878SDavid Wu 
237649c55878SDavid Wu static void rk3399_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
237749c55878SDavid Wu 					int pin_num, struct regmap **regmap,
237849c55878SDavid Wu 					int *reg, u8 *bit)
237949c55878SDavid Wu {
238049c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
238149c55878SDavid Wu 	int drv_num = (pin_num / 8);
238249c55878SDavid Wu 
238349c55878SDavid Wu 	/*  The bank0:16 and bank1:32 pins are located in PMU */
238449c55878SDavid Wu 	if ((bank->bank_num == 0) || (bank->bank_num == 1))
238549c55878SDavid Wu 		*regmap = priv->regmap_pmu;
238649c55878SDavid Wu 	else
238749c55878SDavid Wu 		*regmap = priv->regmap_base;
238849c55878SDavid Wu 
238949c55878SDavid Wu 	*reg = bank->drv[drv_num].offset;
239049c55878SDavid Wu 	if ((bank->drv[drv_num].drv_type == DRV_TYPE_IO_1V8_3V0_AUTO) ||
239149c55878SDavid Wu 	    (bank->drv[drv_num].drv_type == DRV_TYPE_IO_3V3_ONLY))
239249c55878SDavid Wu 		*bit = (pin_num % 8) * 3;
239349c55878SDavid Wu 	else
239449c55878SDavid Wu 		*bit = (pin_num % 8) * 2;
239549c55878SDavid Wu }
239649c55878SDavid Wu 
239749c55878SDavid Wu static int rockchip_perpin_drv_list[DRV_TYPE_MAX][8] = {
239849c55878SDavid Wu 	{ 2, 4, 8, 12, -1, -1, -1, -1 },
239949c55878SDavid Wu 	{ 3, 6, 9, 12, -1, -1, -1, -1 },
240049c55878SDavid Wu 	{ 5, 10, 15, 20, -1, -1, -1, -1 },
240149c55878SDavid Wu 	{ 4, 6, 8, 10, 12, 14, 16, 18 },
240249c55878SDavid Wu 	{ 4, 7, 10, 13, 16, 19, 22, 26 }
240349c55878SDavid Wu };
240449c55878SDavid Wu 
240549c55878SDavid Wu static int rockchip_set_drive_perpin(struct rockchip_pin_bank *bank,
240649c55878SDavid Wu 				     int pin_num, int strength)
240749c55878SDavid Wu {
240849c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
240949c55878SDavid Wu 	struct rockchip_pin_ctrl *ctrl = priv->ctrl;
241049c55878SDavid Wu 	struct regmap *regmap;
241149c55878SDavid Wu 	int reg, ret, i;
241249c55878SDavid Wu 	u32 data, rmask_bits, temp;
241349c55878SDavid Wu 	u8 bit;
24142c16899dSDavid.Wu 	/* Where need to clean the special mask for rockchip_perpin_drv_list */
24152c16899dSDavid.Wu 	int drv_type = bank->drv[pin_num / 8].drv_type & (~DRV_TYPE_IO_MASK);
241649c55878SDavid Wu 
241749c55878SDavid Wu 	debug("setting drive of GPIO%d-%d to %d\n", bank->bank_num,
241849c55878SDavid Wu 	      pin_num, strength);
241949c55878SDavid Wu 
242049c55878SDavid Wu 	ctrl->drv_calc_reg(bank, pin_num, &regmap, &reg, &bit);
2421d499d466SJianqun Xu 	if (ctrl->type == RV1126) {
2422d499d466SJianqun Xu 		rmask_bits = RV1126_DRV_BITS_PER_PIN;
2423d499d466SJianqun Xu 		ret = strength;
2424d499d466SJianqun Xu 		goto config;
2425d499d466SJianqun Xu 	}
242649c55878SDavid Wu 
242749c55878SDavid Wu 	ret = -EINVAL;
242849c55878SDavid Wu 	for (i = 0; i < ARRAY_SIZE(rockchip_perpin_drv_list[drv_type]); i++) {
242949c55878SDavid Wu 		if (rockchip_perpin_drv_list[drv_type][i] == strength) {
243049c55878SDavid Wu 			ret = i;
243149c55878SDavid Wu 			break;
243249c55878SDavid Wu 		} else if (rockchip_perpin_drv_list[drv_type][i] < 0) {
243349c55878SDavid Wu 			ret = rockchip_perpin_drv_list[drv_type][i];
243449c55878SDavid Wu 			break;
243549c55878SDavid Wu 		}
243649c55878SDavid Wu 	}
243749c55878SDavid Wu 
243849c55878SDavid Wu 	if (ret < 0) {
243949c55878SDavid Wu 		debug("unsupported driver strength %d\n", strength);
244049c55878SDavid Wu 		return ret;
244149c55878SDavid Wu 	}
244249c55878SDavid Wu 
244349c55878SDavid Wu 	switch (drv_type) {
244449c55878SDavid Wu 	case DRV_TYPE_IO_1V8_3V0_AUTO:
244549c55878SDavid Wu 	case DRV_TYPE_IO_3V3_ONLY:
244649c55878SDavid Wu 		rmask_bits = RK3399_DRV_3BITS_PER_PIN;
244749c55878SDavid Wu 		switch (bit) {
244849c55878SDavid Wu 		case 0 ... 12:
244949c55878SDavid Wu 			/* regular case, nothing to do */
245049c55878SDavid Wu 			break;
245149c55878SDavid Wu 		case 15:
245249c55878SDavid Wu 			/*
245349c55878SDavid Wu 			 * drive-strength offset is special, as it is spread
245449c55878SDavid Wu 			 * over 2 registers, the bit data[15] contains bit 0
245549c55878SDavid Wu 			 * of the value while temp[1:0] contains bits 2 and 1
245649c55878SDavid Wu 			 */
245749c55878SDavid Wu 			data = (ret & 0x1) << 15;
245849c55878SDavid Wu 			temp = (ret >> 0x1) & 0x3;
245949c55878SDavid Wu 
246049c55878SDavid Wu 			data |= BIT(31);
246149c55878SDavid Wu 			ret = regmap_write(regmap, reg, data);
246249c55878SDavid Wu 			if (ret)
246349c55878SDavid Wu 				return ret;
246449c55878SDavid Wu 
246549c55878SDavid Wu 			temp |= (0x3 << 16);
246649c55878SDavid Wu 			reg += 0x4;
246749c55878SDavid Wu 			ret = regmap_write(regmap, reg, temp);
246849c55878SDavid Wu 
246949c55878SDavid Wu 			return ret;
247049c55878SDavid Wu 		case 18 ... 21:
247149c55878SDavid Wu 			/* setting fully enclosed in the second register */
247249c55878SDavid Wu 			reg += 4;
247349c55878SDavid Wu 			bit -= 16;
247449c55878SDavid Wu 			break;
247549c55878SDavid Wu 		default:
247649c55878SDavid Wu 			debug("unsupported bit: %d for pinctrl drive type: %d\n",
247749c55878SDavid Wu 			      bit, drv_type);
247849c55878SDavid Wu 			return -EINVAL;
247949c55878SDavid Wu 		}
248049c55878SDavid Wu 		break;
248149c55878SDavid Wu 	case DRV_TYPE_IO_DEFAULT:
248249c55878SDavid Wu 	case DRV_TYPE_IO_1V8_OR_3V0:
248349c55878SDavid Wu 	case DRV_TYPE_IO_1V8_ONLY:
248449c55878SDavid Wu 		rmask_bits = RK3288_DRV_BITS_PER_PIN;
248549c55878SDavid Wu 		break;
248649c55878SDavid Wu 	default:
248749c55878SDavid Wu 		debug("unsupported pinctrl drive type: %d\n",
248849c55878SDavid Wu 		      drv_type);
248949c55878SDavid Wu 		return -EINVAL;
249049c55878SDavid Wu 	}
249149c55878SDavid Wu 
2492d499d466SJianqun Xu config:
249355a89bc6SDavid Wu 	if (bank->drv[pin_num / 8].drv_type & DRV_TYPE_WRITABLE_32BIT) {
249455a89bc6SDavid Wu 		regmap_read(regmap, reg, &data);
249555a89bc6SDavid Wu 		data &= ~(((1 << rmask_bits) - 1) << bit);
249655a89bc6SDavid Wu 	} else {
249749c55878SDavid Wu 		/* enable the write to the equivalent lower bits */
249849c55878SDavid Wu 		data = ((1 << rmask_bits) - 1) << (bit + 16);
249955a89bc6SDavid Wu 	}
250049c55878SDavid Wu 
250155a89bc6SDavid Wu 	data |= (ret << bit);
250249c55878SDavid Wu 	ret = regmap_write(regmap, reg, data);
250349c55878SDavid Wu 	return ret;
250449c55878SDavid Wu }
250549c55878SDavid Wu 
250649c55878SDavid Wu static int rockchip_pull_list[PULL_TYPE_MAX][4] = {
250749c55878SDavid Wu 	{
250849c55878SDavid Wu 		PIN_CONFIG_BIAS_DISABLE,
250949c55878SDavid Wu 		PIN_CONFIG_BIAS_PULL_UP,
251049c55878SDavid Wu 		PIN_CONFIG_BIAS_PULL_DOWN,
251149c55878SDavid Wu 		PIN_CONFIG_BIAS_BUS_HOLD
251249c55878SDavid Wu 	},
251349c55878SDavid Wu 	{
251449c55878SDavid Wu 		PIN_CONFIG_BIAS_DISABLE,
251549c55878SDavid Wu 		PIN_CONFIG_BIAS_PULL_DOWN,
251649c55878SDavid Wu 		PIN_CONFIG_BIAS_DISABLE,
251749c55878SDavid Wu 		PIN_CONFIG_BIAS_PULL_UP
251849c55878SDavid Wu 	},
251949c55878SDavid Wu };
252049c55878SDavid Wu 
252149c55878SDavid Wu static int rockchip_set_pull(struct rockchip_pin_bank *bank,
252249c55878SDavid Wu 			     int pin_num, int pull)
252349c55878SDavid Wu {
252449c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
252549c55878SDavid Wu 	struct rockchip_pin_ctrl *ctrl = priv->ctrl;
252649c55878SDavid Wu 	struct regmap *regmap;
252749c55878SDavid Wu 	int reg, ret, i, pull_type;
252849c55878SDavid Wu 	u8 bit;
252949c55878SDavid Wu 	u32 data;
253049c55878SDavid Wu 
253149c55878SDavid Wu 	debug("setting pull of GPIO%d-%d to %d\n", bank->bank_num,
253249c55878SDavid Wu 	      pin_num, pull);
253349c55878SDavid Wu 
253449c55878SDavid Wu 	/* rk3066b does support any pulls */
253549c55878SDavid Wu 	if (ctrl->type == RK3066B)
253649c55878SDavid Wu 		return pull ? -EINVAL : 0;
253749c55878SDavid Wu 
253849c55878SDavid Wu 	ctrl->pull_calc_reg(bank, pin_num, &regmap, &reg, &bit);
253949c55878SDavid Wu 
254049c55878SDavid Wu 	switch (ctrl->type) {
254149c55878SDavid Wu 	case RK2928:
254249c55878SDavid Wu 	case RK3128:
254349c55878SDavid Wu 		data = BIT(bit + 16);
254449c55878SDavid Wu 		if (pull == PIN_CONFIG_BIAS_DISABLE)
254549c55878SDavid Wu 			data |= BIT(bit);
254649c55878SDavid Wu 		ret = regmap_write(regmap, reg, data);
254749c55878SDavid Wu 		break;
254849c55878SDavid Wu 	case PX30:
254949c55878SDavid Wu 	case RV1108:
2550cf04a17bSJianqun Xu 	case RV1126:
2551a2a3fc8fSJianqun Xu 	case RK1808:
255249c55878SDavid Wu 	case RK3188:
255349c55878SDavid Wu 	case RK3288:
2554b3077611SDavid Wu 	case RK3308:
255549c55878SDavid Wu 	case RK3368:
255649c55878SDavid Wu 	case RK3399:
25572c16899dSDavid.Wu 		/*
25582c16899dSDavid.Wu 		 * Where need to clean the special mask for
25592c16899dSDavid.Wu 		 * rockchip_pull_list.
25602c16899dSDavid.Wu 		 */
25612c16899dSDavid.Wu 		pull_type = bank->pull_type[pin_num / 8] & (~PULL_TYPE_IO_MASK);
256249c55878SDavid Wu 		ret = -EINVAL;
256349c55878SDavid Wu 		for (i = 0; i < ARRAY_SIZE(rockchip_pull_list[pull_type]);
256449c55878SDavid Wu 			i++) {
256549c55878SDavid Wu 			if (rockchip_pull_list[pull_type][i] == pull) {
256649c55878SDavid Wu 				ret = i;
256749c55878SDavid Wu 				break;
256849c55878SDavid Wu 			}
256949c55878SDavid Wu 		}
257049c55878SDavid Wu 
257149c55878SDavid Wu 		if (ret < 0) {
257249c55878SDavid Wu 			debug("unsupported pull setting %d\n", pull);
257349c55878SDavid Wu 			return ret;
257449c55878SDavid Wu 		}
257549c55878SDavid Wu 
257655a89bc6SDavid Wu 		if (bank->pull_type[pin_num / 8] & PULL_TYPE_WRITABLE_32BIT) {
257755a89bc6SDavid Wu 			regmap_read(regmap, reg, &data);
257855a89bc6SDavid Wu 			data &= ~(((1 << RK3188_PULL_BITS_PER_PIN) - 1) << bit);
257955a89bc6SDavid Wu 		} else {
258049c55878SDavid Wu 			/* enable the write to the equivalent lower bits */
258149c55878SDavid Wu 			data = ((1 << RK3188_PULL_BITS_PER_PIN) - 1) << (bit + 16);
258255a89bc6SDavid Wu 		}
258349c55878SDavid Wu 
258455a89bc6SDavid Wu 		data |= (ret << bit);
258549c55878SDavid Wu 		ret = regmap_write(regmap, reg, data);
258649c55878SDavid Wu 		break;
258749c55878SDavid Wu 	default:
258849c55878SDavid Wu 		debug("unsupported pinctrl type\n");
258949c55878SDavid Wu 		return -EINVAL;
259049c55878SDavid Wu 	}
259149c55878SDavid Wu 
259249c55878SDavid Wu 	return ret;
259349c55878SDavid Wu }
259449c55878SDavid Wu 
259549c55878SDavid Wu #define RK3328_SCHMITT_BITS_PER_PIN		1
259649c55878SDavid Wu #define RK3328_SCHMITT_PINS_PER_REG		16
259749c55878SDavid Wu #define RK3328_SCHMITT_BANK_STRIDE		8
259849c55878SDavid Wu #define RK3328_SCHMITT_GRF_OFFSET		0x380
259949c55878SDavid Wu 
260049c55878SDavid Wu static int rk3328_calc_schmitt_reg_and_bit(struct rockchip_pin_bank *bank,
260149c55878SDavid Wu 					   int pin_num,
260249c55878SDavid Wu 					   struct regmap **regmap,
260349c55878SDavid Wu 					   int *reg, u8 *bit)
260449c55878SDavid Wu {
260549c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
260649c55878SDavid Wu 
260749c55878SDavid Wu 	*regmap = priv->regmap_base;
260849c55878SDavid Wu 	*reg = RK3328_SCHMITT_GRF_OFFSET;
260949c55878SDavid Wu 
261049c55878SDavid Wu 	*reg += bank->bank_num * RK3328_SCHMITT_BANK_STRIDE;
261149c55878SDavid Wu 	*reg += ((pin_num / RK3328_SCHMITT_PINS_PER_REG) * 4);
261249c55878SDavid Wu 	*bit = pin_num % RK3328_SCHMITT_PINS_PER_REG;
261349c55878SDavid Wu 
261449c55878SDavid Wu 	return 0;
261549c55878SDavid Wu }
261649c55878SDavid Wu 
261749c55878SDavid Wu static int rockchip_set_schmitt(struct rockchip_pin_bank *bank,
261849c55878SDavid Wu 				int pin_num, int enable)
261949c55878SDavid Wu {
262049c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
262149c55878SDavid Wu 	struct rockchip_pin_ctrl *ctrl = priv->ctrl;
262249c55878SDavid Wu 	struct regmap *regmap;
262349c55878SDavid Wu 	int reg, ret;
262449c55878SDavid Wu 	u8 bit;
262549c55878SDavid Wu 	u32 data;
262649c55878SDavid Wu 
262749c55878SDavid Wu 	debug("setting input schmitt of GPIO%d-%d to %d\n", bank->bank_num,
262849c55878SDavid Wu 	      pin_num, enable);
262949c55878SDavid Wu 
263049c55878SDavid Wu 	ret = ctrl->schmitt_calc_reg(bank, pin_num, &regmap, &reg, &bit);
263149c55878SDavid Wu 	if (ret)
263249c55878SDavid Wu 		return ret;
263349c55878SDavid Wu 
263449c55878SDavid Wu 	/* enable the write to the equivalent lower bits */
263549c55878SDavid Wu 	data = BIT(bit + 16) | (enable << bit);
263649c55878SDavid Wu 
263749c55878SDavid Wu 	return regmap_write(regmap, reg, data);
263849c55878SDavid Wu }
263949c55878SDavid Wu 
264032c25d1fSDavid Wu #define PX30_SLEW_RATE_PMU_OFFSET		0x30
264132c25d1fSDavid Wu #define PX30_SLEW_RATE_GRF_OFFSET		0x90
264232c25d1fSDavid Wu #define PX30_SLEW_RATE_PINS_PER_PMU_REG		16
264332c25d1fSDavid Wu #define PX30_SLEW_RATE_BANK_STRIDE		16
264432c25d1fSDavid Wu #define PX30_SLEW_RATE_PINS_PER_GRF_REG		8
264532c25d1fSDavid Wu 
264632c25d1fSDavid Wu static int px30_calc_slew_rate_reg_and_bit(struct rockchip_pin_bank *bank,
264732c25d1fSDavid Wu 					   int pin_num,
264832c25d1fSDavid Wu 					   struct regmap **regmap,
264932c25d1fSDavid Wu 					   int *reg, u8 *bit)
265032c25d1fSDavid Wu {
265132c25d1fSDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
265232c25d1fSDavid Wu 	int pins_per_reg;
265332c25d1fSDavid Wu 
265432c25d1fSDavid Wu 	if (bank->bank_num == 0) {
265532c25d1fSDavid Wu 		*regmap = priv->regmap_pmu;
265632c25d1fSDavid Wu 		*reg = PX30_SLEW_RATE_PMU_OFFSET;
265732c25d1fSDavid Wu 		pins_per_reg = PX30_SCHMITT_PINS_PER_PMU_REG;
265832c25d1fSDavid Wu 	} else {
265932c25d1fSDavid Wu 		*regmap = priv->regmap_base;
266032c25d1fSDavid Wu 		*reg = PX30_SCHMITT_GRF_OFFSET;
266132c25d1fSDavid Wu 		pins_per_reg = PX30_SCHMITT_PINS_PER_GRF_REG;
266232c25d1fSDavid Wu 		*reg += (bank->bank_num  - 1) * PX30_SCHMITT_BANK_STRIDE;
266332c25d1fSDavid Wu 	}
266432c25d1fSDavid Wu 	*reg += ((pin_num / pins_per_reg) * 4);
266532c25d1fSDavid Wu 	*bit = pin_num % pins_per_reg;
266632c25d1fSDavid Wu 
266732c25d1fSDavid Wu 	return 0;
266832c25d1fSDavid Wu }
266932c25d1fSDavid Wu 
267032c25d1fSDavid Wu static int rockchip_set_slew_rate(struct rockchip_pin_bank *bank,
267132c25d1fSDavid Wu 				  int pin_num, int speed)
267232c25d1fSDavid Wu {
267332c25d1fSDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
267432c25d1fSDavid Wu 	struct rockchip_pin_ctrl *ctrl = priv->ctrl;
267532c25d1fSDavid Wu 	struct regmap *regmap;
267632c25d1fSDavid Wu 	int reg, ret;
267732c25d1fSDavid Wu 	u8 bit;
267832c25d1fSDavid Wu 	u32 data;
267932c25d1fSDavid Wu 
268032c25d1fSDavid Wu 	debug("setting slew rate of GPIO%d-%d to %d\n", bank->bank_num,
268132c25d1fSDavid Wu 	      pin_num, speed);
268232c25d1fSDavid Wu 
268332c25d1fSDavid Wu 	ret = ctrl->slew_rate_calc_reg(bank, pin_num, &regmap, &reg, &bit);
268432c25d1fSDavid Wu 	if (ret)
268532c25d1fSDavid Wu 		return ret;
268632c25d1fSDavid Wu 
268732c25d1fSDavid Wu 	/* enable the write to the equivalent lower bits */
268832c25d1fSDavid Wu 	data = BIT(bit + 16) | (speed << bit);
268932c25d1fSDavid Wu 
269032c25d1fSDavid Wu 	return regmap_write(regmap, reg, data);
269132c25d1fSDavid Wu }
269232c25d1fSDavid Wu 
269349c55878SDavid Wu /*
269449c55878SDavid Wu  * Pinconf_ops handling
269549c55878SDavid Wu  */
269649c55878SDavid Wu static bool rockchip_pinconf_pull_valid(struct rockchip_pin_ctrl *ctrl,
269749c55878SDavid Wu 					unsigned int pull)
269849c55878SDavid Wu {
269949c55878SDavid Wu 	switch (ctrl->type) {
270049c55878SDavid Wu 	case RK2928:
270149c55878SDavid Wu 	case RK3128:
270249c55878SDavid Wu 		return (pull == PIN_CONFIG_BIAS_PULL_PIN_DEFAULT ||
270349c55878SDavid Wu 			pull == PIN_CONFIG_BIAS_DISABLE);
270449c55878SDavid Wu 	case RK3066B:
270549c55878SDavid Wu 		return pull ? false : true;
270649c55878SDavid Wu 	case PX30:
270749c55878SDavid Wu 	case RV1108:
2708cf04a17bSJianqun Xu 	case RV1126:
2709a2a3fc8fSJianqun Xu 	case RK1808:
271049c55878SDavid Wu 	case RK3188:
271149c55878SDavid Wu 	case RK3288:
2712b3077611SDavid Wu 	case RK3308:
271349c55878SDavid Wu 	case RK3368:
271449c55878SDavid Wu 	case RK3399:
271549c55878SDavid Wu 		return (pull != PIN_CONFIG_BIAS_PULL_PIN_DEFAULT);
271649c55878SDavid Wu 	}
271749c55878SDavid Wu 
271849c55878SDavid Wu 	return false;
271949c55878SDavid Wu }
272049c55878SDavid Wu 
272149c55878SDavid Wu /* set the pin config settings for a specified pin */
272249c55878SDavid Wu static int rockchip_pinconf_set(struct rockchip_pin_bank *bank,
272349c55878SDavid Wu 				u32 pin, u32 param, u32 arg)
272449c55878SDavid Wu {
272549c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
272649c55878SDavid Wu 	struct rockchip_pin_ctrl *ctrl = priv->ctrl;
272749c55878SDavid Wu 	int rc;
272849c55878SDavid Wu 
272949c55878SDavid Wu 	switch (param) {
273049c55878SDavid Wu 	case PIN_CONFIG_BIAS_DISABLE:
273149c55878SDavid Wu 		rc =  rockchip_set_pull(bank, pin, param);
273249c55878SDavid Wu 		if (rc)
273349c55878SDavid Wu 			return rc;
273449c55878SDavid Wu 		break;
273549c55878SDavid Wu 
273649c55878SDavid Wu 	case PIN_CONFIG_BIAS_PULL_UP:
273749c55878SDavid Wu 	case PIN_CONFIG_BIAS_PULL_DOWN:
273849c55878SDavid Wu 	case PIN_CONFIG_BIAS_PULL_PIN_DEFAULT:
273949c55878SDavid Wu 	case PIN_CONFIG_BIAS_BUS_HOLD:
274049c55878SDavid Wu 		if (!rockchip_pinconf_pull_valid(ctrl, param))
274149c55878SDavid Wu 			return -ENOTSUPP;
274249c55878SDavid Wu 
274349c55878SDavid Wu 		if (!arg)
274449c55878SDavid Wu 			return -EINVAL;
274549c55878SDavid Wu 
274649c55878SDavid Wu 		rc = rockchip_set_pull(bank, pin, param);
274749c55878SDavid Wu 		if (rc)
274849c55878SDavid Wu 			return rc;
274949c55878SDavid Wu 		break;
275049c55878SDavid Wu 
275149c55878SDavid Wu 	case PIN_CONFIG_DRIVE_STRENGTH:
275249c55878SDavid Wu 		if (!ctrl->drv_calc_reg)
275349c55878SDavid Wu 			return -ENOTSUPP;
275449c55878SDavid Wu 
275549c55878SDavid Wu 		rc = rockchip_set_drive_perpin(bank, pin, arg);
275649c55878SDavid Wu 		if (rc < 0)
275749c55878SDavid Wu 			return rc;
275849c55878SDavid Wu 		break;
275949c55878SDavid Wu 
276049c55878SDavid Wu 	case PIN_CONFIG_INPUT_SCHMITT_ENABLE:
276149c55878SDavid Wu 		if (!ctrl->schmitt_calc_reg)
276249c55878SDavid Wu 			return -ENOTSUPP;
276349c55878SDavid Wu 
276449c55878SDavid Wu 		rc = rockchip_set_schmitt(bank, pin, arg);
276549c55878SDavid Wu 		if (rc < 0)
276649c55878SDavid Wu 			return rc;
276749c55878SDavid Wu 		break;
276849c55878SDavid Wu 
276932c25d1fSDavid Wu 	case PIN_CONFIG_SLEW_RATE:
277032c25d1fSDavid Wu 		if (!ctrl->slew_rate_calc_reg)
277132c25d1fSDavid Wu 			return -ENOTSUPP;
277232c25d1fSDavid Wu 
277332c25d1fSDavid Wu 		rc = rockchip_set_slew_rate(bank,
277432c25d1fSDavid Wu 					    pin - bank->pin_base, arg);
277532c25d1fSDavid Wu 		if (rc < 0)
277632c25d1fSDavid Wu 			return rc;
277732c25d1fSDavid Wu 		break;
277832c25d1fSDavid Wu 
277949c55878SDavid Wu 	default:
278049c55878SDavid Wu 		break;
278149c55878SDavid Wu 	}
278249c55878SDavid Wu 
278349c55878SDavid Wu 	return 0;
278449c55878SDavid Wu }
278549c55878SDavid Wu 
278649c55878SDavid Wu static const struct pinconf_param rockchip_conf_params[] = {
278749c55878SDavid Wu 	{ "bias-disable", PIN_CONFIG_BIAS_DISABLE, 0 },
278849c55878SDavid Wu 	{ "bias-bus-hold", PIN_CONFIG_BIAS_BUS_HOLD, 0 },
278949c55878SDavid Wu 	{ "bias-pull-up", PIN_CONFIG_BIAS_PULL_UP, 1 },
279049c55878SDavid Wu 	{ "bias-pull-down", PIN_CONFIG_BIAS_PULL_DOWN, 1 },
279149c55878SDavid Wu 	{ "drive-strength", PIN_CONFIG_DRIVE_STRENGTH, 0 },
279249c55878SDavid Wu 	{ "input-enable", PIN_CONFIG_INPUT_ENABLE, 1 },
279349c55878SDavid Wu 	{ "input-disable", PIN_CONFIG_INPUT_ENABLE, 0 },
279449c55878SDavid Wu 	{ "input-schmitt-disable", PIN_CONFIG_INPUT_SCHMITT_ENABLE, 0 },
279549c55878SDavid Wu 	{ "input-schmitt-enable", PIN_CONFIG_INPUT_SCHMITT_ENABLE, 1 },
279632c25d1fSDavid Wu 	{ "slew-rate", PIN_CONFIG_SLEW_RATE, 0 },
279749c55878SDavid Wu };
279849c55878SDavid Wu 
279949c55878SDavid Wu static int rockchip_pinconf_prop_name_to_param(const char *property,
280049c55878SDavid Wu 					       u32 *default_value)
280149c55878SDavid Wu {
280249c55878SDavid Wu 	const struct pinconf_param *p, *end;
280349c55878SDavid Wu 
280449c55878SDavid Wu 	p = rockchip_conf_params;
280549c55878SDavid Wu 	end = p + sizeof(rockchip_conf_params) / sizeof(struct pinconf_param);
280649c55878SDavid Wu 
280749c55878SDavid Wu 	/* See if this pctldev supports this parameter */
280849c55878SDavid Wu 	for (; p < end; p++) {
280949c55878SDavid Wu 		if (!strcmp(property, p->property)) {
281049c55878SDavid Wu 			*default_value = p->default_value;
281149c55878SDavid Wu 			return p->param;
281249c55878SDavid Wu 		}
281349c55878SDavid Wu 	}
281449c55878SDavid Wu 
281549c55878SDavid Wu 	*default_value = 0;
281649c55878SDavid Wu 	return -EPERM;
281749c55878SDavid Wu }
281849c55878SDavid Wu 
281949c55878SDavid Wu static int rockchip_pinctrl_set_state(struct udevice *dev,
282049c55878SDavid Wu 				      struct udevice *config)
282149c55878SDavid Wu {
282249c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = dev_get_priv(dev);
282349c55878SDavid Wu 	struct rockchip_pin_ctrl *ctrl = priv->ctrl;
282449c55878SDavid Wu 	u32 cells[MAX_ROCKCHIP_PINS_ENTRIES * 4];
282549c55878SDavid Wu 	u32 bank, pin, mux, conf, arg, default_val;
282649c55878SDavid Wu 	int ret, count, i;
282749c55878SDavid Wu 	const char *prop_name;
282849c55878SDavid Wu 	const void *value;
28292208cfa9SKever Yang 	int prop_len, param;
28302208cfa9SKever Yang 	const u32 *data;
28312208cfa9SKever Yang 	ofnode node;
2832d2e2dbd6SJason Zhu #if defined(CONFIG_OF_LIVE) && !defined(CONFIG_SPL_BUILD)
28332208cfa9SKever Yang 	const struct device_node *np;
28342208cfa9SKever Yang 	struct property *pp;
28352208cfa9SKever Yang #else
28362208cfa9SKever Yang 	int property_offset, pcfg_node;
28372208cfa9SKever Yang 	const void *blob = gd->fdt_blob;
28382208cfa9SKever Yang #endif
28392208cfa9SKever Yang 	data = dev_read_prop(config, "rockchip,pins", &count);
284049c55878SDavid Wu 	if (count < 0) {
284187f0ac57SDavid Wu 		debug("%s: bad array size %d\n", __func__, count);
284249c55878SDavid Wu 		return -EINVAL;
284349c55878SDavid Wu 	}
284449c55878SDavid Wu 
284587f0ac57SDavid Wu 	count /= sizeof(u32);
284649c55878SDavid Wu 	if (count > MAX_ROCKCHIP_PINS_ENTRIES * 4) {
284749c55878SDavid Wu 		debug("%s: unsupported pins array count %d\n",
284849c55878SDavid Wu 		      __func__, count);
284949c55878SDavid Wu 		return -EINVAL;
285049c55878SDavid Wu 	}
285149c55878SDavid Wu 
285287f0ac57SDavid Wu 	for (i = 0; i < count; i++)
285387f0ac57SDavid Wu 		cells[i] = fdt32_to_cpu(data[i]);
285487f0ac57SDavid Wu 
285549c55878SDavid Wu 	for (i = 0; i < (count >> 2); i++) {
285649c55878SDavid Wu 		bank = cells[4 * i + 0];
285749c55878SDavid Wu 		pin = cells[4 * i + 1];
285849c55878SDavid Wu 		mux = cells[4 * i + 2];
285949c55878SDavid Wu 		conf = cells[4 * i + 3];
286049c55878SDavid Wu 
286149c55878SDavid Wu 		ret = rockchip_verify_config(dev, bank, pin);
286249c55878SDavid Wu 		if (ret)
286349c55878SDavid Wu 			return ret;
286449c55878SDavid Wu 
286549c55878SDavid Wu 		ret = rockchip_set_mux(&ctrl->pin_banks[bank], pin, mux);
286649c55878SDavid Wu 		if (ret)
286749c55878SDavid Wu 			return ret;
286849c55878SDavid Wu 
28692208cfa9SKever Yang 		node = ofnode_get_by_phandle(conf);
28702208cfa9SKever Yang 		if (!ofnode_valid(node))
287149c55878SDavid Wu 			return -ENODEV;
2872d2e2dbd6SJason Zhu #if defined(CONFIG_OF_LIVE) && !defined(CONFIG_SPL_BUILD)
28732208cfa9SKever Yang 		np = ofnode_to_np(node);
28742208cfa9SKever Yang 		for (pp = np->properties; pp; pp = pp->next) {
28752208cfa9SKever Yang 			prop_name = pp->name;
28762208cfa9SKever Yang 			prop_len = pp->length;
28772208cfa9SKever Yang 			value = pp->value;
28782208cfa9SKever Yang #else
28792208cfa9SKever Yang 		pcfg_node = ofnode_to_offset(node);
288049c55878SDavid Wu 		fdt_for_each_property_offset(property_offset, blob, pcfg_node) {
288149c55878SDavid Wu 			value = fdt_getprop_by_offset(blob, property_offset,
288249c55878SDavid Wu 						      &prop_name, &prop_len);
288349c55878SDavid Wu 			if (!value)
288449c55878SDavid Wu 				return -ENOENT;
28852208cfa9SKever Yang #endif
288649c55878SDavid Wu 			param = rockchip_pinconf_prop_name_to_param(prop_name,
288749c55878SDavid Wu 								    &default_val);
288849c55878SDavid Wu 			if (param < 0)
288949c55878SDavid Wu 				break;
289049c55878SDavid Wu 
289149c55878SDavid Wu 			if (prop_len >= sizeof(fdt32_t))
289249c55878SDavid Wu 				arg = fdt32_to_cpu(*(fdt32_t *)value);
289349c55878SDavid Wu 			else
289449c55878SDavid Wu 				arg = default_val;
289549c55878SDavid Wu 
289649c55878SDavid Wu 			ret = rockchip_pinconf_set(&ctrl->pin_banks[bank], pin,
289749c55878SDavid Wu 						   param, arg);
289849c55878SDavid Wu 			if (ret) {
289949c55878SDavid Wu 				debug("%s: rockchip_pinconf_set fail: %d\n",
290049c55878SDavid Wu 				      __func__, ret);
290149c55878SDavid Wu 				return ret;
290249c55878SDavid Wu 			}
290349c55878SDavid Wu 		}
290449c55878SDavid Wu 	}
290549c55878SDavid Wu 
290649c55878SDavid Wu 	return 0;
290749c55878SDavid Wu }
290849c55878SDavid Wu 
290949c55878SDavid Wu static struct pinctrl_ops rockchip_pinctrl_ops = {
291049c55878SDavid Wu 	.set_state			= rockchip_pinctrl_set_state,
291149c55878SDavid Wu 	.get_gpio_mux			= rockchip_pinctrl_get_gpio_mux,
291249c55878SDavid Wu };
291349c55878SDavid Wu 
2914d5517017SDavid Wu /* Ctrl data specially handle */
2915d5517017SDavid Wu static int rk3308b_ctrl_data_re_init(struct rockchip_pin_ctrl *ctrl)
2916d5517017SDavid Wu {
2917d5517017SDavid Wu 	/*
2918d5517017SDavid Wu 	 * Special for rk3308b, where we need to replace the recalced
2919d5517017SDavid Wu 	 * and routed arrays.
2920d5517017SDavid Wu 	 */
2921d5517017SDavid Wu 	if (soc_is_rk3308b()) {
2922d5517017SDavid Wu 		ctrl->iomux_recalced = rk3308b_mux_recalced_data;
2923d5517017SDavid Wu 		ctrl->niomux_recalced = ARRAY_SIZE(rk3308b_mux_recalced_data);
2924d5517017SDavid Wu 		ctrl->iomux_routes = rk3308b_mux_route_data;
2925d5517017SDavid Wu 		ctrl->niomux_routes = ARRAY_SIZE(rk3308b_mux_route_data);
2926d5517017SDavid Wu 	}
2927d5517017SDavid Wu 
2928d5517017SDavid Wu 	return 0;
2929d5517017SDavid Wu }
2930d5517017SDavid Wu 
293149c55878SDavid Wu /* retrieve the soc specific data */
293249c55878SDavid Wu static struct rockchip_pin_ctrl *rockchip_pinctrl_get_soc_data(struct udevice *dev)
293349c55878SDavid Wu {
293449c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = dev_get_priv(dev);
293549c55878SDavid Wu 	struct rockchip_pin_ctrl *ctrl =
293649c55878SDavid Wu 			(struct rockchip_pin_ctrl *)dev_get_driver_data(dev);
293749c55878SDavid Wu 	struct rockchip_pin_bank *bank;
293849c55878SDavid Wu 	int grf_offs, pmu_offs, drv_grf_offs, drv_pmu_offs, i, j;
293949c55878SDavid Wu 
294049c55878SDavid Wu 	grf_offs = ctrl->grf_mux_offset;
294149c55878SDavid Wu 	pmu_offs = ctrl->pmu_mux_offset;
294249c55878SDavid Wu 	drv_pmu_offs = ctrl->pmu_drv_offset;
294349c55878SDavid Wu 	drv_grf_offs = ctrl->grf_drv_offset;
294449c55878SDavid Wu 	bank = ctrl->pin_banks;
294549c55878SDavid Wu 
2946d5517017SDavid Wu 	/* Ctrl data re-initialize for some Socs */
2947d5517017SDavid Wu 	if (ctrl->ctrl_data_re_init) {
2948d5517017SDavid Wu 		if (ctrl->ctrl_data_re_init(ctrl))
2949d5517017SDavid Wu 			return NULL;
2950d5517017SDavid Wu 	}
2951d5517017SDavid Wu 
295249c55878SDavid Wu 	for (i = 0; i < ctrl->nr_banks; ++i, ++bank) {
295349c55878SDavid Wu 		int bank_pins = 0;
295449c55878SDavid Wu 
295549c55878SDavid Wu 		bank->priv = priv;
295649c55878SDavid Wu 		bank->pin_base = ctrl->nr_pins;
295749c55878SDavid Wu 		ctrl->nr_pins += bank->nr_pins;
295849c55878SDavid Wu 
295949c55878SDavid Wu 		/* calculate iomux and drv offsets */
296049c55878SDavid Wu 		for (j = 0; j < 4; j++) {
296149c55878SDavid Wu 			struct rockchip_iomux *iom = &bank->iomux[j];
296249c55878SDavid Wu 			struct rockchip_drv *drv = &bank->drv[j];
296349c55878SDavid Wu 			int inc;
296449c55878SDavid Wu 
296549c55878SDavid Wu 			if (bank_pins >= bank->nr_pins)
296649c55878SDavid Wu 				break;
296749c55878SDavid Wu 
296849c55878SDavid Wu 			/* preset iomux offset value, set new start value */
296949c55878SDavid Wu 			if (iom->offset >= 0) {
2970d499d466SJianqun Xu 				if ((iom->type & IOMUX_SOURCE_PMU) || (iom->type & IOMUX_L_SOURCE_PMU))
297149c55878SDavid Wu 					pmu_offs = iom->offset;
297249c55878SDavid Wu 				else
297349c55878SDavid Wu 					grf_offs = iom->offset;
297449c55878SDavid Wu 			} else { /* set current iomux offset */
2975d499d466SJianqun Xu 				iom->offset = ((iom->type & IOMUX_SOURCE_PMU) ||
2976d499d466SJianqun Xu 					       (iom->type & IOMUX_L_SOURCE_PMU)) ?
297749c55878SDavid Wu 							pmu_offs : grf_offs;
297849c55878SDavid Wu 			}
297949c55878SDavid Wu 
298049c55878SDavid Wu 			/* preset drv offset value, set new start value */
298149c55878SDavid Wu 			if (drv->offset >= 0) {
298249c55878SDavid Wu 				if (iom->type & IOMUX_SOURCE_PMU)
298349c55878SDavid Wu 					drv_pmu_offs = drv->offset;
298449c55878SDavid Wu 				else
298549c55878SDavid Wu 					drv_grf_offs = drv->offset;
298649c55878SDavid Wu 			} else { /* set current drv offset */
298749c55878SDavid Wu 				drv->offset = (iom->type & IOMUX_SOURCE_PMU) ?
298849c55878SDavid Wu 						drv_pmu_offs : drv_grf_offs;
298949c55878SDavid Wu 			}
299049c55878SDavid Wu 
299149c55878SDavid Wu 			debug("bank %d, iomux %d has iom_offset 0x%x drv_offset 0x%x\n",
299249c55878SDavid Wu 			      i, j, iom->offset, drv->offset);
299349c55878SDavid Wu 
299449c55878SDavid Wu 			/*
299549c55878SDavid Wu 			 * Increase offset according to iomux width.
299649c55878SDavid Wu 			 * 4bit iomux'es are spread over two registers.
299749c55878SDavid Wu 			 */
299849c55878SDavid Wu 			inc = (iom->type & (IOMUX_WIDTH_4BIT |
299988a1f7ffSDavid Wu 					    IOMUX_WIDTH_3BIT |
300088a1f7ffSDavid Wu 					    IOMUX_8WIDTH_2BIT)) ? 8 : 4;
3001d499d466SJianqun Xu 			if ((iom->type & IOMUX_SOURCE_PMU) || (iom->type & IOMUX_L_SOURCE_PMU))
300249c55878SDavid Wu 				pmu_offs += inc;
300349c55878SDavid Wu 			else
300449c55878SDavid Wu 				grf_offs += inc;
300549c55878SDavid Wu 
300649c55878SDavid Wu 			/*
300749c55878SDavid Wu 			 * Increase offset according to drv width.
300849c55878SDavid Wu 			 * 3bit drive-strenth'es are spread over two registers.
300949c55878SDavid Wu 			 */
301049c55878SDavid Wu 			if ((drv->drv_type == DRV_TYPE_IO_1V8_3V0_AUTO) ||
301149c55878SDavid Wu 			    (drv->drv_type == DRV_TYPE_IO_3V3_ONLY))
301249c55878SDavid Wu 				inc = 8;
301349c55878SDavid Wu 			else
301449c55878SDavid Wu 				inc = 4;
301549c55878SDavid Wu 
301649c55878SDavid Wu 			if (iom->type & IOMUX_SOURCE_PMU)
301749c55878SDavid Wu 				drv_pmu_offs += inc;
301849c55878SDavid Wu 			else
301949c55878SDavid Wu 				drv_grf_offs += inc;
302049c55878SDavid Wu 
302149c55878SDavid Wu 			bank_pins += 8;
302249c55878SDavid Wu 		}
302349c55878SDavid Wu 
302449c55878SDavid Wu 		/* calculate the per-bank recalced_mask */
302549c55878SDavid Wu 		for (j = 0; j < ctrl->niomux_recalced; j++) {
302649c55878SDavid Wu 			int pin = 0;
302749c55878SDavid Wu 
302849c55878SDavid Wu 			if (ctrl->iomux_recalced[j].num == bank->bank_num) {
302949c55878SDavid Wu 				pin = ctrl->iomux_recalced[j].pin;
303049c55878SDavid Wu 				bank->recalced_mask |= BIT(pin);
303149c55878SDavid Wu 			}
303249c55878SDavid Wu 		}
303349c55878SDavid Wu 
303449c55878SDavid Wu 		/* calculate the per-bank route_mask */
303549c55878SDavid Wu 		for (j = 0; j < ctrl->niomux_routes; j++) {
303649c55878SDavid Wu 			int pin = 0;
303749c55878SDavid Wu 
303849c55878SDavid Wu 			if (ctrl->iomux_routes[j].bank_num == bank->bank_num) {
303949c55878SDavid Wu 				pin = ctrl->iomux_routes[j].pin;
304049c55878SDavid Wu 				bank->route_mask |= BIT(pin);
304149c55878SDavid Wu 			}
304249c55878SDavid Wu 		}
304349c55878SDavid Wu 	}
304449c55878SDavid Wu 
304549c55878SDavid Wu 	return ctrl;
304649c55878SDavid Wu }
304749c55878SDavid Wu 
3048d5517017SDavid Wu /* SoC data specially handle */
3049d5517017SDavid Wu 
3050d5517017SDavid Wu /* rk3308b SoC data initialize */
3051d5517017SDavid Wu #define RK3308B_GRF_SOC_CON13			0x608
3052d5517017SDavid Wu #define RK3308B_GRF_SOC_CON15			0x610
3053d5517017SDavid Wu 
3054d5517017SDavid Wu /* RK3308B_GRF_SOC_CON13 */
3055d5517017SDavid Wu #define RK3308B_GRF_I2C3_IOFUNC_SRC_CTRL	(BIT(16 + 10) | BIT(10))
3056d5517017SDavid Wu #define RK3308B_GRF_GPIO2A3_SEL_SRC_CTRL	(BIT(16 + 7)  | BIT(7))
3057d5517017SDavid Wu #define RK3308B_GRF_GPIO2A2_SEL_SRC_CTRL	(BIT(16 + 3)  | BIT(3))
3058d5517017SDavid Wu 
3059d5517017SDavid Wu /* RK3308B_GRF_SOC_CON15 */
3060d5517017SDavid Wu #define RK3308B_GRF_GPIO2C0_SEL_SRC_CTRL	(BIT(16 + 11) | BIT(11))
3061d5517017SDavid Wu #define RK3308B_GRF_GPIO3B3_SEL_SRC_CTRL	(BIT(16 + 7)  | BIT(7))
3062d5517017SDavid Wu #define RK3308B_GRF_GPIO3B2_SEL_SRC_CTRL	(BIT(16 + 3)  | BIT(3))
3063d5517017SDavid Wu 
3064d5517017SDavid Wu static int rk3308b_soc_data_init(struct rockchip_pinctrl_priv *priv)
3065d5517017SDavid Wu {
3066d5517017SDavid Wu 	int ret;
3067d5517017SDavid Wu 
3068d5517017SDavid Wu 	/*
3069d5517017SDavid Wu 	 * Enable the special ctrl  of selected sources.
3070d5517017SDavid Wu 	 */
3071d5517017SDavid Wu 	if (soc_is_rk3308b()) {
3072d5517017SDavid Wu 		ret = regmap_write(priv->regmap_base, RK3308B_GRF_SOC_CON13,
3073d5517017SDavid Wu 				   RK3308B_GRF_I2C3_IOFUNC_SRC_CTRL |
3074d5517017SDavid Wu 				   RK3308B_GRF_GPIO2A3_SEL_SRC_CTRL |
3075d5517017SDavid Wu 				   RK3308B_GRF_GPIO2A2_SEL_SRC_CTRL);
3076d5517017SDavid Wu 		if (ret)
3077d5517017SDavid Wu 			return ret;
3078d5517017SDavid Wu 
3079d5517017SDavid Wu 		ret = regmap_write(priv->regmap_base, RK3308B_GRF_SOC_CON15,
3080d5517017SDavid Wu 				   RK3308B_GRF_GPIO2C0_SEL_SRC_CTRL |
3081d5517017SDavid Wu 				   RK3308B_GRF_GPIO3B3_SEL_SRC_CTRL |
3082d5517017SDavid Wu 				   RK3308B_GRF_GPIO3B2_SEL_SRC_CTRL);
3083d5517017SDavid Wu 		if (ret)
3084d5517017SDavid Wu 			return ret;
3085d5517017SDavid Wu 	}
3086d5517017SDavid Wu 
3087d5517017SDavid Wu 	return 0;
3088d5517017SDavid Wu }
3089d5517017SDavid Wu 
309049c55878SDavid Wu static int rockchip_pinctrl_probe(struct udevice *dev)
309149c55878SDavid Wu {
309249c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = dev_get_priv(dev);
309349c55878SDavid Wu 	struct rockchip_pin_ctrl *ctrl;
309449c55878SDavid Wu 	struct udevice *syscon;
309549c55878SDavid Wu 	struct regmap *regmap;
309649c55878SDavid Wu 	int ret = 0;
309749c55878SDavid Wu 
309849c55878SDavid Wu 	/* get rockchip grf syscon phandle */
309949c55878SDavid Wu 	ret = uclass_get_device_by_phandle(UCLASS_SYSCON, dev, "rockchip,grf",
310049c55878SDavid Wu 					   &syscon);
310149c55878SDavid Wu 	if (ret) {
310249c55878SDavid Wu 		debug("unable to find rockchip,grf syscon device (%d)\n", ret);
310349c55878SDavid Wu 		return ret;
310449c55878SDavid Wu 	}
310549c55878SDavid Wu 
310649c55878SDavid Wu 	/* get grf-reg base address */
310749c55878SDavid Wu 	regmap = syscon_get_regmap(syscon);
310849c55878SDavid Wu 	if (!regmap) {
310949c55878SDavid Wu 		debug("unable to find rockchip grf regmap\n");
311049c55878SDavid Wu 		return -ENODEV;
311149c55878SDavid Wu 	}
311249c55878SDavid Wu 	priv->regmap_base = regmap;
311349c55878SDavid Wu 
311449c55878SDavid Wu 	/* option: get pmu-reg base address */
311549c55878SDavid Wu 	ret = uclass_get_device_by_phandle(UCLASS_SYSCON, dev, "rockchip,pmu",
311649c55878SDavid Wu 					   &syscon);
311749c55878SDavid Wu 	if (!ret) {
311849c55878SDavid Wu 		/* get pmugrf-reg base address */
311949c55878SDavid Wu 		regmap = syscon_get_regmap(syscon);
312049c55878SDavid Wu 		if (!regmap) {
312149c55878SDavid Wu 			debug("unable to find rockchip pmu regmap\n");
312249c55878SDavid Wu 			return -ENODEV;
312349c55878SDavid Wu 		}
312449c55878SDavid Wu 		priv->regmap_pmu = regmap;
312549c55878SDavid Wu 	}
312649c55878SDavid Wu 
312749c55878SDavid Wu 	ctrl = rockchip_pinctrl_get_soc_data(dev);
312849c55878SDavid Wu 	if (!ctrl) {
312949c55878SDavid Wu 		debug("driver data not available\n");
313049c55878SDavid Wu 		return -EINVAL;
313149c55878SDavid Wu 	}
313249c55878SDavid Wu 
3133d5517017SDavid Wu 	/* Special handle for some Socs */
3134d5517017SDavid Wu 	if (ctrl->soc_data_init) {
3135d5517017SDavid Wu 		ret = ctrl->soc_data_init(priv);
3136d5517017SDavid Wu 		if (ret)
3137d5517017SDavid Wu 			return ret;
3138d5517017SDavid Wu 	}
3139d5517017SDavid Wu 
314049c55878SDavid Wu 	priv->ctrl = ctrl;
314149c55878SDavid Wu 	return 0;
314249c55878SDavid Wu }
314349c55878SDavid Wu 
314449c55878SDavid Wu static struct rockchip_pin_bank px30_pin_banks[] = {
314549c55878SDavid Wu 	PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0", IOMUX_SOURCE_PMU,
314649c55878SDavid Wu 					     IOMUX_SOURCE_PMU,
314749c55878SDavid Wu 					     IOMUX_SOURCE_PMU,
314849c55878SDavid Wu 					     IOMUX_SOURCE_PMU
314949c55878SDavid Wu 			    ),
315049c55878SDavid Wu 	PIN_BANK_IOMUX_FLAGS(1, 32, "gpio1", IOMUX_WIDTH_4BIT,
315149c55878SDavid Wu 					     IOMUX_WIDTH_4BIT,
315249c55878SDavid Wu 					     IOMUX_WIDTH_4BIT,
315349c55878SDavid Wu 					     IOMUX_WIDTH_4BIT
315449c55878SDavid Wu 			    ),
315549c55878SDavid Wu 	PIN_BANK_IOMUX_FLAGS(2, 32, "gpio2", IOMUX_WIDTH_4BIT,
315649c55878SDavid Wu 					     IOMUX_WIDTH_4BIT,
315749c55878SDavid Wu 					     IOMUX_WIDTH_4BIT,
315849c55878SDavid Wu 					     IOMUX_WIDTH_4BIT
315949c55878SDavid Wu 			    ),
316049c55878SDavid Wu 	PIN_BANK_IOMUX_FLAGS(3, 32, "gpio3", IOMUX_WIDTH_4BIT,
316149c55878SDavid Wu 					     IOMUX_WIDTH_4BIT,
316249c55878SDavid Wu 					     IOMUX_WIDTH_4BIT,
316349c55878SDavid Wu 					     IOMUX_WIDTH_4BIT
316449c55878SDavid Wu 			    ),
316549c55878SDavid Wu };
316649c55878SDavid Wu 
316749c55878SDavid Wu static struct rockchip_pin_ctrl px30_pin_ctrl = {
316849c55878SDavid Wu 		.pin_banks		= px30_pin_banks,
316949c55878SDavid Wu 		.nr_banks		= ARRAY_SIZE(px30_pin_banks),
317049c55878SDavid Wu 		.label			= "PX30-GPIO",
317149c55878SDavid Wu 		.type			= PX30,
317249c55878SDavid Wu 		.grf_mux_offset		= 0x0,
317349c55878SDavid Wu 		.pmu_mux_offset		= 0x0,
317449c55878SDavid Wu 		.iomux_routes		= px30_mux_route_data,
317549c55878SDavid Wu 		.niomux_routes		= ARRAY_SIZE(px30_mux_route_data),
317649c55878SDavid Wu 		.pull_calc_reg		= px30_calc_pull_reg_and_bit,
317749c55878SDavid Wu 		.drv_calc_reg		= px30_calc_drv_reg_and_bit,
317849c55878SDavid Wu 		.schmitt_calc_reg	= px30_calc_schmitt_reg_and_bit,
317932c25d1fSDavid Wu 		.slew_rate_calc_reg	= px30_calc_slew_rate_reg_and_bit,
318049c55878SDavid Wu };
318149c55878SDavid Wu 
318249c55878SDavid Wu static struct rockchip_pin_bank rv1108_pin_banks[] = {
318349c55878SDavid Wu 	PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0", IOMUX_SOURCE_PMU,
318449c55878SDavid Wu 					     IOMUX_SOURCE_PMU,
318549c55878SDavid Wu 					     IOMUX_SOURCE_PMU,
318649c55878SDavid Wu 					     IOMUX_SOURCE_PMU),
318749c55878SDavid Wu 	PIN_BANK_IOMUX_FLAGS(1, 32, "gpio1", 0, 0, 0, 0),
318849c55878SDavid Wu 	PIN_BANK_IOMUX_FLAGS(2, 32, "gpio2", 0, 0, 0, 0),
318949c55878SDavid Wu 	PIN_BANK_IOMUX_FLAGS(3, 32, "gpio3", 0, 0, 0, 0),
319049c55878SDavid Wu };
319149c55878SDavid Wu 
319249c55878SDavid Wu static struct rockchip_pin_ctrl rv1108_pin_ctrl = {
319349c55878SDavid Wu 	.pin_banks		= rv1108_pin_banks,
319449c55878SDavid Wu 	.nr_banks		= ARRAY_SIZE(rv1108_pin_banks),
319549c55878SDavid Wu 	.label			= "RV1108-GPIO",
319649c55878SDavid Wu 	.type			= RV1108,
319749c55878SDavid Wu 	.grf_mux_offset		= 0x10,
319849c55878SDavid Wu 	.pmu_mux_offset		= 0x0,
319949c55878SDavid Wu 	.iomux_recalced		= rv1108_mux_recalced_data,
320049c55878SDavid Wu 	.niomux_recalced	= ARRAY_SIZE(rv1108_mux_recalced_data),
320149c55878SDavid Wu 	.pull_calc_reg		= rv1108_calc_pull_reg_and_bit,
320249c55878SDavid Wu 	.drv_calc_reg		= rv1108_calc_drv_reg_and_bit,
320349c55878SDavid Wu 	.schmitt_calc_reg	= rv1108_calc_schmitt_reg_and_bit,
320449c55878SDavid Wu };
320549c55878SDavid Wu 
3206cf04a17bSJianqun Xu static struct rockchip_pin_bank rv1126_pin_banks[] = {
3207cf04a17bSJianqun Xu 	PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0",
3208cf04a17bSJianqun Xu 			     IOMUX_WIDTH_4BIT | IOMUX_SOURCE_PMU,
3209cf04a17bSJianqun Xu 			     IOMUX_WIDTH_4BIT | IOMUX_SOURCE_PMU,
3210cf04a17bSJianqun Xu 			     IOMUX_WIDTH_4BIT | IOMUX_L_SOURCE_PMU,
3211cf04a17bSJianqun Xu 			     IOMUX_WIDTH_4BIT),
3212d499d466SJianqun Xu 	PIN_BANK_IOMUX_FLAGS_OFFSET(1, 32, "gpio1",
3213cf04a17bSJianqun Xu 			     IOMUX_WIDTH_4BIT,
3214cf04a17bSJianqun Xu 			     IOMUX_WIDTH_4BIT,
3215cf04a17bSJianqun Xu 			     IOMUX_WIDTH_4BIT,
3216d499d466SJianqun Xu 			     IOMUX_WIDTH_4BIT,
3217d499d466SJianqun Xu 			     0x10010, 0x10018, 0x10020, 0x10028),
3218cf04a17bSJianqun Xu 	PIN_BANK_IOMUX_FLAGS(2, 32, "gpio2",
3219cf04a17bSJianqun Xu 			     IOMUX_WIDTH_4BIT,
3220cf04a17bSJianqun Xu 			     IOMUX_WIDTH_4BIT,
3221cf04a17bSJianqun Xu 			     IOMUX_WIDTH_4BIT,
3222cf04a17bSJianqun Xu 			     IOMUX_WIDTH_4BIT),
3223cf04a17bSJianqun Xu 	PIN_BANK_IOMUX_FLAGS(3, 32, "gpio3",
3224cf04a17bSJianqun Xu 			     IOMUX_WIDTH_4BIT,
3225cf04a17bSJianqun Xu 			     IOMUX_WIDTH_4BIT,
3226cf04a17bSJianqun Xu 			     IOMUX_WIDTH_4BIT,
3227cf04a17bSJianqun Xu 			     IOMUX_WIDTH_4BIT),
3228cf04a17bSJianqun Xu 	PIN_BANK_IOMUX_FLAGS(4, 2, "gpio4",
3229cf04a17bSJianqun Xu 			     IOMUX_WIDTH_4BIT, 0, 0, 0),
3230cf04a17bSJianqun Xu };
3231cf04a17bSJianqun Xu 
3232cf04a17bSJianqun Xu static struct rockchip_pin_ctrl rv1126_pin_ctrl = {
3233cf04a17bSJianqun Xu 	.pin_banks		= rv1126_pin_banks,
3234cf04a17bSJianqun Xu 	.nr_banks		= ARRAY_SIZE(rv1126_pin_banks),
3235cf04a17bSJianqun Xu 	.label			= "RV1126-GPIO",
3236cf04a17bSJianqun Xu 	.type			= RV1126,
3237cf04a17bSJianqun Xu 	.grf_mux_offset		= 0x10004, /* mux offset from GPIO0_D0 */
3238cf04a17bSJianqun Xu 	.pmu_mux_offset		= 0x0,
3239d499d466SJianqun Xu 	.iomux_routes		= rv1126_mux_route_data,
3240d499d466SJianqun Xu 	.niomux_routes		= ARRAY_SIZE(rv1126_mux_route_data),
3241cf04a17bSJianqun Xu 	.iomux_recalced		= rv1126_mux_recalced_data,
3242cf04a17bSJianqun Xu 	.niomux_recalced	= ARRAY_SIZE(rv1126_mux_recalced_data),
3243cf04a17bSJianqun Xu 	.pull_calc_reg		= rv1126_calc_pull_reg_and_bit,
3244cf04a17bSJianqun Xu 	.drv_calc_reg		= rv1126_calc_drv_reg_and_bit,
3245cf04a17bSJianqun Xu 	.schmitt_calc_reg	= rv1126_calc_schmitt_reg_and_bit,
3246cf04a17bSJianqun Xu };
3247cf04a17bSJianqun Xu 
3248a2a3fc8fSJianqun Xu static struct rockchip_pin_bank rk1808_pin_banks[] = {
3249a2a3fc8fSJianqun Xu 	PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0",
3250a2a3fc8fSJianqun Xu 			     IOMUX_SOURCE_PMU,
3251a2a3fc8fSJianqun Xu 			     IOMUX_SOURCE_PMU,
3252a2a3fc8fSJianqun Xu 			     IOMUX_SOURCE_PMU,
3253a2a3fc8fSJianqun Xu 			     IOMUX_SOURCE_PMU),
3254a2a3fc8fSJianqun Xu 	PIN_BANK_IOMUX_FLAGS(1, 32, "gpio1",
3255a2a3fc8fSJianqun Xu 			     IOMUX_WIDTH_4BIT,
3256a2a3fc8fSJianqun Xu 			     IOMUX_WIDTH_4BIT,
3257a2a3fc8fSJianqun Xu 			     IOMUX_WIDTH_4BIT,
3258a2a3fc8fSJianqun Xu 			     IOMUX_WIDTH_4BIT),
3259a2a3fc8fSJianqun Xu 	PIN_BANK_IOMUX_FLAGS(2, 32, "gpio2",
3260a2a3fc8fSJianqun Xu 			     IOMUX_WIDTH_4BIT,
3261a2a3fc8fSJianqun Xu 			     IOMUX_WIDTH_4BIT,
3262a2a3fc8fSJianqun Xu 			     IOMUX_WIDTH_4BIT,
3263a2a3fc8fSJianqun Xu 			     IOMUX_WIDTH_4BIT),
3264a2a3fc8fSJianqun Xu 	PIN_BANK_IOMUX_FLAGS(3, 32, "gpio3",
3265a2a3fc8fSJianqun Xu 			     IOMUX_WIDTH_4BIT,
3266a2a3fc8fSJianqun Xu 			     IOMUX_WIDTH_4BIT,
3267a2a3fc8fSJianqun Xu 			     IOMUX_WIDTH_4BIT,
3268a2a3fc8fSJianqun Xu 			     IOMUX_WIDTH_4BIT),
3269a2a3fc8fSJianqun Xu 	PIN_BANK_IOMUX_FLAGS(4, 32, "gpio4",
3270a2a3fc8fSJianqun Xu 			     IOMUX_WIDTH_4BIT,
3271a2a3fc8fSJianqun Xu 			     IOMUX_WIDTH_4BIT,
3272a2a3fc8fSJianqun Xu 			     IOMUX_WIDTH_4BIT,
3273a2a3fc8fSJianqun Xu 			     IOMUX_WIDTH_4BIT),
3274a2a3fc8fSJianqun Xu };
3275a2a3fc8fSJianqun Xu 
3276a2a3fc8fSJianqun Xu static struct rockchip_pin_ctrl rk1808_pin_ctrl = {
3277a2a3fc8fSJianqun Xu 	.pin_banks		= rk1808_pin_banks,
3278a2a3fc8fSJianqun Xu 	.nr_banks		= ARRAY_SIZE(rk1808_pin_banks),
3279a2a3fc8fSJianqun Xu 	.label			= "RK1808-GPIO",
3280a2a3fc8fSJianqun Xu 	.type			= RK1808,
3281a2a3fc8fSJianqun Xu 	.iomux_routes		= rk1808_mux_route_data,
3282a2a3fc8fSJianqun Xu 	.niomux_routes		= ARRAY_SIZE(rk1808_mux_route_data),
3283a2a3fc8fSJianqun Xu 	.grf_mux_offset		= 0x0,
3284a2a3fc8fSJianqun Xu 	.pmu_mux_offset		= 0x0,
3285a2a3fc8fSJianqun Xu 	.pull_calc_reg		= rk1808_calc_pull_reg_and_bit,
3286a2a3fc8fSJianqun Xu 	.drv_calc_reg		= rk1808_calc_drv_reg_and_bit,
3287a2a3fc8fSJianqun Xu 	.schmitt_calc_reg	= rk1808_calc_schmitt_reg_and_bit,
3288a2a3fc8fSJianqun Xu };
3289a2a3fc8fSJianqun Xu 
329049c55878SDavid Wu static struct rockchip_pin_bank rk2928_pin_banks[] = {
329149c55878SDavid Wu 	PIN_BANK(0, 32, "gpio0"),
329249c55878SDavid Wu 	PIN_BANK(1, 32, "gpio1"),
329349c55878SDavid Wu 	PIN_BANK(2, 32, "gpio2"),
329449c55878SDavid Wu 	PIN_BANK(3, 32, "gpio3"),
329549c55878SDavid Wu };
329649c55878SDavid Wu 
329749c55878SDavid Wu static struct rockchip_pin_ctrl rk2928_pin_ctrl = {
329849c55878SDavid Wu 		.pin_banks		= rk2928_pin_banks,
329949c55878SDavid Wu 		.nr_banks		= ARRAY_SIZE(rk2928_pin_banks),
330049c55878SDavid Wu 		.label			= "RK2928-GPIO",
330149c55878SDavid Wu 		.type			= RK2928,
330249c55878SDavid Wu 		.grf_mux_offset		= 0xa8,
330349c55878SDavid Wu 		.pull_calc_reg		= rk2928_calc_pull_reg_and_bit,
330449c55878SDavid Wu };
330549c55878SDavid Wu 
330649c55878SDavid Wu static struct rockchip_pin_bank rk3036_pin_banks[] = {
330749c55878SDavid Wu 	PIN_BANK(0, 32, "gpio0"),
330849c55878SDavid Wu 	PIN_BANK(1, 32, "gpio1"),
330949c55878SDavid Wu 	PIN_BANK(2, 32, "gpio2"),
331049c55878SDavid Wu };
331149c55878SDavid Wu 
331249c55878SDavid Wu static struct rockchip_pin_ctrl rk3036_pin_ctrl = {
331349c55878SDavid Wu 		.pin_banks		= rk3036_pin_banks,
331449c55878SDavid Wu 		.nr_banks		= ARRAY_SIZE(rk3036_pin_banks),
331549c55878SDavid Wu 		.label			= "RK3036-GPIO",
331649c55878SDavid Wu 		.type			= RK2928,
331749c55878SDavid Wu 		.grf_mux_offset		= 0xa8,
331849c55878SDavid Wu 		.pull_calc_reg		= rk2928_calc_pull_reg_and_bit,
331949c55878SDavid Wu };
332049c55878SDavid Wu 
332149c55878SDavid Wu static struct rockchip_pin_bank rk3066a_pin_banks[] = {
332249c55878SDavid Wu 	PIN_BANK(0, 32, "gpio0"),
332349c55878SDavid Wu 	PIN_BANK(1, 32, "gpio1"),
332449c55878SDavid Wu 	PIN_BANK(2, 32, "gpio2"),
332549c55878SDavid Wu 	PIN_BANK(3, 32, "gpio3"),
332649c55878SDavid Wu 	PIN_BANK(4, 32, "gpio4"),
332749c55878SDavid Wu 	PIN_BANK(6, 16, "gpio6"),
332849c55878SDavid Wu };
332949c55878SDavid Wu 
333049c55878SDavid Wu static struct rockchip_pin_ctrl rk3066a_pin_ctrl = {
333149c55878SDavid Wu 		.pin_banks		= rk3066a_pin_banks,
333249c55878SDavid Wu 		.nr_banks		= ARRAY_SIZE(rk3066a_pin_banks),
333349c55878SDavid Wu 		.label			= "RK3066a-GPIO",
333449c55878SDavid Wu 		.type			= RK2928,
333549c55878SDavid Wu 		.grf_mux_offset		= 0xa8,
333649c55878SDavid Wu 		.pull_calc_reg		= rk2928_calc_pull_reg_and_bit,
333749c55878SDavid Wu };
333849c55878SDavid Wu 
333949c55878SDavid Wu static struct rockchip_pin_bank rk3066b_pin_banks[] = {
334049c55878SDavid Wu 	PIN_BANK(0, 32, "gpio0"),
334149c55878SDavid Wu 	PIN_BANK(1, 32, "gpio1"),
334249c55878SDavid Wu 	PIN_BANK(2, 32, "gpio2"),
334349c55878SDavid Wu 	PIN_BANK(3, 32, "gpio3"),
334449c55878SDavid Wu };
334549c55878SDavid Wu 
334649c55878SDavid Wu static struct rockchip_pin_ctrl rk3066b_pin_ctrl = {
334749c55878SDavid Wu 		.pin_banks	= rk3066b_pin_banks,
334849c55878SDavid Wu 		.nr_banks	= ARRAY_SIZE(rk3066b_pin_banks),
334949c55878SDavid Wu 		.label		= "RK3066b-GPIO",
335049c55878SDavid Wu 		.type		= RK3066B,
335149c55878SDavid Wu 		.grf_mux_offset	= 0x60,
335249c55878SDavid Wu };
335349c55878SDavid Wu 
335449c55878SDavid Wu static struct rockchip_pin_bank rk3128_pin_banks[] = {
335549c55878SDavid Wu 	PIN_BANK(0, 32, "gpio0"),
335649c55878SDavid Wu 	PIN_BANK(1, 32, "gpio1"),
335749c55878SDavid Wu 	PIN_BANK(2, 32, "gpio2"),
335849c55878SDavid Wu 	PIN_BANK(3, 32, "gpio3"),
335949c55878SDavid Wu };
336049c55878SDavid Wu 
336149c55878SDavid Wu static struct rockchip_pin_ctrl rk3128_pin_ctrl = {
336249c55878SDavid Wu 		.pin_banks		= rk3128_pin_banks,
336349c55878SDavid Wu 		.nr_banks		= ARRAY_SIZE(rk3128_pin_banks),
336449c55878SDavid Wu 		.label			= "RK3128-GPIO",
336549c55878SDavid Wu 		.type			= RK3128,
336649c55878SDavid Wu 		.grf_mux_offset		= 0xa8,
336749c55878SDavid Wu 		.iomux_recalced		= rk3128_mux_recalced_data,
336849c55878SDavid Wu 		.niomux_recalced	= ARRAY_SIZE(rk3128_mux_recalced_data),
336949c55878SDavid Wu 		.iomux_routes		= rk3128_mux_route_data,
337049c55878SDavid Wu 		.niomux_routes		= ARRAY_SIZE(rk3128_mux_route_data),
337149c55878SDavid Wu 		.pull_calc_reg		= rk3128_calc_pull_reg_and_bit,
337249c55878SDavid Wu };
337349c55878SDavid Wu 
337449c55878SDavid Wu static struct rockchip_pin_bank rk3188_pin_banks[] = {
337549c55878SDavid Wu 	PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0", IOMUX_GPIO_ONLY, 0, 0, 0),
337649c55878SDavid Wu 	PIN_BANK(1, 32, "gpio1"),
337749c55878SDavid Wu 	PIN_BANK(2, 32, "gpio2"),
337849c55878SDavid Wu 	PIN_BANK(3, 32, "gpio3"),
337949c55878SDavid Wu };
338049c55878SDavid Wu 
338149c55878SDavid Wu static struct rockchip_pin_ctrl rk3188_pin_ctrl = {
338249c55878SDavid Wu 		.pin_banks		= rk3188_pin_banks,
338349c55878SDavid Wu 		.nr_banks		= ARRAY_SIZE(rk3188_pin_banks),
338449c55878SDavid Wu 		.label			= "RK3188-GPIO",
338549c55878SDavid Wu 		.type			= RK3188,
338649c55878SDavid Wu 		.grf_mux_offset		= 0x60,
338749c55878SDavid Wu 		.pull_calc_reg		= rk3188_calc_pull_reg_and_bit,
338849c55878SDavid Wu };
338949c55878SDavid Wu 
339049c55878SDavid Wu static struct rockchip_pin_bank rk3228_pin_banks[] = {
339149c55878SDavid Wu 	PIN_BANK(0, 32, "gpio0"),
339249c55878SDavid Wu 	PIN_BANK(1, 32, "gpio1"),
339349c55878SDavid Wu 	PIN_BANK(2, 32, "gpio2"),
339449c55878SDavid Wu 	PIN_BANK(3, 32, "gpio3"),
339549c55878SDavid Wu };
339649c55878SDavid Wu 
339749c55878SDavid Wu static struct rockchip_pin_ctrl rk3228_pin_ctrl = {
339849c55878SDavid Wu 		.pin_banks		= rk3228_pin_banks,
339949c55878SDavid Wu 		.nr_banks		= ARRAY_SIZE(rk3228_pin_banks),
340049c55878SDavid Wu 		.label			= "RK3228-GPIO",
340149c55878SDavid Wu 		.type			= RK3288,
340249c55878SDavid Wu 		.grf_mux_offset		= 0x0,
340349c55878SDavid Wu 		.iomux_routes		= rk3228_mux_route_data,
340449c55878SDavid Wu 		.niomux_routes		= ARRAY_SIZE(rk3228_mux_route_data),
340549c55878SDavid Wu 		.pull_calc_reg		= rk3228_calc_pull_reg_and_bit,
340649c55878SDavid Wu 		.drv_calc_reg		= rk3228_calc_drv_reg_and_bit,
340749c55878SDavid Wu };
340849c55878SDavid Wu 
340949c55878SDavid Wu static struct rockchip_pin_bank rk3288_pin_banks[] = {
341055a89bc6SDavid Wu 	PIN_BANK_IOMUX_DRV_PULL_FLAGS(0, 24, "gpio0",
34114bafc2daSDavid Wu 				      IOMUX_SOURCE_PMU | IOMUX_WRITABLE_32BIT,
34124bafc2daSDavid Wu 				      IOMUX_SOURCE_PMU | IOMUX_WRITABLE_32BIT,
341355a89bc6SDavid Wu 				      IOMUX_SOURCE_PMU | IOMUX_WRITABLE_32BIT,
341455a89bc6SDavid Wu 				      IOMUX_UNROUTED,
341555a89bc6SDavid Wu 				      DRV_TYPE_WRITABLE_32BIT,
341655a89bc6SDavid Wu 				      DRV_TYPE_WRITABLE_32BIT,
341755a89bc6SDavid Wu 				      DRV_TYPE_WRITABLE_32BIT,
341855a89bc6SDavid Wu 				      0,
341955a89bc6SDavid Wu 				      PULL_TYPE_WRITABLE_32BIT,
342055a89bc6SDavid Wu 				      PULL_TYPE_WRITABLE_32BIT,
342155a89bc6SDavid Wu 				      PULL_TYPE_WRITABLE_32BIT,
342255a89bc6SDavid Wu 				      0
342349c55878SDavid Wu 			    ),
342449c55878SDavid Wu 	PIN_BANK_IOMUX_FLAGS(1, 32, "gpio1", IOMUX_UNROUTED,
342549c55878SDavid Wu 					     IOMUX_UNROUTED,
342649c55878SDavid Wu 					     IOMUX_UNROUTED,
342749c55878SDavid Wu 					     0
342849c55878SDavid Wu 			    ),
342949c55878SDavid Wu 	PIN_BANK_IOMUX_FLAGS(2, 32, "gpio2", 0, 0, 0, IOMUX_UNROUTED),
343049c55878SDavid Wu 	PIN_BANK_IOMUX_FLAGS(3, 32, "gpio3", 0, 0, 0, IOMUX_WIDTH_4BIT),
343149c55878SDavid Wu 	PIN_BANK_IOMUX_FLAGS(4, 32, "gpio4", IOMUX_WIDTH_4BIT,
343249c55878SDavid Wu 					     IOMUX_WIDTH_4BIT,
343349c55878SDavid Wu 					     0,
343449c55878SDavid Wu 					     0
343549c55878SDavid Wu 			    ),
343649c55878SDavid Wu 	PIN_BANK_IOMUX_FLAGS(5, 32, "gpio5", IOMUX_UNROUTED,
343749c55878SDavid Wu 					     0,
343849c55878SDavid Wu 					     0,
343949c55878SDavid Wu 					     IOMUX_UNROUTED
344049c55878SDavid Wu 			    ),
344149c55878SDavid Wu 	PIN_BANK_IOMUX_FLAGS(6, 32, "gpio6", 0, 0, 0, IOMUX_UNROUTED),
344249c55878SDavid Wu 	PIN_BANK_IOMUX_FLAGS(7, 32, "gpio7", 0,
344349c55878SDavid Wu 					     0,
344449c55878SDavid Wu 					     IOMUX_WIDTH_4BIT,
344549c55878SDavid Wu 					     IOMUX_UNROUTED
344649c55878SDavid Wu 			    ),
344749c55878SDavid Wu 	PIN_BANK(8, 16, "gpio8"),
344849c55878SDavid Wu };
344949c55878SDavid Wu 
345049c55878SDavid Wu static struct rockchip_pin_ctrl rk3288_pin_ctrl = {
345149c55878SDavid Wu 		.pin_banks		= rk3288_pin_banks,
345249c55878SDavid Wu 		.nr_banks		= ARRAY_SIZE(rk3288_pin_banks),
345349c55878SDavid Wu 		.label			= "RK3288-GPIO",
345449c55878SDavid Wu 		.type			= RK3288,
345549c55878SDavid Wu 		.grf_mux_offset		= 0x0,
345649c55878SDavid Wu 		.pmu_mux_offset		= 0x84,
345749c55878SDavid Wu 		.iomux_routes		= rk3288_mux_route_data,
345849c55878SDavid Wu 		.niomux_routes		= ARRAY_SIZE(rk3288_mux_route_data),
345949c55878SDavid Wu 		.pull_calc_reg		= rk3288_calc_pull_reg_and_bit,
346049c55878SDavid Wu 		.drv_calc_reg		= rk3288_calc_drv_reg_and_bit,
346149c55878SDavid Wu };
346249c55878SDavid Wu 
3463b3077611SDavid Wu static struct rockchip_pin_bank rk3308_pin_banks[] = {
3464b3077611SDavid Wu 	PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0", IOMUX_8WIDTH_2BIT,
3465b3077611SDavid Wu 					     IOMUX_8WIDTH_2BIT,
3466b3077611SDavid Wu 					     IOMUX_8WIDTH_2BIT,
3467b3077611SDavid Wu 					     IOMUX_8WIDTH_2BIT),
3468b3077611SDavid Wu 	PIN_BANK_IOMUX_FLAGS(1, 32, "gpio1", IOMUX_8WIDTH_2BIT,
3469b3077611SDavid Wu 					     IOMUX_8WIDTH_2BIT,
3470b3077611SDavid Wu 					     IOMUX_8WIDTH_2BIT,
3471b3077611SDavid Wu 					     IOMUX_8WIDTH_2BIT),
3472b3077611SDavid Wu 	PIN_BANK_IOMUX_FLAGS(2, 32, "gpio2", IOMUX_8WIDTH_2BIT,
3473b3077611SDavid Wu 					     IOMUX_8WIDTH_2BIT,
3474b3077611SDavid Wu 					     IOMUX_8WIDTH_2BIT,
3475b3077611SDavid Wu 					     IOMUX_8WIDTH_2BIT),
3476b3077611SDavid Wu 	PIN_BANK_IOMUX_FLAGS(3, 32, "gpio3", IOMUX_8WIDTH_2BIT,
3477b3077611SDavid Wu 					     IOMUX_8WIDTH_2BIT,
3478b3077611SDavid Wu 					     IOMUX_8WIDTH_2BIT,
3479b3077611SDavid Wu 					     IOMUX_8WIDTH_2BIT),
3480b3077611SDavid Wu 	PIN_BANK_IOMUX_FLAGS(4, 32, "gpio4", IOMUX_8WIDTH_2BIT,
3481b3077611SDavid Wu 					     IOMUX_8WIDTH_2BIT,
3482b3077611SDavid Wu 					     IOMUX_8WIDTH_2BIT,
3483b3077611SDavid Wu 					     IOMUX_8WIDTH_2BIT),
3484b3077611SDavid Wu };
3485b3077611SDavid Wu 
3486b3077611SDavid Wu static struct rockchip_pin_ctrl rk3308_pin_ctrl = {
3487b3077611SDavid Wu 		.pin_banks		= rk3308_pin_banks,
3488b3077611SDavid Wu 		.nr_banks		= ARRAY_SIZE(rk3308_pin_banks),
3489b3077611SDavid Wu 		.label			= "RK3308-GPIO",
3490b3077611SDavid Wu 		.type			= RK3308,
3491b3077611SDavid Wu 		.grf_mux_offset		= 0x0,
3492b3077611SDavid Wu 		.iomux_recalced		= rk3308_mux_recalced_data,
3493b3077611SDavid Wu 		.niomux_recalced	= ARRAY_SIZE(rk3308_mux_recalced_data),
3494b3077611SDavid Wu 		.iomux_routes		= rk3308_mux_route_data,
3495b3077611SDavid Wu 		.niomux_routes		= ARRAY_SIZE(rk3308_mux_route_data),
3496d5517017SDavid Wu 		.ctrl_data_re_init	= rk3308b_ctrl_data_re_init,
3497d5517017SDavid Wu 		.soc_data_init		= rk3308b_soc_data_init,
3498b3077611SDavid Wu 		.pull_calc_reg		= rk3308_calc_pull_reg_and_bit,
3499b3077611SDavid Wu 		.drv_calc_reg		= rk3308_calc_drv_reg_and_bit,
3500b3077611SDavid Wu 		.schmitt_calc_reg	= rk3308_calc_schmitt_reg_and_bit,
3501b3077611SDavid Wu };
3502b3077611SDavid Wu 
350349c55878SDavid Wu static struct rockchip_pin_bank rk3328_pin_banks[] = {
350449c55878SDavid Wu 	PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0", 0, 0, 0, 0),
350549c55878SDavid Wu 	PIN_BANK_IOMUX_FLAGS(1, 32, "gpio1", 0, 0, 0, 0),
350649c55878SDavid Wu 	PIN_BANK_IOMUX_FLAGS(2, 32, "gpio2", 0,
350749c55878SDavid Wu 			     IOMUX_WIDTH_3BIT,
350849c55878SDavid Wu 			     IOMUX_WIDTH_3BIT,
350949c55878SDavid Wu 			     0),
351049c55878SDavid Wu 	PIN_BANK_IOMUX_FLAGS(3, 32, "gpio3",
351149c55878SDavid Wu 			     IOMUX_WIDTH_3BIT,
351249c55878SDavid Wu 			     IOMUX_WIDTH_3BIT,
351349c55878SDavid Wu 			     0,
351449c55878SDavid Wu 			     0),
351549c55878SDavid Wu };
351649c55878SDavid Wu 
351749c55878SDavid Wu static struct rockchip_pin_ctrl rk3328_pin_ctrl = {
351849c55878SDavid Wu 		.pin_banks		= rk3328_pin_banks,
351949c55878SDavid Wu 		.nr_banks		= ARRAY_SIZE(rk3328_pin_banks),
352049c55878SDavid Wu 		.label			= "RK3328-GPIO",
352149c55878SDavid Wu 		.type			= RK3288,
352249c55878SDavid Wu 		.grf_mux_offset		= 0x0,
352349c55878SDavid Wu 		.iomux_recalced		= rk3328_mux_recalced_data,
352449c55878SDavid Wu 		.niomux_recalced	= ARRAY_SIZE(rk3328_mux_recalced_data),
352549c55878SDavid Wu 		.iomux_routes		= rk3328_mux_route_data,
352649c55878SDavid Wu 		.niomux_routes		= ARRAY_SIZE(rk3328_mux_route_data),
352749c55878SDavid Wu 		.pull_calc_reg		= rk3228_calc_pull_reg_and_bit,
352849c55878SDavid Wu 		.drv_calc_reg		= rk3228_calc_drv_reg_and_bit,
352949c55878SDavid Wu 		.schmitt_calc_reg	= rk3328_calc_schmitt_reg_and_bit,
353049c55878SDavid Wu };
353149c55878SDavid Wu 
353249c55878SDavid Wu static struct rockchip_pin_bank rk3368_pin_banks[] = {
353349c55878SDavid Wu 	PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0", IOMUX_SOURCE_PMU,
353449c55878SDavid Wu 					     IOMUX_SOURCE_PMU,
353549c55878SDavid Wu 					     IOMUX_SOURCE_PMU,
353649c55878SDavid Wu 					     IOMUX_SOURCE_PMU
353749c55878SDavid Wu 			    ),
353849c55878SDavid Wu 	PIN_BANK(1, 32, "gpio1"),
353949c55878SDavid Wu 	PIN_BANK(2, 32, "gpio2"),
354049c55878SDavid Wu 	PIN_BANK(3, 32, "gpio3"),
354149c55878SDavid Wu };
354249c55878SDavid Wu 
354349c55878SDavid Wu static struct rockchip_pin_ctrl rk3368_pin_ctrl = {
354449c55878SDavid Wu 		.pin_banks		= rk3368_pin_banks,
354549c55878SDavid Wu 		.nr_banks		= ARRAY_SIZE(rk3368_pin_banks),
354649c55878SDavid Wu 		.label			= "RK3368-GPIO",
354749c55878SDavid Wu 		.type			= RK3368,
354849c55878SDavid Wu 		.grf_mux_offset		= 0x0,
354949c55878SDavid Wu 		.pmu_mux_offset		= 0x0,
355049c55878SDavid Wu 		.pull_calc_reg		= rk3368_calc_pull_reg_and_bit,
355149c55878SDavid Wu 		.drv_calc_reg		= rk3368_calc_drv_reg_and_bit,
355249c55878SDavid Wu };
355349c55878SDavid Wu 
355449c55878SDavid Wu static struct rockchip_pin_bank rk3399_pin_banks[] = {
355549c55878SDavid Wu 	PIN_BANK_IOMUX_FLAGS_DRV_FLAGS_OFFSET_PULL_FLAGS(0, 32, "gpio0",
355649c55878SDavid Wu 							 IOMUX_SOURCE_PMU,
355749c55878SDavid Wu 							 IOMUX_SOURCE_PMU,
355849c55878SDavid Wu 							 IOMUX_SOURCE_PMU,
355949c55878SDavid Wu 							 IOMUX_SOURCE_PMU,
356049c55878SDavid Wu 							 DRV_TYPE_IO_1V8_ONLY,
356149c55878SDavid Wu 							 DRV_TYPE_IO_1V8_ONLY,
356249c55878SDavid Wu 							 DRV_TYPE_IO_DEFAULT,
356349c55878SDavid Wu 							 DRV_TYPE_IO_DEFAULT,
356449c55878SDavid Wu 							 0x80,
356549c55878SDavid Wu 							 0x88,
356649c55878SDavid Wu 							 -1,
356749c55878SDavid Wu 							 -1,
356849c55878SDavid Wu 							 PULL_TYPE_IO_1V8_ONLY,
356949c55878SDavid Wu 							 PULL_TYPE_IO_1V8_ONLY,
357049c55878SDavid Wu 							 PULL_TYPE_IO_DEFAULT,
357149c55878SDavid Wu 							 PULL_TYPE_IO_DEFAULT
357249c55878SDavid Wu 							),
357349c55878SDavid Wu 	PIN_BANK_IOMUX_DRV_FLAGS_OFFSET(1, 32, "gpio1", IOMUX_SOURCE_PMU,
357449c55878SDavid Wu 					IOMUX_SOURCE_PMU,
357549c55878SDavid Wu 					IOMUX_SOURCE_PMU,
357649c55878SDavid Wu 					IOMUX_SOURCE_PMU,
357749c55878SDavid Wu 					DRV_TYPE_IO_1V8_OR_3V0,
357849c55878SDavid Wu 					DRV_TYPE_IO_1V8_OR_3V0,
357949c55878SDavid Wu 					DRV_TYPE_IO_1V8_OR_3V0,
358049c55878SDavid Wu 					DRV_TYPE_IO_1V8_OR_3V0,
358149c55878SDavid Wu 					0xa0,
358249c55878SDavid Wu 					0xa8,
358349c55878SDavid Wu 					0xb0,
358449c55878SDavid Wu 					0xb8
358549c55878SDavid Wu 					),
358649c55878SDavid Wu 	PIN_BANK_DRV_FLAGS_PULL_FLAGS(2, 32, "gpio2", DRV_TYPE_IO_1V8_OR_3V0,
358749c55878SDavid Wu 				      DRV_TYPE_IO_1V8_OR_3V0,
358849c55878SDavid Wu 				      DRV_TYPE_IO_1V8_ONLY,
358949c55878SDavid Wu 				      DRV_TYPE_IO_1V8_ONLY,
359049c55878SDavid Wu 				      PULL_TYPE_IO_DEFAULT,
359149c55878SDavid Wu 				      PULL_TYPE_IO_DEFAULT,
359249c55878SDavid Wu 				      PULL_TYPE_IO_1V8_ONLY,
359349c55878SDavid Wu 				      PULL_TYPE_IO_1V8_ONLY
359449c55878SDavid Wu 				      ),
359549c55878SDavid Wu 	PIN_BANK_DRV_FLAGS(3, 32, "gpio3", DRV_TYPE_IO_3V3_ONLY,
359649c55878SDavid Wu 			   DRV_TYPE_IO_3V3_ONLY,
359749c55878SDavid Wu 			   DRV_TYPE_IO_3V3_ONLY,
359849c55878SDavid Wu 			   DRV_TYPE_IO_1V8_OR_3V0
359949c55878SDavid Wu 			   ),
360049c55878SDavid Wu 	PIN_BANK_DRV_FLAGS(4, 32, "gpio4", DRV_TYPE_IO_1V8_OR_3V0,
360149c55878SDavid Wu 			   DRV_TYPE_IO_1V8_3V0_AUTO,
360249c55878SDavid Wu 			   DRV_TYPE_IO_1V8_OR_3V0,
360349c55878SDavid Wu 			   DRV_TYPE_IO_1V8_OR_3V0
360449c55878SDavid Wu 			   ),
360549c55878SDavid Wu };
360649c55878SDavid Wu 
360749c55878SDavid Wu static struct rockchip_pin_ctrl rk3399_pin_ctrl = {
360849c55878SDavid Wu 		.pin_banks		= rk3399_pin_banks,
360949c55878SDavid Wu 		.nr_banks		= ARRAY_SIZE(rk3399_pin_banks),
361049c55878SDavid Wu 		.label			= "RK3399-GPIO",
361149c55878SDavid Wu 		.type			= RK3399,
361249c55878SDavid Wu 		.grf_mux_offset		= 0xe000,
361349c55878SDavid Wu 		.pmu_mux_offset		= 0x0,
361449c55878SDavid Wu 		.grf_drv_offset		= 0xe100,
361549c55878SDavid Wu 		.pmu_drv_offset		= 0x80,
361649c55878SDavid Wu 		.iomux_routes		= rk3399_mux_route_data,
361749c55878SDavid Wu 		.niomux_routes		= ARRAY_SIZE(rk3399_mux_route_data),
361849c55878SDavid Wu 		.pull_calc_reg		= rk3399_calc_pull_reg_and_bit,
361949c55878SDavid Wu 		.drv_calc_reg		= rk3399_calc_drv_reg_and_bit,
362049c55878SDavid Wu };
362149c55878SDavid Wu 
362249c55878SDavid Wu static const struct udevice_id rockchip_pinctrl_dt_match[] = {
362349c55878SDavid Wu 	{ .compatible = "rockchip,px30-pinctrl",
362449c55878SDavid Wu 		.data = (ulong)&px30_pin_ctrl },
362549c55878SDavid Wu 	{ .compatible = "rockchip,rv1108-pinctrl",
362649c55878SDavid Wu 		.data = (ulong)&rv1108_pin_ctrl },
3627cf04a17bSJianqun Xu 	{ .compatible = "rockchip,rv1126-pinctrl",
3628cf04a17bSJianqun Xu 		.data = (ulong)&rv1126_pin_ctrl },
3629a2a3fc8fSJianqun Xu 	{ .compatible = "rockchip,rk1808-pinctrl",
3630a2a3fc8fSJianqun Xu 		.data = (ulong)&rk1808_pin_ctrl },
363149c55878SDavid Wu 	{ .compatible = "rockchip,rk2928-pinctrl",
363249c55878SDavid Wu 		.data = (ulong)&rk2928_pin_ctrl },
363349c55878SDavid Wu 	{ .compatible = "rockchip,rk3036-pinctrl",
363449c55878SDavid Wu 		.data = (ulong)&rk3036_pin_ctrl },
363549c55878SDavid Wu 	{ .compatible = "rockchip,rk3066a-pinctrl",
363649c55878SDavid Wu 		.data = (ulong)&rk3066a_pin_ctrl },
363749c55878SDavid Wu 	{ .compatible = "rockchip,rk3066b-pinctrl",
363849c55878SDavid Wu 		.data = (ulong)&rk3066b_pin_ctrl },
363949c55878SDavid Wu 	{ .compatible = "rockchip,rk3128-pinctrl",
364049c55878SDavid Wu 		.data = (ulong)&rk3128_pin_ctrl },
364149c55878SDavid Wu 	{ .compatible = "rockchip,rk3188-pinctrl",
364249c55878SDavid Wu 		.data = (ulong)&rk3188_pin_ctrl },
364349c55878SDavid Wu 	{ .compatible = "rockchip,rk3228-pinctrl",
364449c55878SDavid Wu 		.data = (ulong)&rk3228_pin_ctrl },
364549c55878SDavid Wu 	{ .compatible = "rockchip,rk3288-pinctrl",
364649c55878SDavid Wu 		.data = (ulong)&rk3288_pin_ctrl },
3647b3077611SDavid Wu 	{ .compatible = "rockchip,rk3308-pinctrl",
3648b3077611SDavid Wu 		.data = (ulong)&rk3308_pin_ctrl },
364949c55878SDavid Wu 	{ .compatible = "rockchip,rk3328-pinctrl",
365049c55878SDavid Wu 		.data = (ulong)&rk3328_pin_ctrl },
365149c55878SDavid Wu 	{ .compatible = "rockchip,rk3368-pinctrl",
365249c55878SDavid Wu 		.data = (ulong)&rk3368_pin_ctrl },
365349c55878SDavid Wu 	{ .compatible = "rockchip,rk3399-pinctrl",
365449c55878SDavid Wu 		.data = (ulong)&rk3399_pin_ctrl },
365549c55878SDavid Wu 	{},
365649c55878SDavid Wu };
365749c55878SDavid Wu 
365849c55878SDavid Wu U_BOOT_DRIVER(pinctrl_rockchip) = {
365949c55878SDavid Wu 	.name		= "rockchip_pinctrl",
366049c55878SDavid Wu 	.id		= UCLASS_PINCTRL,
366149c55878SDavid Wu 	.of_match	= rockchip_pinctrl_dt_match,
366249c55878SDavid Wu 	.priv_auto_alloc_size = sizeof(struct rockchip_pinctrl_priv),
366349c55878SDavid Wu 	.ops		= &rockchip_pinctrl_ops,
366449c55878SDavid Wu #if !CONFIG_IS_ENABLED(OF_PLATDATA)
366549c55878SDavid Wu 	.bind		= dm_scan_fdt_dev,
366649c55878SDavid Wu #endif
366749c55878SDavid Wu 	.probe		= rockchip_pinctrl_probe,
366849c55878SDavid Wu };
3669