[PATCH 31/48] clk: qcom: gcc-sm8450: Use common clock controller probe data
From: Abel Vesa
Date: Wed Sep 16 2026 - 06:46:37 EST
Move the always-on branch register offsets into a critical_cbcrs array
and describe the DFS RCGs through qcom_cc_driver_data.
Move the UFS PHY ICE core FORCE_MEM_CORE_ON setting into the
clk_regs_configure callback. This moves the UFS setting after the
always-on branch enables. Those branches serve the camera, display, GPU
and video blocks, not the UFS PHY ICE core clock. The UFS setting is
still applied before GDSC and CCF clock registration.
Keep the SM8475-specific PLL and RCG adjustments in the driver's probe
before calling qcom_cc_probe(), which now handles register mapping and
the common initialization sequence.
Assisted-by: LLM
Signed-off-by: Abel Vesa <abel.vesa@xxxxxxxxxxxxxxxx>
---
drivers/clk/qcom/gcc-sm8450.c | 51 ++++++++++++++++++++++---------------------
1 file changed, 26 insertions(+), 25 deletions(-)
diff --git a/drivers/clk/qcom/gcc-sm8450.c b/drivers/clk/qcom/gcc-sm8450.c
index b18bb34889ab..0d3ed24628fc 100644
--- a/drivers/clk/qcom/gcc-sm8450.c
+++ b/drivers/clk/qcom/gcc-sm8450.c
@@ -3392,7 +3392,32 @@ static const struct regmap_config gcc_sm8450_regmap_config = {
.fast_io = true,
};
+static const u32 gcc_sm8450_critical_cbcrs[] = {
+ 0x36004, /* GCC_CAMERA_AHB_CLK */
+ 0x36020, /* GCC_CAMERA_XO_CLK */
+ 0x37004, /* GCC_DISP_AHB_CLK */
+ 0x3701c, /* GCC_DISP_XO_CLK */
+ 0x81004, /* GCC_GPU_CFG_AHB_CLK */
+ 0x42004, /* GCC_VIDEO_AHB_CLK */
+ 0x42028, /* GCC_VIDEO_XO_CLK */
+};
+
+static void gcc_sm8450_regs_configure(struct device *dev, struct regmap *regmap)
+{
+ /* FORCE_MEM_CORE_ON for ufs phy ice core clocks */
+ regmap_update_bits(regmap, gcc_ufs_phy_ice_core_clk.halt_reg, BIT(14), BIT(14));
+}
+
+static const struct qcom_cc_driver_data gcc_sm8450_driver_data = {
+ .clk_cbcrs = gcc_sm8450_critical_cbcrs,
+ .num_clk_cbcrs = ARRAY_SIZE(gcc_sm8450_critical_cbcrs),
+ .dfs_rcgs = gcc_dfs_clocks,
+ .num_dfs_rcgs = ARRAY_SIZE(gcc_dfs_clocks),
+ .clk_regs_configure = gcc_sm8450_regs_configure,
+};
+
static const struct qcom_cc_desc gcc_sm8450_desc = {
+ .driver_data = &gcc_sm8450_driver_data,
.config = &gcc_sm8450_regmap_config,
.clks = gcc_sm8450_clocks,
.num_clks = ARRAY_SIZE(gcc_sm8450_clocks),
@@ -3411,18 +3436,6 @@ MODULE_DEVICE_TABLE(of, gcc_sm8450_match_table);
static int gcc_sm8450_probe(struct platform_device *pdev)
{
- struct regmap *regmap;
- int ret;
-
- regmap = qcom_cc_map(pdev, &gcc_sm8450_desc);
- if (IS_ERR(regmap))
- return PTR_ERR(regmap);
-
- ret = qcom_cc_register_rcg_dfs(regmap, gcc_dfs_clocks,
- ARRAY_SIZE(gcc_dfs_clocks));
- if (ret)
- return ret;
-
if (of_device_is_compatible(pdev->dev.of_node, "qcom,sm8475-gcc")) {
/* Update GCC PLL0 */
gcc_gpll0.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_OLE];
@@ -3456,19 +3469,7 @@ static int gcc_sm8450_probe(struct platform_device *pdev)
gcc_sm8450_desc.clks[SM8475_GCC_GPLL3] = &sm8475_gcc_gpll3.clkr;
}
- /* FORCE_MEM_CORE_ON for ufs phy ice core clocks */
- regmap_update_bits(regmap, gcc_ufs_phy_ice_core_clk.halt_reg, BIT(14), BIT(14));
-
- /* Keep some clocks always-on */
- qcom_branch_set_clk_en(regmap, 0x36004); /* GCC_CAMERA_AHB_CLK */
- qcom_branch_set_clk_en(regmap, 0x36020); /* GCC_CAMERA_XO_CLK */
- qcom_branch_set_clk_en(regmap, 0x37004); /* GCC_DISP_AHB_CLK */
- qcom_branch_set_clk_en(regmap, 0x3701c); /* GCC_DISP_XO_CLK */
- qcom_branch_set_clk_en(regmap, 0x81004); /* GCC_GPU_CFG_AHB_CLK */
- qcom_branch_set_clk_en(regmap, 0x42004); /* GCC_VIDEO_AHB_CLK */
- qcom_branch_set_clk_en(regmap, 0x42028); /* GCC_VIDEO_XO_CLK */
-
- return qcom_cc_really_probe(&pdev->dev, &gcc_sm8450_desc, regmap);
+ return qcom_cc_probe(pdev, &gcc_sm8450_desc);
}
static struct platform_driver gcc_sm8450_driver = {
--
2.54.0