162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Copyright (c) 2014 MediaTek Inc.
462306a36Sopenharmony_ci * Author: Hongzhou.Yang <hongzhou.yang@mediatek.com>
562306a36Sopenharmony_ci */
662306a36Sopenharmony_ci
762306a36Sopenharmony_ci#include <linux/init.h>
862306a36Sopenharmony_ci#include <linux/platform_device.h>
962306a36Sopenharmony_ci#include <linux/of.h>
1062306a36Sopenharmony_ci#include <linux/pinctrl/pinctrl.h>
1162306a36Sopenharmony_ci#include <linux/regmap.h>
1262306a36Sopenharmony_ci#include <dt-bindings/pinctrl/mt65xx.h>
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_ci#include "pinctrl-mtk-common.h"
1562306a36Sopenharmony_ci#include "pinctrl-mtk-mt8135.h"
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_ci#define DRV_BASE1				0x500
1862306a36Sopenharmony_ci#define DRV_BASE2				0x510
1962306a36Sopenharmony_ci#define PUPD_BASE1				0x400
2062306a36Sopenharmony_ci#define PUPD_BASE2				0x450
2162306a36Sopenharmony_ci#define R0_BASE1				0x4d0
2262306a36Sopenharmony_ci#define R1_BASE1				0x200
2362306a36Sopenharmony_ci#define R1_BASE2				0x250
2462306a36Sopenharmony_ci
2562306a36Sopenharmony_cistruct mtk_spec_pull_set {
2662306a36Sopenharmony_ci	unsigned char pin;
2762306a36Sopenharmony_ci	unsigned char pupd_bit;
2862306a36Sopenharmony_ci	unsigned short pupd_offset;
2962306a36Sopenharmony_ci	unsigned short r0_offset;
3062306a36Sopenharmony_ci	unsigned short r1_offset;
3162306a36Sopenharmony_ci	unsigned char r0_bit;
3262306a36Sopenharmony_ci	unsigned char r1_bit;
3362306a36Sopenharmony_ci};
3462306a36Sopenharmony_ci
3562306a36Sopenharmony_ci#define SPEC_PULL(_pin, _pupd_offset, _pupd_bit, _r0_offset, \
3662306a36Sopenharmony_ci	_r0_bit, _r1_offset, _r1_bit)	\
3762306a36Sopenharmony_ci	{	\
3862306a36Sopenharmony_ci		.pin = _pin,	\
3962306a36Sopenharmony_ci		.pupd_offset = _pupd_offset,	\
4062306a36Sopenharmony_ci		.pupd_bit = _pupd_bit,	\
4162306a36Sopenharmony_ci		.r0_offset = _r0_offset, \
4262306a36Sopenharmony_ci		.r0_bit = _r0_bit, \
4362306a36Sopenharmony_ci		.r1_offset = _r1_offset, \
4462306a36Sopenharmony_ci		.r1_bit = _r1_bit, \
4562306a36Sopenharmony_ci	}
4662306a36Sopenharmony_ci
4762306a36Sopenharmony_cistatic const struct mtk_drv_group_desc mt8135_drv_grp[] =  {
4862306a36Sopenharmony_ci	/* E8E4E2 2/4/6/8/10/12/14/16 */
4962306a36Sopenharmony_ci	MTK_DRV_GRP(2, 16, 0, 2, 2),
5062306a36Sopenharmony_ci	/* E8E4  4/8/12/16 */
5162306a36Sopenharmony_ci	MTK_DRV_GRP(4, 16, 1, 2, 4),
5262306a36Sopenharmony_ci	/* E4E2  2/4/6/8 */
5362306a36Sopenharmony_ci	MTK_DRV_GRP(2, 8, 0, 1, 2),
5462306a36Sopenharmony_ci	/* E16E8E4 4/8/12/16/20/24/28/32 */
5562306a36Sopenharmony_ci	MTK_DRV_GRP(4, 32, 0, 2, 4)
5662306a36Sopenharmony_ci};
5762306a36Sopenharmony_ci
5862306a36Sopenharmony_cistatic const struct mtk_pin_drv_grp mt8135_pin_drv[] = {
5962306a36Sopenharmony_ci	MTK_PIN_DRV_GRP(0, DRV_BASE1, 0, 0),
6062306a36Sopenharmony_ci	MTK_PIN_DRV_GRP(1, DRV_BASE1, 0, 0),
6162306a36Sopenharmony_ci	MTK_PIN_DRV_GRP(2, DRV_BASE1, 0, 0),
6262306a36Sopenharmony_ci	MTK_PIN_DRV_GRP(3, DRV_BASE1, 0, 0),
6362306a36Sopenharmony_ci	MTK_PIN_DRV_GRP(4, DRV_BASE1, 4, 0),
6462306a36Sopenharmony_ci	MTK_PIN_DRV_GRP(5, DRV_BASE1, 8, 0),
6562306a36Sopenharmony_ci	MTK_PIN_DRV_GRP(6, DRV_BASE1, 0, 0),
6662306a36Sopenharmony_ci	MTK_PIN_DRV_GRP(7, DRV_BASE1, 0, 0),
6762306a36Sopenharmony_ci	MTK_PIN_DRV_GRP(8, DRV_BASE1, 0, 0),
6862306a36Sopenharmony_ci	MTK_PIN_DRV_GRP(9, DRV_BASE1, 0, 0),
6962306a36Sopenharmony_ci
7062306a36Sopenharmony_ci	MTK_PIN_DRV_GRP(10, DRV_BASE1, 12, 1),
7162306a36Sopenharmony_ci	MTK_PIN_DRV_GRP(11, DRV_BASE1, 12, 1),
7262306a36Sopenharmony_ci	MTK_PIN_DRV_GRP(12, DRV_BASE1, 12, 1),
7362306a36Sopenharmony_ci	MTK_PIN_DRV_GRP(13, DRV_BASE1, 12, 1),
7462306a36Sopenharmony_ci	MTK_PIN_DRV_GRP(14, DRV_BASE1, 12, 1),
7562306a36Sopenharmony_ci	MTK_PIN_DRV_GRP(15, DRV_BASE1, 12, 1),
7662306a36Sopenharmony_ci	MTK_PIN_DRV_GRP(16, DRV_BASE1, 12, 1),
7762306a36Sopenharmony_ci	MTK_PIN_DRV_GRP(17, DRV_BASE1, 16, 1),
7862306a36Sopenharmony_ci	MTK_PIN_DRV_GRP(18, DRV_BASE1, 16, 1),
7962306a36Sopenharmony_ci	MTK_PIN_DRV_GRP(19, DRV_BASE1, 16, 1),
8062306a36Sopenharmony_ci	MTK_PIN_DRV_GRP(20, DRV_BASE1, 16, 1),
8162306a36Sopenharmony_ci	MTK_PIN_DRV_GRP(21, DRV_BASE1, 16, 1),
8262306a36Sopenharmony_ci	MTK_PIN_DRV_GRP(22, DRV_BASE1, 16, 1),
8362306a36Sopenharmony_ci	MTK_PIN_DRV_GRP(23, DRV_BASE1, 16, 1),
8462306a36Sopenharmony_ci	MTK_PIN_DRV_GRP(24, DRV_BASE1, 16, 1),
8562306a36Sopenharmony_ci	MTK_PIN_DRV_GRP(33, DRV_BASE1, 24, 1),
8662306a36Sopenharmony_ci	MTK_PIN_DRV_GRP(34, DRV_BASE2, 12, 2),
8762306a36Sopenharmony_ci	MTK_PIN_DRV_GRP(37, DRV_BASE2, 20, 1),
8862306a36Sopenharmony_ci	MTK_PIN_DRV_GRP(38, DRV_BASE2, 20, 1),
8962306a36Sopenharmony_ci	MTK_PIN_DRV_GRP(39, DRV_BASE2, 20, 1),
9062306a36Sopenharmony_ci	MTK_PIN_DRV_GRP(40, DRV_BASE2, 24, 1),
9162306a36Sopenharmony_ci	MTK_PIN_DRV_GRP(41, DRV_BASE2, 24, 1),
9262306a36Sopenharmony_ci	MTK_PIN_DRV_GRP(42, DRV_BASE2, 24, 1),
9362306a36Sopenharmony_ci	MTK_PIN_DRV_GRP(43, DRV_BASE2, 28, 1),
9462306a36Sopenharmony_ci	MTK_PIN_DRV_GRP(44, DRV_BASE2, 28, 1),
9562306a36Sopenharmony_ci	MTK_PIN_DRV_GRP(45, DRV_BASE2, 28, 1),
9662306a36Sopenharmony_ci	MTK_PIN_DRV_GRP(46, DRV_BASE2, 28, 1),
9762306a36Sopenharmony_ci	MTK_PIN_DRV_GRP(47, DRV_BASE2, 28, 1),
9862306a36Sopenharmony_ci
9962306a36Sopenharmony_ci	MTK_PIN_DRV_GRP(49, DRV_BASE2+0x10, 0, 1),
10062306a36Sopenharmony_ci	MTK_PIN_DRV_GRP(50, DRV_BASE2+0x10, 4, 1),
10162306a36Sopenharmony_ci	MTK_PIN_DRV_GRP(51, DRV_BASE2+0x10, 8, 1),
10262306a36Sopenharmony_ci	MTK_PIN_DRV_GRP(52, DRV_BASE2+0x10, 12, 2),
10362306a36Sopenharmony_ci	MTK_PIN_DRV_GRP(53, DRV_BASE2+0x10, 16, 1),
10462306a36Sopenharmony_ci	MTK_PIN_DRV_GRP(54, DRV_BASE2+0x10, 20, 1),
10562306a36Sopenharmony_ci	MTK_PIN_DRV_GRP(55, DRV_BASE2+0x10, 24, 1),
10662306a36Sopenharmony_ci	MTK_PIN_DRV_GRP(56, DRV_BASE2+0x10, 28, 1),
10762306a36Sopenharmony_ci
10862306a36Sopenharmony_ci	MTK_PIN_DRV_GRP(57, DRV_BASE2+0x20, 0, 1),
10962306a36Sopenharmony_ci	MTK_PIN_DRV_GRP(58, DRV_BASE2+0x20, 0, 1),
11062306a36Sopenharmony_ci	MTK_PIN_DRV_GRP(59, DRV_BASE2+0x20, 0, 1),
11162306a36Sopenharmony_ci	MTK_PIN_DRV_GRP(60, DRV_BASE2+0x20, 0, 1),
11262306a36Sopenharmony_ci	MTK_PIN_DRV_GRP(61, DRV_BASE2+0x20, 0, 1),
11362306a36Sopenharmony_ci	MTK_PIN_DRV_GRP(62, DRV_BASE2+0x20, 0, 1),
11462306a36Sopenharmony_ci	MTK_PIN_DRV_GRP(63, DRV_BASE2+0x20, 4, 1),
11562306a36Sopenharmony_ci	MTK_PIN_DRV_GRP(64, DRV_BASE2+0x20, 8, 1),
11662306a36Sopenharmony_ci	MTK_PIN_DRV_GRP(65, DRV_BASE2+0x20, 12, 1),
11762306a36Sopenharmony_ci	MTK_PIN_DRV_GRP(66, DRV_BASE2+0x20, 16, 1),
11862306a36Sopenharmony_ci	MTK_PIN_DRV_GRP(67, DRV_BASE2+0x20, 20, 1),
11962306a36Sopenharmony_ci	MTK_PIN_DRV_GRP(68, DRV_BASE2+0x20, 24, 1),
12062306a36Sopenharmony_ci	MTK_PIN_DRV_GRP(69, DRV_BASE2+0x20, 28, 1),
12162306a36Sopenharmony_ci
12262306a36Sopenharmony_ci	MTK_PIN_DRV_GRP(70, DRV_BASE2+0x30, 0, 1),
12362306a36Sopenharmony_ci	MTK_PIN_DRV_GRP(71, DRV_BASE2+0x30, 4, 1),
12462306a36Sopenharmony_ci	MTK_PIN_DRV_GRP(72, DRV_BASE2+0x30, 8, 1),
12562306a36Sopenharmony_ci	MTK_PIN_DRV_GRP(73, DRV_BASE2+0x30, 12, 1),
12662306a36Sopenharmony_ci	MTK_PIN_DRV_GRP(74, DRV_BASE2+0x30, 16, 1),
12762306a36Sopenharmony_ci	MTK_PIN_DRV_GRP(75, DRV_BASE2+0x30, 20, 1),
12862306a36Sopenharmony_ci	MTK_PIN_DRV_GRP(76, DRV_BASE2+0x30, 24, 1),
12962306a36Sopenharmony_ci	MTK_PIN_DRV_GRP(77, DRV_BASE2+0x30, 28, 3),
13062306a36Sopenharmony_ci	MTK_PIN_DRV_GRP(78, DRV_BASE2+0x30, 28, 3),
13162306a36Sopenharmony_ci
13262306a36Sopenharmony_ci	MTK_PIN_DRV_GRP(79, DRV_BASE2+0x40, 0, 3),
13362306a36Sopenharmony_ci	MTK_PIN_DRV_GRP(80, DRV_BASE2+0x40, 4, 3),
13462306a36Sopenharmony_ci
13562306a36Sopenharmony_ci	MTK_PIN_DRV_GRP(81, DRV_BASE2+0x30, 28, 3),
13662306a36Sopenharmony_ci	MTK_PIN_DRV_GRP(82, DRV_BASE2+0x30, 28, 3),
13762306a36Sopenharmony_ci
13862306a36Sopenharmony_ci	MTK_PIN_DRV_GRP(83, DRV_BASE2+0x40, 8, 3),
13962306a36Sopenharmony_ci	MTK_PIN_DRV_GRP(84, DRV_BASE2+0x40, 8, 3),
14062306a36Sopenharmony_ci	MTK_PIN_DRV_GRP(85, DRV_BASE2+0x40, 12, 3),
14162306a36Sopenharmony_ci	MTK_PIN_DRV_GRP(86, DRV_BASE2+0x40, 16, 3),
14262306a36Sopenharmony_ci	MTK_PIN_DRV_GRP(87, DRV_BASE2+0x40, 8, 3),
14362306a36Sopenharmony_ci	MTK_PIN_DRV_GRP(88, DRV_BASE2+0x40, 8, 3),
14462306a36Sopenharmony_ci
14562306a36Sopenharmony_ci	MTK_PIN_DRV_GRP(89, DRV_BASE2+0x50, 12, 0),
14662306a36Sopenharmony_ci	MTK_PIN_DRV_GRP(90, DRV_BASE2+0x50, 12, 0),
14762306a36Sopenharmony_ci	MTK_PIN_DRV_GRP(91, DRV_BASE2+0x50, 12, 0),
14862306a36Sopenharmony_ci	MTK_PIN_DRV_GRP(92, DRV_BASE2+0x50, 12, 0),
14962306a36Sopenharmony_ci	MTK_PIN_DRV_GRP(93, DRV_BASE2+0x50, 12, 0),
15062306a36Sopenharmony_ci	MTK_PIN_DRV_GRP(94, DRV_BASE2+0x50, 12, 0),
15162306a36Sopenharmony_ci	MTK_PIN_DRV_GRP(95, DRV_BASE2+0x50, 12, 0),
15262306a36Sopenharmony_ci
15362306a36Sopenharmony_ci	MTK_PIN_DRV_GRP(96, DRV_BASE1+0xb0, 28, 0),
15462306a36Sopenharmony_ci
15562306a36Sopenharmony_ci	MTK_PIN_DRV_GRP(97, DRV_BASE2+0x50, 12, 0),
15662306a36Sopenharmony_ci	MTK_PIN_DRV_GRP(98, DRV_BASE2+0x50, 16, 0),
15762306a36Sopenharmony_ci	MTK_PIN_DRV_GRP(99, DRV_BASE2+0x50, 20, 1),
15862306a36Sopenharmony_ci	MTK_PIN_DRV_GRP(102, DRV_BASE2+0x50, 24, 1),
15962306a36Sopenharmony_ci	MTK_PIN_DRV_GRP(103, DRV_BASE2+0x50, 28, 1),
16062306a36Sopenharmony_ci
16162306a36Sopenharmony_ci
16262306a36Sopenharmony_ci	MTK_PIN_DRV_GRP(104, DRV_BASE2+0x60, 0, 1),
16362306a36Sopenharmony_ci	MTK_PIN_DRV_GRP(105, DRV_BASE2+0x60, 4, 1),
16462306a36Sopenharmony_ci	MTK_PIN_DRV_GRP(106, DRV_BASE2+0x60, 4, 1),
16562306a36Sopenharmony_ci	MTK_PIN_DRV_GRP(107, DRV_BASE2+0x60, 4, 1),
16662306a36Sopenharmony_ci	MTK_PIN_DRV_GRP(108, DRV_BASE2+0x60, 4, 1),
16762306a36Sopenharmony_ci	MTK_PIN_DRV_GRP(109, DRV_BASE2+0x60, 8, 2),
16862306a36Sopenharmony_ci	MTK_PIN_DRV_GRP(110, DRV_BASE2+0x60, 12, 2),
16962306a36Sopenharmony_ci	MTK_PIN_DRV_GRP(111, DRV_BASE2+0x60, 16, 2),
17062306a36Sopenharmony_ci	MTK_PIN_DRV_GRP(112, DRV_BASE2+0x60, 20, 2),
17162306a36Sopenharmony_ci	MTK_PIN_DRV_GRP(113, DRV_BASE2+0x60, 24, 2),
17262306a36Sopenharmony_ci	MTK_PIN_DRV_GRP(114, DRV_BASE2+0x60, 28, 2),
17362306a36Sopenharmony_ci
17462306a36Sopenharmony_ci	MTK_PIN_DRV_GRP(115, DRV_BASE2+0x70, 0, 2),
17562306a36Sopenharmony_ci	MTK_PIN_DRV_GRP(116, DRV_BASE2+0x70, 4, 2),
17662306a36Sopenharmony_ci	MTK_PIN_DRV_GRP(117, DRV_BASE2+0x70, 8, 2),
17762306a36Sopenharmony_ci	MTK_PIN_DRV_GRP(118, DRV_BASE2+0x70, 12, 2),
17862306a36Sopenharmony_ci	MTK_PIN_DRV_GRP(119, DRV_BASE2+0x70, 16, 2),
17962306a36Sopenharmony_ci	MTK_PIN_DRV_GRP(120, DRV_BASE2+0x70, 20, 2),
18062306a36Sopenharmony_ci
18162306a36Sopenharmony_ci	MTK_PIN_DRV_GRP(181, DRV_BASE1+0xa0, 12, 1),
18262306a36Sopenharmony_ci	MTK_PIN_DRV_GRP(182, DRV_BASE1+0xa0, 16, 1),
18362306a36Sopenharmony_ci	MTK_PIN_DRV_GRP(183, DRV_BASE1+0xa0, 20, 1),
18462306a36Sopenharmony_ci	MTK_PIN_DRV_GRP(184, DRV_BASE1+0xa0, 24, 1),
18562306a36Sopenharmony_ci	MTK_PIN_DRV_GRP(185, DRV_BASE1+0xa0, 28, 1),
18662306a36Sopenharmony_ci
18762306a36Sopenharmony_ci	MTK_PIN_DRV_GRP(186, DRV_BASE1+0xb0, 0, 2),
18862306a36Sopenharmony_ci	MTK_PIN_DRV_GRP(187, DRV_BASE1+0xb0, 0, 2),
18962306a36Sopenharmony_ci	MTK_PIN_DRV_GRP(188, DRV_BASE1+0xb0, 0, 2),
19062306a36Sopenharmony_ci	MTK_PIN_DRV_GRP(189, DRV_BASE1+0xb0, 0, 2),
19162306a36Sopenharmony_ci	MTK_PIN_DRV_GRP(190, DRV_BASE1+0xb0, 4, 1),
19262306a36Sopenharmony_ci	MTK_PIN_DRV_GRP(191, DRV_BASE1+0xb0, 8, 1),
19362306a36Sopenharmony_ci	MTK_PIN_DRV_GRP(192, DRV_BASE1+0xb0, 12, 1),
19462306a36Sopenharmony_ci
19562306a36Sopenharmony_ci	MTK_PIN_DRV_GRP(197, DRV_BASE1+0xb0, 16, 0),
19662306a36Sopenharmony_ci	MTK_PIN_DRV_GRP(198, DRV_BASE1+0xb0, 16, 0),
19762306a36Sopenharmony_ci	MTK_PIN_DRV_GRP(199, DRV_BASE1+0xb0, 20, 0),
19862306a36Sopenharmony_ci	MTK_PIN_DRV_GRP(200, DRV_BASE1+0xb0, 24, 0),
19962306a36Sopenharmony_ci	MTK_PIN_DRV_GRP(201, DRV_BASE1+0xb0, 16, 0),
20062306a36Sopenharmony_ci	MTK_PIN_DRV_GRP(202, DRV_BASE1+0xb0, 16, 0)
20162306a36Sopenharmony_ci};
20262306a36Sopenharmony_ci
20362306a36Sopenharmony_cistatic const struct mtk_spec_pull_set spec_pupd[] = {
20462306a36Sopenharmony_ci	SPEC_PULL(0, PUPD_BASE1, 0, R0_BASE1, 9, R1_BASE1, 0),
20562306a36Sopenharmony_ci	SPEC_PULL(1, PUPD_BASE1, 1, R0_BASE1, 8, R1_BASE1, 1),
20662306a36Sopenharmony_ci	SPEC_PULL(2, PUPD_BASE1, 2, R0_BASE1, 7, R1_BASE1, 2),
20762306a36Sopenharmony_ci	SPEC_PULL(3, PUPD_BASE1, 3, R0_BASE1, 6, R1_BASE1, 3),
20862306a36Sopenharmony_ci	SPEC_PULL(4, PUPD_BASE1, 4, R0_BASE1, 1, R1_BASE1, 4),
20962306a36Sopenharmony_ci	SPEC_PULL(5, PUPD_BASE1, 5, R0_BASE1, 0, R1_BASE1, 5),
21062306a36Sopenharmony_ci	SPEC_PULL(6, PUPD_BASE1, 6, R0_BASE1, 5, R1_BASE1, 6),
21162306a36Sopenharmony_ci	SPEC_PULL(7, PUPD_BASE1, 7, R0_BASE1, 4, R1_BASE1, 7),
21262306a36Sopenharmony_ci	SPEC_PULL(8, PUPD_BASE1, 8, R0_BASE1, 3, R1_BASE1, 8),
21362306a36Sopenharmony_ci	SPEC_PULL(9, PUPD_BASE1, 9, R0_BASE1, 2, R1_BASE1, 9),
21462306a36Sopenharmony_ci	SPEC_PULL(89, PUPD_BASE2, 9, R0_BASE1, 18, R1_BASE2, 9),
21562306a36Sopenharmony_ci	SPEC_PULL(90, PUPD_BASE2, 10, R0_BASE1, 19, R1_BASE2, 10),
21662306a36Sopenharmony_ci	SPEC_PULL(91, PUPD_BASE2, 11, R0_BASE1, 23, R1_BASE2, 11),
21762306a36Sopenharmony_ci	SPEC_PULL(92, PUPD_BASE2, 12, R0_BASE1, 24, R1_BASE2, 12),
21862306a36Sopenharmony_ci	SPEC_PULL(93, PUPD_BASE2, 13, R0_BASE1, 25, R1_BASE2, 13),
21962306a36Sopenharmony_ci	SPEC_PULL(94, PUPD_BASE2, 14, R0_BASE1, 22, R1_BASE2, 14),
22062306a36Sopenharmony_ci	SPEC_PULL(95, PUPD_BASE2, 15, R0_BASE1, 20, R1_BASE2, 15),
22162306a36Sopenharmony_ci	SPEC_PULL(96, PUPD_BASE2+0x10, 0, R0_BASE1, 16, R1_BASE2+0x10, 0),
22262306a36Sopenharmony_ci	SPEC_PULL(97, PUPD_BASE2+0x10, 1, R0_BASE1, 21, R1_BASE2+0x10, 1),
22362306a36Sopenharmony_ci	SPEC_PULL(98, PUPD_BASE2+0x10, 2, R0_BASE1, 17, R1_BASE2+0x10, 2),
22462306a36Sopenharmony_ci	SPEC_PULL(197, PUPD_BASE1+0xc0, 5, R0_BASE1, 13, R1_BASE2+0xc0, 5),
22562306a36Sopenharmony_ci	SPEC_PULL(198, PUPD_BASE2+0xc0, 6, R0_BASE1, 14, R1_BASE2+0xc0, 6),
22662306a36Sopenharmony_ci	SPEC_PULL(199, PUPD_BASE2+0xc0, 7, R0_BASE1, 11, R1_BASE2+0xc0, 7),
22762306a36Sopenharmony_ci	SPEC_PULL(200, PUPD_BASE2+0xc0, 8, R0_BASE1, 10, R1_BASE2+0xc0, 8),
22862306a36Sopenharmony_ci	SPEC_PULL(201, PUPD_BASE2+0xc0, 9, R0_BASE1, 13, R1_BASE2+0xc0, 9),
22962306a36Sopenharmony_ci	SPEC_PULL(202, PUPD_BASE2+0xc0, 10, R0_BASE1, 12, R1_BASE2+0xc0, 10)
23062306a36Sopenharmony_ci};
23162306a36Sopenharmony_ci
23262306a36Sopenharmony_cistatic int spec_pull_set(struct regmap *regmap,
23362306a36Sopenharmony_ci		const struct mtk_pinctrl_devdata *devdata,
23462306a36Sopenharmony_ci		unsigned int pin, bool isup, unsigned int r1r0)
23562306a36Sopenharmony_ci{
23662306a36Sopenharmony_ci	unsigned int i;
23762306a36Sopenharmony_ci	unsigned int reg_pupd, reg_set_r0, reg_set_r1;
23862306a36Sopenharmony_ci	unsigned int reg_rst_r0, reg_rst_r1;
23962306a36Sopenharmony_ci	unsigned char align = devdata->port_align;
24062306a36Sopenharmony_ci	bool find = false;
24162306a36Sopenharmony_ci
24262306a36Sopenharmony_ci	for (i = 0; i < ARRAY_SIZE(spec_pupd); i++) {
24362306a36Sopenharmony_ci		if (pin == spec_pupd[i].pin) {
24462306a36Sopenharmony_ci			find = true;
24562306a36Sopenharmony_ci			break;
24662306a36Sopenharmony_ci		}
24762306a36Sopenharmony_ci	}
24862306a36Sopenharmony_ci
24962306a36Sopenharmony_ci	if (!find)
25062306a36Sopenharmony_ci		return -EINVAL;
25162306a36Sopenharmony_ci
25262306a36Sopenharmony_ci	if (isup)
25362306a36Sopenharmony_ci		reg_pupd = spec_pupd[i].pupd_offset + align;
25462306a36Sopenharmony_ci	else
25562306a36Sopenharmony_ci		reg_pupd = spec_pupd[i].pupd_offset + (align << 1);
25662306a36Sopenharmony_ci
25762306a36Sopenharmony_ci	regmap_write(regmap, reg_pupd, spec_pupd[i].pupd_bit);
25862306a36Sopenharmony_ci
25962306a36Sopenharmony_ci	reg_set_r0 = spec_pupd[i].r0_offset + align;
26062306a36Sopenharmony_ci	reg_rst_r0 = spec_pupd[i].r0_offset + (align << 1);
26162306a36Sopenharmony_ci	reg_set_r1 = spec_pupd[i].r1_offset + align;
26262306a36Sopenharmony_ci	reg_rst_r1 = spec_pupd[i].r1_offset + (align << 1);
26362306a36Sopenharmony_ci
26462306a36Sopenharmony_ci	switch (r1r0) {
26562306a36Sopenharmony_ci	case MTK_PUPD_SET_R1R0_00:
26662306a36Sopenharmony_ci		regmap_write(regmap, reg_rst_r0, spec_pupd[i].r0_bit);
26762306a36Sopenharmony_ci		regmap_write(regmap, reg_rst_r1, spec_pupd[i].r1_bit);
26862306a36Sopenharmony_ci		break;
26962306a36Sopenharmony_ci	case MTK_PUPD_SET_R1R0_01:
27062306a36Sopenharmony_ci		regmap_write(regmap, reg_set_r0, spec_pupd[i].r0_bit);
27162306a36Sopenharmony_ci		regmap_write(regmap, reg_rst_r1, spec_pupd[i].r1_bit);
27262306a36Sopenharmony_ci		break;
27362306a36Sopenharmony_ci	case MTK_PUPD_SET_R1R0_10:
27462306a36Sopenharmony_ci		regmap_write(regmap, reg_rst_r0, spec_pupd[i].r0_bit);
27562306a36Sopenharmony_ci		regmap_write(regmap, reg_set_r1, spec_pupd[i].r1_bit);
27662306a36Sopenharmony_ci		break;
27762306a36Sopenharmony_ci	case MTK_PUPD_SET_R1R0_11:
27862306a36Sopenharmony_ci		regmap_write(regmap, reg_set_r0, spec_pupd[i].r0_bit);
27962306a36Sopenharmony_ci		regmap_write(regmap, reg_set_r1, spec_pupd[i].r1_bit);
28062306a36Sopenharmony_ci		break;
28162306a36Sopenharmony_ci	default:
28262306a36Sopenharmony_ci		return -EINVAL;
28362306a36Sopenharmony_ci	}
28462306a36Sopenharmony_ci
28562306a36Sopenharmony_ci	return 0;
28662306a36Sopenharmony_ci}
28762306a36Sopenharmony_ci
28862306a36Sopenharmony_cistatic const struct mtk_pinctrl_devdata mt8135_pinctrl_data = {
28962306a36Sopenharmony_ci	.pins = mtk_pins_mt8135,
29062306a36Sopenharmony_ci	.npins = ARRAY_SIZE(mtk_pins_mt8135),
29162306a36Sopenharmony_ci	.grp_desc = mt8135_drv_grp,
29262306a36Sopenharmony_ci	.n_grp_cls = ARRAY_SIZE(mt8135_drv_grp),
29362306a36Sopenharmony_ci	.pin_drv_grp = mt8135_pin_drv,
29462306a36Sopenharmony_ci	.n_pin_drv_grps = ARRAY_SIZE(mt8135_pin_drv),
29562306a36Sopenharmony_ci	.spec_pull_set = spec_pull_set,
29662306a36Sopenharmony_ci	.dir_offset = 0x0000,
29762306a36Sopenharmony_ci	.ies_offset = 0x0100,
29862306a36Sopenharmony_ci	.pullen_offset = 0x0200,
29962306a36Sopenharmony_ci	.smt_offset = 0x0300,
30062306a36Sopenharmony_ci	.pullsel_offset = 0x0400,
30162306a36Sopenharmony_ci	.dout_offset = 0x0800,
30262306a36Sopenharmony_ci	.din_offset = 0x0A00,
30362306a36Sopenharmony_ci	.pinmux_offset = 0x0C00,
30462306a36Sopenharmony_ci	.type1_start = 34,
30562306a36Sopenharmony_ci	.type1_end = 149,
30662306a36Sopenharmony_ci	.port_shf = 4,
30762306a36Sopenharmony_ci	.port_mask = 0xf,
30862306a36Sopenharmony_ci	.port_align = 4,
30962306a36Sopenharmony_ci	.mode_mask = 0xf,
31062306a36Sopenharmony_ci	.mode_per_reg = 5,
31162306a36Sopenharmony_ci	.mode_shf = 4,
31262306a36Sopenharmony_ci	.eint_hw = {
31362306a36Sopenharmony_ci		.port_mask = 7,
31462306a36Sopenharmony_ci		.ports     = 6,
31562306a36Sopenharmony_ci		.ap_num    = 192,
31662306a36Sopenharmony_ci		.db_cnt    = 16,
31762306a36Sopenharmony_ci		.db_time = debounce_time_mt2701,
31862306a36Sopenharmony_ci	},
31962306a36Sopenharmony_ci};
32062306a36Sopenharmony_ci
32162306a36Sopenharmony_cistatic const struct of_device_id mt8135_pctrl_match[] = {
32262306a36Sopenharmony_ci	{ .compatible = "mediatek,mt8135-pinctrl", .data = &mt8135_pinctrl_data },
32362306a36Sopenharmony_ci	{ }
32462306a36Sopenharmony_ci};
32562306a36Sopenharmony_ci
32662306a36Sopenharmony_cistatic struct platform_driver mtk_pinctrl_driver = {
32762306a36Sopenharmony_ci	.probe = mtk_pctrl_common_probe,
32862306a36Sopenharmony_ci	.driver = {
32962306a36Sopenharmony_ci		.name = "mediatek-mt8135-pinctrl",
33062306a36Sopenharmony_ci		.of_match_table = mt8135_pctrl_match,
33162306a36Sopenharmony_ci	},
33262306a36Sopenharmony_ci};
33362306a36Sopenharmony_ci
33462306a36Sopenharmony_cistatic int __init mtk_pinctrl_init(void)
33562306a36Sopenharmony_ci{
33662306a36Sopenharmony_ci	return platform_driver_register(&mtk_pinctrl_driver);
33762306a36Sopenharmony_ci}
33862306a36Sopenharmony_ciarch_initcall(mtk_pinctrl_init);
339