diff --git a/drivers/clk/qcom/gcc-sm8650.c b/drivers/clk/qcom/gcc-sm8650.c index 88d0a9e51045..e439c958ae16 100644 --- a/drivers/clk/qcom/gcc-sm8650.c +++ b/drivers/clk/qcom/gcc-sm8650.c @@ -3777,7 +3777,36 @@ static const struct regmap_config gcc_sm8650_regmap_config = { .fast_io = true, }; +static const u32 gcc_sm8650_critical_cbcrs[] = { + 0x26004, /* GCC_CAMERA_AHB_CLK */ + 0x26028, /* GCC_CAMERA_XO_CLK */ + 0x27004, /* GCC_DISP_AHB_CLK */ + 0x27018, /* GCC_DISP_XO_CLK */ + 0x71004, /* GCC_GPU_CFG_AHB_CLK */ + 0x32004, /* GCC_VIDEO_AHB_CLK */ + 0x32030, /* GCC_VIDEO_XO_CLK */ +}; + +static void gcc_sm8650_regs_configure(struct device *dev, struct regmap *regmap) +{ + /* FORCE_MEM_CORE_ON for ufs phy ice core and gcc ufs phy axi clocks */ + qcom_branch_set_force_mem_core(regmap, gcc_ufs_phy_ice_core_clk, true); + qcom_branch_set_force_mem_core(regmap, gcc_ufs_phy_axi_clk, true); + + /* Clear GDSC_SLEEP_ENA_VOTE to stop votes being auto-removed in sleep. */ + regmap_write(regmap, 0x52150, 0x0); +} + +static const struct qcom_cc_driver_data gcc_sm8650_driver_data = { + .clk_cbcrs = gcc_sm8650_critical_cbcrs, + .num_clk_cbcrs = ARRAY_SIZE(gcc_sm8650_critical_cbcrs), + .dfs_rcgs = gcc_dfs_clocks, + .num_dfs_rcgs = ARRAY_SIZE(gcc_dfs_clocks), + .clk_regs_configure = gcc_sm8650_regs_configure, +}; + static const struct qcom_cc_desc gcc_sm8650_desc = { + .driver_data = &gcc_sm8650_driver_data, .config = &gcc_sm8650_regmap_config, .clks = gcc_sm8650_clocks, .num_clks = ARRAY_SIZE(gcc_sm8650_clocks), @@ -3796,35 +3825,7 @@ MODULE_DEVICE_TABLE(of, gcc_sm8650_match_table); static int gcc_sm8650_probe(struct platform_device *pdev) { - struct regmap *regmap; - int ret; - - regmap = qcom_cc_map(pdev, &gcc_sm8650_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; - - /* Keep some clocks always-on */ - qcom_branch_set_clk_en(regmap, 0x26004); /* GCC_CAMERA_AHB_CLK */ - qcom_branch_set_clk_en(regmap, 0x26028); /* GCC_CAMERA_XO_CLK */ - qcom_branch_set_clk_en(regmap, 0x27004); /* GCC_DISP_AHB_CLK */ - qcom_branch_set_clk_en(regmap, 0x27018); /* GCC_DISP_XO_CLK */ - qcom_branch_set_clk_en(regmap, 0x71004); /* GCC_GPU_CFG_AHB_CLK */ - qcom_branch_set_clk_en(regmap, 0x32004); /* GCC_VIDEO_AHB_CLK */ - qcom_branch_set_clk_en(regmap, 0x32030); /* GCC_VIDEO_XO_CLK */ - - /* FORCE_MEM_CORE_ON for ufs phy ice core and gcc ufs phy axi clocks */ - qcom_branch_set_force_mem_core(regmap, gcc_ufs_phy_ice_core_clk, true); - qcom_branch_set_force_mem_core(regmap, gcc_ufs_phy_axi_clk, true); - - /* Clear GDSC_SLEEP_ENA_VOTE to stop votes being auto-removed in sleep. */ - regmap_write(regmap, 0x52150, 0x0); - - return qcom_cc_really_probe(&pdev->dev, &gcc_sm8650_desc, regmap); + return qcom_cc_probe(pdev, &gcc_sm8650_desc); } static struct platform_driver gcc_sm8650_driver = {