162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only
262306a36Sopenharmony_ci
362306a36Sopenharmony_ci#include <linux/module.h>
462306a36Sopenharmony_ci#include <linux/platform_device.h>
562306a36Sopenharmony_ci#include <linux/of.h>
662306a36Sopenharmony_ci#include "pinctrl-mtmips.h"
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci#define MT76X8_GPIO_MODE_MASK		0x3
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ci#define MT76X8_GPIO_MODE_P4LED_KN	58
1162306a36Sopenharmony_ci#define MT76X8_GPIO_MODE_P3LED_KN	56
1262306a36Sopenharmony_ci#define MT76X8_GPIO_MODE_P2LED_KN	54
1362306a36Sopenharmony_ci#define MT76X8_GPIO_MODE_P1LED_KN	52
1462306a36Sopenharmony_ci#define MT76X8_GPIO_MODE_P0LED_KN	50
1562306a36Sopenharmony_ci#define MT76X8_GPIO_MODE_WLED_KN	48
1662306a36Sopenharmony_ci#define MT76X8_GPIO_MODE_P4LED_AN	42
1762306a36Sopenharmony_ci#define MT76X8_GPIO_MODE_P3LED_AN	40
1862306a36Sopenharmony_ci#define MT76X8_GPIO_MODE_P2LED_AN	38
1962306a36Sopenharmony_ci#define MT76X8_GPIO_MODE_P1LED_AN	36
2062306a36Sopenharmony_ci#define MT76X8_GPIO_MODE_P0LED_AN	34
2162306a36Sopenharmony_ci#define MT76X8_GPIO_MODE_WLED_AN	32
2262306a36Sopenharmony_ci#define MT76X8_GPIO_MODE_PWM1		30
2362306a36Sopenharmony_ci#define MT76X8_GPIO_MODE_PWM0		28
2462306a36Sopenharmony_ci#define MT76X8_GPIO_MODE_UART2		26
2562306a36Sopenharmony_ci#define MT76X8_GPIO_MODE_UART1		24
2662306a36Sopenharmony_ci#define MT76X8_GPIO_MODE_I2C		20
2762306a36Sopenharmony_ci#define MT76X8_GPIO_MODE_REFCLK		18
2862306a36Sopenharmony_ci#define MT76X8_GPIO_MODE_PERST		16
2962306a36Sopenharmony_ci#define MT76X8_GPIO_MODE_WDT		14
3062306a36Sopenharmony_ci#define MT76X8_GPIO_MODE_SPI		12
3162306a36Sopenharmony_ci#define MT76X8_GPIO_MODE_SDMODE		10
3262306a36Sopenharmony_ci#define MT76X8_GPIO_MODE_UART0		8
3362306a36Sopenharmony_ci#define MT76X8_GPIO_MODE_I2S		6
3462306a36Sopenharmony_ci#define MT76X8_GPIO_MODE_CS1		4
3562306a36Sopenharmony_ci#define MT76X8_GPIO_MODE_SPIS		2
3662306a36Sopenharmony_ci#define MT76X8_GPIO_MODE_GPIO		0
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_cistatic struct mtmips_pmx_func pwm1_grp[] = {
3962306a36Sopenharmony_ci	FUNC("sdxc d6", 3, 19, 1),
4062306a36Sopenharmony_ci	FUNC("utif", 2, 19, 1),
4162306a36Sopenharmony_ci	FUNC("gpio", 1, 19, 1),
4262306a36Sopenharmony_ci	FUNC("pwm1", 0, 19, 1),
4362306a36Sopenharmony_ci};
4462306a36Sopenharmony_ci
4562306a36Sopenharmony_cistatic struct mtmips_pmx_func pwm0_grp[] = {
4662306a36Sopenharmony_ci	FUNC("sdxc d7", 3, 18, 1),
4762306a36Sopenharmony_ci	FUNC("utif", 2, 18, 1),
4862306a36Sopenharmony_ci	FUNC("gpio", 1, 18, 1),
4962306a36Sopenharmony_ci	FUNC("pwm0", 0, 18, 1),
5062306a36Sopenharmony_ci};
5162306a36Sopenharmony_ci
5262306a36Sopenharmony_cistatic struct mtmips_pmx_func uart2_grp[] = {
5362306a36Sopenharmony_ci	FUNC("sdxc d5 d4", 3, 20, 2),
5462306a36Sopenharmony_ci	FUNC("pwm", 2, 20, 2),
5562306a36Sopenharmony_ci	FUNC("gpio", 1, 20, 2),
5662306a36Sopenharmony_ci	FUNC("uart2", 0, 20, 2),
5762306a36Sopenharmony_ci};
5862306a36Sopenharmony_ci
5962306a36Sopenharmony_cistatic struct mtmips_pmx_func uart1_grp[] = {
6062306a36Sopenharmony_ci	FUNC("sw_r", 3, 45, 2),
6162306a36Sopenharmony_ci	FUNC("pwm", 2, 45, 2),
6262306a36Sopenharmony_ci	FUNC("gpio", 1, 45, 2),
6362306a36Sopenharmony_ci	FUNC("uart1", 0, 45, 2),
6462306a36Sopenharmony_ci};
6562306a36Sopenharmony_ci
6662306a36Sopenharmony_cistatic struct mtmips_pmx_func i2c_grp[] = {
6762306a36Sopenharmony_ci	FUNC("-", 3, 4, 2),
6862306a36Sopenharmony_ci	FUNC("debug", 2, 4, 2),
6962306a36Sopenharmony_ci	FUNC("gpio", 1, 4, 2),
7062306a36Sopenharmony_ci	FUNC("i2c", 0, 4, 2),
7162306a36Sopenharmony_ci};
7262306a36Sopenharmony_ci
7362306a36Sopenharmony_cistatic struct mtmips_pmx_func refclk_grp[] = { FUNC("refclk", 0, 37, 1) };
7462306a36Sopenharmony_cistatic struct mtmips_pmx_func perst_grp[] = { FUNC("perst", 0, 36, 1) };
7562306a36Sopenharmony_cistatic struct mtmips_pmx_func wdt_grp[] = { FUNC("wdt", 0, 38, 1) };
7662306a36Sopenharmony_cistatic struct mtmips_pmx_func spi_grp[] = { FUNC("spi", 0, 7, 4) };
7762306a36Sopenharmony_ci
7862306a36Sopenharmony_cistatic struct mtmips_pmx_func sd_mode_grp[] = {
7962306a36Sopenharmony_ci	FUNC("jtag", 3, 22, 8),
8062306a36Sopenharmony_ci	FUNC("utif", 2, 22, 8),
8162306a36Sopenharmony_ci	FUNC("gpio", 1, 22, 8),
8262306a36Sopenharmony_ci	FUNC("sdxc", 0, 22, 8),
8362306a36Sopenharmony_ci};
8462306a36Sopenharmony_ci
8562306a36Sopenharmony_cistatic struct mtmips_pmx_func uart0_grp[] = {
8662306a36Sopenharmony_ci	FUNC("-", 3, 12, 2),
8762306a36Sopenharmony_ci	FUNC("-", 2, 12, 2),
8862306a36Sopenharmony_ci	FUNC("gpio", 1, 12, 2),
8962306a36Sopenharmony_ci	FUNC("uart0", 0, 12, 2),
9062306a36Sopenharmony_ci};
9162306a36Sopenharmony_ci
9262306a36Sopenharmony_cistatic struct mtmips_pmx_func i2s_grp[] = {
9362306a36Sopenharmony_ci	FUNC("antenna", 3, 0, 4),
9462306a36Sopenharmony_ci	FUNC("pcm", 2, 0, 4),
9562306a36Sopenharmony_ci	FUNC("gpio", 1, 0, 4),
9662306a36Sopenharmony_ci	FUNC("i2s", 0, 0, 4),
9762306a36Sopenharmony_ci};
9862306a36Sopenharmony_ci
9962306a36Sopenharmony_cistatic struct mtmips_pmx_func spi_cs1_grp[] = {
10062306a36Sopenharmony_ci	FUNC("-", 3, 6, 1),
10162306a36Sopenharmony_ci	FUNC("refclk", 2, 6, 1),
10262306a36Sopenharmony_ci	FUNC("gpio", 1, 6, 1),
10362306a36Sopenharmony_ci	FUNC("spi cs1", 0, 6, 1),
10462306a36Sopenharmony_ci};
10562306a36Sopenharmony_ci
10662306a36Sopenharmony_cistatic struct mtmips_pmx_func spis_grp[] = {
10762306a36Sopenharmony_ci	FUNC("pwm_uart2", 3, 14, 4),
10862306a36Sopenharmony_ci	FUNC("utif", 2, 14, 4),
10962306a36Sopenharmony_ci	FUNC("gpio", 1, 14, 4),
11062306a36Sopenharmony_ci	FUNC("spis", 0, 14, 4),
11162306a36Sopenharmony_ci};
11262306a36Sopenharmony_ci
11362306a36Sopenharmony_cistatic struct mtmips_pmx_func gpio_grp[] = {
11462306a36Sopenharmony_ci	FUNC("pcie", 3, 11, 1),
11562306a36Sopenharmony_ci	FUNC("refclk", 2, 11, 1),
11662306a36Sopenharmony_ci	FUNC("gpio", 1, 11, 1),
11762306a36Sopenharmony_ci	FUNC("gpio", 0, 11, 1),
11862306a36Sopenharmony_ci};
11962306a36Sopenharmony_ci
12062306a36Sopenharmony_cistatic struct mtmips_pmx_func p4led_kn_grp[] = {
12162306a36Sopenharmony_ci	FUNC("jtag", 3, 30, 1),
12262306a36Sopenharmony_ci	FUNC("utif", 2, 30, 1),
12362306a36Sopenharmony_ci	FUNC("gpio", 1, 30, 1),
12462306a36Sopenharmony_ci	FUNC("p4led_kn", 0, 30, 1),
12562306a36Sopenharmony_ci};
12662306a36Sopenharmony_ci
12762306a36Sopenharmony_cistatic struct mtmips_pmx_func p3led_kn_grp[] = {
12862306a36Sopenharmony_ci	FUNC("jtag", 3, 31, 1),
12962306a36Sopenharmony_ci	FUNC("utif", 2, 31, 1),
13062306a36Sopenharmony_ci	FUNC("gpio", 1, 31, 1),
13162306a36Sopenharmony_ci	FUNC("p3led_kn", 0, 31, 1),
13262306a36Sopenharmony_ci};
13362306a36Sopenharmony_ci
13462306a36Sopenharmony_cistatic struct mtmips_pmx_func p2led_kn_grp[] = {
13562306a36Sopenharmony_ci	FUNC("jtag", 3, 32, 1),
13662306a36Sopenharmony_ci	FUNC("utif", 2, 32, 1),
13762306a36Sopenharmony_ci	FUNC("gpio", 1, 32, 1),
13862306a36Sopenharmony_ci	FUNC("p2led_kn", 0, 32, 1),
13962306a36Sopenharmony_ci};
14062306a36Sopenharmony_ci
14162306a36Sopenharmony_cistatic struct mtmips_pmx_func p1led_kn_grp[] = {
14262306a36Sopenharmony_ci	FUNC("jtag", 3, 33, 1),
14362306a36Sopenharmony_ci	FUNC("utif", 2, 33, 1),
14462306a36Sopenharmony_ci	FUNC("gpio", 1, 33, 1),
14562306a36Sopenharmony_ci	FUNC("p1led_kn", 0, 33, 1),
14662306a36Sopenharmony_ci};
14762306a36Sopenharmony_ci
14862306a36Sopenharmony_cistatic struct mtmips_pmx_func p0led_kn_grp[] = {
14962306a36Sopenharmony_ci	FUNC("jtag", 3, 34, 1),
15062306a36Sopenharmony_ci	FUNC("rsvd", 2, 34, 1),
15162306a36Sopenharmony_ci	FUNC("gpio", 1, 34, 1),
15262306a36Sopenharmony_ci	FUNC("p0led_kn", 0, 34, 1),
15362306a36Sopenharmony_ci};
15462306a36Sopenharmony_ci
15562306a36Sopenharmony_cistatic struct mtmips_pmx_func wled_kn_grp[] = {
15662306a36Sopenharmony_ci	FUNC("rsvd", 3, 35, 1),
15762306a36Sopenharmony_ci	FUNC("rsvd", 2, 35, 1),
15862306a36Sopenharmony_ci	FUNC("gpio", 1, 35, 1),
15962306a36Sopenharmony_ci	FUNC("wled_kn", 0, 35, 1),
16062306a36Sopenharmony_ci};
16162306a36Sopenharmony_ci
16262306a36Sopenharmony_cistatic struct mtmips_pmx_func p4led_an_grp[] = {
16362306a36Sopenharmony_ci	FUNC("jtag", 3, 39, 1),
16462306a36Sopenharmony_ci	FUNC("utif", 2, 39, 1),
16562306a36Sopenharmony_ci	FUNC("gpio", 1, 39, 1),
16662306a36Sopenharmony_ci	FUNC("p4led_an", 0, 39, 1),
16762306a36Sopenharmony_ci};
16862306a36Sopenharmony_ci
16962306a36Sopenharmony_cistatic struct mtmips_pmx_func p3led_an_grp[] = {
17062306a36Sopenharmony_ci	FUNC("jtag", 3, 40, 1),
17162306a36Sopenharmony_ci	FUNC("utif", 2, 40, 1),
17262306a36Sopenharmony_ci	FUNC("gpio", 1, 40, 1),
17362306a36Sopenharmony_ci	FUNC("p3led_an", 0, 40, 1),
17462306a36Sopenharmony_ci};
17562306a36Sopenharmony_ci
17662306a36Sopenharmony_cistatic struct mtmips_pmx_func p2led_an_grp[] = {
17762306a36Sopenharmony_ci	FUNC("jtag", 3, 41, 1),
17862306a36Sopenharmony_ci	FUNC("utif", 2, 41, 1),
17962306a36Sopenharmony_ci	FUNC("gpio", 1, 41, 1),
18062306a36Sopenharmony_ci	FUNC("p2led_an", 0, 41, 1),
18162306a36Sopenharmony_ci};
18262306a36Sopenharmony_ci
18362306a36Sopenharmony_cistatic struct mtmips_pmx_func p1led_an_grp[] = {
18462306a36Sopenharmony_ci	FUNC("jtag", 3, 42, 1),
18562306a36Sopenharmony_ci	FUNC("utif", 2, 42, 1),
18662306a36Sopenharmony_ci	FUNC("gpio", 1, 42, 1),
18762306a36Sopenharmony_ci	FUNC("p1led_an", 0, 42, 1),
18862306a36Sopenharmony_ci};
18962306a36Sopenharmony_ci
19062306a36Sopenharmony_cistatic struct mtmips_pmx_func p0led_an_grp[] = {
19162306a36Sopenharmony_ci	FUNC("jtag", 3, 43, 1),
19262306a36Sopenharmony_ci	FUNC("rsvd", 2, 43, 1),
19362306a36Sopenharmony_ci	FUNC("gpio", 1, 43, 1),
19462306a36Sopenharmony_ci	FUNC("p0led_an", 0, 43, 1),
19562306a36Sopenharmony_ci};
19662306a36Sopenharmony_ci
19762306a36Sopenharmony_cistatic struct mtmips_pmx_func wled_an_grp[] = {
19862306a36Sopenharmony_ci	FUNC("rsvd", 3, 44, 1),
19962306a36Sopenharmony_ci	FUNC("rsvd", 2, 44, 1),
20062306a36Sopenharmony_ci	FUNC("gpio", 1, 44, 1),
20162306a36Sopenharmony_ci	FUNC("wled_an", 0, 44, 1),
20262306a36Sopenharmony_ci};
20362306a36Sopenharmony_ci
20462306a36Sopenharmony_cistatic struct mtmips_pmx_group mt76x8_pinmux_data[] = {
20562306a36Sopenharmony_ci	GRP_G("pwm1", pwm1_grp, MT76X8_GPIO_MODE_MASK,
20662306a36Sopenharmony_ci				1, MT76X8_GPIO_MODE_PWM1),
20762306a36Sopenharmony_ci	GRP_G("pwm0", pwm0_grp, MT76X8_GPIO_MODE_MASK,
20862306a36Sopenharmony_ci				1, MT76X8_GPIO_MODE_PWM0),
20962306a36Sopenharmony_ci	GRP_G("uart2", uart2_grp, MT76X8_GPIO_MODE_MASK,
21062306a36Sopenharmony_ci				1, MT76X8_GPIO_MODE_UART2),
21162306a36Sopenharmony_ci	GRP_G("uart1", uart1_grp, MT76X8_GPIO_MODE_MASK,
21262306a36Sopenharmony_ci				1, MT76X8_GPIO_MODE_UART1),
21362306a36Sopenharmony_ci	GRP_G("i2c", i2c_grp, MT76X8_GPIO_MODE_MASK,
21462306a36Sopenharmony_ci				1, MT76X8_GPIO_MODE_I2C),
21562306a36Sopenharmony_ci	GRP("refclk", refclk_grp, 1, MT76X8_GPIO_MODE_REFCLK),
21662306a36Sopenharmony_ci	GRP("perst", perst_grp, 1, MT76X8_GPIO_MODE_PERST),
21762306a36Sopenharmony_ci	GRP("wdt", wdt_grp, 1, MT76X8_GPIO_MODE_WDT),
21862306a36Sopenharmony_ci	GRP("spi", spi_grp, 1, MT76X8_GPIO_MODE_SPI),
21962306a36Sopenharmony_ci	GRP_G("sdmode", sd_mode_grp, MT76X8_GPIO_MODE_MASK,
22062306a36Sopenharmony_ci				1, MT76X8_GPIO_MODE_SDMODE),
22162306a36Sopenharmony_ci	GRP_G("uart0", uart0_grp, MT76X8_GPIO_MODE_MASK,
22262306a36Sopenharmony_ci				1, MT76X8_GPIO_MODE_UART0),
22362306a36Sopenharmony_ci	GRP_G("i2s", i2s_grp, MT76X8_GPIO_MODE_MASK,
22462306a36Sopenharmony_ci				1, MT76X8_GPIO_MODE_I2S),
22562306a36Sopenharmony_ci	GRP_G("spi cs1", spi_cs1_grp, MT76X8_GPIO_MODE_MASK,
22662306a36Sopenharmony_ci				1, MT76X8_GPIO_MODE_CS1),
22762306a36Sopenharmony_ci	GRP_G("spis", spis_grp, MT76X8_GPIO_MODE_MASK,
22862306a36Sopenharmony_ci				1, MT76X8_GPIO_MODE_SPIS),
22962306a36Sopenharmony_ci	GRP_G("gpio", gpio_grp, MT76X8_GPIO_MODE_MASK,
23062306a36Sopenharmony_ci				1, MT76X8_GPIO_MODE_GPIO),
23162306a36Sopenharmony_ci	GRP_G("wled_an", wled_an_grp, MT76X8_GPIO_MODE_MASK,
23262306a36Sopenharmony_ci				1, MT76X8_GPIO_MODE_WLED_AN),
23362306a36Sopenharmony_ci	GRP_G("p0led_an", p0led_an_grp, MT76X8_GPIO_MODE_MASK,
23462306a36Sopenharmony_ci				1, MT76X8_GPIO_MODE_P0LED_AN),
23562306a36Sopenharmony_ci	GRP_G("p1led_an", p1led_an_grp, MT76X8_GPIO_MODE_MASK,
23662306a36Sopenharmony_ci				1, MT76X8_GPIO_MODE_P1LED_AN),
23762306a36Sopenharmony_ci	GRP_G("p2led_an", p2led_an_grp, MT76X8_GPIO_MODE_MASK,
23862306a36Sopenharmony_ci				1, MT76X8_GPIO_MODE_P2LED_AN),
23962306a36Sopenharmony_ci	GRP_G("p3led_an", p3led_an_grp, MT76X8_GPIO_MODE_MASK,
24062306a36Sopenharmony_ci				1, MT76X8_GPIO_MODE_P3LED_AN),
24162306a36Sopenharmony_ci	GRP_G("p4led_an", p4led_an_grp, MT76X8_GPIO_MODE_MASK,
24262306a36Sopenharmony_ci				1, MT76X8_GPIO_MODE_P4LED_AN),
24362306a36Sopenharmony_ci	GRP_G("wled_kn", wled_kn_grp, MT76X8_GPIO_MODE_MASK,
24462306a36Sopenharmony_ci				1, MT76X8_GPIO_MODE_WLED_KN),
24562306a36Sopenharmony_ci	GRP_G("p0led_kn", p0led_kn_grp, MT76X8_GPIO_MODE_MASK,
24662306a36Sopenharmony_ci				1, MT76X8_GPIO_MODE_P0LED_KN),
24762306a36Sopenharmony_ci	GRP_G("p1led_kn", p1led_kn_grp, MT76X8_GPIO_MODE_MASK,
24862306a36Sopenharmony_ci				1, MT76X8_GPIO_MODE_P1LED_KN),
24962306a36Sopenharmony_ci	GRP_G("p2led_kn", p2led_kn_grp, MT76X8_GPIO_MODE_MASK,
25062306a36Sopenharmony_ci				1, MT76X8_GPIO_MODE_P2LED_KN),
25162306a36Sopenharmony_ci	GRP_G("p3led_kn", p3led_kn_grp, MT76X8_GPIO_MODE_MASK,
25262306a36Sopenharmony_ci				1, MT76X8_GPIO_MODE_P3LED_KN),
25362306a36Sopenharmony_ci	GRP_G("p4led_kn", p4led_kn_grp, MT76X8_GPIO_MODE_MASK,
25462306a36Sopenharmony_ci				1, MT76X8_GPIO_MODE_P4LED_KN),
25562306a36Sopenharmony_ci	{ 0 }
25662306a36Sopenharmony_ci};
25762306a36Sopenharmony_ci
25862306a36Sopenharmony_cistatic int mt76x8_pinctrl_probe(struct platform_device *pdev)
25962306a36Sopenharmony_ci{
26062306a36Sopenharmony_ci	return mtmips_pinctrl_init(pdev, mt76x8_pinmux_data);
26162306a36Sopenharmony_ci}
26262306a36Sopenharmony_ci
26362306a36Sopenharmony_cistatic const struct of_device_id mt76x8_pinctrl_match[] = {
26462306a36Sopenharmony_ci	{ .compatible = "ralink,mt76x8-pinctrl" },
26562306a36Sopenharmony_ci	{ .compatible = "ralink,mt7620-pinctrl" },
26662306a36Sopenharmony_ci	{ .compatible = "ralink,rt2880-pinmux" },
26762306a36Sopenharmony_ci	{}
26862306a36Sopenharmony_ci};
26962306a36Sopenharmony_ciMODULE_DEVICE_TABLE(of, mt76x8_pinctrl_match);
27062306a36Sopenharmony_ci
27162306a36Sopenharmony_cistatic struct platform_driver mt76x8_pinctrl_driver = {
27262306a36Sopenharmony_ci	.probe = mt76x8_pinctrl_probe,
27362306a36Sopenharmony_ci	.driver = {
27462306a36Sopenharmony_ci		.name = "mt76x8-pinctrl",
27562306a36Sopenharmony_ci		.of_match_table = mt76x8_pinctrl_match,
27662306a36Sopenharmony_ci	},
27762306a36Sopenharmony_ci};
27862306a36Sopenharmony_ci
27962306a36Sopenharmony_cistatic int __init mt76x8_pinctrl_init(void)
28062306a36Sopenharmony_ci{
28162306a36Sopenharmony_ci	return platform_driver_register(&mt76x8_pinctrl_driver);
28262306a36Sopenharmony_ci}
28362306a36Sopenharmony_cicore_initcall_sync(mt76x8_pinctrl_init);
284