xref: /rk3399_rockchip-uboot/drivers/pinctrl/pinctrl-rockchip.c (revision cf04a17b62095fa2561abef40e8dc9e80f48518d)
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>
1149c55878SDavid Wu #include <regmap.h>
1249c55878SDavid Wu #include <syscon.h>
13d5517017SDavid Wu #include <asm/arch/cpu.h>
1449c55878SDavid Wu 
1549c55878SDavid Wu #define MAX_ROCKCHIP_GPIO_PER_BANK	32
1649c55878SDavid Wu #define RK_FUNC_GPIO			0
1787f0ac57SDavid Wu #define MAX_ROCKCHIP_PINS_ENTRIES	30
1849c55878SDavid Wu 
1949c55878SDavid Wu enum rockchip_pinctrl_type {
2049c55878SDavid Wu 	PX30,
2149c55878SDavid Wu 	RV1108,
22*cf04a17bSJianqun Xu 	RV1126,
23a2a3fc8fSJianqun Xu 	RK1808,
2449c55878SDavid Wu 	RK2928,
2549c55878SDavid Wu 	RK3066B,
2649c55878SDavid Wu 	RK3128,
2749c55878SDavid Wu 	RK3188,
2849c55878SDavid Wu 	RK3288,
29b3077611SDavid Wu 	RK3308,
3049c55878SDavid Wu 	RK3368,
3149c55878SDavid Wu 	RK3399,
3249c55878SDavid Wu };
3349c55878SDavid Wu 
3449c55878SDavid Wu /**
3549c55878SDavid Wu  * Encode variants of iomux registers into a type variable
3649c55878SDavid Wu  */
3749c55878SDavid Wu #define IOMUX_GPIO_ONLY		BIT(0)
3849c55878SDavid Wu #define IOMUX_WIDTH_4BIT	BIT(1)
3949c55878SDavid Wu #define IOMUX_SOURCE_PMU	BIT(2)
4049c55878SDavid Wu #define IOMUX_UNROUTED		BIT(3)
4149c55878SDavid Wu #define IOMUX_WIDTH_3BIT	BIT(4)
42b3077611SDavid Wu #define IOMUX_8WIDTH_2BIT	BIT(5)
434bafc2daSDavid Wu #define IOMUX_WRITABLE_32BIT	BIT(6)
44*cf04a17bSJianqun Xu #define IOMUX_L_SOURCE_PMU	BIT(7)
4549c55878SDavid Wu 
4649c55878SDavid Wu /**
4749c55878SDavid Wu  * @type: iomux variant using IOMUX_* constants
4849c55878SDavid Wu  * @offset: if initialized to -1 it will be autocalculated, by specifying
4949c55878SDavid Wu  *	    an initial offset value the relevant source offset can be reset
5049c55878SDavid Wu  *	    to a new value for autocalculating the following iomux registers.
5149c55878SDavid Wu  */
5249c55878SDavid Wu struct rockchip_iomux {
5349c55878SDavid Wu 	int				type;
5449c55878SDavid Wu 	int				offset;
5549c55878SDavid Wu };
5649c55878SDavid Wu 
5755a89bc6SDavid Wu #define DRV_TYPE_IO_MASK		GENMASK(31, 16)
5855a89bc6SDavid Wu #define DRV_TYPE_WRITABLE_32BIT		BIT(31)
5955a89bc6SDavid Wu 
6049c55878SDavid Wu /**
6149c55878SDavid Wu  * enum type index corresponding to rockchip_perpin_drv_list arrays index.
6249c55878SDavid Wu  */
6349c55878SDavid Wu enum rockchip_pin_drv_type {
6449c55878SDavid Wu 	DRV_TYPE_IO_DEFAULT = 0,
6549c55878SDavid Wu 	DRV_TYPE_IO_1V8_OR_3V0,
6649c55878SDavid Wu 	DRV_TYPE_IO_1V8_ONLY,
6749c55878SDavid Wu 	DRV_TYPE_IO_1V8_3V0_AUTO,
6849c55878SDavid Wu 	DRV_TYPE_IO_3V3_ONLY,
6949c55878SDavid Wu 	DRV_TYPE_MAX
7049c55878SDavid Wu };
7149c55878SDavid Wu 
7255a89bc6SDavid Wu #define PULL_TYPE_IO_MASK		GENMASK(31, 16)
7355a89bc6SDavid Wu #define PULL_TYPE_WRITABLE_32BIT	BIT(31)
7455a89bc6SDavid Wu 
7549c55878SDavid Wu /**
7649c55878SDavid Wu  * enum type index corresponding to rockchip_pull_list arrays index.
7749c55878SDavid Wu  */
7849c55878SDavid Wu enum rockchip_pin_pull_type {
7949c55878SDavid Wu 	PULL_TYPE_IO_DEFAULT = 0,
8049c55878SDavid Wu 	PULL_TYPE_IO_1V8_ONLY,
8149c55878SDavid Wu 	PULL_TYPE_MAX
8249c55878SDavid Wu };
8349c55878SDavid Wu 
8449c55878SDavid Wu /**
8549c55878SDavid Wu  * @drv_type: drive strength variant using rockchip_perpin_drv_type
8649c55878SDavid Wu  * @offset: if initialized to -1 it will be autocalculated, by specifying
8749c55878SDavid Wu  *	    an initial offset value the relevant source offset can be reset
8849c55878SDavid Wu  *	    to a new value for autocalculating the following drive strength
8949c55878SDavid Wu  *	    registers. if used chips own cal_drv func instead to calculate
9049c55878SDavid Wu  *	    registers offset, the variant could be ignored.
9149c55878SDavid Wu  */
9249c55878SDavid Wu struct rockchip_drv {
9349c55878SDavid Wu 	enum rockchip_pin_drv_type	drv_type;
9449c55878SDavid Wu 	int				offset;
9549c55878SDavid Wu };
9649c55878SDavid Wu 
9749c55878SDavid Wu /**
9849c55878SDavid Wu  * @priv: common pinctrl private basedata
9949c55878SDavid Wu  * @pin_base: first pin number
10049c55878SDavid Wu  * @nr_pins: number of pins in this bank
10149c55878SDavid Wu  * @name: name of the bank
10249c55878SDavid Wu  * @bank_num: number of the bank, to account for holes
10349c55878SDavid Wu  * @iomux: array describing the 4 iomux sources of the bank
10449c55878SDavid Wu  * @drv: array describing the 4 drive strength sources of the bank
10549c55878SDavid Wu  * @pull_type: array describing the 4 pull type sources of the bank
10649c55878SDavid Wu  * @recalced_mask: bits describing the mux recalced pins of per bank
10749c55878SDavid Wu  * @route_mask: bits describing the routing pins of per bank
10849c55878SDavid Wu  */
10949c55878SDavid Wu struct rockchip_pin_bank {
11049c55878SDavid Wu 	struct rockchip_pinctrl_priv	*priv;
11149c55878SDavid Wu 	u32				pin_base;
11249c55878SDavid Wu 	u8				nr_pins;
11349c55878SDavid Wu 	char				*name;
11449c55878SDavid Wu 	u8				bank_num;
11549c55878SDavid Wu 	struct rockchip_iomux		iomux[4];
11649c55878SDavid Wu 	struct rockchip_drv		drv[4];
11749c55878SDavid Wu 	enum rockchip_pin_pull_type	pull_type[4];
11849c55878SDavid Wu 	u32				recalced_mask;
11949c55878SDavid Wu 	u32				route_mask;
12049c55878SDavid Wu };
12149c55878SDavid Wu 
12249c55878SDavid Wu #define PIN_BANK(id, pins, label)			\
12349c55878SDavid Wu 	{						\
12449c55878SDavid Wu 		.bank_num	= id,			\
12549c55878SDavid Wu 		.nr_pins	= pins,			\
12649c55878SDavid Wu 		.name		= label,		\
12749c55878SDavid Wu 		.iomux		= {			\
12849c55878SDavid Wu 			{ .offset = -1 },		\
12949c55878SDavid Wu 			{ .offset = -1 },		\
13049c55878SDavid Wu 			{ .offset = -1 },		\
13149c55878SDavid Wu 			{ .offset = -1 },		\
13249c55878SDavid Wu 		},					\
13349c55878SDavid Wu 	}
13449c55878SDavid Wu 
13549c55878SDavid Wu #define PIN_BANK_IOMUX_FLAGS(id, pins, label, iom0, iom1, iom2, iom3)	\
13649c55878SDavid Wu 	{								\
13749c55878SDavid Wu 		.bank_num	= id,					\
13849c55878SDavid Wu 		.nr_pins	= pins,					\
13949c55878SDavid Wu 		.name		= label,				\
14049c55878SDavid Wu 		.iomux		= {					\
14149c55878SDavid Wu 			{ .type = iom0, .offset = -1 },			\
14249c55878SDavid Wu 			{ .type = iom1, .offset = -1 },			\
14349c55878SDavid Wu 			{ .type = iom2, .offset = -1 },			\
14449c55878SDavid Wu 			{ .type = iom3, .offset = -1 },			\
14549c55878SDavid Wu 		},							\
14649c55878SDavid Wu 	}
14749c55878SDavid Wu 
14849c55878SDavid Wu #define PIN_BANK_DRV_FLAGS(id, pins, label, type0, type1, type2, type3) \
14949c55878SDavid Wu 	{								\
15049c55878SDavid Wu 		.bank_num	= id,					\
15149c55878SDavid Wu 		.nr_pins	= pins,					\
15249c55878SDavid Wu 		.name		= label,				\
15349c55878SDavid Wu 		.iomux		= {					\
15449c55878SDavid Wu 			{ .offset = -1 },				\
15549c55878SDavid Wu 			{ .offset = -1 },				\
15649c55878SDavid Wu 			{ .offset = -1 },				\
15749c55878SDavid Wu 			{ .offset = -1 },				\
15849c55878SDavid Wu 		},							\
15949c55878SDavid Wu 		.drv		= {					\
16049c55878SDavid Wu 			{ .drv_type = type0, .offset = -1 },		\
16149c55878SDavid Wu 			{ .drv_type = type1, .offset = -1 },		\
16249c55878SDavid Wu 			{ .drv_type = type2, .offset = -1 },		\
16349c55878SDavid Wu 			{ .drv_type = type3, .offset = -1 },		\
16449c55878SDavid Wu 		},							\
16549c55878SDavid Wu 	}
16649c55878SDavid Wu 
16749c55878SDavid Wu #define PIN_BANK_DRV_FLAGS_PULL_FLAGS(id, pins, label, drv0, drv1,	\
16849c55878SDavid Wu 				      drv2, drv3, pull0, pull1,		\
16949c55878SDavid Wu 				      pull2, pull3)			\
17049c55878SDavid Wu 	{								\
17149c55878SDavid Wu 		.bank_num	= id,					\
17249c55878SDavid Wu 		.nr_pins	= pins,					\
17349c55878SDavid Wu 		.name		= label,				\
17449c55878SDavid Wu 		.iomux		= {					\
17549c55878SDavid Wu 			{ .offset = -1 },				\
17649c55878SDavid Wu 			{ .offset = -1 },				\
17749c55878SDavid Wu 			{ .offset = -1 },				\
17849c55878SDavid Wu 			{ .offset = -1 },				\
17949c55878SDavid Wu 		},							\
18049c55878SDavid Wu 		.drv		= {					\
18149c55878SDavid Wu 			{ .drv_type = drv0, .offset = -1 },		\
18249c55878SDavid Wu 			{ .drv_type = drv1, .offset = -1 },		\
18349c55878SDavid Wu 			{ .drv_type = drv2, .offset = -1 },		\
18449c55878SDavid Wu 			{ .drv_type = drv3, .offset = -1 },		\
18549c55878SDavid Wu 		},							\
18649c55878SDavid Wu 		.pull_type[0] = pull0,					\
18749c55878SDavid Wu 		.pull_type[1] = pull1,					\
18849c55878SDavid Wu 		.pull_type[2] = pull2,					\
18949c55878SDavid Wu 		.pull_type[3] = pull3,					\
19049c55878SDavid Wu 	}
19149c55878SDavid Wu 
19249c55878SDavid Wu #define PIN_BANK_IOMUX_DRV_FLAGS_OFFSET(id, pins, label, iom0, iom1,	\
19349c55878SDavid Wu 					iom2, iom3, drv0, drv1, drv2,	\
19449c55878SDavid Wu 					drv3, offset0, offset1,		\
19549c55878SDavid Wu 					offset2, offset3)		\
19649c55878SDavid Wu 	{								\
19749c55878SDavid Wu 		.bank_num	= id,					\
19849c55878SDavid Wu 		.nr_pins	= pins,					\
19949c55878SDavid Wu 		.name		= label,				\
20049c55878SDavid Wu 		.iomux		= {					\
20149c55878SDavid Wu 			{ .type = iom0, .offset = -1 },			\
20249c55878SDavid Wu 			{ .type = iom1, .offset = -1 },			\
20349c55878SDavid Wu 			{ .type = iom2, .offset = -1 },			\
20449c55878SDavid Wu 			{ .type = iom3, .offset = -1 },			\
20549c55878SDavid Wu 		},							\
20649c55878SDavid Wu 		.drv		= {					\
20749c55878SDavid Wu 			{ .drv_type = drv0, .offset = offset0 },	\
20849c55878SDavid Wu 			{ .drv_type = drv1, .offset = offset1 },	\
20949c55878SDavid Wu 			{ .drv_type = drv2, .offset = offset2 },	\
21049c55878SDavid Wu 			{ .drv_type = drv3, .offset = offset3 },	\
21149c55878SDavid Wu 		},							\
21249c55878SDavid Wu 	}
21349c55878SDavid Wu 
21455a89bc6SDavid Wu #define PIN_BANK_IOMUX_DRV_PULL_FLAGS(id, pins, label, iom0, iom1,	\
21555a89bc6SDavid Wu 				      iom2, iom3, drv0, drv1, drv2,	\
21655a89bc6SDavid Wu 				      drv3, pull0, pull1, pull2,	\
21755a89bc6SDavid Wu 				      pull3)				\
21855a89bc6SDavid Wu 	{								\
21955a89bc6SDavid Wu 		.bank_num	= id,					\
22055a89bc6SDavid Wu 		.nr_pins	= pins,					\
22155a89bc6SDavid Wu 		.name		= label,				\
22255a89bc6SDavid Wu 		.iomux		= {					\
22355a89bc6SDavid Wu 			{ .type = iom0, .offset = -1 },			\
22455a89bc6SDavid Wu 			{ .type = iom1, .offset = -1 },			\
22555a89bc6SDavid Wu 			{ .type = iom2, .offset = -1 },			\
22655a89bc6SDavid Wu 			{ .type = iom3, .offset = -1 },			\
22755a89bc6SDavid Wu 		},							\
22855a89bc6SDavid Wu 		.drv		= {					\
22955a89bc6SDavid Wu 			{ .drv_type = drv0, .offset = -1 },		\
23055a89bc6SDavid Wu 			{ .drv_type = drv1, .offset = -1 },		\
23155a89bc6SDavid Wu 			{ .drv_type = drv2, .offset = -1 },		\
23255a89bc6SDavid Wu 			{ .drv_type = drv3, .offset = -1 },		\
23355a89bc6SDavid Wu 		},							\
23455a89bc6SDavid Wu 		.pull_type[0] = pull0,					\
23555a89bc6SDavid Wu 		.pull_type[1] = pull1,					\
23655a89bc6SDavid Wu 		.pull_type[2] = pull2,					\
23755a89bc6SDavid Wu 		.pull_type[3] = pull3,					\
23855a89bc6SDavid Wu 	}
23955a89bc6SDavid Wu 
24049c55878SDavid Wu #define PIN_BANK_IOMUX_FLAGS_DRV_FLAGS_OFFSET_PULL_FLAGS(id, pins,	\
24149c55878SDavid Wu 					      label, iom0, iom1, iom2,  \
24249c55878SDavid Wu 					      iom3, drv0, drv1, drv2,   \
24349c55878SDavid Wu 					      drv3, offset0, offset1,   \
24449c55878SDavid Wu 					      offset2, offset3, pull0,  \
24549c55878SDavid Wu 					      pull1, pull2, pull3)	\
24649c55878SDavid Wu 	{								\
24749c55878SDavid Wu 		.bank_num	= id,					\
24849c55878SDavid Wu 		.nr_pins	= pins,					\
24949c55878SDavid Wu 		.name		= label,				\
25049c55878SDavid Wu 		.iomux		= {					\
25149c55878SDavid Wu 			{ .type = iom0, .offset = -1 },			\
25249c55878SDavid Wu 			{ .type = iom1, .offset = -1 },			\
25349c55878SDavid Wu 			{ .type = iom2, .offset = -1 },			\
25449c55878SDavid Wu 			{ .type = iom3, .offset = -1 },			\
25549c55878SDavid Wu 		},							\
25649c55878SDavid Wu 		.drv		= {					\
25749c55878SDavid Wu 			{ .drv_type = drv0, .offset = offset0 },	\
25849c55878SDavid Wu 			{ .drv_type = drv1, .offset = offset1 },	\
25949c55878SDavid Wu 			{ .drv_type = drv2, .offset = offset2 },	\
26049c55878SDavid Wu 			{ .drv_type = drv3, .offset = offset3 },	\
26149c55878SDavid Wu 		},							\
26249c55878SDavid Wu 		.pull_type[0] = pull0,					\
26349c55878SDavid Wu 		.pull_type[1] = pull1,					\
26449c55878SDavid Wu 		.pull_type[2] = pull2,					\
26549c55878SDavid Wu 		.pull_type[3] = pull3,					\
26649c55878SDavid Wu 	}
26749c55878SDavid Wu 
26849c55878SDavid Wu /**
26949c55878SDavid Wu  * struct rockchip_mux_recalced_data: represent a pin iomux data.
27049c55878SDavid Wu  * @num: bank number.
27149c55878SDavid Wu  * @pin: pin number.
27249c55878SDavid Wu  * @bit: index at register.
27349c55878SDavid Wu  * @reg: register offset.
27449c55878SDavid Wu  * @mask: mask bit
27549c55878SDavid Wu  */
27649c55878SDavid Wu struct rockchip_mux_recalced_data {
27749c55878SDavid Wu 	u8 num;
27849c55878SDavid Wu 	u8 pin;
27949c55878SDavid Wu 	u32 reg;
28049c55878SDavid Wu 	u8 bit;
28149c55878SDavid Wu 	u8 mask;
28249c55878SDavid Wu };
28349c55878SDavid Wu 
28449c55878SDavid Wu /**
28549c55878SDavid Wu  * struct rockchip_mux_recalced_data: represent a pin iomux data.
28649c55878SDavid Wu  * @bank_num: bank number.
28749c55878SDavid Wu  * @pin: index at register or used to calc index.
28849c55878SDavid Wu  * @func: the min pin.
28949c55878SDavid Wu  * @route_offset: the max pin.
29049c55878SDavid Wu  * @route_val: the register offset.
29149c55878SDavid Wu  */
29249c55878SDavid Wu struct rockchip_mux_route_data {
29349c55878SDavid Wu 	u8 bank_num;
29449c55878SDavid Wu 	u8 pin;
29549c55878SDavid Wu 	u8 func;
29649c55878SDavid Wu 	u32 route_offset;
29749c55878SDavid Wu 	u32 route_val;
29849c55878SDavid Wu };
29949c55878SDavid Wu 
30049c55878SDavid Wu /**
30149c55878SDavid Wu  */
30249c55878SDavid Wu struct rockchip_pin_ctrl {
30349c55878SDavid Wu 	struct rockchip_pin_bank	*pin_banks;
30449c55878SDavid Wu 	u32				nr_banks;
30549c55878SDavid Wu 	u32				nr_pins;
30649c55878SDavid Wu 	char				*label;
30749c55878SDavid Wu 	enum rockchip_pinctrl_type	type;
30849c55878SDavid Wu 	int				grf_mux_offset;
30949c55878SDavid Wu 	int				pmu_mux_offset;
31049c55878SDavid Wu 	int				grf_drv_offset;
31149c55878SDavid Wu 	int				pmu_drv_offset;
31249c55878SDavid Wu 	struct rockchip_mux_recalced_data *iomux_recalced;
31349c55878SDavid Wu 	u32				niomux_recalced;
31449c55878SDavid Wu 	struct rockchip_mux_route_data *iomux_routes;
31549c55878SDavid Wu 	u32				niomux_routes;
31649c55878SDavid Wu 
317d5517017SDavid Wu 	int	(*ctrl_data_re_init)(struct rockchip_pin_ctrl *ctrl);
318d5517017SDavid Wu 
319d5517017SDavid Wu 	int	(*soc_data_init)(struct rockchip_pinctrl_priv *info);
320d5517017SDavid Wu 
32149c55878SDavid Wu 	void	(*pull_calc_reg)(struct rockchip_pin_bank *bank,
32249c55878SDavid Wu 				 int pin_num, struct regmap **regmap,
32349c55878SDavid Wu 				 int *reg, u8 *bit);
32449c55878SDavid Wu 	void	(*drv_calc_reg)(struct rockchip_pin_bank *bank,
32549c55878SDavid Wu 				int pin_num, struct regmap **regmap,
32649c55878SDavid Wu 				int *reg, u8 *bit);
32749c55878SDavid Wu 	int	(*schmitt_calc_reg)(struct rockchip_pin_bank *bank,
32849c55878SDavid Wu 				    int pin_num, struct regmap **regmap,
32949c55878SDavid Wu 				    int *reg, u8 *bit);
33032c25d1fSDavid Wu 	int	(*slew_rate_calc_reg)(struct rockchip_pin_bank *bank,
33132c25d1fSDavid Wu 				      int pin_num, struct regmap **regmap,
33232c25d1fSDavid Wu 				      int *reg, u8 *bit);
33349c55878SDavid Wu };
33449c55878SDavid Wu 
33549c55878SDavid Wu /**
33649c55878SDavid Wu  */
33749c55878SDavid Wu struct rockchip_pinctrl_priv {
33849c55878SDavid Wu 	struct rockchip_pin_ctrl	*ctrl;
33949c55878SDavid Wu 	struct regmap			*regmap_base;
34049c55878SDavid Wu 	struct regmap			*regmap_pmu;
34149c55878SDavid Wu 
34249c55878SDavid Wu };
34349c55878SDavid Wu 
34449c55878SDavid Wu static int rockchip_verify_config(struct udevice *dev, u32 bank, u32 pin)
34549c55878SDavid Wu {
34649c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = dev_get_priv(dev);
34749c55878SDavid Wu 	struct rockchip_pin_ctrl *ctrl = priv->ctrl;
34849c55878SDavid Wu 
34949c55878SDavid Wu 	if (bank >= ctrl->nr_banks) {
35049c55878SDavid Wu 		debug("pin conf bank %d >= nbanks %d\n", bank, ctrl->nr_banks);
35149c55878SDavid Wu 		return -EINVAL;
35249c55878SDavid Wu 	}
35349c55878SDavid Wu 
35449c55878SDavid Wu 	if (pin >= MAX_ROCKCHIP_GPIO_PER_BANK) {
35549c55878SDavid Wu 		debug("pin conf pin %d >= %d\n", pin,
35649c55878SDavid Wu 		      MAX_ROCKCHIP_GPIO_PER_BANK);
35749c55878SDavid Wu 		return -EINVAL;
35849c55878SDavid Wu 	}
35949c55878SDavid Wu 
36049c55878SDavid Wu 	return 0;
36149c55878SDavid Wu }
36249c55878SDavid Wu 
36349c55878SDavid Wu static struct rockchip_mux_recalced_data rv1108_mux_recalced_data[] = {
36449c55878SDavid Wu 	{
36549c55878SDavid Wu 		.num = 1,
36649c55878SDavid Wu 		.pin = 0,
36749c55878SDavid Wu 		.reg = 0x418,
36849c55878SDavid Wu 		.bit = 0,
36949c55878SDavid Wu 		.mask = 0x3
37049c55878SDavid Wu 	}, {
37149c55878SDavid Wu 		.num = 1,
37249c55878SDavid Wu 		.pin = 1,
37349c55878SDavid Wu 		.reg = 0x418,
37449c55878SDavid Wu 		.bit = 2,
37549c55878SDavid Wu 		.mask = 0x3
37649c55878SDavid Wu 	}, {
37749c55878SDavid Wu 		.num = 1,
37849c55878SDavid Wu 		.pin = 2,
37949c55878SDavid Wu 		.reg = 0x418,
38049c55878SDavid Wu 		.bit = 4,
38149c55878SDavid Wu 		.mask = 0x3
38249c55878SDavid Wu 	}, {
38349c55878SDavid Wu 		.num = 1,
38449c55878SDavid Wu 		.pin = 3,
38549c55878SDavid Wu 		.reg = 0x418,
38649c55878SDavid Wu 		.bit = 6,
38749c55878SDavid Wu 		.mask = 0x3
38849c55878SDavid Wu 	}, {
38949c55878SDavid Wu 		.num = 1,
39049c55878SDavid Wu 		.pin = 4,
39149c55878SDavid Wu 		.reg = 0x418,
39249c55878SDavid Wu 		.bit = 8,
39349c55878SDavid Wu 		.mask = 0x3
39449c55878SDavid Wu 	}, {
39549c55878SDavid Wu 		.num = 1,
39649c55878SDavid Wu 		.pin = 5,
39749c55878SDavid Wu 		.reg = 0x418,
39849c55878SDavid Wu 		.bit = 10,
39949c55878SDavid Wu 		.mask = 0x3
40049c55878SDavid Wu 	}, {
40149c55878SDavid Wu 		.num = 1,
40249c55878SDavid Wu 		.pin = 6,
40349c55878SDavid Wu 		.reg = 0x418,
40449c55878SDavid Wu 		.bit = 12,
40549c55878SDavid Wu 		.mask = 0x3
40649c55878SDavid Wu 	}, {
40749c55878SDavid Wu 		.num = 1,
40849c55878SDavid Wu 		.pin = 7,
40949c55878SDavid Wu 		.reg = 0x418,
41049c55878SDavid Wu 		.bit = 14,
41149c55878SDavid Wu 		.mask = 0x3
41249c55878SDavid Wu 	}, {
41349c55878SDavid Wu 		.num = 1,
41449c55878SDavid Wu 		.pin = 8,
41549c55878SDavid Wu 		.reg = 0x41c,
41649c55878SDavid Wu 		.bit = 0,
41749c55878SDavid Wu 		.mask = 0x3
41849c55878SDavid Wu 	}, {
41949c55878SDavid Wu 		.num = 1,
42049c55878SDavid Wu 		.pin = 9,
42149c55878SDavid Wu 		.reg = 0x41c,
42249c55878SDavid Wu 		.bit = 2,
42349c55878SDavid Wu 		.mask = 0x3
42449c55878SDavid Wu 	},
42549c55878SDavid Wu };
42649c55878SDavid Wu 
427*cf04a17bSJianqun Xu static struct rockchip_mux_recalced_data rv1126_mux_recalced_data[] = {
428*cf04a17bSJianqun Xu 	{
429*cf04a17bSJianqun Xu 		.num = 0,
430*cf04a17bSJianqun Xu 		.pin = 20,
431*cf04a17bSJianqun Xu 		.reg = 0x10000,
432*cf04a17bSJianqun Xu 		.bit = 0,
433*cf04a17bSJianqun Xu 		.mask = 0xf
434*cf04a17bSJianqun Xu 	},
435*cf04a17bSJianqun Xu 	{
436*cf04a17bSJianqun Xu 		.num = 0,
437*cf04a17bSJianqun Xu 		.pin = 21,
438*cf04a17bSJianqun Xu 		.reg = 0x10000,
439*cf04a17bSJianqun Xu 		.bit = 4,
440*cf04a17bSJianqun Xu 		.mask = 0xf
441*cf04a17bSJianqun Xu 	},
442*cf04a17bSJianqun Xu 	{
443*cf04a17bSJianqun Xu 		.num = 0,
444*cf04a17bSJianqun Xu 		.pin = 22,
445*cf04a17bSJianqun Xu 		.reg = 0x10000,
446*cf04a17bSJianqun Xu 		.bit = 8,
447*cf04a17bSJianqun Xu 		.mask = 0xf
448*cf04a17bSJianqun Xu 	},
449*cf04a17bSJianqun Xu 	{
450*cf04a17bSJianqun Xu 		.num = 0,
451*cf04a17bSJianqun Xu 		.pin = 23,
452*cf04a17bSJianqun Xu 		.reg = 0x10000,
453*cf04a17bSJianqun Xu 		.bit = 12,
454*cf04a17bSJianqun Xu 		.mask = 0xf
455*cf04a17bSJianqun Xu 	},
456*cf04a17bSJianqun Xu };
457*cf04a17bSJianqun Xu 
45849c55878SDavid Wu static  struct rockchip_mux_recalced_data rk3128_mux_recalced_data[] = {
45949c55878SDavid Wu 	{
46049c55878SDavid Wu 		.num = 2,
46149c55878SDavid Wu 		.pin = 20,
46249c55878SDavid Wu 		.reg = 0xe8,
46349c55878SDavid Wu 		.bit = 0,
46449c55878SDavid Wu 		.mask = 0x7
46549c55878SDavid Wu 	}, {
46649c55878SDavid Wu 		.num = 2,
46749c55878SDavid Wu 		.pin = 21,
46849c55878SDavid Wu 		.reg = 0xe8,
46949c55878SDavid Wu 		.bit = 4,
47049c55878SDavid Wu 		.mask = 0x7
47149c55878SDavid Wu 	}, {
47249c55878SDavid Wu 		.num = 2,
47349c55878SDavid Wu 		.pin = 22,
47449c55878SDavid Wu 		.reg = 0xe8,
47549c55878SDavid Wu 		.bit = 8,
47649c55878SDavid Wu 		.mask = 0x7
47749c55878SDavid Wu 	}, {
47849c55878SDavid Wu 		.num = 2,
47949c55878SDavid Wu 		.pin = 23,
48049c55878SDavid Wu 		.reg = 0xe8,
48149c55878SDavid Wu 		.bit = 12,
48249c55878SDavid Wu 		.mask = 0x7
48349c55878SDavid Wu 	}, {
48449c55878SDavid Wu 		.num = 2,
48549c55878SDavid Wu 		.pin = 24,
48649c55878SDavid Wu 		.reg = 0xd4,
48749c55878SDavid Wu 		.bit = 12,
48849c55878SDavid Wu 		.mask = 0x7
48949c55878SDavid Wu 	},
49049c55878SDavid Wu };
49149c55878SDavid Wu 
492b3077611SDavid Wu static struct rockchip_mux_recalced_data rk3308_mux_recalced_data[] = {
493b3077611SDavid Wu 	{
494b3077611SDavid Wu 		.num = 1,
495b3077611SDavid Wu 		.pin = 14,
496b3077611SDavid Wu 		.reg = 0x28,
497b3077611SDavid Wu 		.bit = 12,
498b3077611SDavid Wu 		.mask = 0x7
499b3077611SDavid Wu 	}, {
500b3077611SDavid Wu 		.num = 1,
501b3077611SDavid Wu 		.pin = 15,
502b3077611SDavid Wu 		.reg = 0x2c,
503b3077611SDavid Wu 		.bit = 0,
504b3077611SDavid Wu 		.mask = 0x3
505b3077611SDavid Wu 	}, {
506b3077611SDavid Wu 		.num = 1,
507b3077611SDavid Wu 		.pin = 18,
508b3077611SDavid Wu 		.reg = 0x30,
509b3077611SDavid Wu 		.bit = 4,
510b3077611SDavid Wu 		.mask = 0x7
511b3077611SDavid Wu 	}, {
512b3077611SDavid Wu 		.num = 1,
513b3077611SDavid Wu 		.pin = 19,
514b3077611SDavid Wu 		.reg = 0x30,
515b3077611SDavid Wu 		.bit = 8,
516b3077611SDavid Wu 		.mask = 0x7
517b3077611SDavid Wu 	}, {
518b3077611SDavid Wu 		.num = 1,
519b3077611SDavid Wu 		.pin = 20,
520b3077611SDavid Wu 		.reg = 0x30,
521b3077611SDavid Wu 		.bit = 12,
522b3077611SDavid Wu 		.mask = 0x7
523b3077611SDavid Wu 	}, {
524b3077611SDavid Wu 		.num = 1,
525b3077611SDavid Wu 		.pin = 21,
526b3077611SDavid Wu 		.reg = 0x34,
527b3077611SDavid Wu 		.bit = 0,
528b3077611SDavid Wu 		.mask = 0x7
529b3077611SDavid Wu 	}, {
530b3077611SDavid Wu 		.num = 1,
531b3077611SDavid Wu 		.pin = 22,
532b3077611SDavid Wu 		.reg = 0x34,
533b3077611SDavid Wu 		.bit = 4,
534b3077611SDavid Wu 		.mask = 0x7
535b3077611SDavid Wu 	}, {
536b3077611SDavid Wu 		.num = 1,
537b3077611SDavid Wu 		.pin = 23,
538b3077611SDavid Wu 		.reg = 0x34,
539b3077611SDavid Wu 		.bit = 8,
540b3077611SDavid Wu 		.mask = 0x7
541b3077611SDavid Wu 	}, {
542b3077611SDavid Wu 		.num = 3,
543b3077611SDavid Wu 		.pin = 12,
544b3077611SDavid Wu 		.reg = 0x68,
545b3077611SDavid Wu 		.bit = 8,
546b3077611SDavid Wu 		.mask = 0x7
547b3077611SDavid Wu 	}, {
548b3077611SDavid Wu 		.num = 3,
549b3077611SDavid Wu 		.pin = 13,
550b3077611SDavid Wu 		.reg = 0x68,
551b3077611SDavid Wu 		.bit = 12,
552b3077611SDavid Wu 		.mask = 0x7
553b3077611SDavid Wu 	},
554b3077611SDavid Wu };
555b3077611SDavid Wu 
556d5517017SDavid Wu static struct rockchip_mux_recalced_data rk3308b_mux_recalced_data[] = {
557d5517017SDavid Wu 	{
558d5517017SDavid Wu 		.num = 1,
559d5517017SDavid Wu 		.pin = 14,
560d5517017SDavid Wu 		.reg = 0x28,
561d5517017SDavid Wu 		.bit = 12,
562d5517017SDavid Wu 		.mask = 0xf
563d5517017SDavid Wu 	}, {
564d5517017SDavid Wu 		.num = 1,
565d5517017SDavid Wu 		.pin = 15,
566d5517017SDavid Wu 		.reg = 0x2c,
567d5517017SDavid Wu 		.bit = 0,
568d5517017SDavid Wu 		.mask = 0x3
569d5517017SDavid Wu 	}, {
570d5517017SDavid Wu 		.num = 1,
571d5517017SDavid Wu 		.pin = 18,
572d5517017SDavid Wu 		.reg = 0x30,
573d5517017SDavid Wu 		.bit = 4,
574d5517017SDavid Wu 		.mask = 0xf
575d5517017SDavid Wu 	}, {
576d5517017SDavid Wu 		.num = 1,
577d5517017SDavid Wu 		.pin = 19,
578d5517017SDavid Wu 		.reg = 0x30,
579d5517017SDavid Wu 		.bit = 8,
580d5517017SDavid Wu 		.mask = 0xf
581d5517017SDavid Wu 	}, {
582d5517017SDavid Wu 		.num = 1,
583d5517017SDavid Wu 		.pin = 20,
584d5517017SDavid Wu 		.reg = 0x30,
585d5517017SDavid Wu 		.bit = 12,
586d5517017SDavid Wu 		.mask = 0xf
587d5517017SDavid Wu 	}, {
588d5517017SDavid Wu 		.num = 1,
589d5517017SDavid Wu 		.pin = 21,
590d5517017SDavid Wu 		.reg = 0x34,
591d5517017SDavid Wu 		.bit = 0,
592d5517017SDavid Wu 		.mask = 0xf
593d5517017SDavid Wu 	}, {
594d5517017SDavid Wu 		.num = 1,
595d5517017SDavid Wu 		.pin = 22,
596d5517017SDavid Wu 		.reg = 0x34,
597d5517017SDavid Wu 		.bit = 4,
598d5517017SDavid Wu 		.mask = 0xf
599d5517017SDavid Wu 	}, {
600d5517017SDavid Wu 		.num = 1,
601d5517017SDavid Wu 		.pin = 23,
602d5517017SDavid Wu 		.reg = 0x34,
603d5517017SDavid Wu 		.bit = 8,
604d5517017SDavid Wu 		.mask = 0xf
605d5517017SDavid Wu 	}, {
606d5517017SDavid Wu 		.num = 3,
607752032c9SDavid.Wu 		.pin = 12,
608752032c9SDavid.Wu 		.reg = 0x68,
609752032c9SDavid.Wu 		.bit = 8,
610752032c9SDavid.Wu 		.mask = 0xf
611752032c9SDavid.Wu 	}, {
612752032c9SDavid.Wu 		.num = 3,
613d5517017SDavid Wu 		.pin = 13,
614d5517017SDavid Wu 		.reg = 0x68,
615d5517017SDavid Wu 		.bit = 12,
616d5517017SDavid Wu 		.mask = 0xf
617d5517017SDavid Wu 	}, {
618d5517017SDavid Wu 		.num = 2,
619d5517017SDavid Wu 		.pin = 2,
620d5517017SDavid Wu 		.reg = 0x608,
621d5517017SDavid Wu 		.bit = 0,
622d5517017SDavid Wu 		.mask = 0x7
623d5517017SDavid Wu 	}, {
624d5517017SDavid Wu 		.num = 2,
625d5517017SDavid Wu 		.pin = 3,
626d5517017SDavid Wu 		.reg = 0x608,
627d5517017SDavid Wu 		.bit = 4,
628d5517017SDavid Wu 		.mask = 0x7
629d5517017SDavid Wu 	}, {
630d5517017SDavid Wu 		.num = 2,
631d5517017SDavid Wu 		.pin = 16,
632d5517017SDavid Wu 		.reg = 0x610,
633d5517017SDavid Wu 		.bit = 8,
634d5517017SDavid Wu 		.mask = 0x7
635d5517017SDavid Wu 	}, {
636d5517017SDavid Wu 		.num = 3,
637d5517017SDavid Wu 		.pin = 10,
638d5517017SDavid Wu 		.reg = 0x610,
639d5517017SDavid Wu 		.bit = 0,
640d5517017SDavid Wu 		.mask = 0x7
641d5517017SDavid Wu 	}, {
642d5517017SDavid Wu 		.num = 3,
643d5517017SDavid Wu 		.pin = 11,
644d5517017SDavid Wu 		.reg = 0x610,
645d5517017SDavid Wu 		.bit = 4,
646d5517017SDavid Wu 		.mask = 0x7
647d5517017SDavid Wu 	},
648d5517017SDavid Wu };
649d5517017SDavid Wu 
65049c55878SDavid Wu static struct rockchip_mux_recalced_data rk3328_mux_recalced_data[] = {
65149c55878SDavid Wu 	{
65249c55878SDavid Wu 		.num = 2,
65349c55878SDavid Wu 		.pin = 12,
65449c55878SDavid Wu 		.reg = 0x24,
65549c55878SDavid Wu 		.bit = 8,
65649c55878SDavid Wu 		.mask = 0x3
65749c55878SDavid Wu 	}, {
65849c55878SDavid Wu 		.num = 2,
65949c55878SDavid Wu 		.pin = 15,
66049c55878SDavid Wu 		.reg = 0x28,
66149c55878SDavid Wu 		.bit = 0,
66249c55878SDavid Wu 		.mask = 0x7
66349c55878SDavid Wu 	}, {
66449c55878SDavid Wu 		.num = 2,
66549c55878SDavid Wu 		.pin = 23,
66649c55878SDavid Wu 		.reg = 0x30,
66749c55878SDavid Wu 		.bit = 14,
66849c55878SDavid Wu 		.mask = 0x3
66949c55878SDavid Wu 	},
67049c55878SDavid Wu };
67149c55878SDavid Wu 
67249c55878SDavid Wu static void rockchip_get_recalced_mux(struct rockchip_pin_bank *bank, int pin,
67349c55878SDavid Wu 				      int *reg, u8 *bit, int *mask)
67449c55878SDavid Wu {
67549c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
67649c55878SDavid Wu 	struct rockchip_pin_ctrl *ctrl = priv->ctrl;
67749c55878SDavid Wu 	struct rockchip_mux_recalced_data *data;
67849c55878SDavid Wu 	int i;
67949c55878SDavid Wu 
68049c55878SDavid Wu 	for (i = 0; i < ctrl->niomux_recalced; i++) {
68149c55878SDavid Wu 		data = &ctrl->iomux_recalced[i];
68249c55878SDavid Wu 		if (data->num == bank->bank_num &&
68349c55878SDavid Wu 		    data->pin == pin)
68449c55878SDavid Wu 			break;
68549c55878SDavid Wu 	}
68649c55878SDavid Wu 
68749c55878SDavid Wu 	if (i >= ctrl->niomux_recalced)
68849c55878SDavid Wu 		return;
68949c55878SDavid Wu 
69049c55878SDavid Wu 	*reg = data->reg;
69149c55878SDavid Wu 	*mask = data->mask;
69249c55878SDavid Wu 	*bit = data->bit;
69349c55878SDavid Wu }
69449c55878SDavid Wu 
69549c55878SDavid Wu static struct rockchip_mux_route_data px30_mux_route_data[] = {
69649c55878SDavid Wu 	{
69749c55878SDavid Wu 		/* cif-d2m0 */
69849c55878SDavid Wu 		.bank_num = 2,
69949c55878SDavid Wu 		.pin = 0,
70049c55878SDavid Wu 		.func = 1,
70149c55878SDavid Wu 		.route_offset = 0x184,
70249c55878SDavid Wu 		.route_val = BIT(16 + 7),
70349c55878SDavid Wu 	}, {
70449c55878SDavid Wu 		/* cif-d2m1 */
70549c55878SDavid Wu 		.bank_num = 3,
70649c55878SDavid Wu 		.pin = 3,
70749c55878SDavid Wu 		.func = 3,
70849c55878SDavid Wu 		.route_offset = 0x184,
70949c55878SDavid Wu 		.route_val = BIT(16 + 7) | BIT(7),
71049c55878SDavid Wu 	}, {
71149c55878SDavid Wu 		/* pdm-m0 */
71249c55878SDavid Wu 		.bank_num = 3,
71349c55878SDavid Wu 		.pin = 22,
71449c55878SDavid Wu 		.func = 2,
71549c55878SDavid Wu 		.route_offset = 0x184,
71649c55878SDavid Wu 		.route_val = BIT(16 + 8),
71749c55878SDavid Wu 	}, {
71849c55878SDavid Wu 		/* pdm-m1 */
71949c55878SDavid Wu 		.bank_num = 2,
72049c55878SDavid Wu 		.pin = 22,
72149c55878SDavid Wu 		.func = 1,
72249c55878SDavid Wu 		.route_offset = 0x184,
72349c55878SDavid Wu 		.route_val = BIT(16 + 8) | BIT(8),
72449c55878SDavid Wu 	}, {
72549c55878SDavid Wu 		/* uart2-rxm0 */
72649c55878SDavid Wu 		.bank_num = 1,
727793770dfSDavid Wu 		.pin = 27,
72849c55878SDavid Wu 		.func = 2,
72949c55878SDavid Wu 		.route_offset = 0x184,
730793770dfSDavid Wu 		.route_val = BIT(16 + 10),
73149c55878SDavid Wu 	}, {
73249c55878SDavid Wu 		/* uart2-rxm1 */
73349c55878SDavid Wu 		.bank_num = 2,
73449c55878SDavid Wu 		.pin = 14,
73549c55878SDavid Wu 		.func = 2,
73649c55878SDavid Wu 		.route_offset = 0x184,
737793770dfSDavid Wu 		.route_val = BIT(16 + 10) | BIT(10),
73849c55878SDavid Wu 	}, {
73949c55878SDavid Wu 		/* uart3-rxm0 */
74049c55878SDavid Wu 		.bank_num = 0,
74149c55878SDavid Wu 		.pin = 17,
74249c55878SDavid Wu 		.func = 2,
74349c55878SDavid Wu 		.route_offset = 0x184,
744793770dfSDavid Wu 		.route_val = BIT(16 + 9),
74549c55878SDavid Wu 	}, {
74649c55878SDavid Wu 		/* uart3-rxm1 */
74749c55878SDavid Wu 		.bank_num = 1,
748793770dfSDavid Wu 		.pin = 15,
74949c55878SDavid Wu 		.func = 2,
75049c55878SDavid Wu 		.route_offset = 0x184,
751793770dfSDavid Wu 		.route_val = BIT(16 + 9) | BIT(9),
75249c55878SDavid Wu 	},
75349c55878SDavid Wu };
75449c55878SDavid Wu 
755a2a3fc8fSJianqun Xu static struct rockchip_mux_route_data rk1808_mux_route_data[] = {
756a2a3fc8fSJianqun Xu 	{
757a2a3fc8fSJianqun Xu 		/* i2c2m0_sda */
758a2a3fc8fSJianqun Xu 		.bank_num = 3,
759a2a3fc8fSJianqun Xu 		.pin = 12,
760a2a3fc8fSJianqun Xu 		.func = 2,
761a2a3fc8fSJianqun Xu 		.route_offset = 0x190,
762a2a3fc8fSJianqun Xu 		.route_val = BIT(16 + 3),
763a2a3fc8fSJianqun Xu 	}, {
764a2a3fc8fSJianqun Xu 		/* i2c2m1_sda */
765a2a3fc8fSJianqun Xu 		.bank_num = 1,
766a2a3fc8fSJianqun Xu 		.pin = 13,
767a2a3fc8fSJianqun Xu 		.func = 2,
768a2a3fc8fSJianqun Xu 		.route_offset = 0x190,
769a2a3fc8fSJianqun Xu 		.route_val = BIT(16 + 3) | BIT(3),
770a2a3fc8fSJianqun Xu 	}, {
771a2a3fc8fSJianqun Xu 		/* uart2_rxm0 */
772a2a3fc8fSJianqun Xu 		.bank_num = 4,
773a2a3fc8fSJianqun Xu 		.pin = 3,
774a2a3fc8fSJianqun Xu 		.func = 2,
775a2a3fc8fSJianqun Xu 		.route_offset = 0x190,
776a2a3fc8fSJianqun Xu 		.route_val = BIT(16 + 14) | BIT(16 + 15),
777a2a3fc8fSJianqun Xu 	}, {
778a2a3fc8fSJianqun Xu 		/* uart2_rxm1 */
779a2a3fc8fSJianqun Xu 		.bank_num = 2,
780a2a3fc8fSJianqun Xu 		.pin = 25,
781a2a3fc8fSJianqun Xu 		.func = 2,
782a2a3fc8fSJianqun Xu 		.route_offset = 0x190,
783a2a3fc8fSJianqun Xu 		.route_val = BIT(16 + 14) | BIT(14) | BIT(16 + 15),
784a2a3fc8fSJianqun Xu 	}, {
785a2a3fc8fSJianqun Xu 		/* uart2_rxm2 */
786a2a3fc8fSJianqun Xu 		.bank_num = 3,
787a2a3fc8fSJianqun Xu 		.pin = 4,
788a2a3fc8fSJianqun Xu 		.func = 2,
789a2a3fc8fSJianqun Xu 		.route_offset = 0x190,
790a2a3fc8fSJianqun Xu 		.route_val = BIT(16 + 14) | BIT(16 + 15) | BIT(15),
791a2a3fc8fSJianqun Xu 	},
792a2a3fc8fSJianqun Xu };
793a2a3fc8fSJianqun Xu 
79449c55878SDavid Wu static struct rockchip_mux_route_data rk3128_mux_route_data[] = {
79549c55878SDavid Wu 	{
79649c55878SDavid Wu 		/* spi-0 */
79749c55878SDavid Wu 		.bank_num = 1,
79849c55878SDavid Wu 		.pin = 10,
79949c55878SDavid Wu 		.func = 1,
80049c55878SDavid Wu 		.route_offset = 0x144,
80149c55878SDavid Wu 		.route_val = BIT(16 + 3) | BIT(16 + 4),
80249c55878SDavid Wu 	}, {
80349c55878SDavid Wu 		/* spi-1 */
80449c55878SDavid Wu 		.bank_num = 1,
80549c55878SDavid Wu 		.pin = 27,
80649c55878SDavid Wu 		.func = 3,
80749c55878SDavid Wu 		.route_offset = 0x144,
80849c55878SDavid Wu 		.route_val = BIT(16 + 3) | BIT(16 + 4) | BIT(3),
80949c55878SDavid Wu 	}, {
81049c55878SDavid Wu 		/* spi-2 */
81149c55878SDavid Wu 		.bank_num = 0,
81249c55878SDavid Wu 		.pin = 13,
81349c55878SDavid Wu 		.func = 2,
81449c55878SDavid Wu 		.route_offset = 0x144,
81549c55878SDavid Wu 		.route_val = BIT(16 + 3) | BIT(16 + 4) | BIT(4),
81649c55878SDavid Wu 	}, {
81749c55878SDavid Wu 		/* i2s-0 */
81849c55878SDavid Wu 		.bank_num = 1,
81949c55878SDavid Wu 		.pin = 5,
82049c55878SDavid Wu 		.func = 1,
82149c55878SDavid Wu 		.route_offset = 0x144,
82249c55878SDavid Wu 		.route_val = BIT(16 + 5),
82349c55878SDavid Wu 	}, {
82449c55878SDavid Wu 		/* i2s-1 */
82549c55878SDavid Wu 		.bank_num = 0,
82649c55878SDavid Wu 		.pin = 14,
82749c55878SDavid Wu 		.func = 1,
82849c55878SDavid Wu 		.route_offset = 0x144,
82949c55878SDavid Wu 		.route_val = BIT(16 + 5) | BIT(5),
83049c55878SDavid Wu 	}, {
83149c55878SDavid Wu 		/* emmc-0 */
83249c55878SDavid Wu 		.bank_num = 1,
83349c55878SDavid Wu 		.pin = 22,
83449c55878SDavid Wu 		.func = 2,
83549c55878SDavid Wu 		.route_offset = 0x144,
83649c55878SDavid Wu 		.route_val = BIT(16 + 6),
83749c55878SDavid Wu 	}, {
83849c55878SDavid Wu 		/* emmc-1 */
83949c55878SDavid Wu 		.bank_num = 2,
84049c55878SDavid Wu 		.pin = 4,
84149c55878SDavid Wu 		.func = 2,
84249c55878SDavid Wu 		.route_offset = 0x144,
84349c55878SDavid Wu 		.route_val = BIT(16 + 6) | BIT(6),
84449c55878SDavid Wu 	},
84549c55878SDavid Wu };
84649c55878SDavid Wu 
84749c55878SDavid Wu static struct rockchip_mux_route_data rk3228_mux_route_data[] = {
84849c55878SDavid Wu 	{
84949c55878SDavid Wu 		/* pwm0-0 */
85049c55878SDavid Wu 		.bank_num = 0,
85149c55878SDavid Wu 		.pin = 26,
85249c55878SDavid Wu 		.func = 1,
85349c55878SDavid Wu 		.route_offset = 0x50,
85449c55878SDavid Wu 		.route_val = BIT(16),
85549c55878SDavid Wu 	}, {
85649c55878SDavid Wu 		/* pwm0-1 */
85749c55878SDavid Wu 		.bank_num = 3,
85849c55878SDavid Wu 		.pin = 21,
85949c55878SDavid Wu 		.func = 1,
86049c55878SDavid Wu 		.route_offset = 0x50,
86149c55878SDavid Wu 		.route_val = BIT(16) | BIT(0),
86249c55878SDavid Wu 	}, {
86349c55878SDavid Wu 		/* pwm1-0 */
86449c55878SDavid Wu 		.bank_num = 0,
86549c55878SDavid Wu 		.pin = 27,
86649c55878SDavid Wu 		.func = 1,
86749c55878SDavid Wu 		.route_offset = 0x50,
86849c55878SDavid Wu 		.route_val = BIT(16 + 1),
86949c55878SDavid Wu 	}, {
87049c55878SDavid Wu 		/* pwm1-1 */
87149c55878SDavid Wu 		.bank_num = 0,
87249c55878SDavid Wu 		.pin = 30,
87349c55878SDavid Wu 		.func = 2,
87449c55878SDavid Wu 		.route_offset = 0x50,
87549c55878SDavid Wu 		.route_val = BIT(16 + 1) | BIT(1),
87649c55878SDavid Wu 	}, {
87749c55878SDavid Wu 		/* pwm2-0 */
87849c55878SDavid Wu 		.bank_num = 0,
87949c55878SDavid Wu 		.pin = 28,
88049c55878SDavid Wu 		.func = 1,
88149c55878SDavid Wu 		.route_offset = 0x50,
88249c55878SDavid Wu 		.route_val = BIT(16 + 2),
88349c55878SDavid Wu 	}, {
88449c55878SDavid Wu 		/* pwm2-1 */
88549c55878SDavid Wu 		.bank_num = 1,
88649c55878SDavid Wu 		.pin = 12,
88749c55878SDavid Wu 		.func = 2,
88849c55878SDavid Wu 		.route_offset = 0x50,
88949c55878SDavid Wu 		.route_val = BIT(16 + 2) | BIT(2),
89049c55878SDavid Wu 	}, {
89149c55878SDavid Wu 		/* pwm3-0 */
89249c55878SDavid Wu 		.bank_num = 3,
89349c55878SDavid Wu 		.pin = 26,
89449c55878SDavid Wu 		.func = 1,
89549c55878SDavid Wu 		.route_offset = 0x50,
89649c55878SDavid Wu 		.route_val = BIT(16 + 3),
89749c55878SDavid Wu 	}, {
89849c55878SDavid Wu 		/* pwm3-1 */
89949c55878SDavid Wu 		.bank_num = 1,
90049c55878SDavid Wu 		.pin = 11,
90149c55878SDavid Wu 		.func = 2,
90249c55878SDavid Wu 		.route_offset = 0x50,
90349c55878SDavid Wu 		.route_val = BIT(16 + 3) | BIT(3),
90449c55878SDavid Wu 	}, {
90549c55878SDavid Wu 		/* sdio-0_d0 */
90649c55878SDavid Wu 		.bank_num = 1,
90749c55878SDavid Wu 		.pin = 1,
90849c55878SDavid Wu 		.func = 1,
90949c55878SDavid Wu 		.route_offset = 0x50,
91049c55878SDavid Wu 		.route_val = BIT(16 + 4),
91149c55878SDavid Wu 	}, {
91249c55878SDavid Wu 		/* sdio-1_d0 */
91349c55878SDavid Wu 		.bank_num = 3,
91449c55878SDavid Wu 		.pin = 2,
91549c55878SDavid Wu 		.func = 1,
91649c55878SDavid Wu 		.route_offset = 0x50,
91749c55878SDavid Wu 		.route_val = BIT(16 + 4) | BIT(4),
91849c55878SDavid Wu 	}, {
91949c55878SDavid Wu 		/* spi-0_rx */
92049c55878SDavid Wu 		.bank_num = 0,
92149c55878SDavid Wu 		.pin = 13,
92249c55878SDavid Wu 		.func = 2,
92349c55878SDavid Wu 		.route_offset = 0x50,
92449c55878SDavid Wu 		.route_val = BIT(16 + 5),
92549c55878SDavid Wu 	}, {
92649c55878SDavid Wu 		/* spi-1_rx */
92749c55878SDavid Wu 		.bank_num = 2,
92849c55878SDavid Wu 		.pin = 0,
92949c55878SDavid Wu 		.func = 2,
93049c55878SDavid Wu 		.route_offset = 0x50,
93149c55878SDavid Wu 		.route_val = BIT(16 + 5) | BIT(5),
93249c55878SDavid Wu 	}, {
93349c55878SDavid Wu 		/* emmc-0_cmd */
93449c55878SDavid Wu 		.bank_num = 1,
93549c55878SDavid Wu 		.pin = 22,
93649c55878SDavid Wu 		.func = 2,
93749c55878SDavid Wu 		.route_offset = 0x50,
93849c55878SDavid Wu 		.route_val = BIT(16 + 7),
93949c55878SDavid Wu 	}, {
94049c55878SDavid Wu 		/* emmc-1_cmd */
94149c55878SDavid Wu 		.bank_num = 2,
94249c55878SDavid Wu 		.pin = 4,
94349c55878SDavid Wu 		.func = 2,
94449c55878SDavid Wu 		.route_offset = 0x50,
94549c55878SDavid Wu 		.route_val = BIT(16 + 7) | BIT(7),
94649c55878SDavid Wu 	}, {
94749c55878SDavid Wu 		/* uart2-0_rx */
94849c55878SDavid Wu 		.bank_num = 1,
94949c55878SDavid Wu 		.pin = 19,
95049c55878SDavid Wu 		.func = 2,
95149c55878SDavid Wu 		.route_offset = 0x50,
95249c55878SDavid Wu 		.route_val = BIT(16 + 8),
95349c55878SDavid Wu 	}, {
95449c55878SDavid Wu 		/* uart2-1_rx */
95549c55878SDavid Wu 		.bank_num = 1,
95649c55878SDavid Wu 		.pin = 10,
95749c55878SDavid Wu 		.func = 2,
95849c55878SDavid Wu 		.route_offset = 0x50,
95949c55878SDavid Wu 		.route_val = BIT(16 + 8) | BIT(8),
96049c55878SDavid Wu 	}, {
96149c55878SDavid Wu 		/* uart1-0_rx */
96249c55878SDavid Wu 		.bank_num = 1,
96349c55878SDavid Wu 		.pin = 10,
96449c55878SDavid Wu 		.func = 1,
96549c55878SDavid Wu 		.route_offset = 0x50,
96649c55878SDavid Wu 		.route_val = BIT(16 + 11),
96749c55878SDavid Wu 	}, {
96849c55878SDavid Wu 		/* uart1-1_rx */
96949c55878SDavid Wu 		.bank_num = 3,
97049c55878SDavid Wu 		.pin = 13,
97149c55878SDavid Wu 		.func = 1,
97249c55878SDavid Wu 		.route_offset = 0x50,
97349c55878SDavid Wu 		.route_val = BIT(16 + 11) | BIT(11),
97449c55878SDavid Wu 	},
97549c55878SDavid Wu };
97649c55878SDavid Wu 
97749c55878SDavid Wu static struct rockchip_mux_route_data rk3288_mux_route_data[] = {
97849c55878SDavid Wu 	{
97949c55878SDavid Wu 		/* edphdmi_cecinoutt1 */
98049c55878SDavid Wu 		.bank_num = 7,
98149c55878SDavid Wu 		.pin = 16,
98249c55878SDavid Wu 		.func = 2,
98349c55878SDavid Wu 		.route_offset = 0x264,
98449c55878SDavid Wu 		.route_val = BIT(16 + 12) | BIT(12),
98549c55878SDavid Wu 	}, {
98649c55878SDavid Wu 		/* edphdmi_cecinout */
98749c55878SDavid Wu 		.bank_num = 7,
98849c55878SDavid Wu 		.pin = 23,
98949c55878SDavid Wu 		.func = 4,
99049c55878SDavid Wu 		.route_offset = 0x264,
99149c55878SDavid Wu 		.route_val = BIT(16 + 12),
99249c55878SDavid Wu 	},
99349c55878SDavid Wu };
99449c55878SDavid Wu 
995b3077611SDavid Wu static struct rockchip_mux_route_data rk3308_mux_route_data[] = {
996b3077611SDavid Wu 	{
997d5517017SDavid Wu 		/* rtc_clk */
998d5517017SDavid Wu 		.bank_num = 0,
999d5517017SDavid Wu 		.pin = 19,
1000d5517017SDavid Wu 		.func = 1,
1001d5517017SDavid Wu 		.route_offset = 0x314,
1002d5517017SDavid Wu 		.route_val = BIT(16 + 0) | BIT(0),
1003d5517017SDavid Wu 	}, {
1004b3077611SDavid Wu 		/* uart2_rxm0 */
1005b3077611SDavid Wu 		.bank_num = 1,
1006b3077611SDavid Wu 		.pin = 22,
1007b3077611SDavid Wu 		.func = 2,
1008b3077611SDavid Wu 		.route_offset = 0x314,
1009b3077611SDavid Wu 		.route_val = BIT(16 + 2) | BIT(16 + 3),
1010b3077611SDavid Wu 	}, {
1011b3077611SDavid Wu 		/* uart2_rxm1 */
1012b3077611SDavid Wu 		.bank_num = 4,
1013b3077611SDavid Wu 		.pin = 26,
1014b3077611SDavid Wu 		.func = 2,
1015b3077611SDavid Wu 		.route_offset = 0x314,
1016b3077611SDavid Wu 		.route_val = BIT(16 + 2) | BIT(16 + 3) | BIT(2),
1017b3077611SDavid Wu 	}, {
1018b3077611SDavid Wu 		/* i2c3_sdam0 */
1019b3077611SDavid Wu 		.bank_num = 0,
1020b3077611SDavid Wu 		.pin = 23,
1021b3077611SDavid Wu 		.func = 2,
1022b3077611SDavid Wu 		.route_offset = 0x314,
1023b3077611SDavid Wu 		.route_val = BIT(16 + 4),
1024b3077611SDavid Wu 	}, {
1025b3077611SDavid Wu 		/* i2c3_sdam1 */
1026b3077611SDavid Wu 		.bank_num = 3,
1027b3077611SDavid Wu 		.pin = 12,
1028b3077611SDavid Wu 		.func = 2,
1029b3077611SDavid Wu 		.route_offset = 0x314,
1030b3077611SDavid Wu 		.route_val = BIT(16 + 4) | BIT(4),
1031d5517017SDavid Wu 	}, {
1032d5517017SDavid Wu 		/* i2s-8ch-1-sclktxm0 */
1033d5517017SDavid Wu 		.bank_num = 1,
1034d5517017SDavid Wu 		.pin = 3,
1035d5517017SDavid Wu 		.func = 2,
1036d5517017SDavid Wu 		.route_offset = 0x308,
1037d5517017SDavid Wu 		.route_val = BIT(16 + 3),
1038d5517017SDavid Wu 	}, {
1039d5517017SDavid Wu 		/* i2s-8ch-1-sclkrxm0 */
1040d5517017SDavid Wu 		.bank_num = 1,
1041d5517017SDavid Wu 		.pin = 4,
1042d5517017SDavid Wu 		.func = 2,
1043d5517017SDavid Wu 		.route_offset = 0x308,
1044d5517017SDavid Wu 		.route_val = BIT(16 + 3),
1045d5517017SDavid Wu 	}, {
1046d5517017SDavid Wu 		/* i2s-8ch-1-sclktxm1 */
1047d5517017SDavid Wu 		.bank_num = 1,
1048d5517017SDavid Wu 		.pin = 13,
1049d5517017SDavid Wu 		.func = 2,
1050d5517017SDavid Wu 		.route_offset = 0x308,
1051d5517017SDavid Wu 		.route_val = BIT(16 + 3) | BIT(3),
1052d5517017SDavid Wu 	}, {
1053d5517017SDavid Wu 		/* i2s-8ch-1-sclkrxm1 */
1054d5517017SDavid Wu 		.bank_num = 1,
1055d5517017SDavid Wu 		.pin = 14,
1056d5517017SDavid Wu 		.func = 2,
1057d5517017SDavid Wu 		.route_offset = 0x308,
1058d5517017SDavid Wu 		.route_val = BIT(16 + 3) | BIT(3),
1059d5517017SDavid Wu 	}, {
1060d5517017SDavid Wu 		/* pdm-clkm0 */
1061d5517017SDavid Wu 		.bank_num = 1,
1062d5517017SDavid Wu 		.pin = 4,
1063d5517017SDavid Wu 		.func = 3,
1064d5517017SDavid Wu 		.route_offset = 0x308,
1065d5517017SDavid Wu 		.route_val = BIT(16 + 12) | BIT(16 + 13),
1066d5517017SDavid Wu 	}, {
1067d5517017SDavid Wu 		/* pdm-clkm1 */
1068d5517017SDavid Wu 		.bank_num = 1,
1069d5517017SDavid Wu 		.pin = 14,
1070d5517017SDavid Wu 		.func = 4,
1071d5517017SDavid Wu 		.route_offset = 0x308,
1072d5517017SDavid Wu 		.route_val = BIT(16 + 12) | BIT(16 + 13) | BIT(12),
1073d5517017SDavid Wu 	}, {
1074d5517017SDavid Wu 		/* pdm-clkm2 */
1075d5517017SDavid Wu 		.bank_num = 2,
1076d5517017SDavid Wu 		.pin = 6,
1077d5517017SDavid Wu 		.func = 2,
1078d5517017SDavid Wu 		.route_offset = 0x308,
1079d5517017SDavid Wu 		.route_val = BIT(16 + 12) | BIT(16 + 13) | BIT(13),
1080d5517017SDavid Wu 	}, {
1081d5517017SDavid Wu 		/* pdm-clkm-m2 */
1082d5517017SDavid Wu 		.bank_num = 2,
1083d5517017SDavid Wu 		.pin = 4,
1084d5517017SDavid Wu 		.func = 3,
1085d5517017SDavid Wu 		.route_offset = 0x600,
1086d5517017SDavid Wu 		.route_val = BIT(16 + 2) | BIT(2),
1087d5517017SDavid Wu 	},
1088d5517017SDavid Wu };
1089d5517017SDavid Wu 
1090d5517017SDavid Wu static struct rockchip_mux_route_data rk3308b_mux_route_data[] = {
1091d5517017SDavid 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 	}, {
1099d5517017SDavid Wu 		/* uart2_rxm0 */
1100d5517017SDavid Wu 		.bank_num = 1,
1101d5517017SDavid Wu 		.pin = 22,
1102d5517017SDavid Wu 		.func = 2,
1103d5517017SDavid Wu 		.route_offset = 0x314,
1104d5517017SDavid Wu 		.route_val = BIT(16 + 2) | BIT(16 + 3),
1105d5517017SDavid Wu 	}, {
1106d5517017SDavid Wu 		/* uart2_rxm1 */
1107d5517017SDavid Wu 		.bank_num = 4,
1108d5517017SDavid Wu 		.pin = 26,
1109d5517017SDavid Wu 		.func = 2,
1110d5517017SDavid Wu 		.route_offset = 0x314,
1111d5517017SDavid Wu 		.route_val = BIT(16 + 2) | BIT(16 + 3) | BIT(2),
1112d5517017SDavid Wu 	}, {
1113d5517017SDavid Wu 		/* i2c3_sdam0 */
1114d5517017SDavid Wu 		.bank_num = 0,
1115d5517017SDavid Wu 		.pin = 15,
1116d5517017SDavid Wu 		.func = 2,
1117d5517017SDavid Wu 		.route_offset = 0x608,
1118d5517017SDavid Wu 		.route_val = BIT(16 + 8) | BIT(16 + 9),
1119d5517017SDavid Wu 	}, {
1120d5517017SDavid Wu 		/* i2c3_sdam1 */
1121d5517017SDavid Wu 		.bank_num = 3,
1122d5517017SDavid Wu 		.pin = 12,
1123d5517017SDavid Wu 		.func = 2,
1124d5517017SDavid Wu 		.route_offset = 0x608,
1125d5517017SDavid Wu 		.route_val = BIT(16 + 8) | BIT(16 + 9) | BIT(8),
1126d5517017SDavid Wu 	}, {
1127d5517017SDavid Wu 		/* i2c3_sdam2 */
1128d5517017SDavid Wu 		.bank_num = 2,
1129d5517017SDavid Wu 		.pin = 0,
1130d5517017SDavid Wu 		.func = 3,
1131d5517017SDavid Wu 		.route_offset = 0x608,
1132d5517017SDavid Wu 		.route_val = BIT(16 + 8) | BIT(16 + 9) | BIT(9),
1133d5517017SDavid Wu 	}, {
1134d5517017SDavid Wu 		/* i2s-8ch-1-sclktxm0 */
1135d5517017SDavid Wu 		.bank_num = 1,
1136d5517017SDavid Wu 		.pin = 3,
1137d5517017SDavid Wu 		.func = 2,
1138d5517017SDavid Wu 		.route_offset = 0x308,
1139d5517017SDavid Wu 		.route_val = BIT(16 + 3),
1140d5517017SDavid Wu 	}, {
1141d5517017SDavid Wu 		/* i2s-8ch-1-sclkrxm0 */
1142d5517017SDavid Wu 		.bank_num = 1,
1143d5517017SDavid Wu 		.pin = 4,
1144d5517017SDavid Wu 		.func = 2,
1145d5517017SDavid Wu 		.route_offset = 0x308,
1146d5517017SDavid Wu 		.route_val = BIT(16 + 3),
1147d5517017SDavid Wu 	}, {
1148d5517017SDavid Wu 		/* i2s-8ch-1-sclktxm1 */
1149d5517017SDavid Wu 		.bank_num = 1,
1150d5517017SDavid Wu 		.pin = 13,
1151d5517017SDavid Wu 		.func = 2,
1152d5517017SDavid Wu 		.route_offset = 0x308,
1153d5517017SDavid Wu 		.route_val = BIT(16 + 3) | BIT(3),
1154d5517017SDavid Wu 	}, {
1155d5517017SDavid Wu 		/* i2s-8ch-1-sclkrxm1 */
1156d5517017SDavid Wu 		.bank_num = 1,
1157d5517017SDavid Wu 		.pin = 14,
1158d5517017SDavid Wu 		.func = 2,
1159d5517017SDavid Wu 		.route_offset = 0x308,
1160d5517017SDavid Wu 		.route_val = BIT(16 + 3) | BIT(3),
1161d5517017SDavid Wu 	}, {
1162d5517017SDavid Wu 		/* pdm-clkm0 */
1163d5517017SDavid Wu 		.bank_num = 1,
1164d5517017SDavid Wu 		.pin = 4,
1165d5517017SDavid Wu 		.func = 3,
1166d5517017SDavid Wu 		.route_offset = 0x308,
1167d5517017SDavid Wu 		.route_val =  BIT(16 + 12) | BIT(16 + 13),
1168d5517017SDavid Wu 	}, {
1169d5517017SDavid Wu 		/* pdm-clkm1 */
1170d5517017SDavid Wu 		.bank_num = 1,
1171d5517017SDavid Wu 		.pin = 14,
1172d5517017SDavid Wu 		.func = 4,
1173d5517017SDavid Wu 		.route_offset = 0x308,
1174d5517017SDavid Wu 		.route_val = BIT(16 + 12) | BIT(16 + 13) | BIT(12),
1175d5517017SDavid Wu 	}, {
1176d5517017SDavid Wu 		/* pdm-clkm2 */
1177d5517017SDavid Wu 		.bank_num = 2,
1178d5517017SDavid Wu 		.pin = 6,
1179d5517017SDavid Wu 		.func = 2,
1180d5517017SDavid Wu 		.route_offset = 0x308,
1181d5517017SDavid Wu 		.route_val = BIT(16 + 12) | BIT(16 + 13) | BIT(13),
1182d5517017SDavid Wu 	}, {
1183d5517017SDavid Wu 		/* pdm-clkm-m2 */
1184d5517017SDavid Wu 		.bank_num = 2,
1185d5517017SDavid Wu 		.pin = 4,
1186d5517017SDavid Wu 		.func = 3,
1187d5517017SDavid Wu 		.route_offset = 0x600,
1188d5517017SDavid Wu 		.route_val = BIT(16 + 2) | BIT(2),
1189d5517017SDavid Wu 	}, {
1190d5517017SDavid Wu 		/* spi1_miso */
1191d5517017SDavid Wu 		.bank_num = 3,
1192d5517017SDavid Wu 		.pin = 10,
1193d5517017SDavid Wu 		.func = 3,
1194d5517017SDavid Wu 		.route_offset = 0x314,
1195d5517017SDavid Wu 		.route_val = BIT(16 + 9),
1196d5517017SDavid Wu 	}, {
1197d5517017SDavid Wu 		/* spi1_miso_m1 */
1198d5517017SDavid Wu 		.bank_num = 2,
1199d5517017SDavid Wu 		.pin = 4,
1200d5517017SDavid Wu 		.func = 2,
1201d5517017SDavid Wu 		.route_offset = 0x314,
1202d5517017SDavid Wu 		.route_val = BIT(16 + 9) | BIT(9),
1203d5517017SDavid Wu 	}, {
1204d5517017SDavid Wu 		/* owire_m0 */
1205d5517017SDavid Wu 		.bank_num = 0,
1206d5517017SDavid Wu 		.pin = 11,
1207d5517017SDavid Wu 		.func = 3,
1208d5517017SDavid Wu 		.route_offset = 0x314,
1209d5517017SDavid Wu 		.route_val = BIT(16 + 10) | BIT(16 + 11),
1210d5517017SDavid Wu 	}, {
1211d5517017SDavid Wu 		/* owire_m1 */
1212d5517017SDavid Wu 		.bank_num = 1,
1213d5517017SDavid Wu 		.pin = 22,
1214d5517017SDavid Wu 		.func = 7,
1215d5517017SDavid Wu 		.route_offset = 0x314,
1216d5517017SDavid Wu 		.route_val = BIT(16 + 10) | BIT(16 + 11) | BIT(10),
1217d5517017SDavid Wu 	}, {
1218d5517017SDavid Wu 		/* owire_m2 */
1219d5517017SDavid Wu 		.bank_num = 2,
1220d5517017SDavid Wu 		.pin = 2,
1221d5517017SDavid Wu 		.func = 5,
1222d5517017SDavid Wu 		.route_offset = 0x314,
1223d5517017SDavid Wu 		.route_val = BIT(16 + 10) | BIT(16 + 11) | BIT(11),
1224d5517017SDavid Wu 	}, {
1225d5517017SDavid Wu 		/* can_rxd_m0 */
1226d5517017SDavid Wu 		.bank_num = 0,
1227d5517017SDavid Wu 		.pin = 11,
1228d5517017SDavid Wu 		.func = 2,
1229d5517017SDavid Wu 		.route_offset = 0x314,
1230d5517017SDavid Wu 		.route_val = BIT(16 + 12) | BIT(16 + 13),
1231d5517017SDavid Wu 	}, {
1232d5517017SDavid Wu 		/* can_rxd_m1 */
1233d5517017SDavid Wu 		.bank_num = 1,
1234d5517017SDavid Wu 		.pin = 22,
1235d5517017SDavid Wu 		.func = 5,
1236d5517017SDavid Wu 		.route_offset = 0x314,
1237d5517017SDavid Wu 		.route_val = BIT(16 + 12) | BIT(16 + 13) | BIT(12),
1238d5517017SDavid Wu 	}, {
1239d5517017SDavid Wu 		/* can_rxd_m2 */
1240d5517017SDavid Wu 		.bank_num = 2,
1241d5517017SDavid Wu 		.pin = 2,
1242d5517017SDavid Wu 		.func = 4,
1243d5517017SDavid Wu 		.route_offset = 0x314,
1244d5517017SDavid Wu 		.route_val = BIT(16 + 12) | BIT(16 + 13) | BIT(13),
1245d5517017SDavid Wu 	}, {
1246d5517017SDavid Wu 		/* mac_rxd0_m0 */
1247d5517017SDavid Wu 		.bank_num = 1,
1248d5517017SDavid Wu 		.pin = 20,
1249d5517017SDavid Wu 		.func = 3,
1250d5517017SDavid Wu 		.route_offset = 0x314,
1251d5517017SDavid Wu 		.route_val = BIT(16 + 14),
1252d5517017SDavid Wu 	}, {
1253d5517017SDavid Wu 		/* mac_rxd0_m1 */
1254d5517017SDavid Wu 		.bank_num = 4,
1255d5517017SDavid Wu 		.pin = 2,
1256d5517017SDavid Wu 		.func = 2,
1257d5517017SDavid Wu 		.route_offset = 0x314,
1258d5517017SDavid Wu 		.route_val = BIT(16 + 14) | BIT(14),
1259d5517017SDavid Wu 	}, {
1260d5517017SDavid Wu 		/* uart3_rx */
1261d5517017SDavid Wu 		.bank_num = 3,
1262d5517017SDavid Wu 		.pin = 12,
1263d5517017SDavid Wu 		.func = 4,
1264d5517017SDavid Wu 		.route_offset = 0x314,
1265d5517017SDavid Wu 		.route_val = BIT(16 + 15),
1266d5517017SDavid Wu 	}, {
1267d5517017SDavid Wu 		/* uart3_rx_m1 */
1268d5517017SDavid Wu 		.bank_num = 0,
1269d5517017SDavid Wu 		.pin = 17,
1270d5517017SDavid Wu 		.func = 3,
1271d5517017SDavid Wu 		.route_offset = 0x314,
1272d5517017SDavid Wu 		.route_val = BIT(16 + 15) | BIT(15),
1273b3077611SDavid Wu 	},
1274b3077611SDavid Wu };
1275b3077611SDavid Wu 
127649c55878SDavid Wu static struct rockchip_mux_route_data rk3328_mux_route_data[] = {
127749c55878SDavid Wu 	{
127849c55878SDavid Wu 		/* uart2dbg_rxm0 */
127949c55878SDavid Wu 		.bank_num = 1,
128049c55878SDavid Wu 		.pin = 1,
128149c55878SDavid Wu 		.func = 2,
128249c55878SDavid Wu 		.route_offset = 0x50,
128349c55878SDavid Wu 		.route_val = BIT(16) | BIT(16 + 1),
128449c55878SDavid Wu 	}, {
128549c55878SDavid Wu 		/* uart2dbg_rxm1 */
128649c55878SDavid Wu 		.bank_num = 2,
128749c55878SDavid Wu 		.pin = 1,
128849c55878SDavid Wu 		.func = 1,
128949c55878SDavid Wu 		.route_offset = 0x50,
129049c55878SDavid Wu 		.route_val = BIT(16) | BIT(16 + 1) | BIT(0),
129149c55878SDavid Wu 	}, {
129249c55878SDavid Wu 		/* gmac-m1_rxd0 */
129349c55878SDavid Wu 		.bank_num = 1,
129449c55878SDavid Wu 		.pin = 11,
129549c55878SDavid Wu 		.func = 2,
129649c55878SDavid Wu 		.route_offset = 0x50,
129749c55878SDavid Wu 		.route_val = BIT(16 + 2) | BIT(2),
129849c55878SDavid Wu 	}, {
129949c55878SDavid Wu 		/* gmac-m1-optimized_rxd3 */
130049c55878SDavid Wu 		.bank_num = 1,
130149c55878SDavid Wu 		.pin = 14,
130249c55878SDavid Wu 		.func = 2,
130349c55878SDavid Wu 		.route_offset = 0x50,
130449c55878SDavid Wu 		.route_val = BIT(16 + 10) | BIT(10),
130549c55878SDavid Wu 	}, {
130649c55878SDavid Wu 		/* pdm_sdi0m0 */
130749c55878SDavid Wu 		.bank_num = 2,
130849c55878SDavid Wu 		.pin = 19,
130949c55878SDavid Wu 		.func = 2,
131049c55878SDavid Wu 		.route_offset = 0x50,
131149c55878SDavid Wu 		.route_val = BIT(16 + 3),
131249c55878SDavid Wu 	}, {
131349c55878SDavid Wu 		/* pdm_sdi0m1 */
131449c55878SDavid Wu 		.bank_num = 1,
131549c55878SDavid Wu 		.pin = 23,
131649c55878SDavid Wu 		.func = 3,
131749c55878SDavid Wu 		.route_offset = 0x50,
131849c55878SDavid Wu 		.route_val =  BIT(16 + 3) | BIT(3),
131949c55878SDavid Wu 	}, {
132049c55878SDavid Wu 		/* spi_rxdm2 */
132149c55878SDavid Wu 		.bank_num = 3,
132249c55878SDavid Wu 		.pin = 2,
132349c55878SDavid Wu 		.func = 4,
132449c55878SDavid Wu 		.route_offset = 0x50,
132549c55878SDavid Wu 		.route_val =  BIT(16 + 4) | BIT(16 + 5) | BIT(5),
132649c55878SDavid Wu 	}, {
132749c55878SDavid Wu 		/* i2s2_sdim0 */
132849c55878SDavid Wu 		.bank_num = 1,
132949c55878SDavid Wu 		.pin = 24,
133049c55878SDavid Wu 		.func = 1,
133149c55878SDavid Wu 		.route_offset = 0x50,
133249c55878SDavid Wu 		.route_val = BIT(16 + 6),
133349c55878SDavid Wu 	}, {
133449c55878SDavid Wu 		/* i2s2_sdim1 */
133549c55878SDavid Wu 		.bank_num = 3,
133649c55878SDavid Wu 		.pin = 2,
133749c55878SDavid Wu 		.func = 6,
133849c55878SDavid Wu 		.route_offset = 0x50,
133949c55878SDavid Wu 		.route_val =  BIT(16 + 6) | BIT(6),
134049c55878SDavid Wu 	}, {
134149c55878SDavid Wu 		/* card_iom1 */
134249c55878SDavid Wu 		.bank_num = 2,
134349c55878SDavid Wu 		.pin = 22,
134449c55878SDavid Wu 		.func = 3,
134549c55878SDavid Wu 		.route_offset = 0x50,
134649c55878SDavid Wu 		.route_val =  BIT(16 + 7) | BIT(7),
134749c55878SDavid Wu 	}, {
134849c55878SDavid Wu 		/* tsp_d5m1 */
134949c55878SDavid Wu 		.bank_num = 2,
135049c55878SDavid Wu 		.pin = 16,
135149c55878SDavid Wu 		.func = 3,
135249c55878SDavid Wu 		.route_offset = 0x50,
135349c55878SDavid Wu 		.route_val =  BIT(16 + 8) | BIT(8),
135449c55878SDavid Wu 	}, {
135549c55878SDavid Wu 		/* cif_data5m1 */
135649c55878SDavid Wu 		.bank_num = 2,
135749c55878SDavid Wu 		.pin = 16,
135849c55878SDavid Wu 		.func = 4,
135949c55878SDavid Wu 		.route_offset = 0x50,
136049c55878SDavid Wu 		.route_val =  BIT(16 + 9) | BIT(9),
136149c55878SDavid Wu 	},
136249c55878SDavid Wu };
136349c55878SDavid Wu 
136449c55878SDavid Wu static struct rockchip_mux_route_data rk3399_mux_route_data[] = {
136549c55878SDavid Wu 	{
136649c55878SDavid Wu 		/* uart2dbga_rx */
136749c55878SDavid Wu 		.bank_num = 4,
136849c55878SDavid Wu 		.pin = 8,
136949c55878SDavid Wu 		.func = 2,
137049c55878SDavid Wu 		.route_offset = 0xe21c,
137149c55878SDavid Wu 		.route_val = BIT(16 + 10) | BIT(16 + 11),
137249c55878SDavid Wu 	}, {
137349c55878SDavid Wu 		/* uart2dbgb_rx */
137449c55878SDavid Wu 		.bank_num = 4,
137549c55878SDavid Wu 		.pin = 16,
137649c55878SDavid Wu 		.func = 2,
137749c55878SDavid Wu 		.route_offset = 0xe21c,
137849c55878SDavid Wu 		.route_val = BIT(16 + 10) | BIT(16 + 11) | BIT(10),
137949c55878SDavid Wu 	}, {
138049c55878SDavid Wu 		/* uart2dbgc_rx */
138149c55878SDavid Wu 		.bank_num = 4,
138249c55878SDavid Wu 		.pin = 19,
138349c55878SDavid Wu 		.func = 1,
138449c55878SDavid Wu 		.route_offset = 0xe21c,
138549c55878SDavid Wu 		.route_val = BIT(16 + 10) | BIT(16 + 11) | BIT(11),
138649c55878SDavid Wu 	}, {
138749c55878SDavid Wu 		/* pcie_clkreqn */
138849c55878SDavid Wu 		.bank_num = 2,
138949c55878SDavid Wu 		.pin = 26,
139049c55878SDavid Wu 		.func = 2,
139149c55878SDavid Wu 		.route_offset = 0xe21c,
139249c55878SDavid Wu 		.route_val = BIT(16 + 14),
139349c55878SDavid Wu 	}, {
139449c55878SDavid Wu 		/* pcie_clkreqnb */
139549c55878SDavid Wu 		.bank_num = 4,
139649c55878SDavid Wu 		.pin = 24,
139749c55878SDavid Wu 		.func = 1,
139849c55878SDavid Wu 		.route_offset = 0xe21c,
139949c55878SDavid Wu 		.route_val = BIT(16 + 14) | BIT(14),
140049c55878SDavid Wu 	},
140149c55878SDavid Wu };
140249c55878SDavid Wu 
140349c55878SDavid Wu static bool rockchip_get_mux_route(struct rockchip_pin_bank *bank, int pin,
140449c55878SDavid Wu 				   int mux, u32 *reg, u32 *value)
140549c55878SDavid Wu {
140649c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
140749c55878SDavid Wu 	struct rockchip_pin_ctrl *ctrl = priv->ctrl;
140849c55878SDavid Wu 	struct rockchip_mux_route_data *data;
140949c55878SDavid Wu 	int i;
141049c55878SDavid Wu 
141149c55878SDavid Wu 	for (i = 0; i < ctrl->niomux_routes; i++) {
141249c55878SDavid Wu 		data = &ctrl->iomux_routes[i];
141349c55878SDavid Wu 		if ((data->bank_num == bank->bank_num) &&
141449c55878SDavid Wu 		    (data->pin == pin) && (data->func == mux))
141549c55878SDavid Wu 			break;
141649c55878SDavid Wu 	}
141749c55878SDavid Wu 
141849c55878SDavid Wu 	if (i >= ctrl->niomux_routes)
141949c55878SDavid Wu 		return false;
142049c55878SDavid Wu 
142149c55878SDavid Wu 	*reg = data->route_offset;
142249c55878SDavid Wu 	*value = data->route_val;
142349c55878SDavid Wu 
142449c55878SDavid Wu 	return true;
142549c55878SDavid Wu }
142649c55878SDavid Wu 
142749c55878SDavid Wu static int rockchip_get_mux(struct rockchip_pin_bank *bank, int pin)
142849c55878SDavid Wu {
142949c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
143049c55878SDavid Wu 	int iomux_num = (pin / 8);
143149c55878SDavid Wu 	struct regmap *regmap;
143249c55878SDavid Wu 	unsigned int val;
143349c55878SDavid Wu 	int reg, ret, mask, mux_type;
143449c55878SDavid Wu 	u8 bit;
143549c55878SDavid Wu 
143649c55878SDavid Wu 	if (iomux_num > 3)
143749c55878SDavid Wu 		return -EINVAL;
143849c55878SDavid Wu 
143949c55878SDavid Wu 	if (bank->iomux[iomux_num].type & IOMUX_UNROUTED) {
144049c55878SDavid Wu 		debug("pin %d is unrouted\n", pin);
144149c55878SDavid Wu 		return -EINVAL;
144249c55878SDavid Wu 	}
144349c55878SDavid Wu 
144449c55878SDavid Wu 	if (bank->iomux[iomux_num].type & IOMUX_GPIO_ONLY)
144549c55878SDavid Wu 		return RK_FUNC_GPIO;
144649c55878SDavid Wu 
1447*cf04a17bSJianqun Xu 	if (bank->iomux[iomux_num].type & IOMUX_SOURCE_PMU)
1448*cf04a17bSJianqun Xu 		regmap = priv->regmap_pmu;
1449*cf04a17bSJianqun Xu 	else if (bank->iomux[iomux_num].type & IOMUX_L_SOURCE_PMU)
1450*cf04a17bSJianqun Xu 		regmap = (pin % 8 < 4) ? priv->regmap_pmu : priv->regmap_base;
1451*cf04a17bSJianqun Xu 	else
1452*cf04a17bSJianqun Xu 		regmap = priv->regmap_base;
145349c55878SDavid Wu 
145449c55878SDavid Wu 	/* get basic quadrupel of mux registers and the correct reg inside */
145549c55878SDavid Wu 	mux_type = bank->iomux[iomux_num].type;
145649c55878SDavid Wu 	reg = bank->iomux[iomux_num].offset;
145749c55878SDavid Wu 	if (mux_type & IOMUX_WIDTH_4BIT) {
145849c55878SDavid Wu 		if ((pin % 8) >= 4)
145949c55878SDavid Wu 			reg += 0x4;
146049c55878SDavid Wu 		bit = (pin % 4) * 4;
146149c55878SDavid Wu 		mask = 0xf;
146249c55878SDavid Wu 	} else if (mux_type & IOMUX_WIDTH_3BIT) {
146349c55878SDavid Wu 		if ((pin % 8) >= 5)
146449c55878SDavid Wu 			reg += 0x4;
146549c55878SDavid Wu 		bit = (pin % 8 % 5) * 3;
146649c55878SDavid Wu 		mask = 0x7;
146749c55878SDavid Wu 	} else {
146849c55878SDavid Wu 		bit = (pin % 8) * 2;
146949c55878SDavid Wu 		mask = 0x3;
147049c55878SDavid Wu 	}
147149c55878SDavid Wu 
147249c55878SDavid Wu 	if (bank->recalced_mask & BIT(pin))
147349c55878SDavid Wu 		rockchip_get_recalced_mux(bank, pin, &reg, &bit, &mask);
147449c55878SDavid Wu 
147549c55878SDavid Wu 	ret = regmap_read(regmap, reg, &val);
147649c55878SDavid Wu 	if (ret)
147749c55878SDavid Wu 		return ret;
147849c55878SDavid Wu 
147949c55878SDavid Wu 	return ((val >> bit) & mask);
148049c55878SDavid Wu }
148149c55878SDavid Wu 
148249c55878SDavid Wu static int rockchip_pinctrl_get_gpio_mux(struct udevice *dev, int banknum,
148349c55878SDavid Wu 					 int index)
148449c55878SDavid Wu {	struct rockchip_pinctrl_priv *priv = dev_get_priv(dev);
148549c55878SDavid Wu 	struct rockchip_pin_ctrl *ctrl = priv->ctrl;
148649c55878SDavid Wu 
148749c55878SDavid Wu 	return rockchip_get_mux(&ctrl->pin_banks[banknum], index);
148849c55878SDavid Wu }
148949c55878SDavid Wu 
149049c55878SDavid Wu static int rockchip_verify_mux(struct rockchip_pin_bank *bank,
149149c55878SDavid Wu 			       int pin, int mux)
149249c55878SDavid Wu {
149349c55878SDavid Wu 	int iomux_num = (pin / 8);
149449c55878SDavid Wu 
149549c55878SDavid Wu 	if (iomux_num > 3)
149649c55878SDavid Wu 		return -EINVAL;
149749c55878SDavid Wu 
149849c55878SDavid Wu 	if (bank->iomux[iomux_num].type & IOMUX_UNROUTED) {
149949c55878SDavid Wu 		debug("pin %d is unrouted\n", pin);
150049c55878SDavid Wu 		return -EINVAL;
150149c55878SDavid Wu 	}
150249c55878SDavid Wu 
150349c55878SDavid Wu 	if (bank->iomux[iomux_num].type & IOMUX_GPIO_ONLY) {
150449c55878SDavid Wu 		if (mux != IOMUX_GPIO_ONLY) {
150549c55878SDavid Wu 			debug("pin %d only supports a gpio mux\n", pin);
150649c55878SDavid Wu 			return -ENOTSUPP;
150749c55878SDavid Wu 		}
150849c55878SDavid Wu 	}
150949c55878SDavid Wu 
151049c55878SDavid Wu 	return 0;
151149c55878SDavid Wu }
151249c55878SDavid Wu 
151349c55878SDavid Wu /*
151449c55878SDavid Wu  * Set a new mux function for a pin.
151549c55878SDavid Wu  *
151649c55878SDavid Wu  * The register is divided into the upper and lower 16 bit. When changing
151749c55878SDavid Wu  * a value, the previous register value is not read and changed. Instead
151849c55878SDavid Wu  * it seems the changed bits are marked in the upper 16 bit, while the
151949c55878SDavid Wu  * changed value gets set in the same offset in the lower 16 bit.
152049c55878SDavid Wu  * All pin settings seem to be 2 bit wide in both the upper and lower
152149c55878SDavid Wu  * parts.
152249c55878SDavid Wu  * @bank: pin bank to change
152349c55878SDavid Wu  * @pin: pin to change
152449c55878SDavid Wu  * @mux: new mux function to set
152549c55878SDavid Wu  */
152649c55878SDavid Wu static int rockchip_set_mux(struct rockchip_pin_bank *bank, int pin, int mux)
152749c55878SDavid Wu {
152849c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
152949c55878SDavid Wu 	int iomux_num = (pin / 8);
153049c55878SDavid Wu 	struct regmap *regmap;
153149c55878SDavid Wu 	int reg, ret, mask, mux_type;
153249c55878SDavid Wu 	u8 bit;
153349c55878SDavid Wu 	u32 data, route_reg, route_val;
153449c55878SDavid Wu 
153549c55878SDavid Wu 	ret = rockchip_verify_mux(bank, pin, mux);
153649c55878SDavid Wu 	if (ret < 0)
153749c55878SDavid Wu 		return ret;
153849c55878SDavid Wu 
153949c55878SDavid Wu 	if (bank->iomux[iomux_num].type & IOMUX_GPIO_ONLY)
154049c55878SDavid Wu 		return 0;
154149c55878SDavid Wu 
154249c55878SDavid Wu 	debug("setting mux of GPIO%d-%d to %d\n", bank->bank_num, pin, mux);
154349c55878SDavid Wu 
1544*cf04a17bSJianqun Xu 	if (bank->iomux[iomux_num].type & IOMUX_SOURCE_PMU)
1545*cf04a17bSJianqun Xu 		regmap = priv->regmap_pmu;
1546*cf04a17bSJianqun Xu 	else if (bank->iomux[iomux_num].type & IOMUX_L_SOURCE_PMU)
1547*cf04a17bSJianqun Xu 		regmap = (pin % 8 < 4) ? priv->regmap_pmu : priv->regmap_base;
1548*cf04a17bSJianqun Xu 	else
1549*cf04a17bSJianqun Xu 		regmap = priv->regmap_base;
155049c55878SDavid Wu 
155149c55878SDavid Wu 	/* get basic quadrupel of mux registers and the correct reg inside */
155249c55878SDavid Wu 	mux_type = bank->iomux[iomux_num].type;
155349c55878SDavid Wu 	reg = bank->iomux[iomux_num].offset;
155449c55878SDavid Wu 	if (mux_type & IOMUX_WIDTH_4BIT) {
155549c55878SDavid Wu 		if ((pin % 8) >= 4)
155649c55878SDavid Wu 			reg += 0x4;
155749c55878SDavid Wu 		bit = (pin % 4) * 4;
155849c55878SDavid Wu 		mask = 0xf;
155949c55878SDavid Wu 	} else if (mux_type & IOMUX_WIDTH_3BIT) {
156049c55878SDavid Wu 		if ((pin % 8) >= 5)
156149c55878SDavid Wu 			reg += 0x4;
156249c55878SDavid Wu 		bit = (pin % 8 % 5) * 3;
156349c55878SDavid Wu 		mask = 0x7;
156449c55878SDavid Wu 	} else {
156549c55878SDavid Wu 		bit = (pin % 8) * 2;
156649c55878SDavid Wu 		mask = 0x3;
156749c55878SDavid Wu 	}
156849c55878SDavid Wu 
156949c55878SDavid Wu 	if (bank->recalced_mask & BIT(pin))
157049c55878SDavid Wu 		rockchip_get_recalced_mux(bank, pin, &reg, &bit, &mask);
157149c55878SDavid Wu 
157249c55878SDavid Wu 	if (bank->route_mask & BIT(pin)) {
157349c55878SDavid Wu 		if (rockchip_get_mux_route(bank, pin, mux, &route_reg,
157449c55878SDavid Wu 					   &route_val)) {
157549c55878SDavid Wu 			ret = regmap_write(regmap, route_reg, route_val);
157649c55878SDavid Wu 			if (ret)
157749c55878SDavid Wu 				return ret;
157849c55878SDavid Wu 		}
157949c55878SDavid Wu 	}
158049c55878SDavid Wu 
15814bafc2daSDavid Wu 	if (mux_type & IOMUX_WRITABLE_32BIT) {
15828bf1bc66SDavid Wu 		regmap_read(regmap, reg, &data);
15834bafc2daSDavid Wu 		data &= ~(mask << bit);
15844bafc2daSDavid Wu 	} else {
158549c55878SDavid Wu 		data = (mask << (bit + 16));
15864bafc2daSDavid Wu 	}
15878bf1bc66SDavid Wu 
158849c55878SDavid Wu 	data |= (mux & mask) << bit;
158949c55878SDavid Wu 	ret = regmap_write(regmap, reg, data);
159049c55878SDavid Wu 
159149c55878SDavid Wu 	return ret;
159249c55878SDavid Wu }
159349c55878SDavid Wu 
159449c55878SDavid Wu #define PX30_PULL_PMU_OFFSET		0x10
159549c55878SDavid Wu #define PX30_PULL_GRF_OFFSET		0x60
159649c55878SDavid Wu #define PX30_PULL_BITS_PER_PIN		2
159749c55878SDavid Wu #define PX30_PULL_PINS_PER_REG		8
159849c55878SDavid Wu #define PX30_PULL_BANK_STRIDE		16
159949c55878SDavid Wu 
160049c55878SDavid Wu static void px30_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
160149c55878SDavid Wu 				       int pin_num, struct regmap **regmap,
160249c55878SDavid Wu 				       int *reg, u8 *bit)
160349c55878SDavid Wu {
160449c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
160549c55878SDavid Wu 
160649c55878SDavid Wu 	/* The first 32 pins of the first bank are located in PMU */
160749c55878SDavid Wu 	if (bank->bank_num == 0) {
160849c55878SDavid Wu 		*regmap = priv->regmap_pmu;
160949c55878SDavid Wu 		*reg = PX30_PULL_PMU_OFFSET;
161049c55878SDavid Wu 	} else {
161149c55878SDavid Wu 		*regmap = priv->regmap_base;
161249c55878SDavid Wu 		*reg = PX30_PULL_GRF_OFFSET;
161349c55878SDavid Wu 
161449c55878SDavid Wu 		/* correct the offset, as we're starting with the 2nd bank */
161549c55878SDavid Wu 		*reg -= 0x10;
161649c55878SDavid Wu 		*reg += bank->bank_num * PX30_PULL_BANK_STRIDE;
161749c55878SDavid Wu 	}
161849c55878SDavid Wu 
161949c55878SDavid Wu 	*reg += ((pin_num / PX30_PULL_PINS_PER_REG) * 4);
162049c55878SDavid Wu 	*bit = (pin_num % PX30_PULL_PINS_PER_REG);
162149c55878SDavid Wu 	*bit *= PX30_PULL_BITS_PER_PIN;
162249c55878SDavid Wu }
162349c55878SDavid Wu 
162449c55878SDavid Wu #define PX30_DRV_PMU_OFFSET		0x20
162549c55878SDavid Wu #define PX30_DRV_GRF_OFFSET		0xf0
162649c55878SDavid Wu #define PX30_DRV_BITS_PER_PIN		2
162749c55878SDavid Wu #define PX30_DRV_PINS_PER_REG		8
162849c55878SDavid Wu #define PX30_DRV_BANK_STRIDE		16
162949c55878SDavid Wu 
163049c55878SDavid Wu static void px30_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
163149c55878SDavid Wu 				      int pin_num, struct regmap **regmap,
163249c55878SDavid Wu 				      int *reg, u8 *bit)
163349c55878SDavid Wu {
163449c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
163549c55878SDavid Wu 
163649c55878SDavid Wu 	/* The first 32 pins of the first bank are located in PMU */
163749c55878SDavid Wu 	if (bank->bank_num == 0) {
163849c55878SDavid Wu 		*regmap = priv->regmap_pmu;
163949c55878SDavid Wu 		*reg = PX30_DRV_PMU_OFFSET;
164049c55878SDavid Wu 	} else {
164149c55878SDavid Wu 		*regmap = priv->regmap_base;
164249c55878SDavid Wu 		*reg = PX30_DRV_GRF_OFFSET;
164349c55878SDavid Wu 
164449c55878SDavid Wu 		/* correct the offset, as we're starting with the 2nd bank */
164549c55878SDavid Wu 		*reg -= 0x10;
164649c55878SDavid Wu 		*reg += bank->bank_num * PX30_DRV_BANK_STRIDE;
164749c55878SDavid Wu 	}
164849c55878SDavid Wu 
164949c55878SDavid Wu 	*reg += ((pin_num / PX30_DRV_PINS_PER_REG) * 4);
165049c55878SDavid Wu 	*bit = (pin_num % PX30_DRV_PINS_PER_REG);
165149c55878SDavid Wu 	*bit *= PX30_DRV_BITS_PER_PIN;
165249c55878SDavid Wu }
165349c55878SDavid Wu 
165449c55878SDavid Wu #define PX30_SCHMITT_PMU_OFFSET			0x38
165549c55878SDavid Wu #define PX30_SCHMITT_GRF_OFFSET			0xc0
165649c55878SDavid Wu #define PX30_SCHMITT_PINS_PER_PMU_REG		16
165749c55878SDavid Wu #define PX30_SCHMITT_BANK_STRIDE		16
165849c55878SDavid Wu #define PX30_SCHMITT_PINS_PER_GRF_REG		8
165949c55878SDavid Wu 
166049c55878SDavid Wu static int px30_calc_schmitt_reg_and_bit(struct rockchip_pin_bank *bank,
166149c55878SDavid Wu 					 int pin_num,
166249c55878SDavid Wu 					 struct regmap **regmap,
166349c55878SDavid Wu 					 int *reg, u8 *bit)
166449c55878SDavid Wu {
166549c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
166649c55878SDavid Wu 	int pins_per_reg;
166749c55878SDavid Wu 
166849c55878SDavid Wu 	if (bank->bank_num == 0) {
166949c55878SDavid Wu 		*regmap = priv->regmap_pmu;
167049c55878SDavid Wu 		*reg = PX30_SCHMITT_PMU_OFFSET;
167149c55878SDavid Wu 		pins_per_reg = PX30_SCHMITT_PINS_PER_PMU_REG;
167249c55878SDavid Wu 	} else {
167349c55878SDavid Wu 		*regmap = priv->regmap_base;
167449c55878SDavid Wu 		*reg = PX30_SCHMITT_GRF_OFFSET;
167549c55878SDavid Wu 		pins_per_reg = PX30_SCHMITT_PINS_PER_GRF_REG;
167649c55878SDavid Wu 		*reg += (bank->bank_num - 1) * PX30_SCHMITT_BANK_STRIDE;
167749c55878SDavid Wu 	}
167849c55878SDavid Wu 	*reg += ((pin_num / pins_per_reg) * 4);
167949c55878SDavid Wu 	*bit = pin_num % pins_per_reg;
168049c55878SDavid Wu 
168149c55878SDavid Wu 	return 0;
168249c55878SDavid Wu }
168349c55878SDavid Wu 
168449c55878SDavid Wu #define RV1108_PULL_PMU_OFFSET		0x10
168549c55878SDavid Wu #define RV1108_PULL_OFFSET		0x110
168649c55878SDavid Wu #define RV1108_PULL_PINS_PER_REG	8
168749c55878SDavid Wu #define RV1108_PULL_BITS_PER_PIN	2
168849c55878SDavid Wu #define RV1108_PULL_BANK_STRIDE		16
168949c55878SDavid Wu 
169049c55878SDavid Wu static void rv1108_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
169149c55878SDavid Wu 					 int pin_num, struct regmap **regmap,
169249c55878SDavid Wu 					 int *reg, u8 *bit)
169349c55878SDavid Wu {
169449c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
169549c55878SDavid Wu 
169649c55878SDavid Wu 	/* The first 24 pins of the first bank are located in PMU */
169749c55878SDavid Wu 	if (bank->bank_num == 0) {
169849c55878SDavid Wu 		*regmap = priv->regmap_pmu;
169949c55878SDavid Wu 		*reg = RV1108_PULL_PMU_OFFSET;
170049c55878SDavid Wu 	} else {
170149c55878SDavid Wu 		*reg = RV1108_PULL_OFFSET;
170249c55878SDavid Wu 		*regmap = priv->regmap_base;
170349c55878SDavid Wu 		/* correct the offset, as we're starting with the 2nd bank */
170449c55878SDavid Wu 		*reg -= 0x10;
170549c55878SDavid Wu 		*reg += bank->bank_num * RV1108_PULL_BANK_STRIDE;
170649c55878SDavid Wu 	}
170749c55878SDavid Wu 
170849c55878SDavid Wu 	*reg += ((pin_num / RV1108_PULL_PINS_PER_REG) * 4);
170949c55878SDavid Wu 	*bit = (pin_num % RV1108_PULL_PINS_PER_REG);
171049c55878SDavid Wu 	*bit *= RV1108_PULL_BITS_PER_PIN;
171149c55878SDavid Wu }
171249c55878SDavid Wu 
171349c55878SDavid Wu #define RV1108_DRV_PMU_OFFSET		0x20
171449c55878SDavid Wu #define RV1108_DRV_GRF_OFFSET		0x210
171549c55878SDavid Wu #define RV1108_DRV_BITS_PER_PIN		2
171649c55878SDavid Wu #define RV1108_DRV_PINS_PER_REG		8
171749c55878SDavid Wu #define RV1108_DRV_BANK_STRIDE		16
171849c55878SDavid Wu 
171949c55878SDavid Wu static void rv1108_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
172049c55878SDavid Wu 					int pin_num, struct regmap **regmap,
172149c55878SDavid Wu 					int *reg, u8 *bit)
172249c55878SDavid Wu {
172349c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
172449c55878SDavid Wu 
172549c55878SDavid Wu 	/* The first 24 pins of the first bank are located in PMU */
172649c55878SDavid Wu 	if (bank->bank_num == 0) {
172749c55878SDavid Wu 		*regmap = priv->regmap_pmu;
172849c55878SDavid Wu 		*reg = RV1108_DRV_PMU_OFFSET;
172949c55878SDavid Wu 	} else {
173049c55878SDavid Wu 		*regmap = priv->regmap_base;
173149c55878SDavid Wu 		*reg = RV1108_DRV_GRF_OFFSET;
173249c55878SDavid Wu 
173349c55878SDavid Wu 		/* correct the offset, as we're starting with the 2nd bank */
173449c55878SDavid Wu 		*reg -= 0x10;
173549c55878SDavid Wu 		*reg += bank->bank_num * RV1108_DRV_BANK_STRIDE;
173649c55878SDavid Wu 	}
173749c55878SDavid Wu 
173849c55878SDavid Wu 	*reg += ((pin_num / RV1108_DRV_PINS_PER_REG) * 4);
173949c55878SDavid Wu 	*bit = pin_num % RV1108_DRV_PINS_PER_REG;
174049c55878SDavid Wu 	*bit *= RV1108_DRV_BITS_PER_PIN;
174149c55878SDavid Wu }
174249c55878SDavid Wu 
174349c55878SDavid Wu #define RV1108_SCHMITT_PMU_OFFSET		0x30
174449c55878SDavid Wu #define RV1108_SCHMITT_GRF_OFFSET		0x388
174549c55878SDavid Wu #define RV1108_SCHMITT_BANK_STRIDE		8
174649c55878SDavid Wu #define RV1108_SCHMITT_PINS_PER_GRF_REG		16
174749c55878SDavid Wu #define RV1108_SCHMITT_PINS_PER_PMU_REG		8
174849c55878SDavid Wu 
174949c55878SDavid Wu static int rv1108_calc_schmitt_reg_and_bit(struct rockchip_pin_bank *bank,
175049c55878SDavid Wu 					   int pin_num,
175149c55878SDavid Wu 					   struct regmap **regmap,
175249c55878SDavid Wu 					   int *reg, u8 *bit)
175349c55878SDavid Wu {
175449c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
175549c55878SDavid Wu 	int pins_per_reg;
175649c55878SDavid Wu 
175749c55878SDavid Wu 	if (bank->bank_num == 0) {
175849c55878SDavid Wu 		*regmap = priv->regmap_pmu;
175949c55878SDavid Wu 		*reg = RV1108_SCHMITT_PMU_OFFSET;
176049c55878SDavid Wu 		pins_per_reg = RV1108_SCHMITT_PINS_PER_PMU_REG;
176149c55878SDavid Wu 	} else {
176249c55878SDavid Wu 		*regmap = priv->regmap_base;
176349c55878SDavid Wu 		*reg = RV1108_SCHMITT_GRF_OFFSET;
176449c55878SDavid Wu 		pins_per_reg = RV1108_SCHMITT_PINS_PER_GRF_REG;
176549c55878SDavid Wu 		*reg += (bank->bank_num  - 1) * RV1108_SCHMITT_BANK_STRIDE;
176649c55878SDavid Wu 	}
176749c55878SDavid Wu 	*reg += ((pin_num / pins_per_reg) * 4);
176849c55878SDavid Wu 	*bit = pin_num % pins_per_reg;
176949c55878SDavid Wu 
177049c55878SDavid Wu 	return 0;
177149c55878SDavid Wu }
177249c55878SDavid Wu 
1773*cf04a17bSJianqun Xu #define RV1126_PULL_PMU_OFFSET		0x40
1774*cf04a17bSJianqun Xu #define RV1126_PULL_GRF_GPIO1A0_OFFSET		0x10108
1775*cf04a17bSJianqun Xu #define RV1126_PULL_PINS_PER_REG	8
1776*cf04a17bSJianqun Xu #define RV1126_PULL_BITS_PER_PIN	2
1777*cf04a17bSJianqun Xu #define RV1126_PULL_BANK_STRIDE		16
1778*cf04a17bSJianqun Xu #define RV1126_GPIO_C4_D7(p)	(p >= 20 && p <= 31) /* GPIO0_C4 ~ GPIO0_D7 */
1779*cf04a17bSJianqun Xu 
1780*cf04a17bSJianqun Xu static void rv1126_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
1781*cf04a17bSJianqun Xu 					 int pin_num, struct regmap **regmap,
1782*cf04a17bSJianqun Xu 					 int *reg, u8 *bit)
1783*cf04a17bSJianqun Xu {
1784*cf04a17bSJianqun Xu 	struct rockchip_pinctrl_priv *priv = bank->priv;
1785*cf04a17bSJianqun Xu 
1786*cf04a17bSJianqun Xu 	/* The first 24 pins of the first bank are located in PMU */
1787*cf04a17bSJianqun Xu 	if (bank->bank_num == 0) {
1788*cf04a17bSJianqun Xu 		if (RV1126_GPIO_C4_D7(pin_num)) {
1789*cf04a17bSJianqun Xu 			*regmap = priv->regmap_base;
1790*cf04a17bSJianqun Xu 			*reg = RV1126_PULL_GRF_GPIO1A0_OFFSET;
1791*cf04a17bSJianqun Xu 			*reg -= (((31 - pin_num) / RV1126_PULL_PINS_PER_REG + 1) * 4);
1792*cf04a17bSJianqun Xu 			*bit = pin_num % RV1126_PULL_PINS_PER_REG;
1793*cf04a17bSJianqun Xu 			*bit *= RV1126_PULL_BITS_PER_PIN;
1794*cf04a17bSJianqun Xu 			return;
1795*cf04a17bSJianqun Xu 		}
1796*cf04a17bSJianqun Xu 		*regmap = priv->regmap_pmu;
1797*cf04a17bSJianqun Xu 		*reg = RV1126_PULL_PMU_OFFSET;
1798*cf04a17bSJianqun Xu 	} else {
1799*cf04a17bSJianqun Xu 		*reg = RV1126_PULL_GRF_GPIO1A0_OFFSET;
1800*cf04a17bSJianqun Xu 		*regmap = priv->regmap_base;
1801*cf04a17bSJianqun Xu 		*reg += bank->bank_num * RV1126_PULL_BANK_STRIDE;
1802*cf04a17bSJianqun Xu 	}
1803*cf04a17bSJianqun Xu 
1804*cf04a17bSJianqun Xu 	*reg += ((pin_num / RV1126_PULL_PINS_PER_REG) * 4);
1805*cf04a17bSJianqun Xu 	*bit = (pin_num % RV1126_PULL_PINS_PER_REG);
1806*cf04a17bSJianqun Xu 	*bit *= RV1126_PULL_BITS_PER_PIN;
1807*cf04a17bSJianqun Xu }
1808*cf04a17bSJianqun Xu 
1809*cf04a17bSJianqun Xu #define RV1126_DRV_PMU_OFFSET		0x20
1810*cf04a17bSJianqun Xu #define RV1126_DRV_GRF_GPIO1A0_OFFSET		0x10090
1811*cf04a17bSJianqun Xu #define RV1126_DRV_BITS_PER_PIN		4
1812*cf04a17bSJianqun Xu #define RV1126_DRV_PINS_PER_REG		4
1813*cf04a17bSJianqun Xu #define RV1126_DRV_BANK_STRIDE		32
1814*cf04a17bSJianqun Xu 
1815*cf04a17bSJianqun Xu static void rv1126_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
1816*cf04a17bSJianqun Xu 					int pin_num, struct regmap **regmap,
1817*cf04a17bSJianqun Xu 					int *reg, u8 *bit)
1818*cf04a17bSJianqun Xu {
1819*cf04a17bSJianqun Xu 	struct rockchip_pinctrl_priv *priv = bank->priv;
1820*cf04a17bSJianqun Xu 
1821*cf04a17bSJianqun Xu 	/* The first 24 pins of the first bank are located in PMU */
1822*cf04a17bSJianqun Xu 	if (bank->bank_num == 0) {
1823*cf04a17bSJianqun Xu 		if (RV1126_GPIO_C4_D7(pin_num)) {
1824*cf04a17bSJianqun Xu 			*regmap = priv->regmap_base;
1825*cf04a17bSJianqun Xu 			*reg = RV1126_DRV_GRF_GPIO1A0_OFFSET;
1826*cf04a17bSJianqun Xu 			*reg -= (((31 - pin_num) / RV1126_DRV_PINS_PER_REG + 1) * 4);
1827*cf04a17bSJianqun Xu 			*bit = pin_num % RV1126_DRV_PINS_PER_REG;
1828*cf04a17bSJianqun Xu 			*bit *= RV1126_DRV_BITS_PER_PIN;
1829*cf04a17bSJianqun Xu 			return;
1830*cf04a17bSJianqun Xu 		}
1831*cf04a17bSJianqun Xu 		*regmap = priv->regmap_pmu;
1832*cf04a17bSJianqun Xu 		*reg = RV1126_DRV_PMU_OFFSET;
1833*cf04a17bSJianqun Xu 	} else {
1834*cf04a17bSJianqun Xu 		*regmap = priv->regmap_base;
1835*cf04a17bSJianqun Xu 		*reg = RV1126_DRV_GRF_GPIO1A0_OFFSET;
1836*cf04a17bSJianqun Xu 		*reg += bank->bank_num * RV1126_DRV_BANK_STRIDE;
1837*cf04a17bSJianqun Xu 	}
1838*cf04a17bSJianqun Xu 
1839*cf04a17bSJianqun Xu 	*reg += ((pin_num / RV1126_DRV_PINS_PER_REG) * 4);
1840*cf04a17bSJianqun Xu 	*bit = pin_num % RV1126_DRV_PINS_PER_REG;
1841*cf04a17bSJianqun Xu 	*bit *= RV1126_DRV_BITS_PER_PIN;
1842*cf04a17bSJianqun Xu }
1843*cf04a17bSJianqun Xu 
1844*cf04a17bSJianqun Xu #define RV1126_SCHMITT_PMU_OFFSET		0x60
1845*cf04a17bSJianqun Xu #define RV1126_SCHMITT_GRF_GPIO1A0_OFFSET		0x10188
1846*cf04a17bSJianqun Xu #define RV1126_SCHMITT_BANK_STRIDE		16
1847*cf04a17bSJianqun Xu #define RV1126_SCHMITT_PINS_PER_GRF_REG		8
1848*cf04a17bSJianqun Xu #define RV1126_SCHMITT_PINS_PER_PMU_REG		8
1849*cf04a17bSJianqun Xu 
1850*cf04a17bSJianqun Xu static int rv1126_calc_schmitt_reg_and_bit(struct rockchip_pin_bank *bank,
1851*cf04a17bSJianqun Xu 					   int pin_num,
1852*cf04a17bSJianqun Xu 					   struct regmap **regmap,
1853*cf04a17bSJianqun Xu 					   int *reg, u8 *bit)
1854*cf04a17bSJianqun Xu {
1855*cf04a17bSJianqun Xu 	struct rockchip_pinctrl_priv *priv = bank->priv;
1856*cf04a17bSJianqun Xu 	int pins_per_reg;
1857*cf04a17bSJianqun Xu 
1858*cf04a17bSJianqun Xu 	if (bank->bank_num == 0) {
1859*cf04a17bSJianqun Xu 		if (RV1126_GPIO_C4_D7(pin_num)) {
1860*cf04a17bSJianqun Xu 			*regmap = priv->regmap_base;
1861*cf04a17bSJianqun Xu 			*reg = RV1126_SCHMITT_GRF_GPIO1A0_OFFSET;
1862*cf04a17bSJianqun Xu 			*reg -= (((31 - pin_num) / RV1126_SCHMITT_PINS_PER_GRF_REG + 1) * 4);
1863*cf04a17bSJianqun Xu 			*bit = pin_num % RV1126_SCHMITT_PINS_PER_GRF_REG;
1864*cf04a17bSJianqun Xu 			return 0;
1865*cf04a17bSJianqun Xu 		}
1866*cf04a17bSJianqun Xu 		*regmap = priv->regmap_pmu;
1867*cf04a17bSJianqun Xu 		*reg = RV1126_SCHMITT_PMU_OFFSET;
1868*cf04a17bSJianqun Xu 		pins_per_reg = RV1126_SCHMITT_PINS_PER_PMU_REG;
1869*cf04a17bSJianqun Xu 	} else {
1870*cf04a17bSJianqun Xu 		*regmap = priv->regmap_base;
1871*cf04a17bSJianqun Xu 		*reg = RV1126_SCHMITT_GRF_GPIO1A0_OFFSET;
1872*cf04a17bSJianqun Xu 		pins_per_reg = RV1126_SCHMITT_PINS_PER_GRF_REG;
1873*cf04a17bSJianqun Xu 		*reg += bank->bank_num * RV1126_SCHMITT_BANK_STRIDE;
1874*cf04a17bSJianqun Xu 	}
1875*cf04a17bSJianqun Xu 	*reg += ((pin_num / pins_per_reg) * 4);
1876*cf04a17bSJianqun Xu 	*bit = pin_num % pins_per_reg;
1877*cf04a17bSJianqun Xu 
1878*cf04a17bSJianqun Xu 	return 0;
1879*cf04a17bSJianqun Xu }
1880*cf04a17bSJianqun Xu 
1881a2a3fc8fSJianqun Xu #define RK1808_PULL_PMU_OFFSET		0x10
1882a2a3fc8fSJianqun Xu #define RK1808_PULL_GRF_OFFSET		0x80
1883a2a3fc8fSJianqun Xu #define RK1808_PULL_PINS_PER_REG	8
1884a2a3fc8fSJianqun Xu #define RK1808_PULL_BITS_PER_PIN	2
1885a2a3fc8fSJianqun Xu #define RK1808_PULL_BANK_STRIDE		16
1886a2a3fc8fSJianqun Xu 
1887a2a3fc8fSJianqun Xu static void rk1808_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
1888a2a3fc8fSJianqun Xu 					 int pin_num,
1889a2a3fc8fSJianqun Xu 					 struct regmap **regmap,
1890a2a3fc8fSJianqun Xu 					 int *reg, u8 *bit)
1891a2a3fc8fSJianqun Xu {
1892a2a3fc8fSJianqun Xu 	struct rockchip_pinctrl_priv *priv = bank->priv;
1893a2a3fc8fSJianqun Xu 
1894a2a3fc8fSJianqun Xu 	if (bank->bank_num == 0) {
1895a2a3fc8fSJianqun Xu 		*regmap = priv->regmap_pmu;
1896a2a3fc8fSJianqun Xu 		*reg = RK1808_PULL_PMU_OFFSET;
1897a2a3fc8fSJianqun Xu 	} else {
1898a2a3fc8fSJianqun Xu 		*reg = RK1808_PULL_GRF_OFFSET;
1899a2a3fc8fSJianqun Xu 		*regmap = priv->regmap_base;
1900a2a3fc8fSJianqun Xu 	}
1901a2a3fc8fSJianqun Xu 
1902a2a3fc8fSJianqun Xu 	*reg += ((pin_num / RK1808_PULL_PINS_PER_REG) * 4);
1903a2a3fc8fSJianqun Xu 	*bit = (pin_num % RK1808_PULL_PINS_PER_REG);
1904a2a3fc8fSJianqun Xu 	*bit *= RK1808_PULL_BITS_PER_PIN;
1905a2a3fc8fSJianqun Xu }
1906a2a3fc8fSJianqun Xu 
1907a2a3fc8fSJianqun Xu #define RK1808_DRV_PMU_OFFSET		0x20
1908a2a3fc8fSJianqun Xu #define RK1808_DRV_GRF_OFFSET		0x140
1909a2a3fc8fSJianqun Xu #define RK1808_DRV_BITS_PER_PIN		2
1910a2a3fc8fSJianqun Xu #define RK1808_DRV_PINS_PER_REG		8
1911a2a3fc8fSJianqun Xu #define RK1808_DRV_BANK_STRIDE		16
1912a2a3fc8fSJianqun Xu 
1913a2a3fc8fSJianqun Xu static void rk1808_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
1914a2a3fc8fSJianqun Xu 					int pin_num,
1915a2a3fc8fSJianqun Xu 					struct regmap **regmap,
1916a2a3fc8fSJianqun Xu 					int *reg, u8 *bit)
1917a2a3fc8fSJianqun Xu {
1918a2a3fc8fSJianqun Xu 	struct rockchip_pinctrl_priv *priv = bank->priv;
1919a2a3fc8fSJianqun Xu 
1920a2a3fc8fSJianqun Xu 	if (bank->bank_num == 0) {
1921a2a3fc8fSJianqun Xu 		*regmap = priv->regmap_pmu;
1922a2a3fc8fSJianqun Xu 		*reg = RK1808_DRV_PMU_OFFSET;
1923a2a3fc8fSJianqun Xu 	} else {
1924a2a3fc8fSJianqun Xu 		*regmap = priv->regmap_base;
1925a2a3fc8fSJianqun Xu 		*reg = RK1808_DRV_GRF_OFFSET;
1926a2a3fc8fSJianqun Xu 	}
1927a2a3fc8fSJianqun Xu 
1928a2a3fc8fSJianqun Xu 	*reg += ((pin_num / RK1808_DRV_PINS_PER_REG) * 4);
1929a2a3fc8fSJianqun Xu 	*bit = pin_num % RK1808_DRV_PINS_PER_REG;
1930a2a3fc8fSJianqun Xu 	*bit *= RK1808_DRV_BITS_PER_PIN;
1931a2a3fc8fSJianqun Xu }
1932a2a3fc8fSJianqun Xu 
1933a2a3fc8fSJianqun Xu #define RK1808_SCHMITT_PMU_OFFSET		0x0040
1934a2a3fc8fSJianqun Xu #define RK1808_SCHMITT_GRF_OFFSET		0x0100
1935a2a3fc8fSJianqun Xu #define RK1808_SCHMITT_BANK_STRIDE		16
1936a2a3fc8fSJianqun Xu #define RK1808_SCHMITT_PINS_PER_REG		8
1937a2a3fc8fSJianqun Xu 
1938a2a3fc8fSJianqun Xu static int rk1808_calc_schmitt_reg_and_bit(struct rockchip_pin_bank *bank,
1939a2a3fc8fSJianqun Xu 					   int pin_num,
1940a2a3fc8fSJianqun Xu 					   struct regmap **regmap,
1941a2a3fc8fSJianqun Xu 					   int *reg, u8 *bit)
1942a2a3fc8fSJianqun Xu {
1943a2a3fc8fSJianqun Xu 	struct rockchip_pinctrl_priv *priv = bank->priv;
1944a2a3fc8fSJianqun Xu 
1945a2a3fc8fSJianqun Xu 	if (bank->bank_num == 0) {
1946a2a3fc8fSJianqun Xu 		*regmap = priv->regmap_pmu;
1947a2a3fc8fSJianqun Xu 		*reg = RK1808_SCHMITT_PMU_OFFSET;
1948a2a3fc8fSJianqun Xu 	} else {
1949a2a3fc8fSJianqun Xu 		*regmap = priv->regmap_base;
1950a2a3fc8fSJianqun Xu 		*reg = RK1808_SCHMITT_GRF_OFFSET;
1951a2a3fc8fSJianqun Xu 		*reg += (bank->bank_num  - 1) * RK1808_SCHMITT_BANK_STRIDE;
1952a2a3fc8fSJianqun Xu 	}
1953a2a3fc8fSJianqun Xu 	*reg += ((pin_num / RK1808_SCHMITT_PINS_PER_REG) * 4);
1954a2a3fc8fSJianqun Xu 	*bit = pin_num % RK1808_SCHMITT_PINS_PER_REG;
1955a2a3fc8fSJianqun Xu 
1956a2a3fc8fSJianqun Xu 	return 0;
1957a2a3fc8fSJianqun Xu }
1958a2a3fc8fSJianqun Xu 
195949c55878SDavid Wu #define RK2928_PULL_OFFSET		0x118
196049c55878SDavid Wu #define RK2928_PULL_PINS_PER_REG	16
196149c55878SDavid Wu #define RK2928_PULL_BANK_STRIDE		8
196249c55878SDavid Wu 
196349c55878SDavid Wu static void rk2928_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
196449c55878SDavid Wu 					 int pin_num, struct regmap **regmap,
196549c55878SDavid Wu 					 int *reg, u8 *bit)
196649c55878SDavid Wu {
196749c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
196849c55878SDavid Wu 
196949c55878SDavid Wu 	*regmap = priv->regmap_base;
197049c55878SDavid Wu 	*reg = RK2928_PULL_OFFSET;
197149c55878SDavid Wu 	*reg += bank->bank_num * RK2928_PULL_BANK_STRIDE;
197249c55878SDavid Wu 	*reg += (pin_num / RK2928_PULL_PINS_PER_REG) * 4;
197349c55878SDavid Wu 
197449c55878SDavid Wu 	*bit = pin_num % RK2928_PULL_PINS_PER_REG;
197549c55878SDavid Wu };
197649c55878SDavid Wu 
197749c55878SDavid Wu #define RK3128_PULL_OFFSET	0x118
197849c55878SDavid Wu 
197949c55878SDavid Wu static void rk3128_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
198049c55878SDavid Wu 					 int pin_num, struct regmap **regmap,
198149c55878SDavid Wu 					 int *reg, u8 *bit)
198249c55878SDavid Wu {
198349c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
198449c55878SDavid Wu 
198549c55878SDavid Wu 	*regmap = priv->regmap_base;
198649c55878SDavid Wu 	*reg = RK3128_PULL_OFFSET;
198749c55878SDavid Wu 	*reg += bank->bank_num * RK2928_PULL_BANK_STRIDE;
198849c55878SDavid Wu 	*reg += ((pin_num / RK2928_PULL_PINS_PER_REG) * 4);
198949c55878SDavid Wu 
199049c55878SDavid Wu 	*bit = pin_num % RK2928_PULL_PINS_PER_REG;
199149c55878SDavid Wu }
199249c55878SDavid Wu 
199349c55878SDavid Wu #define RK3188_PULL_OFFSET		0x164
199449c55878SDavid Wu #define RK3188_PULL_BITS_PER_PIN	2
199549c55878SDavid Wu #define RK3188_PULL_PINS_PER_REG	8
199649c55878SDavid Wu #define RK3188_PULL_BANK_STRIDE		16
199749c55878SDavid Wu #define RK3188_PULL_PMU_OFFSET		0x64
199849c55878SDavid Wu 
199949c55878SDavid Wu static void rk3188_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
200049c55878SDavid Wu 					 int pin_num, struct regmap **regmap,
200149c55878SDavid Wu 					 int *reg, u8 *bit)
200249c55878SDavid Wu {
200349c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
200449c55878SDavid Wu 
200549c55878SDavid Wu 	/* The first 12 pins of the first bank are located elsewhere */
200649c55878SDavid Wu 	if (bank->bank_num == 0 && pin_num < 12) {
200749c55878SDavid Wu 		*regmap = priv->regmap_pmu;
200849c55878SDavid Wu 		*reg = RK3188_PULL_PMU_OFFSET;
200949c55878SDavid Wu 
201049c55878SDavid Wu 		*reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4);
201149c55878SDavid Wu 		*bit = pin_num % RK3188_PULL_PINS_PER_REG;
201249c55878SDavid Wu 		*bit *= RK3188_PULL_BITS_PER_PIN;
201349c55878SDavid Wu 	} else {
201449c55878SDavid Wu 		*regmap = priv->regmap_base;
201549c55878SDavid Wu 		*reg = RK3188_PULL_OFFSET;
201649c55878SDavid Wu 
201749c55878SDavid Wu 		/* correct the offset, as it is the 2nd pull register */
201849c55878SDavid Wu 		*reg -= 4;
201949c55878SDavid Wu 		*reg += bank->bank_num * RK3188_PULL_BANK_STRIDE;
202049c55878SDavid Wu 		*reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4);
202149c55878SDavid Wu 
202249c55878SDavid Wu 		/*
202349c55878SDavid Wu 		 * The bits in these registers have an inverse ordering
202449c55878SDavid Wu 		 * with the lowest pin being in bits 15:14 and the highest
202549c55878SDavid Wu 		 * pin in bits 1:0
202649c55878SDavid Wu 		 */
202749c55878SDavid Wu 		*bit = 7 - (pin_num % RK3188_PULL_PINS_PER_REG);
202849c55878SDavid Wu 		*bit *= RK3188_PULL_BITS_PER_PIN;
202949c55878SDavid Wu 	}
203049c55878SDavid Wu }
203149c55878SDavid Wu 
203249c55878SDavid Wu #define RK3288_PULL_OFFSET		0x140
203349c55878SDavid Wu static void rk3288_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
203449c55878SDavid Wu 					 int pin_num, struct regmap **regmap,
203549c55878SDavid Wu 					 int *reg, u8 *bit)
203649c55878SDavid Wu {
203749c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
203849c55878SDavid Wu 
203949c55878SDavid Wu 	/* The first 24 pins of the first bank are located in PMU */
204049c55878SDavid Wu 	if (bank->bank_num == 0) {
204149c55878SDavid Wu 		*regmap = priv->regmap_pmu;
204249c55878SDavid Wu 		*reg = RK3188_PULL_PMU_OFFSET;
204349c55878SDavid Wu 
204449c55878SDavid Wu 		*reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4);
204549c55878SDavid Wu 		*bit = pin_num % RK3188_PULL_PINS_PER_REG;
204649c55878SDavid Wu 		*bit *= RK3188_PULL_BITS_PER_PIN;
204749c55878SDavid Wu 	} else {
204849c55878SDavid Wu 		*regmap = priv->regmap_base;
204949c55878SDavid Wu 		*reg = RK3288_PULL_OFFSET;
205049c55878SDavid Wu 
205149c55878SDavid Wu 		/* correct the offset, as we're starting with the 2nd bank */
205249c55878SDavid Wu 		*reg -= 0x10;
205349c55878SDavid Wu 		*reg += bank->bank_num * RK3188_PULL_BANK_STRIDE;
205449c55878SDavid Wu 		*reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4);
205549c55878SDavid Wu 
205649c55878SDavid Wu 		*bit = (pin_num % RK3188_PULL_PINS_PER_REG);
205749c55878SDavid Wu 		*bit *= RK3188_PULL_BITS_PER_PIN;
205849c55878SDavid Wu 	}
205949c55878SDavid Wu }
206049c55878SDavid Wu 
206149c55878SDavid Wu #define RK3288_DRV_PMU_OFFSET		0x70
206249c55878SDavid Wu #define RK3288_DRV_GRF_OFFSET		0x1c0
206349c55878SDavid Wu #define RK3288_DRV_BITS_PER_PIN		2
206449c55878SDavid Wu #define RK3288_DRV_PINS_PER_REG		8
206549c55878SDavid Wu #define RK3288_DRV_BANK_STRIDE		16
206649c55878SDavid Wu 
206749c55878SDavid Wu static void rk3288_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
206849c55878SDavid Wu 					int pin_num, struct regmap **regmap,
206949c55878SDavid Wu 					int *reg, u8 *bit)
207049c55878SDavid Wu {
207149c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
207249c55878SDavid Wu 
207349c55878SDavid Wu 	/* The first 24 pins of the first bank are located in PMU */
207449c55878SDavid Wu 	if (bank->bank_num == 0) {
207549c55878SDavid Wu 		*regmap = priv->regmap_pmu;
207649c55878SDavid Wu 		*reg = RK3288_DRV_PMU_OFFSET;
207749c55878SDavid Wu 
207849c55878SDavid Wu 		*reg += ((pin_num / RK3288_DRV_PINS_PER_REG) * 4);
207949c55878SDavid Wu 		*bit = pin_num % RK3288_DRV_PINS_PER_REG;
208049c55878SDavid Wu 		*bit *= RK3288_DRV_BITS_PER_PIN;
208149c55878SDavid Wu 	} else {
208249c55878SDavid Wu 		*regmap = priv->regmap_base;
208349c55878SDavid Wu 		*reg = RK3288_DRV_GRF_OFFSET;
208449c55878SDavid Wu 
208549c55878SDavid Wu 		/* correct the offset, as we're starting with the 2nd bank */
208649c55878SDavid Wu 		*reg -= 0x10;
208749c55878SDavid Wu 		*reg += bank->bank_num * RK3288_DRV_BANK_STRIDE;
208849c55878SDavid Wu 		*reg += ((pin_num / RK3288_DRV_PINS_PER_REG) * 4);
208949c55878SDavid Wu 
209049c55878SDavid Wu 		*bit = (pin_num % RK3288_DRV_PINS_PER_REG);
209149c55878SDavid Wu 		*bit *= RK3288_DRV_BITS_PER_PIN;
209249c55878SDavid Wu 	}
209349c55878SDavid Wu }
209449c55878SDavid Wu 
209549c55878SDavid Wu #define RK3228_PULL_OFFSET		0x100
209649c55878SDavid Wu 
209749c55878SDavid Wu static void rk3228_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
209849c55878SDavid Wu 					 int pin_num, struct regmap **regmap,
209949c55878SDavid Wu 					 int *reg, u8 *bit)
210049c55878SDavid Wu {
210149c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
210249c55878SDavid Wu 
210349c55878SDavid Wu 	*regmap = priv->regmap_base;
210449c55878SDavid Wu 	*reg = RK3228_PULL_OFFSET;
210549c55878SDavid Wu 	*reg += bank->bank_num * RK3188_PULL_BANK_STRIDE;
210649c55878SDavid Wu 	*reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4);
210749c55878SDavid Wu 
210849c55878SDavid Wu 	*bit = (pin_num % RK3188_PULL_PINS_PER_REG);
210949c55878SDavid Wu 	*bit *= RK3188_PULL_BITS_PER_PIN;
211049c55878SDavid Wu }
211149c55878SDavid Wu 
211249c55878SDavid Wu #define RK3228_DRV_GRF_OFFSET		0x200
211349c55878SDavid Wu 
211449c55878SDavid Wu static void rk3228_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
211549c55878SDavid Wu 					int pin_num, struct regmap **regmap,
211649c55878SDavid Wu 					int *reg, u8 *bit)
211749c55878SDavid Wu {
211849c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
211949c55878SDavid Wu 
212049c55878SDavid Wu 	*regmap = priv->regmap_base;
212149c55878SDavid Wu 	*reg = RK3228_DRV_GRF_OFFSET;
212249c55878SDavid Wu 	*reg += bank->bank_num * RK3288_DRV_BANK_STRIDE;
212349c55878SDavid Wu 	*reg += ((pin_num / RK3288_DRV_PINS_PER_REG) * 4);
212449c55878SDavid Wu 
212549c55878SDavid Wu 	*bit = (pin_num % RK3288_DRV_PINS_PER_REG);
212649c55878SDavid Wu 	*bit *= RK3288_DRV_BITS_PER_PIN;
212749c55878SDavid Wu }
212849c55878SDavid Wu 
2129b3077611SDavid Wu #define RK3308_PULL_OFFSET		0xa0
2130b3077611SDavid Wu 
2131b3077611SDavid Wu static void rk3308_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
2132b3077611SDavid Wu 					 int pin_num, struct regmap **regmap,
2133b3077611SDavid Wu 					 int *reg, u8 *bit)
2134b3077611SDavid Wu {
2135b3077611SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
2136b3077611SDavid Wu 
2137b3077611SDavid Wu 	*regmap = priv->regmap_base;
2138b3077611SDavid Wu 	*reg = RK3308_PULL_OFFSET;
2139b3077611SDavid Wu 	*reg += bank->bank_num * RK3188_PULL_BANK_STRIDE;
2140b3077611SDavid Wu 	*reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4);
2141b3077611SDavid Wu 
2142b3077611SDavid Wu 	*bit = (pin_num % RK3188_PULL_PINS_PER_REG);
2143b3077611SDavid Wu 	*bit *= RK3188_PULL_BITS_PER_PIN;
2144b3077611SDavid Wu }
2145b3077611SDavid Wu 
2146b3077611SDavid Wu #define RK3308_DRV_GRF_OFFSET		0x100
2147b3077611SDavid Wu 
2148b3077611SDavid Wu static void rk3308_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
2149b3077611SDavid Wu 					int pin_num, struct regmap **regmap,
2150b3077611SDavid Wu 					int *reg, u8 *bit)
2151b3077611SDavid Wu {
2152b3077611SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
2153b3077611SDavid Wu 
2154b3077611SDavid Wu 	*regmap = priv->regmap_base;
2155b3077611SDavid Wu 	*reg = RK3308_DRV_GRF_OFFSET;
2156b3077611SDavid Wu 	*reg += bank->bank_num * RK3288_DRV_BANK_STRIDE;
2157b3077611SDavid Wu 	*reg += ((pin_num / RK3288_DRV_PINS_PER_REG) * 4);
2158b3077611SDavid Wu 
2159b3077611SDavid Wu 	*bit = (pin_num % RK3288_DRV_PINS_PER_REG);
2160b3077611SDavid Wu 	*bit *= RK3288_DRV_BITS_PER_PIN;
2161b3077611SDavid Wu }
2162b3077611SDavid Wu 
2163b3077611SDavid Wu #define RK3308_SCHMITT_PINS_PER_REG	8
2164b3077611SDavid Wu #define RK3308_SCHMITT_BANK_STRIDE	16
2165b3077611SDavid Wu #define RK3308_SCHMITT_GRF_OFFSET	0x1a0
2166b3077611SDavid Wu 
2167b3077611SDavid Wu static int rk3308_calc_schmitt_reg_and_bit(struct rockchip_pin_bank *bank,
2168b3077611SDavid Wu 					   int pin_num,
2169b3077611SDavid Wu 					   struct regmap **regmap,
2170b3077611SDavid Wu 					   int *reg, u8 *bit)
2171b3077611SDavid Wu {
2172b3077611SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
2173b3077611SDavid Wu 
2174b3077611SDavid Wu 	*regmap = priv->regmap_base;
2175b3077611SDavid Wu 	*reg = RK3308_SCHMITT_GRF_OFFSET;
2176b3077611SDavid Wu 
2177b3077611SDavid Wu 	*reg += bank->bank_num * RK3308_SCHMITT_BANK_STRIDE;
2178b3077611SDavid Wu 	*reg += ((pin_num / RK3308_SCHMITT_PINS_PER_REG) * 4);
2179b3077611SDavid Wu 	*bit = pin_num % RK3308_SCHMITT_PINS_PER_REG;
2180b3077611SDavid Wu 
2181b3077611SDavid Wu 	return 0;
2182b3077611SDavid Wu }
2183b3077611SDavid Wu 
218449c55878SDavid Wu #define RK3368_PULL_GRF_OFFSET		0x100
218549c55878SDavid Wu #define RK3368_PULL_PMU_OFFSET		0x10
218649c55878SDavid Wu 
218749c55878SDavid Wu static void rk3368_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
218849c55878SDavid Wu 					 int pin_num, struct regmap **regmap,
218949c55878SDavid Wu 					 int *reg, u8 *bit)
219049c55878SDavid Wu {
219149c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
219249c55878SDavid Wu 
219349c55878SDavid Wu 	/* The first 32 pins of the first bank are located in PMU */
219449c55878SDavid Wu 	if (bank->bank_num == 0) {
219549c55878SDavid Wu 		*regmap = priv->regmap_pmu;
219649c55878SDavid Wu 		*reg = RK3368_PULL_PMU_OFFSET;
219749c55878SDavid Wu 
219849c55878SDavid Wu 		*reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4);
219949c55878SDavid Wu 		*bit = pin_num % RK3188_PULL_PINS_PER_REG;
220049c55878SDavid Wu 		*bit *= RK3188_PULL_BITS_PER_PIN;
220149c55878SDavid Wu 	} else {
220249c55878SDavid Wu 		*regmap = priv->regmap_base;
220349c55878SDavid Wu 		*reg = RK3368_PULL_GRF_OFFSET;
220449c55878SDavid Wu 
220549c55878SDavid Wu 		/* correct the offset, as we're starting with the 2nd bank */
220649c55878SDavid Wu 		*reg -= 0x10;
220749c55878SDavid Wu 		*reg += bank->bank_num * RK3188_PULL_BANK_STRIDE;
220849c55878SDavid Wu 		*reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4);
220949c55878SDavid Wu 
221049c55878SDavid Wu 		*bit = (pin_num % RK3188_PULL_PINS_PER_REG);
221149c55878SDavid Wu 		*bit *= RK3188_PULL_BITS_PER_PIN;
221249c55878SDavid Wu 	}
221349c55878SDavid Wu }
221449c55878SDavid Wu 
221549c55878SDavid Wu #define RK3368_DRV_PMU_OFFSET		0x20
221649c55878SDavid Wu #define RK3368_DRV_GRF_OFFSET		0x200
221749c55878SDavid Wu 
221849c55878SDavid Wu static void rk3368_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
221949c55878SDavid Wu 					int pin_num, struct regmap **regmap,
222049c55878SDavid Wu 					int *reg, u8 *bit)
222149c55878SDavid Wu {
222249c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
222349c55878SDavid Wu 
222449c55878SDavid Wu 	/* The first 32 pins of the first bank are located in PMU */
222549c55878SDavid Wu 	if (bank->bank_num == 0) {
222649c55878SDavid Wu 		*regmap = priv->regmap_pmu;
222749c55878SDavid Wu 		*reg = RK3368_DRV_PMU_OFFSET;
222849c55878SDavid Wu 
222949c55878SDavid Wu 		*reg += ((pin_num / RK3288_DRV_PINS_PER_REG) * 4);
223049c55878SDavid Wu 		*bit = pin_num % RK3288_DRV_PINS_PER_REG;
223149c55878SDavid Wu 		*bit *= RK3288_DRV_BITS_PER_PIN;
223249c55878SDavid Wu 	} else {
223349c55878SDavid Wu 		*regmap = priv->regmap_base;
223449c55878SDavid Wu 		*reg = RK3368_DRV_GRF_OFFSET;
223549c55878SDavid Wu 
223649c55878SDavid Wu 		/* correct the offset, as we're starting with the 2nd bank */
223749c55878SDavid Wu 		*reg -= 0x10;
223849c55878SDavid Wu 		*reg += bank->bank_num * RK3288_DRV_BANK_STRIDE;
223949c55878SDavid Wu 		*reg += ((pin_num / RK3288_DRV_PINS_PER_REG) * 4);
224049c55878SDavid Wu 
224149c55878SDavid Wu 		*bit = (pin_num % RK3288_DRV_PINS_PER_REG);
224249c55878SDavid Wu 		*bit *= RK3288_DRV_BITS_PER_PIN;
224349c55878SDavid Wu 	}
224449c55878SDavid Wu }
224549c55878SDavid Wu 
224649c55878SDavid Wu #define RK3399_PULL_GRF_OFFSET		0xe040
224749c55878SDavid Wu #define RK3399_PULL_PMU_OFFSET		0x40
224849c55878SDavid Wu #define RK3399_DRV_3BITS_PER_PIN	3
224949c55878SDavid Wu 
225049c55878SDavid Wu static void rk3399_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
225149c55878SDavid Wu 					 int pin_num, struct regmap **regmap,
225249c55878SDavid Wu 					 int *reg, u8 *bit)
225349c55878SDavid Wu {
225449c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
225549c55878SDavid Wu 
225649c55878SDavid Wu 	/* The bank0:16 and bank1:32 pins are located in PMU */
225749c55878SDavid Wu 	if ((bank->bank_num == 0) || (bank->bank_num == 1)) {
225849c55878SDavid Wu 		*regmap = priv->regmap_pmu;
225949c55878SDavid Wu 		*reg = RK3399_PULL_PMU_OFFSET;
226049c55878SDavid Wu 
226149c55878SDavid Wu 		*reg += bank->bank_num * RK3188_PULL_BANK_STRIDE;
226249c55878SDavid Wu 
226349c55878SDavid Wu 		*reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4);
226449c55878SDavid Wu 		*bit = pin_num % RK3188_PULL_PINS_PER_REG;
226549c55878SDavid Wu 		*bit *= RK3188_PULL_BITS_PER_PIN;
226649c55878SDavid Wu 	} else {
226749c55878SDavid Wu 		*regmap = priv->regmap_base;
226849c55878SDavid Wu 		*reg = RK3399_PULL_GRF_OFFSET;
226949c55878SDavid Wu 
227049c55878SDavid Wu 		/* correct the offset, as we're starting with the 3rd bank */
227149c55878SDavid Wu 		*reg -= 0x20;
227249c55878SDavid Wu 		*reg += bank->bank_num * RK3188_PULL_BANK_STRIDE;
227349c55878SDavid Wu 		*reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4);
227449c55878SDavid Wu 
227549c55878SDavid Wu 		*bit = (pin_num % RK3188_PULL_PINS_PER_REG);
227649c55878SDavid Wu 		*bit *= RK3188_PULL_BITS_PER_PIN;
227749c55878SDavid Wu 	}
227849c55878SDavid Wu }
227949c55878SDavid Wu 
228049c55878SDavid Wu static void rk3399_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
228149c55878SDavid Wu 					int pin_num, struct regmap **regmap,
228249c55878SDavid Wu 					int *reg, u8 *bit)
228349c55878SDavid Wu {
228449c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
228549c55878SDavid Wu 	int drv_num = (pin_num / 8);
228649c55878SDavid Wu 
228749c55878SDavid Wu 	/*  The bank0:16 and bank1:32 pins are located in PMU */
228849c55878SDavid Wu 	if ((bank->bank_num == 0) || (bank->bank_num == 1))
228949c55878SDavid Wu 		*regmap = priv->regmap_pmu;
229049c55878SDavid Wu 	else
229149c55878SDavid Wu 		*regmap = priv->regmap_base;
229249c55878SDavid Wu 
229349c55878SDavid Wu 	*reg = bank->drv[drv_num].offset;
229449c55878SDavid Wu 	if ((bank->drv[drv_num].drv_type == DRV_TYPE_IO_1V8_3V0_AUTO) ||
229549c55878SDavid Wu 	    (bank->drv[drv_num].drv_type == DRV_TYPE_IO_3V3_ONLY))
229649c55878SDavid Wu 		*bit = (pin_num % 8) * 3;
229749c55878SDavid Wu 	else
229849c55878SDavid Wu 		*bit = (pin_num % 8) * 2;
229949c55878SDavid Wu }
230049c55878SDavid Wu 
230149c55878SDavid Wu static int rockchip_perpin_drv_list[DRV_TYPE_MAX][8] = {
230249c55878SDavid Wu 	{ 2, 4, 8, 12, -1, -1, -1, -1 },
230349c55878SDavid Wu 	{ 3, 6, 9, 12, -1, -1, -1, -1 },
230449c55878SDavid Wu 	{ 5, 10, 15, 20, -1, -1, -1, -1 },
230549c55878SDavid Wu 	{ 4, 6, 8, 10, 12, 14, 16, 18 },
230649c55878SDavid Wu 	{ 4, 7, 10, 13, 16, 19, 22, 26 }
230749c55878SDavid Wu };
230849c55878SDavid Wu 
230949c55878SDavid Wu static int rockchip_set_drive_perpin(struct rockchip_pin_bank *bank,
231049c55878SDavid Wu 				     int pin_num, int strength)
231149c55878SDavid Wu {
231249c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
231349c55878SDavid Wu 	struct rockchip_pin_ctrl *ctrl = priv->ctrl;
231449c55878SDavid Wu 	struct regmap *regmap;
231549c55878SDavid Wu 	int reg, ret, i;
231649c55878SDavid Wu 	u32 data, rmask_bits, temp;
231749c55878SDavid Wu 	u8 bit;
23182c16899dSDavid.Wu 	/* Where need to clean the special mask for rockchip_perpin_drv_list */
23192c16899dSDavid.Wu 	int drv_type = bank->drv[pin_num / 8].drv_type & (~DRV_TYPE_IO_MASK);
232049c55878SDavid Wu 
232149c55878SDavid Wu 	debug("setting drive of GPIO%d-%d to %d\n", bank->bank_num,
232249c55878SDavid Wu 	      pin_num, strength);
232349c55878SDavid Wu 
232449c55878SDavid Wu 	ctrl->drv_calc_reg(bank, pin_num, &regmap, &reg, &bit);
232549c55878SDavid Wu 
232649c55878SDavid Wu 	ret = -EINVAL;
232749c55878SDavid Wu 	for (i = 0; i < ARRAY_SIZE(rockchip_perpin_drv_list[drv_type]); i++) {
232849c55878SDavid Wu 		if (rockchip_perpin_drv_list[drv_type][i] == strength) {
232949c55878SDavid Wu 			ret = i;
233049c55878SDavid Wu 			break;
233149c55878SDavid Wu 		} else if (rockchip_perpin_drv_list[drv_type][i] < 0) {
233249c55878SDavid Wu 			ret = rockchip_perpin_drv_list[drv_type][i];
233349c55878SDavid Wu 			break;
233449c55878SDavid Wu 		}
233549c55878SDavid Wu 	}
233649c55878SDavid Wu 
233749c55878SDavid Wu 	if (ret < 0) {
233849c55878SDavid Wu 		debug("unsupported driver strength %d\n", strength);
233949c55878SDavid Wu 		return ret;
234049c55878SDavid Wu 	}
234149c55878SDavid Wu 
234249c55878SDavid Wu 	switch (drv_type) {
234349c55878SDavid Wu 	case DRV_TYPE_IO_1V8_3V0_AUTO:
234449c55878SDavid Wu 	case DRV_TYPE_IO_3V3_ONLY:
234549c55878SDavid Wu 		rmask_bits = RK3399_DRV_3BITS_PER_PIN;
234649c55878SDavid Wu 		switch (bit) {
234749c55878SDavid Wu 		case 0 ... 12:
234849c55878SDavid Wu 			/* regular case, nothing to do */
234949c55878SDavid Wu 			break;
235049c55878SDavid Wu 		case 15:
235149c55878SDavid Wu 			/*
235249c55878SDavid Wu 			 * drive-strength offset is special, as it is spread
235349c55878SDavid Wu 			 * over 2 registers, the bit data[15] contains bit 0
235449c55878SDavid Wu 			 * of the value while temp[1:0] contains bits 2 and 1
235549c55878SDavid Wu 			 */
235649c55878SDavid Wu 			data = (ret & 0x1) << 15;
235749c55878SDavid Wu 			temp = (ret >> 0x1) & 0x3;
235849c55878SDavid Wu 
235949c55878SDavid Wu 			data |= BIT(31);
236049c55878SDavid Wu 			ret = regmap_write(regmap, reg, data);
236149c55878SDavid Wu 			if (ret)
236249c55878SDavid Wu 				return ret;
236349c55878SDavid Wu 
236449c55878SDavid Wu 			temp |= (0x3 << 16);
236549c55878SDavid Wu 			reg += 0x4;
236649c55878SDavid Wu 			ret = regmap_write(regmap, reg, temp);
236749c55878SDavid Wu 
236849c55878SDavid Wu 			return ret;
236949c55878SDavid Wu 		case 18 ... 21:
237049c55878SDavid Wu 			/* setting fully enclosed in the second register */
237149c55878SDavid Wu 			reg += 4;
237249c55878SDavid Wu 			bit -= 16;
237349c55878SDavid Wu 			break;
237449c55878SDavid Wu 		default:
237549c55878SDavid Wu 			debug("unsupported bit: %d for pinctrl drive type: %d\n",
237649c55878SDavid Wu 			      bit, drv_type);
237749c55878SDavid Wu 			return -EINVAL;
237849c55878SDavid Wu 		}
237949c55878SDavid Wu 		break;
238049c55878SDavid Wu 	case DRV_TYPE_IO_DEFAULT:
238149c55878SDavid Wu 	case DRV_TYPE_IO_1V8_OR_3V0:
238249c55878SDavid Wu 	case DRV_TYPE_IO_1V8_ONLY:
238349c55878SDavid Wu 		rmask_bits = RK3288_DRV_BITS_PER_PIN;
238449c55878SDavid Wu 		break;
238549c55878SDavid Wu 	default:
238649c55878SDavid Wu 		debug("unsupported pinctrl drive type: %d\n",
238749c55878SDavid Wu 		      drv_type);
238849c55878SDavid Wu 		return -EINVAL;
238949c55878SDavid Wu 	}
239049c55878SDavid Wu 
239155a89bc6SDavid Wu 	if (bank->drv[pin_num / 8].drv_type & DRV_TYPE_WRITABLE_32BIT) {
239255a89bc6SDavid Wu 		regmap_read(regmap, reg, &data);
239355a89bc6SDavid Wu 		data &= ~(((1 << rmask_bits) - 1) << bit);
239455a89bc6SDavid Wu 	} else {
239549c55878SDavid Wu 		/* enable the write to the equivalent lower bits */
239649c55878SDavid Wu 		data = ((1 << rmask_bits) - 1) << (bit + 16);
239755a89bc6SDavid Wu 	}
239849c55878SDavid Wu 
239955a89bc6SDavid Wu 	data |= (ret << bit);
240049c55878SDavid Wu 	ret = regmap_write(regmap, reg, data);
240149c55878SDavid Wu 	return ret;
240249c55878SDavid Wu }
240349c55878SDavid Wu 
240449c55878SDavid Wu static int rockchip_pull_list[PULL_TYPE_MAX][4] = {
240549c55878SDavid Wu 	{
240649c55878SDavid Wu 		PIN_CONFIG_BIAS_DISABLE,
240749c55878SDavid Wu 		PIN_CONFIG_BIAS_PULL_UP,
240849c55878SDavid Wu 		PIN_CONFIG_BIAS_PULL_DOWN,
240949c55878SDavid Wu 		PIN_CONFIG_BIAS_BUS_HOLD
241049c55878SDavid Wu 	},
241149c55878SDavid Wu 	{
241249c55878SDavid Wu 		PIN_CONFIG_BIAS_DISABLE,
241349c55878SDavid Wu 		PIN_CONFIG_BIAS_PULL_DOWN,
241449c55878SDavid Wu 		PIN_CONFIG_BIAS_DISABLE,
241549c55878SDavid Wu 		PIN_CONFIG_BIAS_PULL_UP
241649c55878SDavid Wu 	},
241749c55878SDavid Wu };
241849c55878SDavid Wu 
241949c55878SDavid Wu static int rockchip_set_pull(struct rockchip_pin_bank *bank,
242049c55878SDavid Wu 			     int pin_num, int pull)
242149c55878SDavid Wu {
242249c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
242349c55878SDavid Wu 	struct rockchip_pin_ctrl *ctrl = priv->ctrl;
242449c55878SDavid Wu 	struct regmap *regmap;
242549c55878SDavid Wu 	int reg, ret, i, pull_type;
242649c55878SDavid Wu 	u8 bit;
242749c55878SDavid Wu 	u32 data;
242849c55878SDavid Wu 
242949c55878SDavid Wu 	debug("setting pull of GPIO%d-%d to %d\n", bank->bank_num,
243049c55878SDavid Wu 	      pin_num, pull);
243149c55878SDavid Wu 
243249c55878SDavid Wu 	/* rk3066b does support any pulls */
243349c55878SDavid Wu 	if (ctrl->type == RK3066B)
243449c55878SDavid Wu 		return pull ? -EINVAL : 0;
243549c55878SDavid Wu 
243649c55878SDavid Wu 	ctrl->pull_calc_reg(bank, pin_num, &regmap, &reg, &bit);
243749c55878SDavid Wu 
243849c55878SDavid Wu 	switch (ctrl->type) {
243949c55878SDavid Wu 	case RK2928:
244049c55878SDavid Wu 	case RK3128:
244149c55878SDavid Wu 		data = BIT(bit + 16);
244249c55878SDavid Wu 		if (pull == PIN_CONFIG_BIAS_DISABLE)
244349c55878SDavid Wu 			data |= BIT(bit);
244449c55878SDavid Wu 		ret = regmap_write(regmap, reg, data);
244549c55878SDavid Wu 		break;
244649c55878SDavid Wu 	case PX30:
244749c55878SDavid Wu 	case RV1108:
2448*cf04a17bSJianqun Xu 	case RV1126:
2449a2a3fc8fSJianqun Xu 	case RK1808:
245049c55878SDavid Wu 	case RK3188:
245149c55878SDavid Wu 	case RK3288:
2452b3077611SDavid Wu 	case RK3308:
245349c55878SDavid Wu 	case RK3368:
245449c55878SDavid Wu 	case RK3399:
24552c16899dSDavid.Wu 		/*
24562c16899dSDavid.Wu 		 * Where need to clean the special mask for
24572c16899dSDavid.Wu 		 * rockchip_pull_list.
24582c16899dSDavid.Wu 		 */
24592c16899dSDavid.Wu 		pull_type = bank->pull_type[pin_num / 8] & (~PULL_TYPE_IO_MASK);
246049c55878SDavid Wu 		ret = -EINVAL;
246149c55878SDavid Wu 		for (i = 0; i < ARRAY_SIZE(rockchip_pull_list[pull_type]);
246249c55878SDavid Wu 			i++) {
246349c55878SDavid Wu 			if (rockchip_pull_list[pull_type][i] == pull) {
246449c55878SDavid Wu 				ret = i;
246549c55878SDavid Wu 				break;
246649c55878SDavid Wu 			}
246749c55878SDavid Wu 		}
246849c55878SDavid Wu 
246949c55878SDavid Wu 		if (ret < 0) {
247049c55878SDavid Wu 			debug("unsupported pull setting %d\n", pull);
247149c55878SDavid Wu 			return ret;
247249c55878SDavid Wu 		}
247349c55878SDavid Wu 
247455a89bc6SDavid Wu 		if (bank->pull_type[pin_num / 8] & PULL_TYPE_WRITABLE_32BIT) {
247555a89bc6SDavid Wu 			regmap_read(regmap, reg, &data);
247655a89bc6SDavid Wu 			data &= ~(((1 << RK3188_PULL_BITS_PER_PIN) - 1) << bit);
247755a89bc6SDavid Wu 		} else {
247849c55878SDavid Wu 			/* enable the write to the equivalent lower bits */
247949c55878SDavid Wu 			data = ((1 << RK3188_PULL_BITS_PER_PIN) - 1) << (bit + 16);
248055a89bc6SDavid Wu 		}
248149c55878SDavid Wu 
248255a89bc6SDavid Wu 		data |= (ret << bit);
248349c55878SDavid Wu 		ret = regmap_write(regmap, reg, data);
248449c55878SDavid Wu 		break;
248549c55878SDavid Wu 	default:
248649c55878SDavid Wu 		debug("unsupported pinctrl type\n");
248749c55878SDavid Wu 		return -EINVAL;
248849c55878SDavid Wu 	}
248949c55878SDavid Wu 
249049c55878SDavid Wu 	return ret;
249149c55878SDavid Wu }
249249c55878SDavid Wu 
249349c55878SDavid Wu #define RK3328_SCHMITT_BITS_PER_PIN		1
249449c55878SDavid Wu #define RK3328_SCHMITT_PINS_PER_REG		16
249549c55878SDavid Wu #define RK3328_SCHMITT_BANK_STRIDE		8
249649c55878SDavid Wu #define RK3328_SCHMITT_GRF_OFFSET		0x380
249749c55878SDavid Wu 
249849c55878SDavid Wu static int rk3328_calc_schmitt_reg_and_bit(struct rockchip_pin_bank *bank,
249949c55878SDavid Wu 					   int pin_num,
250049c55878SDavid Wu 					   struct regmap **regmap,
250149c55878SDavid Wu 					   int *reg, u8 *bit)
250249c55878SDavid Wu {
250349c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
250449c55878SDavid Wu 
250549c55878SDavid Wu 	*regmap = priv->regmap_base;
250649c55878SDavid Wu 	*reg = RK3328_SCHMITT_GRF_OFFSET;
250749c55878SDavid Wu 
250849c55878SDavid Wu 	*reg += bank->bank_num * RK3328_SCHMITT_BANK_STRIDE;
250949c55878SDavid Wu 	*reg += ((pin_num / RK3328_SCHMITT_PINS_PER_REG) * 4);
251049c55878SDavid Wu 	*bit = pin_num % RK3328_SCHMITT_PINS_PER_REG;
251149c55878SDavid Wu 
251249c55878SDavid Wu 	return 0;
251349c55878SDavid Wu }
251449c55878SDavid Wu 
251549c55878SDavid Wu static int rockchip_set_schmitt(struct rockchip_pin_bank *bank,
251649c55878SDavid Wu 				int pin_num, int enable)
251749c55878SDavid Wu {
251849c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
251949c55878SDavid Wu 	struct rockchip_pin_ctrl *ctrl = priv->ctrl;
252049c55878SDavid Wu 	struct regmap *regmap;
252149c55878SDavid Wu 	int reg, ret;
252249c55878SDavid Wu 	u8 bit;
252349c55878SDavid Wu 	u32 data;
252449c55878SDavid Wu 
252549c55878SDavid Wu 	debug("setting input schmitt of GPIO%d-%d to %d\n", bank->bank_num,
252649c55878SDavid Wu 	      pin_num, enable);
252749c55878SDavid Wu 
252849c55878SDavid Wu 	ret = ctrl->schmitt_calc_reg(bank, pin_num, &regmap, &reg, &bit);
252949c55878SDavid Wu 	if (ret)
253049c55878SDavid Wu 		return ret;
253149c55878SDavid Wu 
253249c55878SDavid Wu 	/* enable the write to the equivalent lower bits */
253349c55878SDavid Wu 	data = BIT(bit + 16) | (enable << bit);
253449c55878SDavid Wu 
253549c55878SDavid Wu 	return regmap_write(regmap, reg, data);
253649c55878SDavid Wu }
253749c55878SDavid Wu 
253832c25d1fSDavid Wu #define PX30_SLEW_RATE_PMU_OFFSET		0x30
253932c25d1fSDavid Wu #define PX30_SLEW_RATE_GRF_OFFSET		0x90
254032c25d1fSDavid Wu #define PX30_SLEW_RATE_PINS_PER_PMU_REG		16
254132c25d1fSDavid Wu #define PX30_SLEW_RATE_BANK_STRIDE		16
254232c25d1fSDavid Wu #define PX30_SLEW_RATE_PINS_PER_GRF_REG		8
254332c25d1fSDavid Wu 
254432c25d1fSDavid Wu static int px30_calc_slew_rate_reg_and_bit(struct rockchip_pin_bank *bank,
254532c25d1fSDavid Wu 					   int pin_num,
254632c25d1fSDavid Wu 					   struct regmap **regmap,
254732c25d1fSDavid Wu 					   int *reg, u8 *bit)
254832c25d1fSDavid Wu {
254932c25d1fSDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
255032c25d1fSDavid Wu 	int pins_per_reg;
255132c25d1fSDavid Wu 
255232c25d1fSDavid Wu 	if (bank->bank_num == 0) {
255332c25d1fSDavid Wu 		*regmap = priv->regmap_pmu;
255432c25d1fSDavid Wu 		*reg = PX30_SLEW_RATE_PMU_OFFSET;
255532c25d1fSDavid Wu 		pins_per_reg = PX30_SCHMITT_PINS_PER_PMU_REG;
255632c25d1fSDavid Wu 	} else {
255732c25d1fSDavid Wu 		*regmap = priv->regmap_base;
255832c25d1fSDavid Wu 		*reg = PX30_SCHMITT_GRF_OFFSET;
255932c25d1fSDavid Wu 		pins_per_reg = PX30_SCHMITT_PINS_PER_GRF_REG;
256032c25d1fSDavid Wu 		*reg += (bank->bank_num  - 1) * PX30_SCHMITT_BANK_STRIDE;
256132c25d1fSDavid Wu 	}
256232c25d1fSDavid Wu 	*reg += ((pin_num / pins_per_reg) * 4);
256332c25d1fSDavid Wu 	*bit = pin_num % pins_per_reg;
256432c25d1fSDavid Wu 
256532c25d1fSDavid Wu 	return 0;
256632c25d1fSDavid Wu }
256732c25d1fSDavid Wu 
256832c25d1fSDavid Wu static int rockchip_set_slew_rate(struct rockchip_pin_bank *bank,
256932c25d1fSDavid Wu 				  int pin_num, int speed)
257032c25d1fSDavid Wu {
257132c25d1fSDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
257232c25d1fSDavid Wu 	struct rockchip_pin_ctrl *ctrl = priv->ctrl;
257332c25d1fSDavid Wu 	struct regmap *regmap;
257432c25d1fSDavid Wu 	int reg, ret;
257532c25d1fSDavid Wu 	u8 bit;
257632c25d1fSDavid Wu 	u32 data;
257732c25d1fSDavid Wu 
257832c25d1fSDavid Wu 	debug("setting slew rate of GPIO%d-%d to %d\n", bank->bank_num,
257932c25d1fSDavid Wu 	      pin_num, speed);
258032c25d1fSDavid Wu 
258132c25d1fSDavid Wu 	ret = ctrl->slew_rate_calc_reg(bank, pin_num, &regmap, &reg, &bit);
258232c25d1fSDavid Wu 	if (ret)
258332c25d1fSDavid Wu 		return ret;
258432c25d1fSDavid Wu 
258532c25d1fSDavid Wu 	/* enable the write to the equivalent lower bits */
258632c25d1fSDavid Wu 	data = BIT(bit + 16) | (speed << bit);
258732c25d1fSDavid Wu 
258832c25d1fSDavid Wu 	return regmap_write(regmap, reg, data);
258932c25d1fSDavid Wu }
259032c25d1fSDavid Wu 
259149c55878SDavid Wu /*
259249c55878SDavid Wu  * Pinconf_ops handling
259349c55878SDavid Wu  */
259449c55878SDavid Wu static bool rockchip_pinconf_pull_valid(struct rockchip_pin_ctrl *ctrl,
259549c55878SDavid Wu 					unsigned int pull)
259649c55878SDavid Wu {
259749c55878SDavid Wu 	switch (ctrl->type) {
259849c55878SDavid Wu 	case RK2928:
259949c55878SDavid Wu 	case RK3128:
260049c55878SDavid Wu 		return (pull == PIN_CONFIG_BIAS_PULL_PIN_DEFAULT ||
260149c55878SDavid Wu 			pull == PIN_CONFIG_BIAS_DISABLE);
260249c55878SDavid Wu 	case RK3066B:
260349c55878SDavid Wu 		return pull ? false : true;
260449c55878SDavid Wu 	case PX30:
260549c55878SDavid Wu 	case RV1108:
2606*cf04a17bSJianqun Xu 	case RV1126:
2607a2a3fc8fSJianqun Xu 	case RK1808:
260849c55878SDavid Wu 	case RK3188:
260949c55878SDavid Wu 	case RK3288:
2610b3077611SDavid Wu 	case RK3308:
261149c55878SDavid Wu 	case RK3368:
261249c55878SDavid Wu 	case RK3399:
261349c55878SDavid Wu 		return (pull != PIN_CONFIG_BIAS_PULL_PIN_DEFAULT);
261449c55878SDavid Wu 	}
261549c55878SDavid Wu 
261649c55878SDavid Wu 	return false;
261749c55878SDavid Wu }
261849c55878SDavid Wu 
261949c55878SDavid Wu /* set the pin config settings for a specified pin */
262049c55878SDavid Wu static int rockchip_pinconf_set(struct rockchip_pin_bank *bank,
262149c55878SDavid Wu 				u32 pin, u32 param, u32 arg)
262249c55878SDavid Wu {
262349c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = bank->priv;
262449c55878SDavid Wu 	struct rockchip_pin_ctrl *ctrl = priv->ctrl;
262549c55878SDavid Wu 	int rc;
262649c55878SDavid Wu 
262749c55878SDavid Wu 	switch (param) {
262849c55878SDavid Wu 	case PIN_CONFIG_BIAS_DISABLE:
262949c55878SDavid Wu 		rc =  rockchip_set_pull(bank, pin, param);
263049c55878SDavid Wu 		if (rc)
263149c55878SDavid Wu 			return rc;
263249c55878SDavid Wu 		break;
263349c55878SDavid Wu 
263449c55878SDavid Wu 	case PIN_CONFIG_BIAS_PULL_UP:
263549c55878SDavid Wu 	case PIN_CONFIG_BIAS_PULL_DOWN:
263649c55878SDavid Wu 	case PIN_CONFIG_BIAS_PULL_PIN_DEFAULT:
263749c55878SDavid Wu 	case PIN_CONFIG_BIAS_BUS_HOLD:
263849c55878SDavid Wu 		if (!rockchip_pinconf_pull_valid(ctrl, param))
263949c55878SDavid Wu 			return -ENOTSUPP;
264049c55878SDavid Wu 
264149c55878SDavid Wu 		if (!arg)
264249c55878SDavid Wu 			return -EINVAL;
264349c55878SDavid Wu 
264449c55878SDavid Wu 		rc = rockchip_set_pull(bank, pin, param);
264549c55878SDavid Wu 		if (rc)
264649c55878SDavid Wu 			return rc;
264749c55878SDavid Wu 		break;
264849c55878SDavid Wu 
264949c55878SDavid Wu 	case PIN_CONFIG_DRIVE_STRENGTH:
265049c55878SDavid Wu 		if (!ctrl->drv_calc_reg)
265149c55878SDavid Wu 			return -ENOTSUPP;
265249c55878SDavid Wu 
265349c55878SDavid Wu 		rc = rockchip_set_drive_perpin(bank, pin, arg);
265449c55878SDavid Wu 		if (rc < 0)
265549c55878SDavid Wu 			return rc;
265649c55878SDavid Wu 		break;
265749c55878SDavid Wu 
265849c55878SDavid Wu 	case PIN_CONFIG_INPUT_SCHMITT_ENABLE:
265949c55878SDavid Wu 		if (!ctrl->schmitt_calc_reg)
266049c55878SDavid Wu 			return -ENOTSUPP;
266149c55878SDavid Wu 
266249c55878SDavid Wu 		rc = rockchip_set_schmitt(bank, pin, arg);
266349c55878SDavid Wu 		if (rc < 0)
266449c55878SDavid Wu 			return rc;
266549c55878SDavid Wu 		break;
266649c55878SDavid Wu 
266732c25d1fSDavid Wu 	case PIN_CONFIG_SLEW_RATE:
266832c25d1fSDavid Wu 		if (!ctrl->slew_rate_calc_reg)
266932c25d1fSDavid Wu 			return -ENOTSUPP;
267032c25d1fSDavid Wu 
267132c25d1fSDavid Wu 		rc = rockchip_set_slew_rate(bank,
267232c25d1fSDavid Wu 					    pin - bank->pin_base, arg);
267332c25d1fSDavid Wu 		if (rc < 0)
267432c25d1fSDavid Wu 			return rc;
267532c25d1fSDavid Wu 		break;
267632c25d1fSDavid Wu 
267749c55878SDavid Wu 	default:
267849c55878SDavid Wu 		break;
267949c55878SDavid Wu 	}
268049c55878SDavid Wu 
268149c55878SDavid Wu 	return 0;
268249c55878SDavid Wu }
268349c55878SDavid Wu 
268449c55878SDavid Wu static const struct pinconf_param rockchip_conf_params[] = {
268549c55878SDavid Wu 	{ "bias-disable", PIN_CONFIG_BIAS_DISABLE, 0 },
268649c55878SDavid Wu 	{ "bias-bus-hold", PIN_CONFIG_BIAS_BUS_HOLD, 0 },
268749c55878SDavid Wu 	{ "bias-pull-up", PIN_CONFIG_BIAS_PULL_UP, 1 },
268849c55878SDavid Wu 	{ "bias-pull-down", PIN_CONFIG_BIAS_PULL_DOWN, 1 },
268949c55878SDavid Wu 	{ "drive-strength", PIN_CONFIG_DRIVE_STRENGTH, 0 },
269049c55878SDavid Wu 	{ "input-enable", PIN_CONFIG_INPUT_ENABLE, 1 },
269149c55878SDavid Wu 	{ "input-disable", PIN_CONFIG_INPUT_ENABLE, 0 },
269249c55878SDavid Wu 	{ "input-schmitt-disable", PIN_CONFIG_INPUT_SCHMITT_ENABLE, 0 },
269349c55878SDavid Wu 	{ "input-schmitt-enable", PIN_CONFIG_INPUT_SCHMITT_ENABLE, 1 },
269432c25d1fSDavid Wu 	{ "slew-rate", PIN_CONFIG_SLEW_RATE, 0 },
269549c55878SDavid Wu };
269649c55878SDavid Wu 
269749c55878SDavid Wu static int rockchip_pinconf_prop_name_to_param(const char *property,
269849c55878SDavid Wu 					       u32 *default_value)
269949c55878SDavid Wu {
270049c55878SDavid Wu 	const struct pinconf_param *p, *end;
270149c55878SDavid Wu 
270249c55878SDavid Wu 	p = rockchip_conf_params;
270349c55878SDavid Wu 	end = p + sizeof(rockchip_conf_params) / sizeof(struct pinconf_param);
270449c55878SDavid Wu 
270549c55878SDavid Wu 	/* See if this pctldev supports this parameter */
270649c55878SDavid Wu 	for (; p < end; p++) {
270749c55878SDavid Wu 		if (!strcmp(property, p->property)) {
270849c55878SDavid Wu 			*default_value = p->default_value;
270949c55878SDavid Wu 			return p->param;
271049c55878SDavid Wu 		}
271149c55878SDavid Wu 	}
271249c55878SDavid Wu 
271349c55878SDavid Wu 	*default_value = 0;
271449c55878SDavid Wu 	return -EPERM;
271549c55878SDavid Wu }
271649c55878SDavid Wu 
271749c55878SDavid Wu static int rockchip_pinctrl_set_state(struct udevice *dev,
271849c55878SDavid Wu 				      struct udevice *config)
271949c55878SDavid Wu {
272049c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = dev_get_priv(dev);
272149c55878SDavid Wu 	struct rockchip_pin_ctrl *ctrl = priv->ctrl;
272249c55878SDavid Wu 	u32 cells[MAX_ROCKCHIP_PINS_ENTRIES * 4];
272349c55878SDavid Wu 	u32 bank, pin, mux, conf, arg, default_val;
272449c55878SDavid Wu 	int ret, count, i;
272549c55878SDavid Wu 	const char *prop_name;
272649c55878SDavid Wu 	const void *value;
27272208cfa9SKever Yang 	int prop_len, param;
27282208cfa9SKever Yang 	const u32 *data;
27292208cfa9SKever Yang 	ofnode node;
2730d2e2dbd6SJason Zhu #if defined(CONFIG_OF_LIVE) && !defined(CONFIG_SPL_BUILD)
27312208cfa9SKever Yang 	const struct device_node *np;
27322208cfa9SKever Yang 	struct property *pp;
27332208cfa9SKever Yang #else
27342208cfa9SKever Yang 	int property_offset, pcfg_node;
27352208cfa9SKever Yang 	const void *blob = gd->fdt_blob;
27362208cfa9SKever Yang #endif
27372208cfa9SKever Yang 	data = dev_read_prop(config, "rockchip,pins", &count);
273849c55878SDavid Wu 	if (count < 0) {
273987f0ac57SDavid Wu 		debug("%s: bad array size %d\n", __func__, count);
274049c55878SDavid Wu 		return -EINVAL;
274149c55878SDavid Wu 	}
274249c55878SDavid Wu 
274387f0ac57SDavid Wu 	count /= sizeof(u32);
274449c55878SDavid Wu 	if (count > MAX_ROCKCHIP_PINS_ENTRIES * 4) {
274549c55878SDavid Wu 		debug("%s: unsupported pins array count %d\n",
274649c55878SDavid Wu 		      __func__, count);
274749c55878SDavid Wu 		return -EINVAL;
274849c55878SDavid Wu 	}
274949c55878SDavid Wu 
275087f0ac57SDavid Wu 	for (i = 0; i < count; i++)
275187f0ac57SDavid Wu 		cells[i] = fdt32_to_cpu(data[i]);
275287f0ac57SDavid Wu 
275349c55878SDavid Wu 	for (i = 0; i < (count >> 2); i++) {
275449c55878SDavid Wu 		bank = cells[4 * i + 0];
275549c55878SDavid Wu 		pin = cells[4 * i + 1];
275649c55878SDavid Wu 		mux = cells[4 * i + 2];
275749c55878SDavid Wu 		conf = cells[4 * i + 3];
275849c55878SDavid Wu 
275949c55878SDavid Wu 		ret = rockchip_verify_config(dev, bank, pin);
276049c55878SDavid Wu 		if (ret)
276149c55878SDavid Wu 			return ret;
276249c55878SDavid Wu 
276349c55878SDavid Wu 		ret = rockchip_set_mux(&ctrl->pin_banks[bank], pin, mux);
276449c55878SDavid Wu 		if (ret)
276549c55878SDavid Wu 			return ret;
276649c55878SDavid Wu 
27672208cfa9SKever Yang 		node = ofnode_get_by_phandle(conf);
27682208cfa9SKever Yang 		if (!ofnode_valid(node))
276949c55878SDavid Wu 			return -ENODEV;
2770d2e2dbd6SJason Zhu #if defined(CONFIG_OF_LIVE) && !defined(CONFIG_SPL_BUILD)
27712208cfa9SKever Yang 		np = ofnode_to_np(node);
27722208cfa9SKever Yang 		for (pp = np->properties; pp; pp = pp->next) {
27732208cfa9SKever Yang 			prop_name = pp->name;
27742208cfa9SKever Yang 			prop_len = pp->length;
27752208cfa9SKever Yang 			value = pp->value;
27762208cfa9SKever Yang #else
27772208cfa9SKever Yang 		pcfg_node = ofnode_to_offset(node);
277849c55878SDavid Wu 		fdt_for_each_property_offset(property_offset, blob, pcfg_node) {
277949c55878SDavid Wu 			value = fdt_getprop_by_offset(blob, property_offset,
278049c55878SDavid Wu 						      &prop_name, &prop_len);
278149c55878SDavid Wu 			if (!value)
278249c55878SDavid Wu 				return -ENOENT;
27832208cfa9SKever Yang #endif
278449c55878SDavid Wu 			param = rockchip_pinconf_prop_name_to_param(prop_name,
278549c55878SDavid Wu 								    &default_val);
278649c55878SDavid Wu 			if (param < 0)
278749c55878SDavid Wu 				break;
278849c55878SDavid Wu 
278949c55878SDavid Wu 			if (prop_len >= sizeof(fdt32_t))
279049c55878SDavid Wu 				arg = fdt32_to_cpu(*(fdt32_t *)value);
279149c55878SDavid Wu 			else
279249c55878SDavid Wu 				arg = default_val;
279349c55878SDavid Wu 
279449c55878SDavid Wu 			ret = rockchip_pinconf_set(&ctrl->pin_banks[bank], pin,
279549c55878SDavid Wu 						   param, arg);
279649c55878SDavid Wu 			if (ret) {
279749c55878SDavid Wu 				debug("%s: rockchip_pinconf_set fail: %d\n",
279849c55878SDavid Wu 				      __func__, ret);
279949c55878SDavid Wu 				return ret;
280049c55878SDavid Wu 			}
280149c55878SDavid Wu 		}
280249c55878SDavid Wu 	}
280349c55878SDavid Wu 
280449c55878SDavid Wu 	return 0;
280549c55878SDavid Wu }
280649c55878SDavid Wu 
280749c55878SDavid Wu static struct pinctrl_ops rockchip_pinctrl_ops = {
280849c55878SDavid Wu 	.set_state			= rockchip_pinctrl_set_state,
280949c55878SDavid Wu 	.get_gpio_mux			= rockchip_pinctrl_get_gpio_mux,
281049c55878SDavid Wu };
281149c55878SDavid Wu 
2812d5517017SDavid Wu /* Ctrl data specially handle */
2813d5517017SDavid Wu static int rk3308b_ctrl_data_re_init(struct rockchip_pin_ctrl *ctrl)
2814d5517017SDavid Wu {
2815d5517017SDavid Wu 	/*
2816d5517017SDavid Wu 	 * Special for rk3308b, where we need to replace the recalced
2817d5517017SDavid Wu 	 * and routed arrays.
2818d5517017SDavid Wu 	 */
2819d5517017SDavid Wu 	if (soc_is_rk3308b()) {
2820d5517017SDavid Wu 		ctrl->iomux_recalced = rk3308b_mux_recalced_data;
2821d5517017SDavid Wu 		ctrl->niomux_recalced = ARRAY_SIZE(rk3308b_mux_recalced_data);
2822d5517017SDavid Wu 		ctrl->iomux_routes = rk3308b_mux_route_data;
2823d5517017SDavid Wu 		ctrl->niomux_routes = ARRAY_SIZE(rk3308b_mux_route_data);
2824d5517017SDavid Wu 	}
2825d5517017SDavid Wu 
2826d5517017SDavid Wu 	return 0;
2827d5517017SDavid Wu }
2828d5517017SDavid Wu 
282949c55878SDavid Wu /* retrieve the soc specific data */
283049c55878SDavid Wu static struct rockchip_pin_ctrl *rockchip_pinctrl_get_soc_data(struct udevice *dev)
283149c55878SDavid Wu {
283249c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = dev_get_priv(dev);
283349c55878SDavid Wu 	struct rockchip_pin_ctrl *ctrl =
283449c55878SDavid Wu 			(struct rockchip_pin_ctrl *)dev_get_driver_data(dev);
283549c55878SDavid Wu 	struct rockchip_pin_bank *bank;
283649c55878SDavid Wu 	int grf_offs, pmu_offs, drv_grf_offs, drv_pmu_offs, i, j;
283749c55878SDavid Wu 
283849c55878SDavid Wu 	grf_offs = ctrl->grf_mux_offset;
283949c55878SDavid Wu 	pmu_offs = ctrl->pmu_mux_offset;
284049c55878SDavid Wu 	drv_pmu_offs = ctrl->pmu_drv_offset;
284149c55878SDavid Wu 	drv_grf_offs = ctrl->grf_drv_offset;
284249c55878SDavid Wu 	bank = ctrl->pin_banks;
284349c55878SDavid Wu 
2844d5517017SDavid Wu 	/* Ctrl data re-initialize for some Socs */
2845d5517017SDavid Wu 	if (ctrl->ctrl_data_re_init) {
2846d5517017SDavid Wu 		if (ctrl->ctrl_data_re_init(ctrl))
2847d5517017SDavid Wu 			return NULL;
2848d5517017SDavid Wu 	}
2849d5517017SDavid Wu 
285049c55878SDavid Wu 	for (i = 0; i < ctrl->nr_banks; ++i, ++bank) {
285149c55878SDavid Wu 		int bank_pins = 0;
285249c55878SDavid Wu 
285349c55878SDavid Wu 		bank->priv = priv;
285449c55878SDavid Wu 		bank->pin_base = ctrl->nr_pins;
285549c55878SDavid Wu 		ctrl->nr_pins += bank->nr_pins;
285649c55878SDavid Wu 
285749c55878SDavid Wu 		/* calculate iomux and drv offsets */
285849c55878SDavid Wu 		for (j = 0; j < 4; j++) {
285949c55878SDavid Wu 			struct rockchip_iomux *iom = &bank->iomux[j];
286049c55878SDavid Wu 			struct rockchip_drv *drv = &bank->drv[j];
286149c55878SDavid Wu 			int inc;
286249c55878SDavid Wu 
286349c55878SDavid Wu 			if (bank_pins >= bank->nr_pins)
286449c55878SDavid Wu 				break;
286549c55878SDavid Wu 
286649c55878SDavid Wu 			/* preset iomux offset value, set new start value */
286749c55878SDavid Wu 			if (iom->offset >= 0) {
286849c55878SDavid Wu 				if (iom->type & IOMUX_SOURCE_PMU)
286949c55878SDavid Wu 					pmu_offs = iom->offset;
287049c55878SDavid Wu 				else
287149c55878SDavid Wu 					grf_offs = iom->offset;
287249c55878SDavid Wu 			} else { /* set current iomux offset */
287349c55878SDavid Wu 				iom->offset = (iom->type & IOMUX_SOURCE_PMU) ?
287449c55878SDavid Wu 							pmu_offs : grf_offs;
287549c55878SDavid Wu 			}
287649c55878SDavid Wu 
287749c55878SDavid Wu 			/* preset drv offset value, set new start value */
287849c55878SDavid Wu 			if (drv->offset >= 0) {
287949c55878SDavid Wu 				if (iom->type & IOMUX_SOURCE_PMU)
288049c55878SDavid Wu 					drv_pmu_offs = drv->offset;
288149c55878SDavid Wu 				else
288249c55878SDavid Wu 					drv_grf_offs = drv->offset;
288349c55878SDavid Wu 			} else { /* set current drv offset */
288449c55878SDavid Wu 				drv->offset = (iom->type & IOMUX_SOURCE_PMU) ?
288549c55878SDavid Wu 						drv_pmu_offs : drv_grf_offs;
288649c55878SDavid Wu 			}
288749c55878SDavid Wu 
288849c55878SDavid Wu 			debug("bank %d, iomux %d has iom_offset 0x%x drv_offset 0x%x\n",
288949c55878SDavid Wu 			      i, j, iom->offset, drv->offset);
289049c55878SDavid Wu 
289149c55878SDavid Wu 			/*
289249c55878SDavid Wu 			 * Increase offset according to iomux width.
289349c55878SDavid Wu 			 * 4bit iomux'es are spread over two registers.
289449c55878SDavid Wu 			 */
289549c55878SDavid Wu 			inc = (iom->type & (IOMUX_WIDTH_4BIT |
289688a1f7ffSDavid Wu 					    IOMUX_WIDTH_3BIT |
289788a1f7ffSDavid Wu 					    IOMUX_8WIDTH_2BIT)) ? 8 : 4;
289849c55878SDavid Wu 			if (iom->type & IOMUX_SOURCE_PMU)
289949c55878SDavid Wu 				pmu_offs += inc;
290049c55878SDavid Wu 			else
290149c55878SDavid Wu 				grf_offs += inc;
290249c55878SDavid Wu 
290349c55878SDavid Wu 			/*
290449c55878SDavid Wu 			 * Increase offset according to drv width.
290549c55878SDavid Wu 			 * 3bit drive-strenth'es are spread over two registers.
290649c55878SDavid Wu 			 */
290749c55878SDavid Wu 			if ((drv->drv_type == DRV_TYPE_IO_1V8_3V0_AUTO) ||
290849c55878SDavid Wu 			    (drv->drv_type == DRV_TYPE_IO_3V3_ONLY))
290949c55878SDavid Wu 				inc = 8;
291049c55878SDavid Wu 			else
291149c55878SDavid Wu 				inc = 4;
291249c55878SDavid Wu 
291349c55878SDavid Wu 			if (iom->type & IOMUX_SOURCE_PMU)
291449c55878SDavid Wu 				drv_pmu_offs += inc;
291549c55878SDavid Wu 			else
291649c55878SDavid Wu 				drv_grf_offs += inc;
291749c55878SDavid Wu 
291849c55878SDavid Wu 			bank_pins += 8;
291949c55878SDavid Wu 		}
292049c55878SDavid Wu 
292149c55878SDavid Wu 		/* calculate the per-bank recalced_mask */
292249c55878SDavid Wu 		for (j = 0; j < ctrl->niomux_recalced; j++) {
292349c55878SDavid Wu 			int pin = 0;
292449c55878SDavid Wu 
292549c55878SDavid Wu 			if (ctrl->iomux_recalced[j].num == bank->bank_num) {
292649c55878SDavid Wu 				pin = ctrl->iomux_recalced[j].pin;
292749c55878SDavid Wu 				bank->recalced_mask |= BIT(pin);
292849c55878SDavid Wu 			}
292949c55878SDavid Wu 		}
293049c55878SDavid Wu 
293149c55878SDavid Wu 		/* calculate the per-bank route_mask */
293249c55878SDavid Wu 		for (j = 0; j < ctrl->niomux_routes; j++) {
293349c55878SDavid Wu 			int pin = 0;
293449c55878SDavid Wu 
293549c55878SDavid Wu 			if (ctrl->iomux_routes[j].bank_num == bank->bank_num) {
293649c55878SDavid Wu 				pin = ctrl->iomux_routes[j].pin;
293749c55878SDavid Wu 				bank->route_mask |= BIT(pin);
293849c55878SDavid Wu 			}
293949c55878SDavid Wu 		}
294049c55878SDavid Wu 	}
294149c55878SDavid Wu 
294249c55878SDavid Wu 	return ctrl;
294349c55878SDavid Wu }
294449c55878SDavid Wu 
2945d5517017SDavid Wu /* SoC data specially handle */
2946d5517017SDavid Wu 
2947d5517017SDavid Wu /* rk3308b SoC data initialize */
2948d5517017SDavid Wu #define RK3308B_GRF_SOC_CON13			0x608
2949d5517017SDavid Wu #define RK3308B_GRF_SOC_CON15			0x610
2950d5517017SDavid Wu 
2951d5517017SDavid Wu /* RK3308B_GRF_SOC_CON13 */
2952d5517017SDavid Wu #define RK3308B_GRF_I2C3_IOFUNC_SRC_CTRL	(BIT(16 + 10) | BIT(10))
2953d5517017SDavid Wu #define RK3308B_GRF_GPIO2A3_SEL_SRC_CTRL	(BIT(16 + 7)  | BIT(7))
2954d5517017SDavid Wu #define RK3308B_GRF_GPIO2A2_SEL_SRC_CTRL	(BIT(16 + 3)  | BIT(3))
2955d5517017SDavid Wu 
2956d5517017SDavid Wu /* RK3308B_GRF_SOC_CON15 */
2957d5517017SDavid Wu #define RK3308B_GRF_GPIO2C0_SEL_SRC_CTRL	(BIT(16 + 11) | BIT(11))
2958d5517017SDavid Wu #define RK3308B_GRF_GPIO3B3_SEL_SRC_CTRL	(BIT(16 + 7)  | BIT(7))
2959d5517017SDavid Wu #define RK3308B_GRF_GPIO3B2_SEL_SRC_CTRL	(BIT(16 + 3)  | BIT(3))
2960d5517017SDavid Wu 
2961d5517017SDavid Wu static int rk3308b_soc_data_init(struct rockchip_pinctrl_priv *priv)
2962d5517017SDavid Wu {
2963d5517017SDavid Wu 	int ret;
2964d5517017SDavid Wu 
2965d5517017SDavid Wu 	/*
2966d5517017SDavid Wu 	 * Enable the special ctrl  of selected sources.
2967d5517017SDavid Wu 	 */
2968d5517017SDavid Wu 	if (soc_is_rk3308b()) {
2969d5517017SDavid Wu 		ret = regmap_write(priv->regmap_base, RK3308B_GRF_SOC_CON13,
2970d5517017SDavid Wu 				   RK3308B_GRF_I2C3_IOFUNC_SRC_CTRL |
2971d5517017SDavid Wu 				   RK3308B_GRF_GPIO2A3_SEL_SRC_CTRL |
2972d5517017SDavid Wu 				   RK3308B_GRF_GPIO2A2_SEL_SRC_CTRL);
2973d5517017SDavid Wu 		if (ret)
2974d5517017SDavid Wu 			return ret;
2975d5517017SDavid Wu 
2976d5517017SDavid Wu 		ret = regmap_write(priv->regmap_base, RK3308B_GRF_SOC_CON15,
2977d5517017SDavid Wu 				   RK3308B_GRF_GPIO2C0_SEL_SRC_CTRL |
2978d5517017SDavid Wu 				   RK3308B_GRF_GPIO3B3_SEL_SRC_CTRL |
2979d5517017SDavid Wu 				   RK3308B_GRF_GPIO3B2_SEL_SRC_CTRL);
2980d5517017SDavid Wu 		if (ret)
2981d5517017SDavid Wu 			return ret;
2982d5517017SDavid Wu 	}
2983d5517017SDavid Wu 
2984d5517017SDavid Wu 	return 0;
2985d5517017SDavid Wu }
2986d5517017SDavid Wu 
298749c55878SDavid Wu static int rockchip_pinctrl_probe(struct udevice *dev)
298849c55878SDavid Wu {
298949c55878SDavid Wu 	struct rockchip_pinctrl_priv *priv = dev_get_priv(dev);
299049c55878SDavid Wu 	struct rockchip_pin_ctrl *ctrl;
299149c55878SDavid Wu 	struct udevice *syscon;
299249c55878SDavid Wu 	struct regmap *regmap;
299349c55878SDavid Wu 	int ret = 0;
299449c55878SDavid Wu 
299549c55878SDavid Wu 	/* get rockchip grf syscon phandle */
299649c55878SDavid Wu 	ret = uclass_get_device_by_phandle(UCLASS_SYSCON, dev, "rockchip,grf",
299749c55878SDavid Wu 					   &syscon);
299849c55878SDavid Wu 	if (ret) {
299949c55878SDavid Wu 		debug("unable to find rockchip,grf syscon device (%d)\n", ret);
300049c55878SDavid Wu 		return ret;
300149c55878SDavid Wu 	}
300249c55878SDavid Wu 
300349c55878SDavid Wu 	/* get grf-reg base address */
300449c55878SDavid Wu 	regmap = syscon_get_regmap(syscon);
300549c55878SDavid Wu 	if (!regmap) {
300649c55878SDavid Wu 		debug("unable to find rockchip grf regmap\n");
300749c55878SDavid Wu 		return -ENODEV;
300849c55878SDavid Wu 	}
300949c55878SDavid Wu 	priv->regmap_base = regmap;
301049c55878SDavid Wu 
301149c55878SDavid Wu 	/* option: get pmu-reg base address */
301249c55878SDavid Wu 	ret = uclass_get_device_by_phandle(UCLASS_SYSCON, dev, "rockchip,pmu",
301349c55878SDavid Wu 					   &syscon);
301449c55878SDavid Wu 	if (!ret) {
301549c55878SDavid Wu 		/* get pmugrf-reg base address */
301649c55878SDavid Wu 		regmap = syscon_get_regmap(syscon);
301749c55878SDavid Wu 		if (!regmap) {
301849c55878SDavid Wu 			debug("unable to find rockchip pmu regmap\n");
301949c55878SDavid Wu 			return -ENODEV;
302049c55878SDavid Wu 		}
302149c55878SDavid Wu 		priv->regmap_pmu = regmap;
302249c55878SDavid Wu 	}
302349c55878SDavid Wu 
302449c55878SDavid Wu 	ctrl = rockchip_pinctrl_get_soc_data(dev);
302549c55878SDavid Wu 	if (!ctrl) {
302649c55878SDavid Wu 		debug("driver data not available\n");
302749c55878SDavid Wu 		return -EINVAL;
302849c55878SDavid Wu 	}
302949c55878SDavid Wu 
3030d5517017SDavid Wu 	/* Special handle for some Socs */
3031d5517017SDavid Wu 	if (ctrl->soc_data_init) {
3032d5517017SDavid Wu 		ret = ctrl->soc_data_init(priv);
3033d5517017SDavid Wu 		if (ret)
3034d5517017SDavid Wu 			return ret;
3035d5517017SDavid Wu 	}
3036d5517017SDavid Wu 
303749c55878SDavid Wu 	priv->ctrl = ctrl;
303849c55878SDavid Wu 	return 0;
303949c55878SDavid Wu }
304049c55878SDavid Wu 
304149c55878SDavid Wu static struct rockchip_pin_bank px30_pin_banks[] = {
304249c55878SDavid Wu 	PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0", IOMUX_SOURCE_PMU,
304349c55878SDavid Wu 					     IOMUX_SOURCE_PMU,
304449c55878SDavid Wu 					     IOMUX_SOURCE_PMU,
304549c55878SDavid Wu 					     IOMUX_SOURCE_PMU
304649c55878SDavid Wu 			    ),
304749c55878SDavid Wu 	PIN_BANK_IOMUX_FLAGS(1, 32, "gpio1", IOMUX_WIDTH_4BIT,
304849c55878SDavid Wu 					     IOMUX_WIDTH_4BIT,
304949c55878SDavid Wu 					     IOMUX_WIDTH_4BIT,
305049c55878SDavid Wu 					     IOMUX_WIDTH_4BIT
305149c55878SDavid Wu 			    ),
305249c55878SDavid Wu 	PIN_BANK_IOMUX_FLAGS(2, 32, "gpio2", IOMUX_WIDTH_4BIT,
305349c55878SDavid Wu 					     IOMUX_WIDTH_4BIT,
305449c55878SDavid Wu 					     IOMUX_WIDTH_4BIT,
305549c55878SDavid Wu 					     IOMUX_WIDTH_4BIT
305649c55878SDavid Wu 			    ),
305749c55878SDavid Wu 	PIN_BANK_IOMUX_FLAGS(3, 32, "gpio3", IOMUX_WIDTH_4BIT,
305849c55878SDavid Wu 					     IOMUX_WIDTH_4BIT,
305949c55878SDavid Wu 					     IOMUX_WIDTH_4BIT,
306049c55878SDavid Wu 					     IOMUX_WIDTH_4BIT
306149c55878SDavid Wu 			    ),
306249c55878SDavid Wu };
306349c55878SDavid Wu 
306449c55878SDavid Wu static struct rockchip_pin_ctrl px30_pin_ctrl = {
306549c55878SDavid Wu 		.pin_banks		= px30_pin_banks,
306649c55878SDavid Wu 		.nr_banks		= ARRAY_SIZE(px30_pin_banks),
306749c55878SDavid Wu 		.label			= "PX30-GPIO",
306849c55878SDavid Wu 		.type			= PX30,
306949c55878SDavid Wu 		.grf_mux_offset		= 0x0,
307049c55878SDavid Wu 		.pmu_mux_offset		= 0x0,
307149c55878SDavid Wu 		.iomux_routes		= px30_mux_route_data,
307249c55878SDavid Wu 		.niomux_routes		= ARRAY_SIZE(px30_mux_route_data),
307349c55878SDavid Wu 		.pull_calc_reg		= px30_calc_pull_reg_and_bit,
307449c55878SDavid Wu 		.drv_calc_reg		= px30_calc_drv_reg_and_bit,
307549c55878SDavid Wu 		.schmitt_calc_reg	= px30_calc_schmitt_reg_and_bit,
307632c25d1fSDavid Wu 		.slew_rate_calc_reg	= px30_calc_slew_rate_reg_and_bit,
307749c55878SDavid Wu };
307849c55878SDavid Wu 
307949c55878SDavid Wu static struct rockchip_pin_bank rv1108_pin_banks[] = {
308049c55878SDavid Wu 	PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0", IOMUX_SOURCE_PMU,
308149c55878SDavid Wu 					     IOMUX_SOURCE_PMU,
308249c55878SDavid Wu 					     IOMUX_SOURCE_PMU,
308349c55878SDavid Wu 					     IOMUX_SOURCE_PMU),
308449c55878SDavid Wu 	PIN_BANK_IOMUX_FLAGS(1, 32, "gpio1", 0, 0, 0, 0),
308549c55878SDavid Wu 	PIN_BANK_IOMUX_FLAGS(2, 32, "gpio2", 0, 0, 0, 0),
308649c55878SDavid Wu 	PIN_BANK_IOMUX_FLAGS(3, 32, "gpio3", 0, 0, 0, 0),
308749c55878SDavid Wu };
308849c55878SDavid Wu 
308949c55878SDavid Wu static struct rockchip_pin_ctrl rv1108_pin_ctrl = {
309049c55878SDavid Wu 	.pin_banks		= rv1108_pin_banks,
309149c55878SDavid Wu 	.nr_banks		= ARRAY_SIZE(rv1108_pin_banks),
309249c55878SDavid Wu 	.label			= "RV1108-GPIO",
309349c55878SDavid Wu 	.type			= RV1108,
309449c55878SDavid Wu 	.grf_mux_offset		= 0x10,
309549c55878SDavid Wu 	.pmu_mux_offset		= 0x0,
309649c55878SDavid Wu 	.iomux_recalced		= rv1108_mux_recalced_data,
309749c55878SDavid Wu 	.niomux_recalced	= ARRAY_SIZE(rv1108_mux_recalced_data),
309849c55878SDavid Wu 	.pull_calc_reg		= rv1108_calc_pull_reg_and_bit,
309949c55878SDavid Wu 	.drv_calc_reg		= rv1108_calc_drv_reg_and_bit,
310049c55878SDavid Wu 	.schmitt_calc_reg	= rv1108_calc_schmitt_reg_and_bit,
310149c55878SDavid Wu };
310249c55878SDavid Wu 
3103*cf04a17bSJianqun Xu static struct rockchip_pin_bank rv1126_pin_banks[] = {
3104*cf04a17bSJianqun Xu 	PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0",
3105*cf04a17bSJianqun Xu 			     IOMUX_WIDTH_4BIT | IOMUX_SOURCE_PMU,
3106*cf04a17bSJianqun Xu 			     IOMUX_WIDTH_4BIT | IOMUX_SOURCE_PMU,
3107*cf04a17bSJianqun Xu 			     IOMUX_WIDTH_4BIT | IOMUX_L_SOURCE_PMU,
3108*cf04a17bSJianqun Xu 			     IOMUX_WIDTH_4BIT),
3109*cf04a17bSJianqun Xu 	PIN_BANK_IOMUX_FLAGS(1, 32, "gpio1",
3110*cf04a17bSJianqun Xu 			     IOMUX_WIDTH_4BIT,
3111*cf04a17bSJianqun Xu 			     IOMUX_WIDTH_4BIT,
3112*cf04a17bSJianqun Xu 			     IOMUX_WIDTH_4BIT,
3113*cf04a17bSJianqun Xu 			     IOMUX_WIDTH_4BIT),
3114*cf04a17bSJianqun Xu 	PIN_BANK_IOMUX_FLAGS(2, 32, "gpio2",
3115*cf04a17bSJianqun Xu 			     IOMUX_WIDTH_4BIT,
3116*cf04a17bSJianqun Xu 			     IOMUX_WIDTH_4BIT,
3117*cf04a17bSJianqun Xu 			     IOMUX_WIDTH_4BIT,
3118*cf04a17bSJianqun Xu 			     IOMUX_WIDTH_4BIT),
3119*cf04a17bSJianqun Xu 	PIN_BANK_IOMUX_FLAGS(3, 32, "gpio3",
3120*cf04a17bSJianqun Xu 			     IOMUX_WIDTH_4BIT,
3121*cf04a17bSJianqun Xu 			     IOMUX_WIDTH_4BIT,
3122*cf04a17bSJianqun Xu 			     IOMUX_WIDTH_4BIT,
3123*cf04a17bSJianqun Xu 			     IOMUX_WIDTH_4BIT),
3124*cf04a17bSJianqun Xu 	PIN_BANK_IOMUX_FLAGS(4, 2, "gpio4",
3125*cf04a17bSJianqun Xu 			     IOMUX_WIDTH_4BIT, 0, 0, 0),
3126*cf04a17bSJianqun Xu };
3127*cf04a17bSJianqun Xu 
3128*cf04a17bSJianqun Xu static struct rockchip_pin_ctrl rv1126_pin_ctrl = {
3129*cf04a17bSJianqun Xu 	.pin_banks		= rv1126_pin_banks,
3130*cf04a17bSJianqun Xu 	.nr_banks		= ARRAY_SIZE(rv1126_pin_banks),
3131*cf04a17bSJianqun Xu 	.label			= "RV1126-GPIO",
3132*cf04a17bSJianqun Xu 	.type			= RV1126,
3133*cf04a17bSJianqun Xu 	.grf_mux_offset		= 0x10004, /* mux offset from GPIO0_D0 */
3134*cf04a17bSJianqun Xu 	.pmu_mux_offset		= 0x0,
3135*cf04a17bSJianqun Xu 	.iomux_recalced		= rv1126_mux_recalced_data,
3136*cf04a17bSJianqun Xu 	.niomux_recalced	= ARRAY_SIZE(rv1126_mux_recalced_data),
3137*cf04a17bSJianqun Xu 	.pull_calc_reg		= rv1126_calc_pull_reg_and_bit,
3138*cf04a17bSJianqun Xu 	.drv_calc_reg		= rv1126_calc_drv_reg_and_bit,
3139*cf04a17bSJianqun Xu 	.schmitt_calc_reg	= rv1126_calc_schmitt_reg_and_bit,
3140*cf04a17bSJianqun Xu };
3141*cf04a17bSJianqun Xu 
3142a2a3fc8fSJianqun Xu static struct rockchip_pin_bank rk1808_pin_banks[] = {
3143a2a3fc8fSJianqun Xu 	PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0",
3144a2a3fc8fSJianqun Xu 			     IOMUX_SOURCE_PMU,
3145a2a3fc8fSJianqun Xu 			     IOMUX_SOURCE_PMU,
3146a2a3fc8fSJianqun Xu 			     IOMUX_SOURCE_PMU,
3147a2a3fc8fSJianqun Xu 			     IOMUX_SOURCE_PMU),
3148a2a3fc8fSJianqun Xu 	PIN_BANK_IOMUX_FLAGS(1, 32, "gpio1",
3149a2a3fc8fSJianqun Xu 			     IOMUX_WIDTH_4BIT,
3150a2a3fc8fSJianqun Xu 			     IOMUX_WIDTH_4BIT,
3151a2a3fc8fSJianqun Xu 			     IOMUX_WIDTH_4BIT,
3152a2a3fc8fSJianqun Xu 			     IOMUX_WIDTH_4BIT),
3153a2a3fc8fSJianqun Xu 	PIN_BANK_IOMUX_FLAGS(2, 32, "gpio2",
3154a2a3fc8fSJianqun Xu 			     IOMUX_WIDTH_4BIT,
3155a2a3fc8fSJianqun Xu 			     IOMUX_WIDTH_4BIT,
3156a2a3fc8fSJianqun Xu 			     IOMUX_WIDTH_4BIT,
3157a2a3fc8fSJianqun Xu 			     IOMUX_WIDTH_4BIT),
3158a2a3fc8fSJianqun Xu 	PIN_BANK_IOMUX_FLAGS(3, 32, "gpio3",
3159a2a3fc8fSJianqun Xu 			     IOMUX_WIDTH_4BIT,
3160a2a3fc8fSJianqun Xu 			     IOMUX_WIDTH_4BIT,
3161a2a3fc8fSJianqun Xu 			     IOMUX_WIDTH_4BIT,
3162a2a3fc8fSJianqun Xu 			     IOMUX_WIDTH_4BIT),
3163a2a3fc8fSJianqun Xu 	PIN_BANK_IOMUX_FLAGS(4, 32, "gpio4",
3164a2a3fc8fSJianqun Xu 			     IOMUX_WIDTH_4BIT,
3165a2a3fc8fSJianqun Xu 			     IOMUX_WIDTH_4BIT,
3166a2a3fc8fSJianqun Xu 			     IOMUX_WIDTH_4BIT,
3167a2a3fc8fSJianqun Xu 			     IOMUX_WIDTH_4BIT),
3168a2a3fc8fSJianqun Xu };
3169a2a3fc8fSJianqun Xu 
3170a2a3fc8fSJianqun Xu static struct rockchip_pin_ctrl rk1808_pin_ctrl = {
3171a2a3fc8fSJianqun Xu 	.pin_banks		= rk1808_pin_banks,
3172a2a3fc8fSJianqun Xu 	.nr_banks		= ARRAY_SIZE(rk1808_pin_banks),
3173a2a3fc8fSJianqun Xu 	.label			= "RK1808-GPIO",
3174a2a3fc8fSJianqun Xu 	.type			= RK1808,
3175a2a3fc8fSJianqun Xu 	.iomux_routes		= rk1808_mux_route_data,
3176a2a3fc8fSJianqun Xu 	.niomux_routes		= ARRAY_SIZE(rk1808_mux_route_data),
3177a2a3fc8fSJianqun Xu 	.grf_mux_offset		= 0x0,
3178a2a3fc8fSJianqun Xu 	.pmu_mux_offset		= 0x0,
3179a2a3fc8fSJianqun Xu 	.pull_calc_reg		= rk1808_calc_pull_reg_and_bit,
3180a2a3fc8fSJianqun Xu 	.drv_calc_reg		= rk1808_calc_drv_reg_and_bit,
3181a2a3fc8fSJianqun Xu 	.schmitt_calc_reg	= rk1808_calc_schmitt_reg_and_bit,
3182a2a3fc8fSJianqun Xu };
3183a2a3fc8fSJianqun Xu 
318449c55878SDavid Wu static struct rockchip_pin_bank rk2928_pin_banks[] = {
318549c55878SDavid Wu 	PIN_BANK(0, 32, "gpio0"),
318649c55878SDavid Wu 	PIN_BANK(1, 32, "gpio1"),
318749c55878SDavid Wu 	PIN_BANK(2, 32, "gpio2"),
318849c55878SDavid Wu 	PIN_BANK(3, 32, "gpio3"),
318949c55878SDavid Wu };
319049c55878SDavid Wu 
319149c55878SDavid Wu static struct rockchip_pin_ctrl rk2928_pin_ctrl = {
319249c55878SDavid Wu 		.pin_banks		= rk2928_pin_banks,
319349c55878SDavid Wu 		.nr_banks		= ARRAY_SIZE(rk2928_pin_banks),
319449c55878SDavid Wu 		.label			= "RK2928-GPIO",
319549c55878SDavid Wu 		.type			= RK2928,
319649c55878SDavid Wu 		.grf_mux_offset		= 0xa8,
319749c55878SDavid Wu 		.pull_calc_reg		= rk2928_calc_pull_reg_and_bit,
319849c55878SDavid Wu };
319949c55878SDavid Wu 
320049c55878SDavid Wu static struct rockchip_pin_bank rk3036_pin_banks[] = {
320149c55878SDavid Wu 	PIN_BANK(0, 32, "gpio0"),
320249c55878SDavid Wu 	PIN_BANK(1, 32, "gpio1"),
320349c55878SDavid Wu 	PIN_BANK(2, 32, "gpio2"),
320449c55878SDavid Wu };
320549c55878SDavid Wu 
320649c55878SDavid Wu static struct rockchip_pin_ctrl rk3036_pin_ctrl = {
320749c55878SDavid Wu 		.pin_banks		= rk3036_pin_banks,
320849c55878SDavid Wu 		.nr_banks		= ARRAY_SIZE(rk3036_pin_banks),
320949c55878SDavid Wu 		.label			= "RK3036-GPIO",
321049c55878SDavid Wu 		.type			= RK2928,
321149c55878SDavid Wu 		.grf_mux_offset		= 0xa8,
321249c55878SDavid Wu 		.pull_calc_reg		= rk2928_calc_pull_reg_and_bit,
321349c55878SDavid Wu };
321449c55878SDavid Wu 
321549c55878SDavid Wu static struct rockchip_pin_bank rk3066a_pin_banks[] = {
321649c55878SDavid Wu 	PIN_BANK(0, 32, "gpio0"),
321749c55878SDavid Wu 	PIN_BANK(1, 32, "gpio1"),
321849c55878SDavid Wu 	PIN_BANK(2, 32, "gpio2"),
321949c55878SDavid Wu 	PIN_BANK(3, 32, "gpio3"),
322049c55878SDavid Wu 	PIN_BANK(4, 32, "gpio4"),
322149c55878SDavid Wu 	PIN_BANK(6, 16, "gpio6"),
322249c55878SDavid Wu };
322349c55878SDavid Wu 
322449c55878SDavid Wu static struct rockchip_pin_ctrl rk3066a_pin_ctrl = {
322549c55878SDavid Wu 		.pin_banks		= rk3066a_pin_banks,
322649c55878SDavid Wu 		.nr_banks		= ARRAY_SIZE(rk3066a_pin_banks),
322749c55878SDavid Wu 		.label			= "RK3066a-GPIO",
322849c55878SDavid Wu 		.type			= RK2928,
322949c55878SDavid Wu 		.grf_mux_offset		= 0xa8,
323049c55878SDavid Wu 		.pull_calc_reg		= rk2928_calc_pull_reg_and_bit,
323149c55878SDavid Wu };
323249c55878SDavid Wu 
323349c55878SDavid Wu static struct rockchip_pin_bank rk3066b_pin_banks[] = {
323449c55878SDavid Wu 	PIN_BANK(0, 32, "gpio0"),
323549c55878SDavid Wu 	PIN_BANK(1, 32, "gpio1"),
323649c55878SDavid Wu 	PIN_BANK(2, 32, "gpio2"),
323749c55878SDavid Wu 	PIN_BANK(3, 32, "gpio3"),
323849c55878SDavid Wu };
323949c55878SDavid Wu 
324049c55878SDavid Wu static struct rockchip_pin_ctrl rk3066b_pin_ctrl = {
324149c55878SDavid Wu 		.pin_banks	= rk3066b_pin_banks,
324249c55878SDavid Wu 		.nr_banks	= ARRAY_SIZE(rk3066b_pin_banks),
324349c55878SDavid Wu 		.label		= "RK3066b-GPIO",
324449c55878SDavid Wu 		.type		= RK3066B,
324549c55878SDavid Wu 		.grf_mux_offset	= 0x60,
324649c55878SDavid Wu };
324749c55878SDavid Wu 
324849c55878SDavid Wu static struct rockchip_pin_bank rk3128_pin_banks[] = {
324949c55878SDavid Wu 	PIN_BANK(0, 32, "gpio0"),
325049c55878SDavid Wu 	PIN_BANK(1, 32, "gpio1"),
325149c55878SDavid Wu 	PIN_BANK(2, 32, "gpio2"),
325249c55878SDavid Wu 	PIN_BANK(3, 32, "gpio3"),
325349c55878SDavid Wu };
325449c55878SDavid Wu 
325549c55878SDavid Wu static struct rockchip_pin_ctrl rk3128_pin_ctrl = {
325649c55878SDavid Wu 		.pin_banks		= rk3128_pin_banks,
325749c55878SDavid Wu 		.nr_banks		= ARRAY_SIZE(rk3128_pin_banks),
325849c55878SDavid Wu 		.label			= "RK3128-GPIO",
325949c55878SDavid Wu 		.type			= RK3128,
326049c55878SDavid Wu 		.grf_mux_offset		= 0xa8,
326149c55878SDavid Wu 		.iomux_recalced		= rk3128_mux_recalced_data,
326249c55878SDavid Wu 		.niomux_recalced	= ARRAY_SIZE(rk3128_mux_recalced_data),
326349c55878SDavid Wu 		.iomux_routes		= rk3128_mux_route_data,
326449c55878SDavid Wu 		.niomux_routes		= ARRAY_SIZE(rk3128_mux_route_data),
326549c55878SDavid Wu 		.pull_calc_reg		= rk3128_calc_pull_reg_and_bit,
326649c55878SDavid Wu };
326749c55878SDavid Wu 
326849c55878SDavid Wu static struct rockchip_pin_bank rk3188_pin_banks[] = {
326949c55878SDavid Wu 	PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0", IOMUX_GPIO_ONLY, 0, 0, 0),
327049c55878SDavid Wu 	PIN_BANK(1, 32, "gpio1"),
327149c55878SDavid Wu 	PIN_BANK(2, 32, "gpio2"),
327249c55878SDavid Wu 	PIN_BANK(3, 32, "gpio3"),
327349c55878SDavid Wu };
327449c55878SDavid Wu 
327549c55878SDavid Wu static struct rockchip_pin_ctrl rk3188_pin_ctrl = {
327649c55878SDavid Wu 		.pin_banks		= rk3188_pin_banks,
327749c55878SDavid Wu 		.nr_banks		= ARRAY_SIZE(rk3188_pin_banks),
327849c55878SDavid Wu 		.label			= "RK3188-GPIO",
327949c55878SDavid Wu 		.type			= RK3188,
328049c55878SDavid Wu 		.grf_mux_offset		= 0x60,
328149c55878SDavid Wu 		.pull_calc_reg		= rk3188_calc_pull_reg_and_bit,
328249c55878SDavid Wu };
328349c55878SDavid Wu 
328449c55878SDavid Wu static struct rockchip_pin_bank rk3228_pin_banks[] = {
328549c55878SDavid Wu 	PIN_BANK(0, 32, "gpio0"),
328649c55878SDavid Wu 	PIN_BANK(1, 32, "gpio1"),
328749c55878SDavid Wu 	PIN_BANK(2, 32, "gpio2"),
328849c55878SDavid Wu 	PIN_BANK(3, 32, "gpio3"),
328949c55878SDavid Wu };
329049c55878SDavid Wu 
329149c55878SDavid Wu static struct rockchip_pin_ctrl rk3228_pin_ctrl = {
329249c55878SDavid Wu 		.pin_banks		= rk3228_pin_banks,
329349c55878SDavid Wu 		.nr_banks		= ARRAY_SIZE(rk3228_pin_banks),
329449c55878SDavid Wu 		.label			= "RK3228-GPIO",
329549c55878SDavid Wu 		.type			= RK3288,
329649c55878SDavid Wu 		.grf_mux_offset		= 0x0,
329749c55878SDavid Wu 		.iomux_routes		= rk3228_mux_route_data,
329849c55878SDavid Wu 		.niomux_routes		= ARRAY_SIZE(rk3228_mux_route_data),
329949c55878SDavid Wu 		.pull_calc_reg		= rk3228_calc_pull_reg_and_bit,
330049c55878SDavid Wu 		.drv_calc_reg		= rk3228_calc_drv_reg_and_bit,
330149c55878SDavid Wu };
330249c55878SDavid Wu 
330349c55878SDavid Wu static struct rockchip_pin_bank rk3288_pin_banks[] = {
330455a89bc6SDavid Wu 	PIN_BANK_IOMUX_DRV_PULL_FLAGS(0, 24, "gpio0",
33054bafc2daSDavid Wu 				      IOMUX_SOURCE_PMU | IOMUX_WRITABLE_32BIT,
33064bafc2daSDavid Wu 				      IOMUX_SOURCE_PMU | IOMUX_WRITABLE_32BIT,
330755a89bc6SDavid Wu 				      IOMUX_SOURCE_PMU | IOMUX_WRITABLE_32BIT,
330855a89bc6SDavid Wu 				      IOMUX_UNROUTED,
330955a89bc6SDavid Wu 				      DRV_TYPE_WRITABLE_32BIT,
331055a89bc6SDavid Wu 				      DRV_TYPE_WRITABLE_32BIT,
331155a89bc6SDavid Wu 				      DRV_TYPE_WRITABLE_32BIT,
331255a89bc6SDavid Wu 				      0,
331355a89bc6SDavid Wu 				      PULL_TYPE_WRITABLE_32BIT,
331455a89bc6SDavid Wu 				      PULL_TYPE_WRITABLE_32BIT,
331555a89bc6SDavid Wu 				      PULL_TYPE_WRITABLE_32BIT,
331655a89bc6SDavid Wu 				      0
331749c55878SDavid Wu 			    ),
331849c55878SDavid Wu 	PIN_BANK_IOMUX_FLAGS(1, 32, "gpio1", IOMUX_UNROUTED,
331949c55878SDavid Wu 					     IOMUX_UNROUTED,
332049c55878SDavid Wu 					     IOMUX_UNROUTED,
332149c55878SDavid Wu 					     0
332249c55878SDavid Wu 			    ),
332349c55878SDavid Wu 	PIN_BANK_IOMUX_FLAGS(2, 32, "gpio2", 0, 0, 0, IOMUX_UNROUTED),
332449c55878SDavid Wu 	PIN_BANK_IOMUX_FLAGS(3, 32, "gpio3", 0, 0, 0, IOMUX_WIDTH_4BIT),
332549c55878SDavid Wu 	PIN_BANK_IOMUX_FLAGS(4, 32, "gpio4", IOMUX_WIDTH_4BIT,
332649c55878SDavid Wu 					     IOMUX_WIDTH_4BIT,
332749c55878SDavid Wu 					     0,
332849c55878SDavid Wu 					     0
332949c55878SDavid Wu 			    ),
333049c55878SDavid Wu 	PIN_BANK_IOMUX_FLAGS(5, 32, "gpio5", IOMUX_UNROUTED,
333149c55878SDavid Wu 					     0,
333249c55878SDavid Wu 					     0,
333349c55878SDavid Wu 					     IOMUX_UNROUTED
333449c55878SDavid Wu 			    ),
333549c55878SDavid Wu 	PIN_BANK_IOMUX_FLAGS(6, 32, "gpio6", 0, 0, 0, IOMUX_UNROUTED),
333649c55878SDavid Wu 	PIN_BANK_IOMUX_FLAGS(7, 32, "gpio7", 0,
333749c55878SDavid Wu 					     0,
333849c55878SDavid Wu 					     IOMUX_WIDTH_4BIT,
333949c55878SDavid Wu 					     IOMUX_UNROUTED
334049c55878SDavid Wu 			    ),
334149c55878SDavid Wu 	PIN_BANK(8, 16, "gpio8"),
334249c55878SDavid Wu };
334349c55878SDavid Wu 
334449c55878SDavid Wu static struct rockchip_pin_ctrl rk3288_pin_ctrl = {
334549c55878SDavid Wu 		.pin_banks		= rk3288_pin_banks,
334649c55878SDavid Wu 		.nr_banks		= ARRAY_SIZE(rk3288_pin_banks),
334749c55878SDavid Wu 		.label			= "RK3288-GPIO",
334849c55878SDavid Wu 		.type			= RK3288,
334949c55878SDavid Wu 		.grf_mux_offset		= 0x0,
335049c55878SDavid Wu 		.pmu_mux_offset		= 0x84,
335149c55878SDavid Wu 		.iomux_routes		= rk3288_mux_route_data,
335249c55878SDavid Wu 		.niomux_routes		= ARRAY_SIZE(rk3288_mux_route_data),
335349c55878SDavid Wu 		.pull_calc_reg		= rk3288_calc_pull_reg_and_bit,
335449c55878SDavid Wu 		.drv_calc_reg		= rk3288_calc_drv_reg_and_bit,
335549c55878SDavid Wu };
335649c55878SDavid Wu 
3357b3077611SDavid Wu static struct rockchip_pin_bank rk3308_pin_banks[] = {
3358b3077611SDavid Wu 	PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0", IOMUX_8WIDTH_2BIT,
3359b3077611SDavid Wu 					     IOMUX_8WIDTH_2BIT,
3360b3077611SDavid Wu 					     IOMUX_8WIDTH_2BIT,
3361b3077611SDavid Wu 					     IOMUX_8WIDTH_2BIT),
3362b3077611SDavid Wu 	PIN_BANK_IOMUX_FLAGS(1, 32, "gpio1", IOMUX_8WIDTH_2BIT,
3363b3077611SDavid Wu 					     IOMUX_8WIDTH_2BIT,
3364b3077611SDavid Wu 					     IOMUX_8WIDTH_2BIT,
3365b3077611SDavid Wu 					     IOMUX_8WIDTH_2BIT),
3366b3077611SDavid Wu 	PIN_BANK_IOMUX_FLAGS(2, 32, "gpio2", IOMUX_8WIDTH_2BIT,
3367b3077611SDavid Wu 					     IOMUX_8WIDTH_2BIT,
3368b3077611SDavid Wu 					     IOMUX_8WIDTH_2BIT,
3369b3077611SDavid Wu 					     IOMUX_8WIDTH_2BIT),
3370b3077611SDavid Wu 	PIN_BANK_IOMUX_FLAGS(3, 32, "gpio3", IOMUX_8WIDTH_2BIT,
3371b3077611SDavid Wu 					     IOMUX_8WIDTH_2BIT,
3372b3077611SDavid Wu 					     IOMUX_8WIDTH_2BIT,
3373b3077611SDavid Wu 					     IOMUX_8WIDTH_2BIT),
3374b3077611SDavid Wu 	PIN_BANK_IOMUX_FLAGS(4, 32, "gpio4", IOMUX_8WIDTH_2BIT,
3375b3077611SDavid Wu 					     IOMUX_8WIDTH_2BIT,
3376b3077611SDavid Wu 					     IOMUX_8WIDTH_2BIT,
3377b3077611SDavid Wu 					     IOMUX_8WIDTH_2BIT),
3378b3077611SDavid Wu };
3379b3077611SDavid Wu 
3380b3077611SDavid Wu static struct rockchip_pin_ctrl rk3308_pin_ctrl = {
3381b3077611SDavid Wu 		.pin_banks		= rk3308_pin_banks,
3382b3077611SDavid Wu 		.nr_banks		= ARRAY_SIZE(rk3308_pin_banks),
3383b3077611SDavid Wu 		.label			= "RK3308-GPIO",
3384b3077611SDavid Wu 		.type			= RK3308,
3385b3077611SDavid Wu 		.grf_mux_offset		= 0x0,
3386b3077611SDavid Wu 		.iomux_recalced		= rk3308_mux_recalced_data,
3387b3077611SDavid Wu 		.niomux_recalced	= ARRAY_SIZE(rk3308_mux_recalced_data),
3388b3077611SDavid Wu 		.iomux_routes		= rk3308_mux_route_data,
3389b3077611SDavid Wu 		.niomux_routes		= ARRAY_SIZE(rk3308_mux_route_data),
3390d5517017SDavid Wu 		.ctrl_data_re_init	= rk3308b_ctrl_data_re_init,
3391d5517017SDavid Wu 		.soc_data_init		= rk3308b_soc_data_init,
3392b3077611SDavid Wu 		.pull_calc_reg		= rk3308_calc_pull_reg_and_bit,
3393b3077611SDavid Wu 		.drv_calc_reg		= rk3308_calc_drv_reg_and_bit,
3394b3077611SDavid Wu 		.schmitt_calc_reg	= rk3308_calc_schmitt_reg_and_bit,
3395b3077611SDavid Wu };
3396b3077611SDavid Wu 
339749c55878SDavid Wu static struct rockchip_pin_bank rk3328_pin_banks[] = {
339849c55878SDavid Wu 	PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0", 0, 0, 0, 0),
339949c55878SDavid Wu 	PIN_BANK_IOMUX_FLAGS(1, 32, "gpio1", 0, 0, 0, 0),
340049c55878SDavid Wu 	PIN_BANK_IOMUX_FLAGS(2, 32, "gpio2", 0,
340149c55878SDavid Wu 			     IOMUX_WIDTH_3BIT,
340249c55878SDavid Wu 			     IOMUX_WIDTH_3BIT,
340349c55878SDavid Wu 			     0),
340449c55878SDavid Wu 	PIN_BANK_IOMUX_FLAGS(3, 32, "gpio3",
340549c55878SDavid Wu 			     IOMUX_WIDTH_3BIT,
340649c55878SDavid Wu 			     IOMUX_WIDTH_3BIT,
340749c55878SDavid Wu 			     0,
340849c55878SDavid Wu 			     0),
340949c55878SDavid Wu };
341049c55878SDavid Wu 
341149c55878SDavid Wu static struct rockchip_pin_ctrl rk3328_pin_ctrl = {
341249c55878SDavid Wu 		.pin_banks		= rk3328_pin_banks,
341349c55878SDavid Wu 		.nr_banks		= ARRAY_SIZE(rk3328_pin_banks),
341449c55878SDavid Wu 		.label			= "RK3328-GPIO",
341549c55878SDavid Wu 		.type			= RK3288,
341649c55878SDavid Wu 		.grf_mux_offset		= 0x0,
341749c55878SDavid Wu 		.iomux_recalced		= rk3328_mux_recalced_data,
341849c55878SDavid Wu 		.niomux_recalced	= ARRAY_SIZE(rk3328_mux_recalced_data),
341949c55878SDavid Wu 		.iomux_routes		= rk3328_mux_route_data,
342049c55878SDavid Wu 		.niomux_routes		= ARRAY_SIZE(rk3328_mux_route_data),
342149c55878SDavid Wu 		.pull_calc_reg		= rk3228_calc_pull_reg_and_bit,
342249c55878SDavid Wu 		.drv_calc_reg		= rk3228_calc_drv_reg_and_bit,
342349c55878SDavid Wu 		.schmitt_calc_reg	= rk3328_calc_schmitt_reg_and_bit,
342449c55878SDavid Wu };
342549c55878SDavid Wu 
342649c55878SDavid Wu static struct rockchip_pin_bank rk3368_pin_banks[] = {
342749c55878SDavid Wu 	PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0", IOMUX_SOURCE_PMU,
342849c55878SDavid Wu 					     IOMUX_SOURCE_PMU,
342949c55878SDavid Wu 					     IOMUX_SOURCE_PMU,
343049c55878SDavid Wu 					     IOMUX_SOURCE_PMU
343149c55878SDavid Wu 			    ),
343249c55878SDavid Wu 	PIN_BANK(1, 32, "gpio1"),
343349c55878SDavid Wu 	PIN_BANK(2, 32, "gpio2"),
343449c55878SDavid Wu 	PIN_BANK(3, 32, "gpio3"),
343549c55878SDavid Wu };
343649c55878SDavid Wu 
343749c55878SDavid Wu static struct rockchip_pin_ctrl rk3368_pin_ctrl = {
343849c55878SDavid Wu 		.pin_banks		= rk3368_pin_banks,
343949c55878SDavid Wu 		.nr_banks		= ARRAY_SIZE(rk3368_pin_banks),
344049c55878SDavid Wu 		.label			= "RK3368-GPIO",
344149c55878SDavid Wu 		.type			= RK3368,
344249c55878SDavid Wu 		.grf_mux_offset		= 0x0,
344349c55878SDavid Wu 		.pmu_mux_offset		= 0x0,
344449c55878SDavid Wu 		.pull_calc_reg		= rk3368_calc_pull_reg_and_bit,
344549c55878SDavid Wu 		.drv_calc_reg		= rk3368_calc_drv_reg_and_bit,
344649c55878SDavid Wu };
344749c55878SDavid Wu 
344849c55878SDavid Wu static struct rockchip_pin_bank rk3399_pin_banks[] = {
344949c55878SDavid Wu 	PIN_BANK_IOMUX_FLAGS_DRV_FLAGS_OFFSET_PULL_FLAGS(0, 32, "gpio0",
345049c55878SDavid Wu 							 IOMUX_SOURCE_PMU,
345149c55878SDavid Wu 							 IOMUX_SOURCE_PMU,
345249c55878SDavid Wu 							 IOMUX_SOURCE_PMU,
345349c55878SDavid Wu 							 IOMUX_SOURCE_PMU,
345449c55878SDavid Wu 							 DRV_TYPE_IO_1V8_ONLY,
345549c55878SDavid Wu 							 DRV_TYPE_IO_1V8_ONLY,
345649c55878SDavid Wu 							 DRV_TYPE_IO_DEFAULT,
345749c55878SDavid Wu 							 DRV_TYPE_IO_DEFAULT,
345849c55878SDavid Wu 							 0x80,
345949c55878SDavid Wu 							 0x88,
346049c55878SDavid Wu 							 -1,
346149c55878SDavid Wu 							 -1,
346249c55878SDavid Wu 							 PULL_TYPE_IO_1V8_ONLY,
346349c55878SDavid Wu 							 PULL_TYPE_IO_1V8_ONLY,
346449c55878SDavid Wu 							 PULL_TYPE_IO_DEFAULT,
346549c55878SDavid Wu 							 PULL_TYPE_IO_DEFAULT
346649c55878SDavid Wu 							),
346749c55878SDavid Wu 	PIN_BANK_IOMUX_DRV_FLAGS_OFFSET(1, 32, "gpio1", IOMUX_SOURCE_PMU,
346849c55878SDavid Wu 					IOMUX_SOURCE_PMU,
346949c55878SDavid Wu 					IOMUX_SOURCE_PMU,
347049c55878SDavid Wu 					IOMUX_SOURCE_PMU,
347149c55878SDavid Wu 					DRV_TYPE_IO_1V8_OR_3V0,
347249c55878SDavid Wu 					DRV_TYPE_IO_1V8_OR_3V0,
347349c55878SDavid Wu 					DRV_TYPE_IO_1V8_OR_3V0,
347449c55878SDavid Wu 					DRV_TYPE_IO_1V8_OR_3V0,
347549c55878SDavid Wu 					0xa0,
347649c55878SDavid Wu 					0xa8,
347749c55878SDavid Wu 					0xb0,
347849c55878SDavid Wu 					0xb8
347949c55878SDavid Wu 					),
348049c55878SDavid Wu 	PIN_BANK_DRV_FLAGS_PULL_FLAGS(2, 32, "gpio2", DRV_TYPE_IO_1V8_OR_3V0,
348149c55878SDavid Wu 				      DRV_TYPE_IO_1V8_OR_3V0,
348249c55878SDavid Wu 				      DRV_TYPE_IO_1V8_ONLY,
348349c55878SDavid Wu 				      DRV_TYPE_IO_1V8_ONLY,
348449c55878SDavid Wu 				      PULL_TYPE_IO_DEFAULT,
348549c55878SDavid Wu 				      PULL_TYPE_IO_DEFAULT,
348649c55878SDavid Wu 				      PULL_TYPE_IO_1V8_ONLY,
348749c55878SDavid Wu 				      PULL_TYPE_IO_1V8_ONLY
348849c55878SDavid Wu 				      ),
348949c55878SDavid Wu 	PIN_BANK_DRV_FLAGS(3, 32, "gpio3", DRV_TYPE_IO_3V3_ONLY,
349049c55878SDavid Wu 			   DRV_TYPE_IO_3V3_ONLY,
349149c55878SDavid Wu 			   DRV_TYPE_IO_3V3_ONLY,
349249c55878SDavid Wu 			   DRV_TYPE_IO_1V8_OR_3V0
349349c55878SDavid Wu 			   ),
349449c55878SDavid Wu 	PIN_BANK_DRV_FLAGS(4, 32, "gpio4", DRV_TYPE_IO_1V8_OR_3V0,
349549c55878SDavid Wu 			   DRV_TYPE_IO_1V8_3V0_AUTO,
349649c55878SDavid Wu 			   DRV_TYPE_IO_1V8_OR_3V0,
349749c55878SDavid Wu 			   DRV_TYPE_IO_1V8_OR_3V0
349849c55878SDavid Wu 			   ),
349949c55878SDavid Wu };
350049c55878SDavid Wu 
350149c55878SDavid Wu static struct rockchip_pin_ctrl rk3399_pin_ctrl = {
350249c55878SDavid Wu 		.pin_banks		= rk3399_pin_banks,
350349c55878SDavid Wu 		.nr_banks		= ARRAY_SIZE(rk3399_pin_banks),
350449c55878SDavid Wu 		.label			= "RK3399-GPIO",
350549c55878SDavid Wu 		.type			= RK3399,
350649c55878SDavid Wu 		.grf_mux_offset		= 0xe000,
350749c55878SDavid Wu 		.pmu_mux_offset		= 0x0,
350849c55878SDavid Wu 		.grf_drv_offset		= 0xe100,
350949c55878SDavid Wu 		.pmu_drv_offset		= 0x80,
351049c55878SDavid Wu 		.iomux_routes		= rk3399_mux_route_data,
351149c55878SDavid Wu 		.niomux_routes		= ARRAY_SIZE(rk3399_mux_route_data),
351249c55878SDavid Wu 		.pull_calc_reg		= rk3399_calc_pull_reg_and_bit,
351349c55878SDavid Wu 		.drv_calc_reg		= rk3399_calc_drv_reg_and_bit,
351449c55878SDavid Wu };
351549c55878SDavid Wu 
351649c55878SDavid Wu static const struct udevice_id rockchip_pinctrl_dt_match[] = {
351749c55878SDavid Wu 	{ .compatible = "rockchip,px30-pinctrl",
351849c55878SDavid Wu 		.data = (ulong)&px30_pin_ctrl },
351949c55878SDavid Wu 	{ .compatible = "rockchip,rv1108-pinctrl",
352049c55878SDavid Wu 		.data = (ulong)&rv1108_pin_ctrl },
3521*cf04a17bSJianqun Xu 	{ .compatible = "rockchip,rv1126-pinctrl",
3522*cf04a17bSJianqun Xu 		.data = (ulong)&rv1126_pin_ctrl },
3523a2a3fc8fSJianqun Xu 	{ .compatible = "rockchip,rk1808-pinctrl",
3524a2a3fc8fSJianqun Xu 		.data = (ulong)&rk1808_pin_ctrl },
352549c55878SDavid Wu 	{ .compatible = "rockchip,rk2928-pinctrl",
352649c55878SDavid Wu 		.data = (ulong)&rk2928_pin_ctrl },
352749c55878SDavid Wu 	{ .compatible = "rockchip,rk3036-pinctrl",
352849c55878SDavid Wu 		.data = (ulong)&rk3036_pin_ctrl },
352949c55878SDavid Wu 	{ .compatible = "rockchip,rk3066a-pinctrl",
353049c55878SDavid Wu 		.data = (ulong)&rk3066a_pin_ctrl },
353149c55878SDavid Wu 	{ .compatible = "rockchip,rk3066b-pinctrl",
353249c55878SDavid Wu 		.data = (ulong)&rk3066b_pin_ctrl },
353349c55878SDavid Wu 	{ .compatible = "rockchip,rk3128-pinctrl",
353449c55878SDavid Wu 		.data = (ulong)&rk3128_pin_ctrl },
353549c55878SDavid Wu 	{ .compatible = "rockchip,rk3188-pinctrl",
353649c55878SDavid Wu 		.data = (ulong)&rk3188_pin_ctrl },
353749c55878SDavid Wu 	{ .compatible = "rockchip,rk3228-pinctrl",
353849c55878SDavid Wu 		.data = (ulong)&rk3228_pin_ctrl },
353949c55878SDavid Wu 	{ .compatible = "rockchip,rk3288-pinctrl",
354049c55878SDavid Wu 		.data = (ulong)&rk3288_pin_ctrl },
3541b3077611SDavid Wu 	{ .compatible = "rockchip,rk3308-pinctrl",
3542b3077611SDavid Wu 		.data = (ulong)&rk3308_pin_ctrl },
354349c55878SDavid Wu 	{ .compatible = "rockchip,rk3328-pinctrl",
354449c55878SDavid Wu 		.data = (ulong)&rk3328_pin_ctrl },
354549c55878SDavid Wu 	{ .compatible = "rockchip,rk3368-pinctrl",
354649c55878SDavid Wu 		.data = (ulong)&rk3368_pin_ctrl },
354749c55878SDavid Wu 	{ .compatible = "rockchip,rk3399-pinctrl",
354849c55878SDavid Wu 		.data = (ulong)&rk3399_pin_ctrl },
354949c55878SDavid Wu 	{},
355049c55878SDavid Wu };
355149c55878SDavid Wu 
355249c55878SDavid Wu U_BOOT_DRIVER(pinctrl_rockchip) = {
355349c55878SDavid Wu 	.name		= "rockchip_pinctrl",
355449c55878SDavid Wu 	.id		= UCLASS_PINCTRL,
355549c55878SDavid Wu 	.of_match	= rockchip_pinctrl_dt_match,
355649c55878SDavid Wu 	.priv_auto_alloc_size = sizeof(struct rockchip_pinctrl_priv),
355749c55878SDavid Wu 	.ops		= &rockchip_pinctrl_ops,
355849c55878SDavid Wu #if !CONFIG_IS_ENABLED(OF_PLATDATA)
355949c55878SDavid Wu 	.bind		= dm_scan_fdt_dev,
356049c55878SDavid Wu #endif
356149c55878SDavid Wu 	.probe		= rockchip_pinctrl_probe,
356249c55878SDavid Wu };
3563