18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci *
48c2ecf20Sopenharmony_ci * Parts of this file are based on Ralink's 2.6.21 BSP
58c2ecf20Sopenharmony_ci *
68c2ecf20Sopenharmony_ci * Copyright (C) 2008-2011 Gabor Juhos <juhosg@openwrt.org>
78c2ecf20Sopenharmony_ci * Copyright (C) 2008 Imre Kaloz <kaloz@openwrt.org>
88c2ecf20Sopenharmony_ci * Copyright (C) 2013 John Crispin <john@phrozen.org>
98c2ecf20Sopenharmony_ci */
108c2ecf20Sopenharmony_ci
118c2ecf20Sopenharmony_ci#include <linux/kernel.h>
128c2ecf20Sopenharmony_ci#include <linux/init.h>
138c2ecf20Sopenharmony_ci#include <linux/bug.h>
148c2ecf20Sopenharmony_ci
158c2ecf20Sopenharmony_ci#include <asm/mipsregs.h>
168c2ecf20Sopenharmony_ci#include <asm/mach-ralink/ralink_regs.h>
178c2ecf20Sopenharmony_ci#include <asm/mach-ralink/mt7620.h>
188c2ecf20Sopenharmony_ci#include <asm/mach-ralink/pinmux.h>
198c2ecf20Sopenharmony_ci
208c2ecf20Sopenharmony_ci#include "common.h"
218c2ecf20Sopenharmony_ci
228c2ecf20Sopenharmony_ci/* analog */
238c2ecf20Sopenharmony_ci#define PMU0_CFG		0x88
248c2ecf20Sopenharmony_ci#define PMU_SW_SET		BIT(28)
258c2ecf20Sopenharmony_ci#define A_DCDC_EN		BIT(24)
268c2ecf20Sopenharmony_ci#define A_SSC_PERI		BIT(19)
278c2ecf20Sopenharmony_ci#define A_SSC_GEN		BIT(18)
288c2ecf20Sopenharmony_ci#define A_SSC_M			0x3
298c2ecf20Sopenharmony_ci#define A_SSC_S			16
308c2ecf20Sopenharmony_ci#define A_DLY_M			0x7
318c2ecf20Sopenharmony_ci#define A_DLY_S			8
328c2ecf20Sopenharmony_ci#define A_VTUNE_M		0xff
338c2ecf20Sopenharmony_ci
348c2ecf20Sopenharmony_ci/* digital */
358c2ecf20Sopenharmony_ci#define PMU1_CFG		0x8C
368c2ecf20Sopenharmony_ci#define DIG_SW_SEL		BIT(25)
378c2ecf20Sopenharmony_ci
388c2ecf20Sopenharmony_ci/* clock scaling */
398c2ecf20Sopenharmony_ci#define CLKCFG_FDIV_MASK	0x1f00
408c2ecf20Sopenharmony_ci#define CLKCFG_FDIV_USB_VAL	0x0300
418c2ecf20Sopenharmony_ci#define CLKCFG_FFRAC_MASK	0x001f
428c2ecf20Sopenharmony_ci#define CLKCFG_FFRAC_USB_VAL	0x0003
438c2ecf20Sopenharmony_ci
448c2ecf20Sopenharmony_ci/* EFUSE bits */
458c2ecf20Sopenharmony_ci#define EFUSE_MT7688		0x100000
468c2ecf20Sopenharmony_ci
478c2ecf20Sopenharmony_ci/* DRAM type bit */
488c2ecf20Sopenharmony_ci#define DRAM_TYPE_MT7628_MASK	0x1
498c2ecf20Sopenharmony_ci
508c2ecf20Sopenharmony_ci/* does the board have sdram or ddram */
518c2ecf20Sopenharmony_cistatic int dram_type;
528c2ecf20Sopenharmony_ci
538c2ecf20Sopenharmony_cistatic struct rt2880_pmx_func i2c_grp[] =  { FUNC("i2c", 0, 1, 2) };
548c2ecf20Sopenharmony_cistatic struct rt2880_pmx_func spi_grp[] = { FUNC("spi", 0, 3, 4) };
558c2ecf20Sopenharmony_cistatic struct rt2880_pmx_func uartlite_grp[] = { FUNC("uartlite", 0, 15, 2) };
568c2ecf20Sopenharmony_cistatic struct rt2880_pmx_func mdio_grp[] = {
578c2ecf20Sopenharmony_ci	FUNC("mdio", MT7620_GPIO_MODE_MDIO, 22, 2),
588c2ecf20Sopenharmony_ci	FUNC("refclk", MT7620_GPIO_MODE_MDIO_REFCLK, 22, 2),
598c2ecf20Sopenharmony_ci};
608c2ecf20Sopenharmony_cistatic struct rt2880_pmx_func rgmii1_grp[] = { FUNC("rgmii1", 0, 24, 12) };
618c2ecf20Sopenharmony_cistatic struct rt2880_pmx_func refclk_grp[] = { FUNC("spi refclk", 0, 37, 3) };
628c2ecf20Sopenharmony_cistatic struct rt2880_pmx_func ephy_grp[] = { FUNC("ephy", 0, 40, 5) };
638c2ecf20Sopenharmony_cistatic struct rt2880_pmx_func rgmii2_grp[] = { FUNC("rgmii2", 0, 60, 12) };
648c2ecf20Sopenharmony_cistatic struct rt2880_pmx_func wled_grp[] = { FUNC("wled", 0, 72, 1) };
658c2ecf20Sopenharmony_cistatic struct rt2880_pmx_func pa_grp[] = { FUNC("pa", 0, 18, 4) };
668c2ecf20Sopenharmony_cistatic struct rt2880_pmx_func uartf_grp[] = {
678c2ecf20Sopenharmony_ci	FUNC("uartf", MT7620_GPIO_MODE_UARTF, 7, 8),
688c2ecf20Sopenharmony_ci	FUNC("pcm uartf", MT7620_GPIO_MODE_PCM_UARTF, 7, 8),
698c2ecf20Sopenharmony_ci	FUNC("pcm i2s", MT7620_GPIO_MODE_PCM_I2S, 7, 8),
708c2ecf20Sopenharmony_ci	FUNC("i2s uartf", MT7620_GPIO_MODE_I2S_UARTF, 7, 8),
718c2ecf20Sopenharmony_ci	FUNC("pcm gpio", MT7620_GPIO_MODE_PCM_GPIO, 11, 4),
728c2ecf20Sopenharmony_ci	FUNC("gpio uartf", MT7620_GPIO_MODE_GPIO_UARTF, 7, 4),
738c2ecf20Sopenharmony_ci	FUNC("gpio i2s", MT7620_GPIO_MODE_GPIO_I2S, 7, 4),
748c2ecf20Sopenharmony_ci};
758c2ecf20Sopenharmony_cistatic struct rt2880_pmx_func wdt_grp[] = {
768c2ecf20Sopenharmony_ci	FUNC("wdt rst", 0, 17, 1),
778c2ecf20Sopenharmony_ci	FUNC("wdt refclk", 0, 17, 1),
788c2ecf20Sopenharmony_ci	};
798c2ecf20Sopenharmony_cistatic struct rt2880_pmx_func pcie_rst_grp[] = {
808c2ecf20Sopenharmony_ci	FUNC("pcie rst", MT7620_GPIO_MODE_PCIE_RST, 36, 1),
818c2ecf20Sopenharmony_ci	FUNC("pcie refclk", MT7620_GPIO_MODE_PCIE_REF, 36, 1)
828c2ecf20Sopenharmony_ci};
838c2ecf20Sopenharmony_cistatic struct rt2880_pmx_func nd_sd_grp[] = {
848c2ecf20Sopenharmony_ci	FUNC("nand", MT7620_GPIO_MODE_NAND, 45, 15),
858c2ecf20Sopenharmony_ci	FUNC("sd", MT7620_GPIO_MODE_SD, 47, 13)
868c2ecf20Sopenharmony_ci};
878c2ecf20Sopenharmony_ci
888c2ecf20Sopenharmony_cistatic struct rt2880_pmx_group mt7620a_pinmux_data[] = {
898c2ecf20Sopenharmony_ci	GRP("i2c", i2c_grp, 1, MT7620_GPIO_MODE_I2C),
908c2ecf20Sopenharmony_ci	GRP("uartf", uartf_grp, MT7620_GPIO_MODE_UART0_MASK,
918c2ecf20Sopenharmony_ci		MT7620_GPIO_MODE_UART0_SHIFT),
928c2ecf20Sopenharmony_ci	GRP("spi", spi_grp, 1, MT7620_GPIO_MODE_SPI),
938c2ecf20Sopenharmony_ci	GRP("uartlite", uartlite_grp, 1, MT7620_GPIO_MODE_UART1),
948c2ecf20Sopenharmony_ci	GRP_G("wdt", wdt_grp, MT7620_GPIO_MODE_WDT_MASK,
958c2ecf20Sopenharmony_ci		MT7620_GPIO_MODE_WDT_GPIO, MT7620_GPIO_MODE_WDT_SHIFT),
968c2ecf20Sopenharmony_ci	GRP_G("mdio", mdio_grp, MT7620_GPIO_MODE_MDIO_MASK,
978c2ecf20Sopenharmony_ci		MT7620_GPIO_MODE_MDIO_GPIO, MT7620_GPIO_MODE_MDIO_SHIFT),
988c2ecf20Sopenharmony_ci	GRP("rgmii1", rgmii1_grp, 1, MT7620_GPIO_MODE_RGMII1),
998c2ecf20Sopenharmony_ci	GRP("spi refclk", refclk_grp, 1, MT7620_GPIO_MODE_SPI_REF_CLK),
1008c2ecf20Sopenharmony_ci	GRP_G("pcie", pcie_rst_grp, MT7620_GPIO_MODE_PCIE_MASK,
1018c2ecf20Sopenharmony_ci		MT7620_GPIO_MODE_PCIE_GPIO, MT7620_GPIO_MODE_PCIE_SHIFT),
1028c2ecf20Sopenharmony_ci	GRP_G("nd_sd", nd_sd_grp, MT7620_GPIO_MODE_ND_SD_MASK,
1038c2ecf20Sopenharmony_ci		MT7620_GPIO_MODE_ND_SD_GPIO, MT7620_GPIO_MODE_ND_SD_SHIFT),
1048c2ecf20Sopenharmony_ci	GRP("rgmii2", rgmii2_grp, 1, MT7620_GPIO_MODE_RGMII2),
1058c2ecf20Sopenharmony_ci	GRP("wled", wled_grp, 1, MT7620_GPIO_MODE_WLED),
1068c2ecf20Sopenharmony_ci	GRP("ephy", ephy_grp, 1, MT7620_GPIO_MODE_EPHY),
1078c2ecf20Sopenharmony_ci	GRP("pa", pa_grp, 1, MT7620_GPIO_MODE_PA),
1088c2ecf20Sopenharmony_ci	{ 0 }
1098c2ecf20Sopenharmony_ci};
1108c2ecf20Sopenharmony_ci
1118c2ecf20Sopenharmony_cistatic struct rt2880_pmx_func pwm1_grp_mt7628[] = {
1128c2ecf20Sopenharmony_ci	FUNC("sdxc d6", 3, 19, 1),
1138c2ecf20Sopenharmony_ci	FUNC("utif", 2, 19, 1),
1148c2ecf20Sopenharmony_ci	FUNC("gpio", 1, 19, 1),
1158c2ecf20Sopenharmony_ci	FUNC("pwm1", 0, 19, 1),
1168c2ecf20Sopenharmony_ci};
1178c2ecf20Sopenharmony_ci
1188c2ecf20Sopenharmony_cistatic struct rt2880_pmx_func pwm0_grp_mt7628[] = {
1198c2ecf20Sopenharmony_ci	FUNC("sdxc d7", 3, 18, 1),
1208c2ecf20Sopenharmony_ci	FUNC("utif", 2, 18, 1),
1218c2ecf20Sopenharmony_ci	FUNC("gpio", 1, 18, 1),
1228c2ecf20Sopenharmony_ci	FUNC("pwm0", 0, 18, 1),
1238c2ecf20Sopenharmony_ci};
1248c2ecf20Sopenharmony_ci
1258c2ecf20Sopenharmony_cistatic struct rt2880_pmx_func uart2_grp_mt7628[] = {
1268c2ecf20Sopenharmony_ci	FUNC("sdxc d5 d4", 3, 20, 2),
1278c2ecf20Sopenharmony_ci	FUNC("pwm", 2, 20, 2),
1288c2ecf20Sopenharmony_ci	FUNC("gpio", 1, 20, 2),
1298c2ecf20Sopenharmony_ci	FUNC("uart2", 0, 20, 2),
1308c2ecf20Sopenharmony_ci};
1318c2ecf20Sopenharmony_ci
1328c2ecf20Sopenharmony_cistatic struct rt2880_pmx_func uart1_grp_mt7628[] = {
1338c2ecf20Sopenharmony_ci	FUNC("sw_r", 3, 45, 2),
1348c2ecf20Sopenharmony_ci	FUNC("pwm", 2, 45, 2),
1358c2ecf20Sopenharmony_ci	FUNC("gpio", 1, 45, 2),
1368c2ecf20Sopenharmony_ci	FUNC("uart1", 0, 45, 2),
1378c2ecf20Sopenharmony_ci};
1388c2ecf20Sopenharmony_ci
1398c2ecf20Sopenharmony_cistatic struct rt2880_pmx_func i2c_grp_mt7628[] = {
1408c2ecf20Sopenharmony_ci	FUNC("-", 3, 4, 2),
1418c2ecf20Sopenharmony_ci	FUNC("debug", 2, 4, 2),
1428c2ecf20Sopenharmony_ci	FUNC("gpio", 1, 4, 2),
1438c2ecf20Sopenharmony_ci	FUNC("i2c", 0, 4, 2),
1448c2ecf20Sopenharmony_ci};
1458c2ecf20Sopenharmony_ci
1468c2ecf20Sopenharmony_cistatic struct rt2880_pmx_func refclk_grp_mt7628[] = { FUNC("refclk", 0, 37, 1) };
1478c2ecf20Sopenharmony_cistatic struct rt2880_pmx_func perst_grp_mt7628[] = { FUNC("perst", 0, 36, 1) };
1488c2ecf20Sopenharmony_cistatic struct rt2880_pmx_func wdt_grp_mt7628[] = { FUNC("wdt", 0, 38, 1) };
1498c2ecf20Sopenharmony_cistatic struct rt2880_pmx_func spi_grp_mt7628[] = { FUNC("spi", 0, 7, 4) };
1508c2ecf20Sopenharmony_ci
1518c2ecf20Sopenharmony_cistatic struct rt2880_pmx_func sd_mode_grp_mt7628[] = {
1528c2ecf20Sopenharmony_ci	FUNC("jtag", 3, 22, 8),
1538c2ecf20Sopenharmony_ci	FUNC("utif", 2, 22, 8),
1548c2ecf20Sopenharmony_ci	FUNC("gpio", 1, 22, 8),
1558c2ecf20Sopenharmony_ci	FUNC("sdxc", 0, 22, 8),
1568c2ecf20Sopenharmony_ci};
1578c2ecf20Sopenharmony_ci
1588c2ecf20Sopenharmony_cistatic struct rt2880_pmx_func uart0_grp_mt7628[] = {
1598c2ecf20Sopenharmony_ci	FUNC("-", 3, 12, 2),
1608c2ecf20Sopenharmony_ci	FUNC("-", 2, 12, 2),
1618c2ecf20Sopenharmony_ci	FUNC("gpio", 1, 12, 2),
1628c2ecf20Sopenharmony_ci	FUNC("uart0", 0, 12, 2),
1638c2ecf20Sopenharmony_ci};
1648c2ecf20Sopenharmony_ci
1658c2ecf20Sopenharmony_cistatic struct rt2880_pmx_func i2s_grp_mt7628[] = {
1668c2ecf20Sopenharmony_ci	FUNC("antenna", 3, 0, 4),
1678c2ecf20Sopenharmony_ci	FUNC("pcm", 2, 0, 4),
1688c2ecf20Sopenharmony_ci	FUNC("gpio", 1, 0, 4),
1698c2ecf20Sopenharmony_ci	FUNC("i2s", 0, 0, 4),
1708c2ecf20Sopenharmony_ci};
1718c2ecf20Sopenharmony_ci
1728c2ecf20Sopenharmony_cistatic struct rt2880_pmx_func spi_cs1_grp_mt7628[] = {
1738c2ecf20Sopenharmony_ci	FUNC("-", 3, 6, 1),
1748c2ecf20Sopenharmony_ci	FUNC("refclk", 2, 6, 1),
1758c2ecf20Sopenharmony_ci	FUNC("gpio", 1, 6, 1),
1768c2ecf20Sopenharmony_ci	FUNC("spi cs1", 0, 6, 1),
1778c2ecf20Sopenharmony_ci};
1788c2ecf20Sopenharmony_ci
1798c2ecf20Sopenharmony_cistatic struct rt2880_pmx_func spis_grp_mt7628[] = {
1808c2ecf20Sopenharmony_ci	FUNC("pwm_uart2", 3, 14, 4),
1818c2ecf20Sopenharmony_ci	FUNC("utif", 2, 14, 4),
1828c2ecf20Sopenharmony_ci	FUNC("gpio", 1, 14, 4),
1838c2ecf20Sopenharmony_ci	FUNC("spis", 0, 14, 4),
1848c2ecf20Sopenharmony_ci};
1858c2ecf20Sopenharmony_ci
1868c2ecf20Sopenharmony_cistatic struct rt2880_pmx_func gpio_grp_mt7628[] = {
1878c2ecf20Sopenharmony_ci	FUNC("pcie", 3, 11, 1),
1888c2ecf20Sopenharmony_ci	FUNC("refclk", 2, 11, 1),
1898c2ecf20Sopenharmony_ci	FUNC("gpio", 1, 11, 1),
1908c2ecf20Sopenharmony_ci	FUNC("gpio", 0, 11, 1),
1918c2ecf20Sopenharmony_ci};
1928c2ecf20Sopenharmony_ci
1938c2ecf20Sopenharmony_cistatic struct rt2880_pmx_func p4led_kn_grp_mt7628[] = {
1948c2ecf20Sopenharmony_ci	FUNC("jtag", 3, 30, 1),
1958c2ecf20Sopenharmony_ci	FUNC("utif", 2, 30, 1),
1968c2ecf20Sopenharmony_ci	FUNC("gpio", 1, 30, 1),
1978c2ecf20Sopenharmony_ci	FUNC("p4led_kn", 0, 30, 1),
1988c2ecf20Sopenharmony_ci};
1998c2ecf20Sopenharmony_ci
2008c2ecf20Sopenharmony_cistatic struct rt2880_pmx_func p3led_kn_grp_mt7628[] = {
2018c2ecf20Sopenharmony_ci	FUNC("jtag", 3, 31, 1),
2028c2ecf20Sopenharmony_ci	FUNC("utif", 2, 31, 1),
2038c2ecf20Sopenharmony_ci	FUNC("gpio", 1, 31, 1),
2048c2ecf20Sopenharmony_ci	FUNC("p3led_kn", 0, 31, 1),
2058c2ecf20Sopenharmony_ci};
2068c2ecf20Sopenharmony_ci
2078c2ecf20Sopenharmony_cistatic struct rt2880_pmx_func p2led_kn_grp_mt7628[] = {
2088c2ecf20Sopenharmony_ci	FUNC("jtag", 3, 32, 1),
2098c2ecf20Sopenharmony_ci	FUNC("utif", 2, 32, 1),
2108c2ecf20Sopenharmony_ci	FUNC("gpio", 1, 32, 1),
2118c2ecf20Sopenharmony_ci	FUNC("p2led_kn", 0, 32, 1),
2128c2ecf20Sopenharmony_ci};
2138c2ecf20Sopenharmony_ci
2148c2ecf20Sopenharmony_cistatic struct rt2880_pmx_func p1led_kn_grp_mt7628[] = {
2158c2ecf20Sopenharmony_ci	FUNC("jtag", 3, 33, 1),
2168c2ecf20Sopenharmony_ci	FUNC("utif", 2, 33, 1),
2178c2ecf20Sopenharmony_ci	FUNC("gpio", 1, 33, 1),
2188c2ecf20Sopenharmony_ci	FUNC("p1led_kn", 0, 33, 1),
2198c2ecf20Sopenharmony_ci};
2208c2ecf20Sopenharmony_ci
2218c2ecf20Sopenharmony_cistatic struct rt2880_pmx_func p0led_kn_grp_mt7628[] = {
2228c2ecf20Sopenharmony_ci	FUNC("jtag", 3, 34, 1),
2238c2ecf20Sopenharmony_ci	FUNC("rsvd", 2, 34, 1),
2248c2ecf20Sopenharmony_ci	FUNC("gpio", 1, 34, 1),
2258c2ecf20Sopenharmony_ci	FUNC("p0led_kn", 0, 34, 1),
2268c2ecf20Sopenharmony_ci};
2278c2ecf20Sopenharmony_ci
2288c2ecf20Sopenharmony_cistatic struct rt2880_pmx_func wled_kn_grp_mt7628[] = {
2298c2ecf20Sopenharmony_ci	FUNC("rsvd", 3, 35, 1),
2308c2ecf20Sopenharmony_ci	FUNC("rsvd", 2, 35, 1),
2318c2ecf20Sopenharmony_ci	FUNC("gpio", 1, 35, 1),
2328c2ecf20Sopenharmony_ci	FUNC("wled_kn", 0, 35, 1),
2338c2ecf20Sopenharmony_ci};
2348c2ecf20Sopenharmony_ci
2358c2ecf20Sopenharmony_cistatic struct rt2880_pmx_func p4led_an_grp_mt7628[] = {
2368c2ecf20Sopenharmony_ci	FUNC("jtag", 3, 39, 1),
2378c2ecf20Sopenharmony_ci	FUNC("utif", 2, 39, 1),
2388c2ecf20Sopenharmony_ci	FUNC("gpio", 1, 39, 1),
2398c2ecf20Sopenharmony_ci	FUNC("p4led_an", 0, 39, 1),
2408c2ecf20Sopenharmony_ci};
2418c2ecf20Sopenharmony_ci
2428c2ecf20Sopenharmony_cistatic struct rt2880_pmx_func p3led_an_grp_mt7628[] = {
2438c2ecf20Sopenharmony_ci	FUNC("jtag", 3, 40, 1),
2448c2ecf20Sopenharmony_ci	FUNC("utif", 2, 40, 1),
2458c2ecf20Sopenharmony_ci	FUNC("gpio", 1, 40, 1),
2468c2ecf20Sopenharmony_ci	FUNC("p3led_an", 0, 40, 1),
2478c2ecf20Sopenharmony_ci};
2488c2ecf20Sopenharmony_ci
2498c2ecf20Sopenharmony_cistatic struct rt2880_pmx_func p2led_an_grp_mt7628[] = {
2508c2ecf20Sopenharmony_ci	FUNC("jtag", 3, 41, 1),
2518c2ecf20Sopenharmony_ci	FUNC("utif", 2, 41, 1),
2528c2ecf20Sopenharmony_ci	FUNC("gpio", 1, 41, 1),
2538c2ecf20Sopenharmony_ci	FUNC("p2led_an", 0, 41, 1),
2548c2ecf20Sopenharmony_ci};
2558c2ecf20Sopenharmony_ci
2568c2ecf20Sopenharmony_cistatic struct rt2880_pmx_func p1led_an_grp_mt7628[] = {
2578c2ecf20Sopenharmony_ci	FUNC("jtag", 3, 42, 1),
2588c2ecf20Sopenharmony_ci	FUNC("utif", 2, 42, 1),
2598c2ecf20Sopenharmony_ci	FUNC("gpio", 1, 42, 1),
2608c2ecf20Sopenharmony_ci	FUNC("p1led_an", 0, 42, 1),
2618c2ecf20Sopenharmony_ci};
2628c2ecf20Sopenharmony_ci
2638c2ecf20Sopenharmony_cistatic struct rt2880_pmx_func p0led_an_grp_mt7628[] = {
2648c2ecf20Sopenharmony_ci	FUNC("jtag", 3, 43, 1),
2658c2ecf20Sopenharmony_ci	FUNC("rsvd", 2, 43, 1),
2668c2ecf20Sopenharmony_ci	FUNC("gpio", 1, 43, 1),
2678c2ecf20Sopenharmony_ci	FUNC("p0led_an", 0, 43, 1),
2688c2ecf20Sopenharmony_ci};
2698c2ecf20Sopenharmony_ci
2708c2ecf20Sopenharmony_cistatic struct rt2880_pmx_func wled_an_grp_mt7628[] = {
2718c2ecf20Sopenharmony_ci	FUNC("rsvd", 3, 44, 1),
2728c2ecf20Sopenharmony_ci	FUNC("rsvd", 2, 44, 1),
2738c2ecf20Sopenharmony_ci	FUNC("gpio", 1, 44, 1),
2748c2ecf20Sopenharmony_ci	FUNC("wled_an", 0, 44, 1),
2758c2ecf20Sopenharmony_ci};
2768c2ecf20Sopenharmony_ci
2778c2ecf20Sopenharmony_ci#define MT7628_GPIO_MODE_MASK		0x3
2788c2ecf20Sopenharmony_ci
2798c2ecf20Sopenharmony_ci#define MT7628_GPIO_MODE_P4LED_KN	58
2808c2ecf20Sopenharmony_ci#define MT7628_GPIO_MODE_P3LED_KN	56
2818c2ecf20Sopenharmony_ci#define MT7628_GPIO_MODE_P2LED_KN	54
2828c2ecf20Sopenharmony_ci#define MT7628_GPIO_MODE_P1LED_KN	52
2838c2ecf20Sopenharmony_ci#define MT7628_GPIO_MODE_P0LED_KN	50
2848c2ecf20Sopenharmony_ci#define MT7628_GPIO_MODE_WLED_KN	48
2858c2ecf20Sopenharmony_ci#define MT7628_GPIO_MODE_P4LED_AN	42
2868c2ecf20Sopenharmony_ci#define MT7628_GPIO_MODE_P3LED_AN	40
2878c2ecf20Sopenharmony_ci#define MT7628_GPIO_MODE_P2LED_AN	38
2888c2ecf20Sopenharmony_ci#define MT7628_GPIO_MODE_P1LED_AN	36
2898c2ecf20Sopenharmony_ci#define MT7628_GPIO_MODE_P0LED_AN	34
2908c2ecf20Sopenharmony_ci#define MT7628_GPIO_MODE_WLED_AN	32
2918c2ecf20Sopenharmony_ci#define MT7628_GPIO_MODE_PWM1		30
2928c2ecf20Sopenharmony_ci#define MT7628_GPIO_MODE_PWM0		28
2938c2ecf20Sopenharmony_ci#define MT7628_GPIO_MODE_UART2		26
2948c2ecf20Sopenharmony_ci#define MT7628_GPIO_MODE_UART1		24
2958c2ecf20Sopenharmony_ci#define MT7628_GPIO_MODE_I2C		20
2968c2ecf20Sopenharmony_ci#define MT7628_GPIO_MODE_REFCLK		18
2978c2ecf20Sopenharmony_ci#define MT7628_GPIO_MODE_PERST		16
2988c2ecf20Sopenharmony_ci#define MT7628_GPIO_MODE_WDT		14
2998c2ecf20Sopenharmony_ci#define MT7628_GPIO_MODE_SPI		12
3008c2ecf20Sopenharmony_ci#define MT7628_GPIO_MODE_SDMODE		10
3018c2ecf20Sopenharmony_ci#define MT7628_GPIO_MODE_UART0		8
3028c2ecf20Sopenharmony_ci#define MT7628_GPIO_MODE_I2S		6
3038c2ecf20Sopenharmony_ci#define MT7628_GPIO_MODE_CS1		4
3048c2ecf20Sopenharmony_ci#define MT7628_GPIO_MODE_SPIS		2
3058c2ecf20Sopenharmony_ci#define MT7628_GPIO_MODE_GPIO		0
3068c2ecf20Sopenharmony_ci
3078c2ecf20Sopenharmony_cistatic struct rt2880_pmx_group mt7628an_pinmux_data[] = {
3088c2ecf20Sopenharmony_ci	GRP_G("pwm1", pwm1_grp_mt7628, MT7628_GPIO_MODE_MASK,
3098c2ecf20Sopenharmony_ci				1, MT7628_GPIO_MODE_PWM1),
3108c2ecf20Sopenharmony_ci	GRP_G("pwm0", pwm0_grp_mt7628, MT7628_GPIO_MODE_MASK,
3118c2ecf20Sopenharmony_ci				1, MT7628_GPIO_MODE_PWM0),
3128c2ecf20Sopenharmony_ci	GRP_G("uart2", uart2_grp_mt7628, MT7628_GPIO_MODE_MASK,
3138c2ecf20Sopenharmony_ci				1, MT7628_GPIO_MODE_UART2),
3148c2ecf20Sopenharmony_ci	GRP_G("uart1", uart1_grp_mt7628, MT7628_GPIO_MODE_MASK,
3158c2ecf20Sopenharmony_ci				1, MT7628_GPIO_MODE_UART1),
3168c2ecf20Sopenharmony_ci	GRP_G("i2c", i2c_grp_mt7628, MT7628_GPIO_MODE_MASK,
3178c2ecf20Sopenharmony_ci				1, MT7628_GPIO_MODE_I2C),
3188c2ecf20Sopenharmony_ci	GRP("refclk", refclk_grp_mt7628, 1, MT7628_GPIO_MODE_REFCLK),
3198c2ecf20Sopenharmony_ci	GRP("perst", perst_grp_mt7628, 1, MT7628_GPIO_MODE_PERST),
3208c2ecf20Sopenharmony_ci	GRP("wdt", wdt_grp_mt7628, 1, MT7628_GPIO_MODE_WDT),
3218c2ecf20Sopenharmony_ci	GRP("spi", spi_grp_mt7628, 1, MT7628_GPIO_MODE_SPI),
3228c2ecf20Sopenharmony_ci	GRP_G("sdmode", sd_mode_grp_mt7628, MT7628_GPIO_MODE_MASK,
3238c2ecf20Sopenharmony_ci				1, MT7628_GPIO_MODE_SDMODE),
3248c2ecf20Sopenharmony_ci	GRP_G("uart0", uart0_grp_mt7628, MT7628_GPIO_MODE_MASK,
3258c2ecf20Sopenharmony_ci				1, MT7628_GPIO_MODE_UART0),
3268c2ecf20Sopenharmony_ci	GRP_G("i2s", i2s_grp_mt7628, MT7628_GPIO_MODE_MASK,
3278c2ecf20Sopenharmony_ci				1, MT7628_GPIO_MODE_I2S),
3288c2ecf20Sopenharmony_ci	GRP_G("spi cs1", spi_cs1_grp_mt7628, MT7628_GPIO_MODE_MASK,
3298c2ecf20Sopenharmony_ci				1, MT7628_GPIO_MODE_CS1),
3308c2ecf20Sopenharmony_ci	GRP_G("spis", spis_grp_mt7628, MT7628_GPIO_MODE_MASK,
3318c2ecf20Sopenharmony_ci				1, MT7628_GPIO_MODE_SPIS),
3328c2ecf20Sopenharmony_ci	GRP_G("gpio", gpio_grp_mt7628, MT7628_GPIO_MODE_MASK,
3338c2ecf20Sopenharmony_ci				1, MT7628_GPIO_MODE_GPIO),
3348c2ecf20Sopenharmony_ci	GRP_G("wled_an", wled_an_grp_mt7628, MT7628_GPIO_MODE_MASK,
3358c2ecf20Sopenharmony_ci				1, MT7628_GPIO_MODE_WLED_AN),
3368c2ecf20Sopenharmony_ci	GRP_G("p0led_an", p0led_an_grp_mt7628, MT7628_GPIO_MODE_MASK,
3378c2ecf20Sopenharmony_ci				1, MT7628_GPIO_MODE_P0LED_AN),
3388c2ecf20Sopenharmony_ci	GRP_G("p1led_an", p1led_an_grp_mt7628, MT7628_GPIO_MODE_MASK,
3398c2ecf20Sopenharmony_ci				1, MT7628_GPIO_MODE_P1LED_AN),
3408c2ecf20Sopenharmony_ci	GRP_G("p2led_an", p2led_an_grp_mt7628, MT7628_GPIO_MODE_MASK,
3418c2ecf20Sopenharmony_ci				1, MT7628_GPIO_MODE_P2LED_AN),
3428c2ecf20Sopenharmony_ci	GRP_G("p3led_an", p3led_an_grp_mt7628, MT7628_GPIO_MODE_MASK,
3438c2ecf20Sopenharmony_ci				1, MT7628_GPIO_MODE_P3LED_AN),
3448c2ecf20Sopenharmony_ci	GRP_G("p4led_an", p4led_an_grp_mt7628, MT7628_GPIO_MODE_MASK,
3458c2ecf20Sopenharmony_ci				1, MT7628_GPIO_MODE_P4LED_AN),
3468c2ecf20Sopenharmony_ci	GRP_G("wled_kn", wled_kn_grp_mt7628, MT7628_GPIO_MODE_MASK,
3478c2ecf20Sopenharmony_ci				1, MT7628_GPIO_MODE_WLED_KN),
3488c2ecf20Sopenharmony_ci	GRP_G("p0led_kn", p0led_kn_grp_mt7628, MT7628_GPIO_MODE_MASK,
3498c2ecf20Sopenharmony_ci				1, MT7628_GPIO_MODE_P0LED_KN),
3508c2ecf20Sopenharmony_ci	GRP_G("p1led_kn", p1led_kn_grp_mt7628, MT7628_GPIO_MODE_MASK,
3518c2ecf20Sopenharmony_ci				1, MT7628_GPIO_MODE_P1LED_KN),
3528c2ecf20Sopenharmony_ci	GRP_G("p2led_kn", p2led_kn_grp_mt7628, MT7628_GPIO_MODE_MASK,
3538c2ecf20Sopenharmony_ci				1, MT7628_GPIO_MODE_P2LED_KN),
3548c2ecf20Sopenharmony_ci	GRP_G("p3led_kn", p3led_kn_grp_mt7628, MT7628_GPIO_MODE_MASK,
3558c2ecf20Sopenharmony_ci				1, MT7628_GPIO_MODE_P3LED_KN),
3568c2ecf20Sopenharmony_ci	GRP_G("p4led_kn", p4led_kn_grp_mt7628, MT7628_GPIO_MODE_MASK,
3578c2ecf20Sopenharmony_ci				1, MT7628_GPIO_MODE_P4LED_KN),
3588c2ecf20Sopenharmony_ci	{ 0 }
3598c2ecf20Sopenharmony_ci};
3608c2ecf20Sopenharmony_ci
3618c2ecf20Sopenharmony_cistatic inline int is_mt76x8(void)
3628c2ecf20Sopenharmony_ci{
3638c2ecf20Sopenharmony_ci	return ralink_soc == MT762X_SOC_MT7628AN ||
3648c2ecf20Sopenharmony_ci	       ralink_soc == MT762X_SOC_MT7688;
3658c2ecf20Sopenharmony_ci}
3668c2ecf20Sopenharmony_ci
3678c2ecf20Sopenharmony_cistatic __init u32
3688c2ecf20Sopenharmony_cimt7620_calc_rate(u32 ref_rate, u32 mul, u32 div)
3698c2ecf20Sopenharmony_ci{
3708c2ecf20Sopenharmony_ci	u64 t;
3718c2ecf20Sopenharmony_ci
3728c2ecf20Sopenharmony_ci	t = ref_rate;
3738c2ecf20Sopenharmony_ci	t *= mul;
3748c2ecf20Sopenharmony_ci	do_div(t, div);
3758c2ecf20Sopenharmony_ci
3768c2ecf20Sopenharmony_ci	return t;
3778c2ecf20Sopenharmony_ci}
3788c2ecf20Sopenharmony_ci
3798c2ecf20Sopenharmony_ci#define MHZ(x)		((x) * 1000 * 1000)
3808c2ecf20Sopenharmony_ci
3818c2ecf20Sopenharmony_cistatic __init unsigned long
3828c2ecf20Sopenharmony_cimt7620_get_xtal_rate(void)
3838c2ecf20Sopenharmony_ci{
3848c2ecf20Sopenharmony_ci	u32 reg;
3858c2ecf20Sopenharmony_ci
3868c2ecf20Sopenharmony_ci	reg = rt_sysc_r32(SYSC_REG_SYSTEM_CONFIG0);
3878c2ecf20Sopenharmony_ci	if (reg & SYSCFG0_XTAL_FREQ_SEL)
3888c2ecf20Sopenharmony_ci		return MHZ(40);
3898c2ecf20Sopenharmony_ci
3908c2ecf20Sopenharmony_ci	return MHZ(20);
3918c2ecf20Sopenharmony_ci}
3928c2ecf20Sopenharmony_ci
3938c2ecf20Sopenharmony_cistatic __init unsigned long
3948c2ecf20Sopenharmony_cimt7620_get_periph_rate(unsigned long xtal_rate)
3958c2ecf20Sopenharmony_ci{
3968c2ecf20Sopenharmony_ci	u32 reg;
3978c2ecf20Sopenharmony_ci
3988c2ecf20Sopenharmony_ci	reg = rt_sysc_r32(SYSC_REG_CLKCFG0);
3998c2ecf20Sopenharmony_ci	if (reg & CLKCFG0_PERI_CLK_SEL)
4008c2ecf20Sopenharmony_ci		return xtal_rate;
4018c2ecf20Sopenharmony_ci
4028c2ecf20Sopenharmony_ci	return MHZ(40);
4038c2ecf20Sopenharmony_ci}
4048c2ecf20Sopenharmony_ci
4058c2ecf20Sopenharmony_cistatic const u32 mt7620_clk_divider[] __initconst = { 2, 3, 4, 8 };
4068c2ecf20Sopenharmony_ci
4078c2ecf20Sopenharmony_cistatic __init unsigned long
4088c2ecf20Sopenharmony_cimt7620_get_cpu_pll_rate(unsigned long xtal_rate)
4098c2ecf20Sopenharmony_ci{
4108c2ecf20Sopenharmony_ci	u32 reg;
4118c2ecf20Sopenharmony_ci	u32 mul;
4128c2ecf20Sopenharmony_ci	u32 div;
4138c2ecf20Sopenharmony_ci
4148c2ecf20Sopenharmony_ci	reg = rt_sysc_r32(SYSC_REG_CPLL_CONFIG0);
4158c2ecf20Sopenharmony_ci	if (reg & CPLL_CFG0_BYPASS_REF_CLK)
4168c2ecf20Sopenharmony_ci		return xtal_rate;
4178c2ecf20Sopenharmony_ci
4188c2ecf20Sopenharmony_ci	if ((reg & CPLL_CFG0_SW_CFG) == 0)
4198c2ecf20Sopenharmony_ci		return MHZ(600);
4208c2ecf20Sopenharmony_ci
4218c2ecf20Sopenharmony_ci	mul = (reg >> CPLL_CFG0_PLL_MULT_RATIO_SHIFT) &
4228c2ecf20Sopenharmony_ci	      CPLL_CFG0_PLL_MULT_RATIO_MASK;
4238c2ecf20Sopenharmony_ci	mul += 24;
4248c2ecf20Sopenharmony_ci	if (reg & CPLL_CFG0_LC_CURFCK)
4258c2ecf20Sopenharmony_ci		mul *= 2;
4268c2ecf20Sopenharmony_ci
4278c2ecf20Sopenharmony_ci	div = (reg >> CPLL_CFG0_PLL_DIV_RATIO_SHIFT) &
4288c2ecf20Sopenharmony_ci	      CPLL_CFG0_PLL_DIV_RATIO_MASK;
4298c2ecf20Sopenharmony_ci
4308c2ecf20Sopenharmony_ci	WARN_ON(div >= ARRAY_SIZE(mt7620_clk_divider));
4318c2ecf20Sopenharmony_ci
4328c2ecf20Sopenharmony_ci	return mt7620_calc_rate(xtal_rate, mul, mt7620_clk_divider[div]);
4338c2ecf20Sopenharmony_ci}
4348c2ecf20Sopenharmony_ci
4358c2ecf20Sopenharmony_cistatic __init unsigned long
4368c2ecf20Sopenharmony_cimt7620_get_pll_rate(unsigned long xtal_rate, unsigned long cpu_pll_rate)
4378c2ecf20Sopenharmony_ci{
4388c2ecf20Sopenharmony_ci	u32 reg;
4398c2ecf20Sopenharmony_ci
4408c2ecf20Sopenharmony_ci	reg = rt_sysc_r32(SYSC_REG_CPLL_CONFIG1);
4418c2ecf20Sopenharmony_ci	if (reg & CPLL_CFG1_CPU_AUX1)
4428c2ecf20Sopenharmony_ci		return xtal_rate;
4438c2ecf20Sopenharmony_ci
4448c2ecf20Sopenharmony_ci	if (reg & CPLL_CFG1_CPU_AUX0)
4458c2ecf20Sopenharmony_ci		return MHZ(480);
4468c2ecf20Sopenharmony_ci
4478c2ecf20Sopenharmony_ci	return cpu_pll_rate;
4488c2ecf20Sopenharmony_ci}
4498c2ecf20Sopenharmony_ci
4508c2ecf20Sopenharmony_cistatic __init unsigned long
4518c2ecf20Sopenharmony_cimt7620_get_cpu_rate(unsigned long pll_rate)
4528c2ecf20Sopenharmony_ci{
4538c2ecf20Sopenharmony_ci	u32 reg;
4548c2ecf20Sopenharmony_ci	u32 mul;
4558c2ecf20Sopenharmony_ci	u32 div;
4568c2ecf20Sopenharmony_ci
4578c2ecf20Sopenharmony_ci	reg = rt_sysc_r32(SYSC_REG_CPU_SYS_CLKCFG);
4588c2ecf20Sopenharmony_ci
4598c2ecf20Sopenharmony_ci	mul = reg & CPU_SYS_CLKCFG_CPU_FFRAC_MASK;
4608c2ecf20Sopenharmony_ci	div = (reg >> CPU_SYS_CLKCFG_CPU_FDIV_SHIFT) &
4618c2ecf20Sopenharmony_ci	      CPU_SYS_CLKCFG_CPU_FDIV_MASK;
4628c2ecf20Sopenharmony_ci
4638c2ecf20Sopenharmony_ci	return mt7620_calc_rate(pll_rate, mul, div);
4648c2ecf20Sopenharmony_ci}
4658c2ecf20Sopenharmony_ci
4668c2ecf20Sopenharmony_cistatic const u32 mt7620_ocp_dividers[16] __initconst = {
4678c2ecf20Sopenharmony_ci	[CPU_SYS_CLKCFG_OCP_RATIO_2] = 2,
4688c2ecf20Sopenharmony_ci	[CPU_SYS_CLKCFG_OCP_RATIO_3] = 3,
4698c2ecf20Sopenharmony_ci	[CPU_SYS_CLKCFG_OCP_RATIO_4] = 4,
4708c2ecf20Sopenharmony_ci	[CPU_SYS_CLKCFG_OCP_RATIO_5] = 5,
4718c2ecf20Sopenharmony_ci	[CPU_SYS_CLKCFG_OCP_RATIO_10] = 10,
4728c2ecf20Sopenharmony_ci};
4738c2ecf20Sopenharmony_ci
4748c2ecf20Sopenharmony_cistatic __init unsigned long
4758c2ecf20Sopenharmony_cimt7620_get_dram_rate(unsigned long pll_rate)
4768c2ecf20Sopenharmony_ci{
4778c2ecf20Sopenharmony_ci	if (dram_type == SYSCFG0_DRAM_TYPE_SDRAM)
4788c2ecf20Sopenharmony_ci		return pll_rate / 4;
4798c2ecf20Sopenharmony_ci
4808c2ecf20Sopenharmony_ci	return pll_rate / 3;
4818c2ecf20Sopenharmony_ci}
4828c2ecf20Sopenharmony_ci
4838c2ecf20Sopenharmony_cistatic __init unsigned long
4848c2ecf20Sopenharmony_cimt7620_get_sys_rate(unsigned long cpu_rate)
4858c2ecf20Sopenharmony_ci{
4868c2ecf20Sopenharmony_ci	u32 reg;
4878c2ecf20Sopenharmony_ci	u32 ocp_ratio;
4888c2ecf20Sopenharmony_ci	u32 div;
4898c2ecf20Sopenharmony_ci
4908c2ecf20Sopenharmony_ci	reg = rt_sysc_r32(SYSC_REG_CPU_SYS_CLKCFG);
4918c2ecf20Sopenharmony_ci
4928c2ecf20Sopenharmony_ci	ocp_ratio = (reg >> CPU_SYS_CLKCFG_OCP_RATIO_SHIFT) &
4938c2ecf20Sopenharmony_ci		    CPU_SYS_CLKCFG_OCP_RATIO_MASK;
4948c2ecf20Sopenharmony_ci
4958c2ecf20Sopenharmony_ci	if (WARN_ON(ocp_ratio >= ARRAY_SIZE(mt7620_ocp_dividers)))
4968c2ecf20Sopenharmony_ci		return cpu_rate;
4978c2ecf20Sopenharmony_ci
4988c2ecf20Sopenharmony_ci	div = mt7620_ocp_dividers[ocp_ratio];
4998c2ecf20Sopenharmony_ci	if (WARN(!div, "invalid divider for OCP ratio %u", ocp_ratio))
5008c2ecf20Sopenharmony_ci		return cpu_rate;
5018c2ecf20Sopenharmony_ci
5028c2ecf20Sopenharmony_ci	return cpu_rate / div;
5038c2ecf20Sopenharmony_ci}
5048c2ecf20Sopenharmony_ci
5058c2ecf20Sopenharmony_civoid __init ralink_clk_init(void)
5068c2ecf20Sopenharmony_ci{
5078c2ecf20Sopenharmony_ci	unsigned long xtal_rate;
5088c2ecf20Sopenharmony_ci	unsigned long cpu_pll_rate;
5098c2ecf20Sopenharmony_ci	unsigned long pll_rate;
5108c2ecf20Sopenharmony_ci	unsigned long cpu_rate;
5118c2ecf20Sopenharmony_ci	unsigned long sys_rate;
5128c2ecf20Sopenharmony_ci	unsigned long dram_rate;
5138c2ecf20Sopenharmony_ci	unsigned long periph_rate;
5148c2ecf20Sopenharmony_ci	unsigned long pcmi2s_rate;
5158c2ecf20Sopenharmony_ci
5168c2ecf20Sopenharmony_ci	xtal_rate = mt7620_get_xtal_rate();
5178c2ecf20Sopenharmony_ci
5188c2ecf20Sopenharmony_ci#define RFMT(label)	label ":%lu.%03luMHz "
5198c2ecf20Sopenharmony_ci#define RINT(x)		((x) / 1000000)
5208c2ecf20Sopenharmony_ci#define RFRAC(x)	(((x) / 1000) % 1000)
5218c2ecf20Sopenharmony_ci
5228c2ecf20Sopenharmony_ci	if (is_mt76x8()) {
5238c2ecf20Sopenharmony_ci		if (xtal_rate == MHZ(40))
5248c2ecf20Sopenharmony_ci			cpu_rate = MHZ(580);
5258c2ecf20Sopenharmony_ci		else
5268c2ecf20Sopenharmony_ci			cpu_rate = MHZ(575);
5278c2ecf20Sopenharmony_ci		dram_rate = sys_rate = cpu_rate / 3;
5288c2ecf20Sopenharmony_ci		periph_rate = MHZ(40);
5298c2ecf20Sopenharmony_ci		pcmi2s_rate = MHZ(480);
5308c2ecf20Sopenharmony_ci
5318c2ecf20Sopenharmony_ci		ralink_clk_add("10000d00.uartlite", periph_rate);
5328c2ecf20Sopenharmony_ci		ralink_clk_add("10000e00.uartlite", periph_rate);
5338c2ecf20Sopenharmony_ci	} else {
5348c2ecf20Sopenharmony_ci		cpu_pll_rate = mt7620_get_cpu_pll_rate(xtal_rate);
5358c2ecf20Sopenharmony_ci		pll_rate = mt7620_get_pll_rate(xtal_rate, cpu_pll_rate);
5368c2ecf20Sopenharmony_ci
5378c2ecf20Sopenharmony_ci		cpu_rate = mt7620_get_cpu_rate(pll_rate);
5388c2ecf20Sopenharmony_ci		dram_rate = mt7620_get_dram_rate(pll_rate);
5398c2ecf20Sopenharmony_ci		sys_rate = mt7620_get_sys_rate(cpu_rate);
5408c2ecf20Sopenharmony_ci		periph_rate = mt7620_get_periph_rate(xtal_rate);
5418c2ecf20Sopenharmony_ci		pcmi2s_rate = periph_rate;
5428c2ecf20Sopenharmony_ci
5438c2ecf20Sopenharmony_ci		pr_debug(RFMT("XTAL") RFMT("CPU_PLL") RFMT("PLL"),
5448c2ecf20Sopenharmony_ci			 RINT(xtal_rate), RFRAC(xtal_rate),
5458c2ecf20Sopenharmony_ci			 RINT(cpu_pll_rate), RFRAC(cpu_pll_rate),
5468c2ecf20Sopenharmony_ci			 RINT(pll_rate), RFRAC(pll_rate));
5478c2ecf20Sopenharmony_ci
5488c2ecf20Sopenharmony_ci		ralink_clk_add("10000500.uart", periph_rate);
5498c2ecf20Sopenharmony_ci	}
5508c2ecf20Sopenharmony_ci
5518c2ecf20Sopenharmony_ci	pr_debug(RFMT("CPU") RFMT("DRAM") RFMT("SYS") RFMT("PERIPH"),
5528c2ecf20Sopenharmony_ci		 RINT(cpu_rate), RFRAC(cpu_rate),
5538c2ecf20Sopenharmony_ci		 RINT(dram_rate), RFRAC(dram_rate),
5548c2ecf20Sopenharmony_ci		 RINT(sys_rate), RFRAC(sys_rate),
5558c2ecf20Sopenharmony_ci		 RINT(periph_rate), RFRAC(periph_rate));
5568c2ecf20Sopenharmony_ci#undef RFRAC
5578c2ecf20Sopenharmony_ci#undef RINT
5588c2ecf20Sopenharmony_ci#undef RFMT
5598c2ecf20Sopenharmony_ci
5608c2ecf20Sopenharmony_ci	ralink_clk_add("cpu", cpu_rate);
5618c2ecf20Sopenharmony_ci	ralink_clk_add("10000100.timer", periph_rate);
5628c2ecf20Sopenharmony_ci	ralink_clk_add("10000120.watchdog", periph_rate);
5638c2ecf20Sopenharmony_ci	ralink_clk_add("10000900.i2c", periph_rate);
5648c2ecf20Sopenharmony_ci	ralink_clk_add("10000a00.i2s", pcmi2s_rate);
5658c2ecf20Sopenharmony_ci	ralink_clk_add("10000b00.spi", sys_rate);
5668c2ecf20Sopenharmony_ci	ralink_clk_add("10000b40.spi", sys_rate);
5678c2ecf20Sopenharmony_ci	ralink_clk_add("10000c00.uartlite", periph_rate);
5688c2ecf20Sopenharmony_ci	ralink_clk_add("10000d00.uart1", periph_rate);
5698c2ecf20Sopenharmony_ci	ralink_clk_add("10000e00.uart2", periph_rate);
5708c2ecf20Sopenharmony_ci	ralink_clk_add("10180000.wmac", xtal_rate);
5718c2ecf20Sopenharmony_ci
5728c2ecf20Sopenharmony_ci	if (IS_ENABLED(CONFIG_USB) && !is_mt76x8()) {
5738c2ecf20Sopenharmony_ci		/*
5748c2ecf20Sopenharmony_ci		 * When the CPU goes into sleep mode, the BUS clock will be
5758c2ecf20Sopenharmony_ci		 * too low for USB to function properly. Adjust the busses
5768c2ecf20Sopenharmony_ci		 * fractional divider to fix this
5778c2ecf20Sopenharmony_ci		 */
5788c2ecf20Sopenharmony_ci		u32 val = rt_sysc_r32(SYSC_REG_CPU_SYS_CLKCFG);
5798c2ecf20Sopenharmony_ci
5808c2ecf20Sopenharmony_ci		val &= ~(CLKCFG_FDIV_MASK | CLKCFG_FFRAC_MASK);
5818c2ecf20Sopenharmony_ci		val |= CLKCFG_FDIV_USB_VAL | CLKCFG_FFRAC_USB_VAL;
5828c2ecf20Sopenharmony_ci
5838c2ecf20Sopenharmony_ci		rt_sysc_w32(val, SYSC_REG_CPU_SYS_CLKCFG);
5848c2ecf20Sopenharmony_ci	}
5858c2ecf20Sopenharmony_ci}
5868c2ecf20Sopenharmony_ci
5878c2ecf20Sopenharmony_civoid __init ralink_of_remap(void)
5888c2ecf20Sopenharmony_ci{
5898c2ecf20Sopenharmony_ci	rt_sysc_membase = plat_of_remap_node("ralink,mt7620a-sysc");
5908c2ecf20Sopenharmony_ci	rt_memc_membase = plat_of_remap_node("ralink,mt7620a-memc");
5918c2ecf20Sopenharmony_ci
5928c2ecf20Sopenharmony_ci	if (!rt_sysc_membase || !rt_memc_membase)
5938c2ecf20Sopenharmony_ci		panic("Failed to remap core resources");
5948c2ecf20Sopenharmony_ci}
5958c2ecf20Sopenharmony_ci
5968c2ecf20Sopenharmony_cistatic __init void
5978c2ecf20Sopenharmony_cimt7620_dram_init(struct ralink_soc_info *soc_info)
5988c2ecf20Sopenharmony_ci{
5998c2ecf20Sopenharmony_ci	switch (dram_type) {
6008c2ecf20Sopenharmony_ci	case SYSCFG0_DRAM_TYPE_SDRAM:
6018c2ecf20Sopenharmony_ci		pr_info("Board has SDRAM\n");
6028c2ecf20Sopenharmony_ci		soc_info->mem_size_min = MT7620_SDRAM_SIZE_MIN;
6038c2ecf20Sopenharmony_ci		soc_info->mem_size_max = MT7620_SDRAM_SIZE_MAX;
6048c2ecf20Sopenharmony_ci		break;
6058c2ecf20Sopenharmony_ci
6068c2ecf20Sopenharmony_ci	case SYSCFG0_DRAM_TYPE_DDR1:
6078c2ecf20Sopenharmony_ci		pr_info("Board has DDR1\n");
6088c2ecf20Sopenharmony_ci		soc_info->mem_size_min = MT7620_DDR1_SIZE_MIN;
6098c2ecf20Sopenharmony_ci		soc_info->mem_size_max = MT7620_DDR1_SIZE_MAX;
6108c2ecf20Sopenharmony_ci		break;
6118c2ecf20Sopenharmony_ci
6128c2ecf20Sopenharmony_ci	case SYSCFG0_DRAM_TYPE_DDR2:
6138c2ecf20Sopenharmony_ci		pr_info("Board has DDR2\n");
6148c2ecf20Sopenharmony_ci		soc_info->mem_size_min = MT7620_DDR2_SIZE_MIN;
6158c2ecf20Sopenharmony_ci		soc_info->mem_size_max = MT7620_DDR2_SIZE_MAX;
6168c2ecf20Sopenharmony_ci		break;
6178c2ecf20Sopenharmony_ci	default:
6188c2ecf20Sopenharmony_ci		BUG();
6198c2ecf20Sopenharmony_ci	}
6208c2ecf20Sopenharmony_ci}
6218c2ecf20Sopenharmony_ci
6228c2ecf20Sopenharmony_cistatic __init void
6238c2ecf20Sopenharmony_cimt7628_dram_init(struct ralink_soc_info *soc_info)
6248c2ecf20Sopenharmony_ci{
6258c2ecf20Sopenharmony_ci	switch (dram_type) {
6268c2ecf20Sopenharmony_ci	case SYSCFG0_DRAM_TYPE_DDR1_MT7628:
6278c2ecf20Sopenharmony_ci		pr_info("Board has DDR1\n");
6288c2ecf20Sopenharmony_ci		soc_info->mem_size_min = MT7620_DDR1_SIZE_MIN;
6298c2ecf20Sopenharmony_ci		soc_info->mem_size_max = MT7620_DDR1_SIZE_MAX;
6308c2ecf20Sopenharmony_ci		break;
6318c2ecf20Sopenharmony_ci
6328c2ecf20Sopenharmony_ci	case SYSCFG0_DRAM_TYPE_DDR2_MT7628:
6338c2ecf20Sopenharmony_ci		pr_info("Board has DDR2\n");
6348c2ecf20Sopenharmony_ci		soc_info->mem_size_min = MT7620_DDR2_SIZE_MIN;
6358c2ecf20Sopenharmony_ci		soc_info->mem_size_max = MT7620_DDR2_SIZE_MAX;
6368c2ecf20Sopenharmony_ci		break;
6378c2ecf20Sopenharmony_ci	default:
6388c2ecf20Sopenharmony_ci		BUG();
6398c2ecf20Sopenharmony_ci	}
6408c2ecf20Sopenharmony_ci}
6418c2ecf20Sopenharmony_ci
6428c2ecf20Sopenharmony_civoid prom_soc_init(struct ralink_soc_info *soc_info)
6438c2ecf20Sopenharmony_ci{
6448c2ecf20Sopenharmony_ci	void __iomem *sysc = (void __iomem *) KSEG1ADDR(MT7620_SYSC_BASE);
6458c2ecf20Sopenharmony_ci	unsigned char *name = NULL;
6468c2ecf20Sopenharmony_ci	u32 n0;
6478c2ecf20Sopenharmony_ci	u32 n1;
6488c2ecf20Sopenharmony_ci	u32 rev;
6498c2ecf20Sopenharmony_ci	u32 cfg0;
6508c2ecf20Sopenharmony_ci	u32 pmu0;
6518c2ecf20Sopenharmony_ci	u32 pmu1;
6528c2ecf20Sopenharmony_ci	u32 bga;
6538c2ecf20Sopenharmony_ci
6548c2ecf20Sopenharmony_ci	n0 = __raw_readl(sysc + SYSC_REG_CHIP_NAME0);
6558c2ecf20Sopenharmony_ci	n1 = __raw_readl(sysc + SYSC_REG_CHIP_NAME1);
6568c2ecf20Sopenharmony_ci	rev = __raw_readl(sysc + SYSC_REG_CHIP_REV);
6578c2ecf20Sopenharmony_ci	bga = (rev >> CHIP_REV_PKG_SHIFT) & CHIP_REV_PKG_MASK;
6588c2ecf20Sopenharmony_ci
6598c2ecf20Sopenharmony_ci	if (n0 == MT7620_CHIP_NAME0 && n1 == MT7620_CHIP_NAME1) {
6608c2ecf20Sopenharmony_ci		if (bga) {
6618c2ecf20Sopenharmony_ci			ralink_soc = MT762X_SOC_MT7620A;
6628c2ecf20Sopenharmony_ci			name = "MT7620A";
6638c2ecf20Sopenharmony_ci			soc_info->compatible = "ralink,mt7620a-soc";
6648c2ecf20Sopenharmony_ci		} else {
6658c2ecf20Sopenharmony_ci			ralink_soc = MT762X_SOC_MT7620N;
6668c2ecf20Sopenharmony_ci			name = "MT7620N";
6678c2ecf20Sopenharmony_ci			soc_info->compatible = "ralink,mt7620n-soc";
6688c2ecf20Sopenharmony_ci		}
6698c2ecf20Sopenharmony_ci	} else if (n0 == MT7620_CHIP_NAME0 && n1 == MT7628_CHIP_NAME1) {
6708c2ecf20Sopenharmony_ci		u32 efuse = __raw_readl(sysc + SYSC_REG_EFUSE_CFG);
6718c2ecf20Sopenharmony_ci
6728c2ecf20Sopenharmony_ci		if (efuse & EFUSE_MT7688) {
6738c2ecf20Sopenharmony_ci			ralink_soc = MT762X_SOC_MT7688;
6748c2ecf20Sopenharmony_ci			name = "MT7688";
6758c2ecf20Sopenharmony_ci		} else {
6768c2ecf20Sopenharmony_ci			ralink_soc = MT762X_SOC_MT7628AN;
6778c2ecf20Sopenharmony_ci			name = "MT7628AN";
6788c2ecf20Sopenharmony_ci		}
6798c2ecf20Sopenharmony_ci		soc_info->compatible = "ralink,mt7628an-soc";
6808c2ecf20Sopenharmony_ci	} else {
6818c2ecf20Sopenharmony_ci		panic("mt762x: unknown SoC, n0:%08x n1:%08x\n", n0, n1);
6828c2ecf20Sopenharmony_ci	}
6838c2ecf20Sopenharmony_ci
6848c2ecf20Sopenharmony_ci	snprintf(soc_info->sys_type, RAMIPS_SYS_TYPE_LEN,
6858c2ecf20Sopenharmony_ci		"MediaTek %s ver:%u eco:%u",
6868c2ecf20Sopenharmony_ci		name,
6878c2ecf20Sopenharmony_ci		(rev >> CHIP_REV_VER_SHIFT) & CHIP_REV_VER_MASK,
6888c2ecf20Sopenharmony_ci		(rev & CHIP_REV_ECO_MASK));
6898c2ecf20Sopenharmony_ci
6908c2ecf20Sopenharmony_ci	cfg0 = __raw_readl(sysc + SYSC_REG_SYSTEM_CONFIG0);
6918c2ecf20Sopenharmony_ci	if (is_mt76x8()) {
6928c2ecf20Sopenharmony_ci		dram_type = cfg0 & DRAM_TYPE_MT7628_MASK;
6938c2ecf20Sopenharmony_ci	} else {
6948c2ecf20Sopenharmony_ci		dram_type = (cfg0 >> SYSCFG0_DRAM_TYPE_SHIFT) &
6958c2ecf20Sopenharmony_ci			    SYSCFG0_DRAM_TYPE_MASK;
6968c2ecf20Sopenharmony_ci		if (dram_type == SYSCFG0_DRAM_TYPE_UNKNOWN)
6978c2ecf20Sopenharmony_ci			dram_type = SYSCFG0_DRAM_TYPE_SDRAM;
6988c2ecf20Sopenharmony_ci	}
6998c2ecf20Sopenharmony_ci
7008c2ecf20Sopenharmony_ci	soc_info->mem_base = MT7620_DRAM_BASE;
7018c2ecf20Sopenharmony_ci	if (is_mt76x8())
7028c2ecf20Sopenharmony_ci		mt7628_dram_init(soc_info);
7038c2ecf20Sopenharmony_ci	else
7048c2ecf20Sopenharmony_ci		mt7620_dram_init(soc_info);
7058c2ecf20Sopenharmony_ci
7068c2ecf20Sopenharmony_ci	pmu0 = __raw_readl(sysc + PMU0_CFG);
7078c2ecf20Sopenharmony_ci	pmu1 = __raw_readl(sysc + PMU1_CFG);
7088c2ecf20Sopenharmony_ci
7098c2ecf20Sopenharmony_ci	pr_info("Analog PMU set to %s control\n",
7108c2ecf20Sopenharmony_ci		(pmu0 & PMU_SW_SET) ? ("sw") : ("hw"));
7118c2ecf20Sopenharmony_ci	pr_info("Digital PMU set to %s control\n",
7128c2ecf20Sopenharmony_ci		(pmu1 & DIG_SW_SEL) ? ("sw") : ("hw"));
7138c2ecf20Sopenharmony_ci
7148c2ecf20Sopenharmony_ci	if (is_mt76x8())
7158c2ecf20Sopenharmony_ci		rt2880_pinmux_data = mt7628an_pinmux_data;
7168c2ecf20Sopenharmony_ci	else
7178c2ecf20Sopenharmony_ci		rt2880_pinmux_data = mt7620a_pinmux_data;
7188c2ecf20Sopenharmony_ci}
719