CPU clock definition in devicetree should be specified per CPU, not in the cpus node.
The implementation of plat_init_time() needs to be modified to look for the clock frequency in the changed location. To achieve this, the relevant code is copied from the generic MIPS implementation in arch/mips/generic/init.c. Signed-off-by: Sander Vanheule <san...@svanheule.net> --- target/linux/realtek/dts-5.10/rtl838x.dtsi | 9 +++++- target/linux/realtek/dts-5.10/rtl930x.dtsi | 9 +++++- target/linux/realtek/dts-5.10/rtl931x.dtsi | 5 ++- .../files-5.10/arch/mips/rtl838x/setup.c | 32 +++++++++++-------- 4 files changed, 39 insertions(+), 16 deletions(-) diff --git a/target/linux/realtek/dts-5.10/rtl838x.dtsi b/target/linux/realtek/dts-5.10/rtl838x.dtsi index 11cabc3f63cb..aa6c131753db 100644 --- a/target/linux/realtek/dts-5.10/rtl838x.dtsi +++ b/target/linux/realtek/dts-5.10/rtl838x.dtsi @@ -56,11 +56,12 @@ cpus { #address-cells = <1>; #size-cells = <0>; - frequency = <500000000>; cpu@0 { compatible = "mips,mips4KEc"; reg = <0>; + clocks = <&cpu_clk>; + clock-names = "cpu"; }; }; @@ -68,6 +69,12 @@ bootargs = "console=ttyS0,115200"; }; + cpu_clk: cpu_clk { + compatible = "fixed-clock"; + #clock-cells = <0>; + clock-frequency = <500000000>; + }; + lx_clk: lx_clk { compatible = "fixed-clock"; #clock-cells = <0>; diff --git a/target/linux/realtek/dts-5.10/rtl930x.dtsi b/target/linux/realtek/dts-5.10/rtl930x.dtsi index bfde5e6ff6ae..74c7181c96e2 100644 --- a/target/linux/realtek/dts-5.10/rtl930x.dtsi +++ b/target/linux/realtek/dts-5.10/rtl930x.dtsi @@ -11,11 +11,12 @@ cpus { #address-cells = <1>; #size-cells = <0>; - frequency = <800000000>; cpu@0 { compatible = "mips,mips34Kc"; reg = <0>; + clocks = <&cpu_clk>; + clock-names = "cpu"; }; }; @@ -35,6 +36,12 @@ interrupt-controller; }; + cpu_clk: cpu_clk { + compatible = "fixed-clock"; + #clock-cells = <0>; + clock-frequency = <800000000>; + }; + lx_clk: lx_clk { compatible = "fixed-clock"; #clock-cells = <0>; diff --git a/target/linux/realtek/dts-5.10/rtl931x.dtsi b/target/linux/realtek/dts-5.10/rtl931x.dtsi index 29aee1f7b268..f6f39222fde8 100644 --- a/target/linux/realtek/dts-5.10/rtl931x.dtsi +++ b/target/linux/realtek/dts-5.10/rtl931x.dtsi @@ -11,16 +11,19 @@ cpus { #address-cells = <1>; #size-cells = <0>; - frequency = <1000000000>; cpu@0 { compatible = "mti,interaptive"; reg = <0>; + clocks = <&cpuclock>; + clock-names = "cpu"; }; cpu@1 { compatible = "mti,interaptive"; reg = <1>; + clocks = <&cpuclock>; + clock-names = "cpu"; }; }; diff --git a/target/linux/realtek/files-5.10/arch/mips/rtl838x/setup.c b/target/linux/realtek/files-5.10/arch/mips/rtl838x/setup.c index 55419c7b0b7a..86eb3c5eeaf5 100644 --- a/target/linux/realtek/files-5.10/arch/mips/rtl838x/setup.c +++ b/target/linux/realtek/files-5.10/arch/mips/rtl838x/setup.c @@ -11,9 +11,9 @@ #include <linux/console.h> #include <linux/init.h> -#include <linux/clkdev.h> -#include <linux/clk-provider.h> +#include <linux/clk.h> #include <linux/delay.h> +#include <linux/of_clk.h> #include <linux/of_fdt.h> #include <linux/irqchip.h> @@ -91,23 +91,29 @@ void __init plat_mem_setup(void) void __init plat_time_init(void) { struct device_node *np; - u32 freq = 500000000; + struct clk *clk; of_clk_init(NULL); - timer_probe(); - np = of_find_node_by_name(NULL, "cpus"); + np = of_get_cpu_node(0, NULL); if (!np) { - pr_err("Missing 'cpus' DT node, using default frequency."); - } else { - if (of_property_read_u32(np, "frequency", &freq) < 0) - pr_err("No 'frequency' property in DT, using default."); - else - pr_info("CPU frequency from device tree: %dMHz", freq / 1000000); - of_node_put(np); + pr_err("Failed to get CPU node\n"); + return; + } + + clk = of_clk_get(np, 0); + if (IS_ERR(clk)) { + pr_err("Failed to get CPU clock: %ld\n", PTR_ERR(clk)); + return; } - mips_hpt_frequency = freq / 2; + mips_hpt_frequency = clk_get_rate(clk); + clk_put(clk); + + /* The counter runs at half the CPU clock rate */ + mips_hpt_frequency /= 2; + + timer_probe(); } void __init arch_init_irq(void) -- 2.36.1 _______________________________________________ openwrt-devel mailing list openwrt-devel@lists.openwrt.org https://lists.openwrt.org/mailman/listinfo/openwrt-devel