Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

clk: ralink: mtmips: fix clocks probe order in oldest ralink SoCs

Base clocks are the first in being probed and are real dependencies of the
rest of fixed, factor and peripheral clocks. For old ralink SoCs RT2880,
RT305x and RT3883 'xtal' must be defined first since in any other case,
when fixed clocks are probed they are delayed until 'xtal' is probed so the
following warning appears:

WARNING: CPU: 0 PID: 0 at drivers/clk/ralink/clk-mtmips.c:499 rt3883_bus_recalc_rate+0x98/0x138
Modules linked in:
CPU: 0 PID: 0 Comm: swapper Not tainted 6.6.43 #0
Stack : 805e58d0 00000000 00000004 8004f950 00000000 00000004 00000000 00000000
80669c54 80830000 80700000 805ae570 80670068 00000001 80669bf8 00000000
00000000 00000000 805ae570 80669b38 00000020 804db7dc 00000000 00000000
203a6d6d 80669b78 80669e48 70617773 00000000 805ae570 00000000 00000009
00000000 00000001 00000004 00000001 00000000 00000000 83fe43b0 00000000
...
Call Trace:
[<800065d0>] show_stack+0x64/0xf4
[<804bca14>] dump_stack_lvl+0x38/0x60
[<800218ac>] __warn+0x94/0xe4
[<8002195c>] warn_slowpath_fmt+0x60/0x94
[<80259ff8>] rt3883_bus_recalc_rate+0x98/0x138
[<80254530>] __clk_register+0x568/0x688
[<80254838>] of_clk_hw_register+0x18/0x2c
[<8070b910>] rt2880_clk_of_clk_init_driver+0x18c/0x594
[<8070b628>] of_clk_init+0x1c0/0x23c
[<806fc448>] plat_time_init+0x58/0x18c
[<806fdaf0>] time_init+0x10/0x6c
[<806f9bc4>] start_kernel+0x458/0x67c

---[ end trace 0000000000000000 ]---

When this driver was mainlined we could not find any active users of old
ralink SoCs so we cannot perform any real tests for them. Now, one user
of a Belkin f9k1109 version 1 device which uses RT3883 SoC appeared and
reported some issues in openWRT:
- https://github.com/openwrt/openwrt/issues/16054

Thus, define a 'rt2880_xtal_recalc_rate()' just returning the expected
frequency 40Mhz and use it along the old ralink SoCs to have a correct
boot trace with no warnings and a working clock plan from the beggining.

Fixes: 6f3b15586eef ("clk: ralink: add clock and reset driver for MTMIPS SoCs")
Signed-off-by: Sergio Paracuellos <sergio.paracuellos@gmail.com>
Link: https://lore.kernel.org/r/20240910044024.120009-3-sergio.paracuellos@gmail.com
Signed-off-by: Stephen Boyd <sboyd@kernel.org>

authored by

Sergio Paracuellos and committed by
Stephen Boyd
d34db686 33239152

+13 -8
+13 -8
drivers/clk/ralink/clk-mtmips.c
··· 263 263 .rate = _rate \ 264 264 } 265 265 266 - static struct mtmips_clk_fixed rt305x_fixed_clocks[] = { 267 - CLK_FIXED("xtal", NULL, 40000000) 268 - }; 269 - 270 266 static struct mtmips_clk_fixed rt3883_fixed_clocks[] = { 271 267 CLK_FIXED("xtal", NULL, 40000000), 272 268 CLK_FIXED("periph", "xtal", 40000000) ··· 365 369 static inline struct mtmips_clk *to_mtmips_clk(struct clk_hw *hw) 366 370 { 367 371 return container_of(hw, struct mtmips_clk, hw); 372 + } 373 + 374 + static unsigned long rt2880_xtal_recalc_rate(struct clk_hw *hw, 375 + unsigned long parent_rate) 376 + { 377 + return 40000000; 368 378 } 369 379 370 380 static unsigned long rt5350_xtal_recalc_rate(struct clk_hw *hw, ··· 684 682 } 685 683 686 684 static struct mtmips_clk rt2880_clks_base[] = { 685 + { CLK_BASE("xtal", NULL, rt2880_xtal_recalc_rate) }, 687 686 { CLK_BASE("cpu", "xtal", rt2880_cpu_recalc_rate) } 688 687 }; 689 688 690 689 static struct mtmips_clk rt305x_clks_base[] = { 690 + { CLK_BASE("xtal", NULL, rt2880_xtal_recalc_rate) }, 691 691 { CLK_BASE("cpu", "xtal", rt305x_cpu_recalc_rate) } 692 692 }; 693 693 ··· 699 695 }; 700 696 701 697 static struct mtmips_clk rt3883_clks_base[] = { 698 + { CLK_BASE("xtal", NULL, rt2880_xtal_recalc_rate) }, 702 699 { CLK_BASE("cpu", "xtal", rt3883_cpu_recalc_rate) }, 703 700 { CLK_BASE("bus", "cpu", rt3883_bus_recalc_rate) } 704 701 }; ··· 756 751 static const struct mtmips_clk_data rt2880_clk_data = { 757 752 .clk_base = rt2880_clks_base, 758 753 .num_clk_base = ARRAY_SIZE(rt2880_clks_base), 759 - .clk_fixed = rt305x_fixed_clocks, 760 - .num_clk_fixed = ARRAY_SIZE(rt305x_fixed_clocks), 754 + .clk_fixed = NULL, 755 + .num_clk_fixed = 0, 761 756 .clk_factor = rt2880_factor_clocks, 762 757 .num_clk_factor = ARRAY_SIZE(rt2880_factor_clocks), 763 758 .clk_periph = rt2880_pherip_clks, ··· 767 762 static const struct mtmips_clk_data rt305x_clk_data = { 768 763 .clk_base = rt305x_clks_base, 769 764 .num_clk_base = ARRAY_SIZE(rt305x_clks_base), 770 - .clk_fixed = rt305x_fixed_clocks, 771 - .num_clk_fixed = ARRAY_SIZE(rt305x_fixed_clocks), 765 + .clk_fixed = NULL, 766 + .num_clk_fixed = 0, 772 767 .clk_factor = rt305x_factor_clocks, 773 768 .num_clk_factor = ARRAY_SIZE(rt305x_factor_clocks), 774 769 .clk_periph = rt305x_pherip_clks,