This is an automatically generated commit which aids following Kernel patch history, as git will see the move and copy as a rename thus defeating the purpose. For the original discussion see: https://lists.openwrt.org/pipermail/openwrt-devel/2023-October/041673.html Signed-off-by: Tianling Shen <cnsztl@immortalwrt.org> Link: https://github.com/openwrt/openwrt/pull/23139 Signed-off-by: Nick Hainke <vincent@systemli.org>
151 lines
5.3 KiB
Diff
151 lines
5.3 KiB
Diff
From 33af96244a66f855baa43d424844bb437c79c30c Mon Sep 17 00:00:00 2001
|
|
From: Sebastian Reichel <sebastian.reichel@collabora.com>
|
|
Date: Wed, 11 Dec 2024 17:58:51 +0100
|
|
Subject: [PATCH] clk: rockchip: rk3588: register GATE_LINK later
|
|
|
|
The proper GATE_LINK implementation will use runtime PM to handle the
|
|
linked gate clocks, which requires device context. Currently all clocks
|
|
are registered early via CLK_OF_DECLARE, which is before the kernel
|
|
knows about devices.
|
|
|
|
Moving the full clocks registration to the probe routine does not work,
|
|
since the clocks needed for timers must be registered early.
|
|
|
|
To work around this issue, most of the clock tree is registered early,
|
|
but GATE_LINK clocks are handled in the probe routine. Since the resets
|
|
are not needed early either, they have also been moved to the probe
|
|
routine.
|
|
|
|
Signed-off-by: Sebastian Reichel <sebastian.reichel@collabora.com>
|
|
Link: https://lore.kernel.org/r/20241211165957.94922-3-sebastian.reichel@collabora.com
|
|
Signed-off-by: Heiko Stuebner <heiko@sntech.de>
|
|
---
|
|
drivers/clk/rockchip/clk-rk3588.c | 66 +++++++++++++++++++++++++++----
|
|
1 file changed, 58 insertions(+), 8 deletions(-)
|
|
|
|
--- a/drivers/clk/rockchip/clk-rk3588.c
|
|
+++ b/drivers/clk/rockchip/clk-rk3588.c
|
|
@@ -266,6 +266,8 @@ static struct rockchip_pll_rate_table rk
|
|
}, \
|
|
}
|
|
|
|
+static struct rockchip_clk_provider *early_ctx;
|
|
+
|
|
static struct rockchip_cpuclk_rate_table rk3588_cpub0clk_rates[] __initdata = {
|
|
RK3588_CPUB01CLK_RATE(2496000000, 1),
|
|
RK3588_CPUB01CLK_RATE(2400000000, 1),
|
|
@@ -694,7 +696,7 @@ static struct rockchip_pll_clock rk3588_
|
|
RK3588_MODE_CON0, 10, 15, 0, rk3588_pll_rates),
|
|
};
|
|
|
|
-static struct rockchip_clk_branch rk3588_clk_branches[] __initdata = {
|
|
+static struct rockchip_clk_branch rk3588_early_clk_branches[] __initdata = {
|
|
/*
|
|
* CRU Clock-Architecture
|
|
*/
|
|
@@ -2428,7 +2430,9 @@ static struct rockchip_clk_branch rk3588
|
|
RK3588_CLKGATE_CON(68), 5, GFLAGS),
|
|
GATE(ACLK_AV1, "aclk_av1", "aclk_av1_pre", 0,
|
|
RK3588_CLKGATE_CON(68), 2, GFLAGS),
|
|
+};
|
|
|
|
+static struct rockchip_clk_branch rk3588_clk_branches[] = {
|
|
GATE_LINK(ACLK_ISP1_PRE, "aclk_isp1_pre", "aclk_isp1_root", ACLK_VI_ROOT, 0, RK3588_CLKGATE_CON(26), 6, GFLAGS),
|
|
GATE_LINK(HCLK_ISP1_PRE, "hclk_isp1_pre", "hclk_isp1_root", HCLK_VI_ROOT, 0, RK3588_CLKGATE_CON(26), 8, GFLAGS),
|
|
GATE_LINK(HCLK_NVM, "hclk_nvm", "hclk_nvm_root", ACLK_NVM_ROOT, RK3588_LINKED_CLK, RK3588_CLKGATE_CON(31), 2, GFLAGS),
|
|
@@ -2453,26 +2457,31 @@ static struct rockchip_clk_branch rk3588
|
|
GATE_LINK(PCLK_VO1GRF, "pclk_vo1grf", "pclk_vo1_root", HCLK_VO1, CLK_IGNORE_UNUSED, RK3588_CLKGATE_CON(59), 12, GFLAGS),
|
|
};
|
|
|
|
-static void __init rk3588_clk_init(struct device_node *np)
|
|
+static void __init rk3588_clk_early_init(struct device_node *np)
|
|
{
|
|
struct rockchip_clk_provider *ctx;
|
|
- unsigned long clk_nr_clks;
|
|
+ unsigned long clk_nr_clks, max_clk_id1, max_clk_id2;
|
|
void __iomem *reg_base;
|
|
|
|
- clk_nr_clks = rockchip_clk_find_max_clk_id(rk3588_clk_branches,
|
|
- ARRAY_SIZE(rk3588_clk_branches)) + 1;
|
|
+ max_clk_id1 = rockchip_clk_find_max_clk_id(rk3588_clk_branches,
|
|
+ ARRAY_SIZE(rk3588_clk_branches));
|
|
+ max_clk_id2 = rockchip_clk_find_max_clk_id(rk3588_early_clk_branches,
|
|
+ ARRAY_SIZE(rk3588_early_clk_branches));
|
|
+ clk_nr_clks = max(max_clk_id1, max_clk_id2) + 1;
|
|
+
|
|
reg_base = of_iomap(np, 0);
|
|
if (!reg_base) {
|
|
pr_err("%s: could not map cru region\n", __func__);
|
|
return;
|
|
}
|
|
|
|
- ctx = rockchip_clk_init(np, reg_base, clk_nr_clks);
|
|
+ ctx = rockchip_clk_init_early(np, reg_base, clk_nr_clks);
|
|
if (IS_ERR(ctx)) {
|
|
pr_err("%s: rockchip clk init failed\n", __func__);
|
|
iounmap(reg_base);
|
|
return;
|
|
}
|
|
+ early_ctx = ctx;
|
|
|
|
rockchip_clk_register_plls(ctx, rk3588_pll_clks,
|
|
ARRAY_SIZE(rk3588_pll_clks),
|
|
@@ -2491,14 +2500,55 @@ static void __init rk3588_clk_init(struc
|
|
&rk3588_cpub1clk_data, rk3588_cpub1clk_rates,
|
|
ARRAY_SIZE(rk3588_cpub1clk_rates));
|
|
|
|
+ rockchip_clk_register_branches(ctx, rk3588_early_clk_branches,
|
|
+ ARRAY_SIZE(rk3588_early_clk_branches));
|
|
+
|
|
+ rockchip_clk_of_add_provider(np, ctx);
|
|
+}
|
|
+CLK_OF_DECLARE_DRIVER(rk3588_cru, "rockchip,rk3588-cru", rk3588_clk_early_init);
|
|
+
|
|
+static int clk_rk3588_probe(struct platform_device *pdev)
|
|
+{
|
|
+ struct rockchip_clk_provider *ctx = early_ctx;
|
|
+ struct device *dev = &pdev->dev;
|
|
+ struct device_node *np = dev->of_node;
|
|
+
|
|
rockchip_clk_register_branches(ctx, rk3588_clk_branches,
|
|
ARRAY_SIZE(rk3588_clk_branches));
|
|
|
|
- rk3588_rst_init(np, reg_base);
|
|
+ rockchip_clk_finalize(ctx);
|
|
|
|
+ rk3588_rst_init(np, ctx->reg_base);
|
|
rockchip_register_restart_notifier(ctx, RK3588_GLB_SRST_FST, NULL);
|
|
|
|
+ /*
|
|
+ * Re-add clock provider, so that the newly added clocks are also
|
|
+ * re-parented and get their defaults configured.
|
|
+ */
|
|
+ of_clk_del_provider(np);
|
|
rockchip_clk_of_add_provider(np, ctx);
|
|
+
|
|
+ return 0;
|
|
}
|
|
|
|
-CLK_OF_DECLARE(rk3588_cru, "rockchip,rk3588-cru", rk3588_clk_init);
|
|
+static const struct of_device_id clk_rk3588_match_table[] = {
|
|
+ {
|
|
+ .compatible = "rockchip,rk3588-cru",
|
|
+ },
|
|
+ { }
|
|
+};
|
|
+
|
|
+static struct platform_driver clk_rk3588_driver = {
|
|
+ .probe = clk_rk3588_probe,
|
|
+ .driver = {
|
|
+ .name = "clk-rk3588",
|
|
+ .of_match_table = clk_rk3588_match_table,
|
|
+ .suppress_bind_attrs = true,
|
|
+ },
|
|
+};
|
|
+
|
|
+static int __init rockchip_clk_rk3588_drv_register(void)
|
|
+{
|
|
+ return platform_driver_register(&clk_rk3588_driver);
|
|
+}
|
|
+core_initcall(rockchip_clk_rk3588_drv_register);
|