Merge tag 'denywrite-for-5.15' of git://github.com/davidhildenbrand/linux
[linux-2.6-microblaze.git] / arch / mips / ralink / mt7620.c
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  *
4  * Parts of this file are based on Ralink's 2.6.21 BSP
5  *
6  * Copyright (C) 2008-2011 Gabor Juhos <juhosg@openwrt.org>
7  * Copyright (C) 2008 Imre Kaloz <kaloz@openwrt.org>
8  * Copyright (C) 2013 John Crispin <john@phrozen.org>
9  */
10
11 #include <linux/kernel.h>
12 #include <linux/init.h>
13 #include <linux/bug.h>
14
15 #include <asm/mipsregs.h>
16 #include <asm/mach-ralink/ralink_regs.h>
17 #include <asm/mach-ralink/mt7620.h>
18
19 #include "common.h"
20
21 /* analog */
22 #define PMU0_CFG                0x88
23 #define PMU_SW_SET              BIT(28)
24 #define A_DCDC_EN               BIT(24)
25 #define A_SSC_PERI              BIT(19)
26 #define A_SSC_GEN               BIT(18)
27 #define A_SSC_M                 0x3
28 #define A_SSC_S                 16
29 #define A_DLY_M                 0x7
30 #define A_DLY_S                 8
31 #define A_VTUNE_M               0xff
32
33 /* digital */
34 #define PMU1_CFG                0x8C
35 #define DIG_SW_SEL              BIT(25)
36
37 /* clock scaling */
38 #define CLKCFG_FDIV_MASK        0x1f00
39 #define CLKCFG_FDIV_USB_VAL     0x0300
40 #define CLKCFG_FFRAC_MASK       0x001f
41 #define CLKCFG_FFRAC_USB_VAL    0x0003
42
43 /* EFUSE bits */
44 #define EFUSE_MT7688            0x100000
45
46 /* DRAM type bit */
47 #define DRAM_TYPE_MT7628_MASK   0x1
48
49 /* does the board have sdram or ddram */
50 static int dram_type;
51
52 static __init u32
53 mt7620_calc_rate(u32 ref_rate, u32 mul, u32 div)
54 {
55         u64 t;
56
57         t = ref_rate;
58         t *= mul;
59         do_div(t, div);
60
61         return t;
62 }
63
64 #define MHZ(x)          ((x) * 1000 * 1000)
65
66 static __init unsigned long
67 mt7620_get_xtal_rate(void)
68 {
69         u32 reg;
70
71         reg = rt_sysc_r32(SYSC_REG_SYSTEM_CONFIG0);
72         if (reg & SYSCFG0_XTAL_FREQ_SEL)
73                 return MHZ(40);
74
75         return MHZ(20);
76 }
77
78 static __init unsigned long
79 mt7620_get_periph_rate(unsigned long xtal_rate)
80 {
81         u32 reg;
82
83         reg = rt_sysc_r32(SYSC_REG_CLKCFG0);
84         if (reg & CLKCFG0_PERI_CLK_SEL)
85                 return xtal_rate;
86
87         return MHZ(40);
88 }
89
90 static const u32 mt7620_clk_divider[] __initconst = { 2, 3, 4, 8 };
91
92 static __init unsigned long
93 mt7620_get_cpu_pll_rate(unsigned long xtal_rate)
94 {
95         u32 reg;
96         u32 mul;
97         u32 div;
98
99         reg = rt_sysc_r32(SYSC_REG_CPLL_CONFIG0);
100         if (reg & CPLL_CFG0_BYPASS_REF_CLK)
101                 return xtal_rate;
102
103         if ((reg & CPLL_CFG0_SW_CFG) == 0)
104                 return MHZ(600);
105
106         mul = (reg >> CPLL_CFG0_PLL_MULT_RATIO_SHIFT) &
107               CPLL_CFG0_PLL_MULT_RATIO_MASK;
108         mul += 24;
109         if (reg & CPLL_CFG0_LC_CURFCK)
110                 mul *= 2;
111
112         div = (reg >> CPLL_CFG0_PLL_DIV_RATIO_SHIFT) &
113               CPLL_CFG0_PLL_DIV_RATIO_MASK;
114
115         WARN_ON(div >= ARRAY_SIZE(mt7620_clk_divider));
116
117         return mt7620_calc_rate(xtal_rate, mul, mt7620_clk_divider[div]);
118 }
119
120 static __init unsigned long
121 mt7620_get_pll_rate(unsigned long xtal_rate, unsigned long cpu_pll_rate)
122 {
123         u32 reg;
124
125         reg = rt_sysc_r32(SYSC_REG_CPLL_CONFIG1);
126         if (reg & CPLL_CFG1_CPU_AUX1)
127                 return xtal_rate;
128
129         if (reg & CPLL_CFG1_CPU_AUX0)
130                 return MHZ(480);
131
132         return cpu_pll_rate;
133 }
134
135 static __init unsigned long
136 mt7620_get_cpu_rate(unsigned long pll_rate)
137 {
138         u32 reg;
139         u32 mul;
140         u32 div;
141
142         reg = rt_sysc_r32(SYSC_REG_CPU_SYS_CLKCFG);
143
144         mul = reg & CPU_SYS_CLKCFG_CPU_FFRAC_MASK;
145         div = (reg >> CPU_SYS_CLKCFG_CPU_FDIV_SHIFT) &
146               CPU_SYS_CLKCFG_CPU_FDIV_MASK;
147
148         return mt7620_calc_rate(pll_rate, mul, div);
149 }
150
151 static const u32 mt7620_ocp_dividers[16] __initconst = {
152         [CPU_SYS_CLKCFG_OCP_RATIO_2] = 2,
153         [CPU_SYS_CLKCFG_OCP_RATIO_3] = 3,
154         [CPU_SYS_CLKCFG_OCP_RATIO_4] = 4,
155         [CPU_SYS_CLKCFG_OCP_RATIO_5] = 5,
156         [CPU_SYS_CLKCFG_OCP_RATIO_10] = 10,
157 };
158
159 static __init unsigned long
160 mt7620_get_dram_rate(unsigned long pll_rate)
161 {
162         if (dram_type == SYSCFG0_DRAM_TYPE_SDRAM)
163                 return pll_rate / 4;
164
165         return pll_rate / 3;
166 }
167
168 static __init unsigned long
169 mt7620_get_sys_rate(unsigned long cpu_rate)
170 {
171         u32 reg;
172         u32 ocp_ratio;
173         u32 div;
174
175         reg = rt_sysc_r32(SYSC_REG_CPU_SYS_CLKCFG);
176
177         ocp_ratio = (reg >> CPU_SYS_CLKCFG_OCP_RATIO_SHIFT) &
178                     CPU_SYS_CLKCFG_OCP_RATIO_MASK;
179
180         if (WARN_ON(ocp_ratio >= ARRAY_SIZE(mt7620_ocp_dividers)))
181                 return cpu_rate;
182
183         div = mt7620_ocp_dividers[ocp_ratio];
184         if (WARN(!div, "invalid divider for OCP ratio %u", ocp_ratio))
185                 return cpu_rate;
186
187         return cpu_rate / div;
188 }
189
190 void __init ralink_clk_init(void)
191 {
192         unsigned long xtal_rate;
193         unsigned long cpu_pll_rate;
194         unsigned long pll_rate;
195         unsigned long cpu_rate;
196         unsigned long sys_rate;
197         unsigned long dram_rate;
198         unsigned long periph_rate;
199         unsigned long pcmi2s_rate;
200
201         xtal_rate = mt7620_get_xtal_rate();
202
203 #define RFMT(label)     label ":%lu.%03luMHz "
204 #define RINT(x)         ((x) / 1000000)
205 #define RFRAC(x)        (((x) / 1000) % 1000)
206
207         if (is_mt76x8()) {
208                 if (xtal_rate == MHZ(40))
209                         cpu_rate = MHZ(580);
210                 else
211                         cpu_rate = MHZ(575);
212                 dram_rate = sys_rate = cpu_rate / 3;
213                 periph_rate = MHZ(40);
214                 pcmi2s_rate = MHZ(480);
215
216                 ralink_clk_add("10000d00.uartlite", periph_rate);
217                 ralink_clk_add("10000e00.uartlite", periph_rate);
218         } else {
219                 cpu_pll_rate = mt7620_get_cpu_pll_rate(xtal_rate);
220                 pll_rate = mt7620_get_pll_rate(xtal_rate, cpu_pll_rate);
221
222                 cpu_rate = mt7620_get_cpu_rate(pll_rate);
223                 dram_rate = mt7620_get_dram_rate(pll_rate);
224                 sys_rate = mt7620_get_sys_rate(cpu_rate);
225                 periph_rate = mt7620_get_periph_rate(xtal_rate);
226                 pcmi2s_rate = periph_rate;
227
228                 pr_debug(RFMT("XTAL") RFMT("CPU_PLL") RFMT("PLL"),
229                          RINT(xtal_rate), RFRAC(xtal_rate),
230                          RINT(cpu_pll_rate), RFRAC(cpu_pll_rate),
231                          RINT(pll_rate), RFRAC(pll_rate));
232
233                 ralink_clk_add("10000500.uart", periph_rate);
234         }
235
236         pr_debug(RFMT("CPU") RFMT("DRAM") RFMT("SYS") RFMT("PERIPH"),
237                  RINT(cpu_rate), RFRAC(cpu_rate),
238                  RINT(dram_rate), RFRAC(dram_rate),
239                  RINT(sys_rate), RFRAC(sys_rate),
240                  RINT(periph_rate), RFRAC(periph_rate));
241 #undef RFRAC
242 #undef RINT
243 #undef RFMT
244
245         ralink_clk_add("cpu", cpu_rate);
246         ralink_clk_add("10000100.timer", periph_rate);
247         ralink_clk_add("10000120.watchdog", periph_rate);
248         ralink_clk_add("10000900.i2c", periph_rate);
249         ralink_clk_add("10000a00.i2s", pcmi2s_rate);
250         ralink_clk_add("10000b00.spi", sys_rate);
251         ralink_clk_add("10000b40.spi", sys_rate);
252         ralink_clk_add("10000c00.uartlite", periph_rate);
253         ralink_clk_add("10000d00.uart1", periph_rate);
254         ralink_clk_add("10000e00.uart2", periph_rate);
255         ralink_clk_add("10180000.wmac", xtal_rate);
256
257         if (IS_ENABLED(CONFIG_USB) && !is_mt76x8()) {
258                 /*
259                  * When the CPU goes into sleep mode, the BUS clock will be
260                  * too low for USB to function properly. Adjust the busses
261                  * fractional divider to fix this
262                  */
263                 u32 val = rt_sysc_r32(SYSC_REG_CPU_SYS_CLKCFG);
264
265                 val &= ~(CLKCFG_FDIV_MASK | CLKCFG_FFRAC_MASK);
266                 val |= CLKCFG_FDIV_USB_VAL | CLKCFG_FFRAC_USB_VAL;
267
268                 rt_sysc_w32(val, SYSC_REG_CPU_SYS_CLKCFG);
269         }
270 }
271
272 void __init ralink_of_remap(void)
273 {
274         rt_sysc_membase = plat_of_remap_node("ralink,mt7620a-sysc");
275         rt_memc_membase = plat_of_remap_node("ralink,mt7620a-memc");
276
277         if (!rt_sysc_membase || !rt_memc_membase)
278                 panic("Failed to remap core resources");
279 }
280
281 static __init void
282 mt7620_dram_init(struct ralink_soc_info *soc_info)
283 {
284         switch (dram_type) {
285         case SYSCFG0_DRAM_TYPE_SDRAM:
286                 pr_info("Board has SDRAM\n");
287                 soc_info->mem_size_min = MT7620_SDRAM_SIZE_MIN;
288                 soc_info->mem_size_max = MT7620_SDRAM_SIZE_MAX;
289                 break;
290
291         case SYSCFG0_DRAM_TYPE_DDR1:
292                 pr_info("Board has DDR1\n");
293                 soc_info->mem_size_min = MT7620_DDR1_SIZE_MIN;
294                 soc_info->mem_size_max = MT7620_DDR1_SIZE_MAX;
295                 break;
296
297         case SYSCFG0_DRAM_TYPE_DDR2:
298                 pr_info("Board has DDR2\n");
299                 soc_info->mem_size_min = MT7620_DDR2_SIZE_MIN;
300                 soc_info->mem_size_max = MT7620_DDR2_SIZE_MAX;
301                 break;
302         default:
303                 BUG();
304         }
305 }
306
307 static __init void
308 mt7628_dram_init(struct ralink_soc_info *soc_info)
309 {
310         switch (dram_type) {
311         case SYSCFG0_DRAM_TYPE_DDR1_MT7628:
312                 pr_info("Board has DDR1\n");
313                 soc_info->mem_size_min = MT7620_DDR1_SIZE_MIN;
314                 soc_info->mem_size_max = MT7620_DDR1_SIZE_MAX;
315                 break;
316
317         case SYSCFG0_DRAM_TYPE_DDR2_MT7628:
318                 pr_info("Board has DDR2\n");
319                 soc_info->mem_size_min = MT7620_DDR2_SIZE_MIN;
320                 soc_info->mem_size_max = MT7620_DDR2_SIZE_MAX;
321                 break;
322         default:
323                 BUG();
324         }
325 }
326
327 void __init prom_soc_init(struct ralink_soc_info *soc_info)
328 {
329         void __iomem *sysc = (void __iomem *) KSEG1ADDR(MT7620_SYSC_BASE);
330         unsigned char *name = NULL;
331         u32 n0;
332         u32 n1;
333         u32 rev;
334         u32 cfg0;
335         u32 pmu0;
336         u32 pmu1;
337         u32 bga;
338
339         n0 = __raw_readl(sysc + SYSC_REG_CHIP_NAME0);
340         n1 = __raw_readl(sysc + SYSC_REG_CHIP_NAME1);
341         rev = __raw_readl(sysc + SYSC_REG_CHIP_REV);
342         bga = (rev >> CHIP_REV_PKG_SHIFT) & CHIP_REV_PKG_MASK;
343
344         if (n0 == MT7620_CHIP_NAME0 && n1 == MT7620_CHIP_NAME1) {
345                 if (bga) {
346                         ralink_soc = MT762X_SOC_MT7620A;
347                         name = "MT7620A";
348                         soc_info->compatible = "ralink,mt7620a-soc";
349                 } else {
350                         ralink_soc = MT762X_SOC_MT7620N;
351                         name = "MT7620N";
352                         soc_info->compatible = "ralink,mt7620n-soc";
353                 }
354         } else if (n0 == MT7620_CHIP_NAME0 && n1 == MT7628_CHIP_NAME1) {
355                 u32 efuse = __raw_readl(sysc + SYSC_REG_EFUSE_CFG);
356
357                 if (efuse & EFUSE_MT7688) {
358                         ralink_soc = MT762X_SOC_MT7688;
359                         name = "MT7688";
360                 } else {
361                         ralink_soc = MT762X_SOC_MT7628AN;
362                         name = "MT7628AN";
363                 }
364                 soc_info->compatible = "ralink,mt7628an-soc";
365         } else {
366                 panic("mt762x: unknown SoC, n0:%08x n1:%08x\n", n0, n1);
367         }
368
369         snprintf(soc_info->sys_type, RAMIPS_SYS_TYPE_LEN,
370                 "MediaTek %s ver:%u eco:%u",
371                 name,
372                 (rev >> CHIP_REV_VER_SHIFT) & CHIP_REV_VER_MASK,
373                 (rev & CHIP_REV_ECO_MASK));
374
375         cfg0 = __raw_readl(sysc + SYSC_REG_SYSTEM_CONFIG0);
376         if (is_mt76x8()) {
377                 dram_type = cfg0 & DRAM_TYPE_MT7628_MASK;
378         } else {
379                 dram_type = (cfg0 >> SYSCFG0_DRAM_TYPE_SHIFT) &
380                             SYSCFG0_DRAM_TYPE_MASK;
381                 if (dram_type == SYSCFG0_DRAM_TYPE_UNKNOWN)
382                         dram_type = SYSCFG0_DRAM_TYPE_SDRAM;
383         }
384
385         soc_info->mem_base = MT7620_DRAM_BASE;
386         if (is_mt76x8())
387                 mt7628_dram_init(soc_info);
388         else
389                 mt7620_dram_init(soc_info);
390
391         pmu0 = __raw_readl(sysc + PMU0_CFG);
392         pmu1 = __raw_readl(sysc + PMU1_CFG);
393
394         pr_info("Analog PMU set to %s control\n",
395                 (pmu0 & PMU_SW_SET) ? ("sw") : ("hw"));
396         pr_info("Digital PMU set to %s control\n",
397                 (pmu1 & DIG_SW_SEL) ? ("sw") : ("hw"));
398 }