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