xref: /openbmc/linux/arch/mips/ralink/clk.c (revision 2612e3bbc0386368a850140a6c9b990cd496a5ec)
1d2912cb1SThomas Gleixner // SPDX-License-Identifier: GPL-2.0-only
23f0a06b0SJohn Crispin /*
33f0a06b0SJohn Crispin  *
43f0a06b0SJohn Crispin  *  Copyright (C) 2011 Gabor Juhos <juhosg@openwrt.org>
597b92108SJohn Crispin  *  Copyright (C) 2013 John Crispin <john@phrozen.org>
63f0a06b0SJohn Crispin  */
73f0a06b0SJohn Crispin 
83f0a06b0SJohn Crispin #include <linux/kernel.h>
926dd3e4fSPaul Gortmaker #include <linux/init.h>
1026dd3e4fSPaul Gortmaker #include <linux/export.h>
113f0a06b0SJohn Crispin #include <linux/clkdev.h>
123f0a06b0SJohn Crispin #include <linux/clk.h>
1335f752beSArnd Bergmann #include <linux/clk-provider.h>
14*ad38c17bSSergio Paracuellos #include <asm/mach-ralink/ralink_regs.h>
153f0a06b0SJohn Crispin 
163f0a06b0SJohn Crispin #include <asm/time.h>
173f0a06b0SJohn Crispin 
183f0a06b0SJohn Crispin #include "common.h"
193f0a06b0SJohn Crispin 
clk_cpu(int * idx)20*ad38c17bSSergio Paracuellos static const char *clk_cpu(int *idx)
213f0a06b0SJohn Crispin {
22*ad38c17bSSergio Paracuellos 	switch (ralink_soc) {
23*ad38c17bSSergio Paracuellos 	case RT2880_SOC:
24*ad38c17bSSergio Paracuellos 		*idx = 0;
25*ad38c17bSSergio Paracuellos 		return "ralink,rt2880-sysc";
26*ad38c17bSSergio Paracuellos 	case RT3883_SOC:
27*ad38c17bSSergio Paracuellos 		*idx = 0;
28*ad38c17bSSergio Paracuellos 		return "ralink,rt3883-sysc";
29*ad38c17bSSergio Paracuellos 	case RT305X_SOC_RT3050:
30*ad38c17bSSergio Paracuellos 		*idx = 0;
31*ad38c17bSSergio Paracuellos 		return "ralink,rt3050-sysc";
32*ad38c17bSSergio Paracuellos 	case RT305X_SOC_RT3052:
33*ad38c17bSSergio Paracuellos 		*idx = 0;
34*ad38c17bSSergio Paracuellos 		return "ralink,rt3052-sysc";
35*ad38c17bSSergio Paracuellos 	case RT305X_SOC_RT3350:
36*ad38c17bSSergio Paracuellos 		*idx = 1;
37*ad38c17bSSergio Paracuellos 		return "ralink,rt3350-sysc";
38*ad38c17bSSergio Paracuellos 	case RT305X_SOC_RT3352:
39*ad38c17bSSergio Paracuellos 		*idx = 1;
40*ad38c17bSSergio Paracuellos 		return "ralink,rt3352-sysc";
41*ad38c17bSSergio Paracuellos 	case RT305X_SOC_RT5350:
42*ad38c17bSSergio Paracuellos 		*idx = 1;
43*ad38c17bSSergio Paracuellos 		return "ralink,rt5350-sysc";
44*ad38c17bSSergio Paracuellos 	case MT762X_SOC_MT7620A:
45*ad38c17bSSergio Paracuellos 		*idx = 2;
46*ad38c17bSSergio Paracuellos 		return "ralink,mt7620-sysc";
47*ad38c17bSSergio Paracuellos 	case MT762X_SOC_MT7620N:
48*ad38c17bSSergio Paracuellos 		*idx = 2;
49*ad38c17bSSergio Paracuellos 		return "ralink,mt7620-sysc";
50*ad38c17bSSergio Paracuellos 	case MT762X_SOC_MT7628AN:
51*ad38c17bSSergio Paracuellos 		*idx = 1;
52*ad38c17bSSergio Paracuellos 		return "ralink,mt7628-sysc";
53*ad38c17bSSergio Paracuellos 	case MT762X_SOC_MT7688:
54*ad38c17bSSergio Paracuellos 		*idx = 1;
55*ad38c17bSSergio Paracuellos 		return "ralink,mt7688-sysc";
56*ad38c17bSSergio Paracuellos 	default:
57*ad38c17bSSergio Paracuellos 		*idx = -1;
58*ad38c17bSSergio Paracuellos 		return "invalid";
59*ad38c17bSSergio Paracuellos 	}
603f0a06b0SJohn Crispin }
613f0a06b0SJohn Crispin 
plat_time_init(void)623f0a06b0SJohn Crispin void __init plat_time_init(void)
633f0a06b0SJohn Crispin {
64*ad38c17bSSergio Paracuellos 	struct of_phandle_args clkspec;
65*ad38c17bSSergio Paracuellos 	const char *compatible;
663f0a06b0SJohn Crispin 	struct clk *clk;
67*ad38c17bSSergio Paracuellos 	int cpu_clk_idx;
683f0a06b0SJohn Crispin 
693f0a06b0SJohn Crispin 	ralink_of_remap();
703f0a06b0SJohn Crispin 
71*ad38c17bSSergio Paracuellos 	compatible = clk_cpu(&cpu_clk_idx);
72*ad38c17bSSergio Paracuellos 	if (cpu_clk_idx == -1)
73*ad38c17bSSergio Paracuellos 		panic("unable to get CPU clock index");
74*ad38c17bSSergio Paracuellos 
75*ad38c17bSSergio Paracuellos 	of_clk_init(NULL);
76*ad38c17bSSergio Paracuellos 	clkspec.np = of_find_compatible_node(NULL, NULL, compatible);
77*ad38c17bSSergio Paracuellos 	clkspec.args_count = 1;
78*ad38c17bSSergio Paracuellos 	clkspec.args[0] = cpu_clk_idx;
79*ad38c17bSSergio Paracuellos 	clk = of_clk_get_from_provider(&clkspec);
803f0a06b0SJohn Crispin 	if (IS_ERR(clk))
813f0a06b0SJohn Crispin 		panic("unable to get CPU clock, err=%ld", PTR_ERR(clk));
823f0a06b0SJohn Crispin 	pr_info("CPU Clock: %ldMHz\n", clk_get_rate(clk) / 1000000);
833f0a06b0SJohn Crispin 	mips_hpt_frequency = clk_get_rate(clk) / 2;
843f0a06b0SJohn Crispin 	clk_put(clk);
85ba5d08c0SDaniel Lezcano 	timer_probe();
863f0a06b0SJohn Crispin }
87