clk: qcom: cpu-8996: fix PLL configuration sequence
authorDmitry Baryshkov <dmitry.baryshkov@linaro.org>
Fri, 13 Jan 2023 12:05:40 +0000 (14:05 +0200)
committerBjorn Andersson <andersson@kernel.org>
Thu, 19 Jan 2023 04:50:01 +0000 (22:50 -0600)
Switch both power and performance clocks to the GPLL0/2 (sys_apcs_aux)
before PLL configuration. Switch them to the ACD afterwards.

Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
Reviewed-by: Konrad Dybcio <konrad.dybcio@linaro.org>
Signed-off-by: Bjorn Andersson <andersson@kernel.org>
Link: https://lore.kernel.org/r/20230113120544.59320-11-dmitry.baryshkov@linaro.org
drivers/clk/qcom/clk-cpu-8996.c

index 45015bb0dafe46a02e4558a40b4534970bed80d5..244b7279921452a62c43539df3f5a0bfd91b2c7e 100644 (file)
@@ -432,13 +432,27 @@ static int qcom_cpu_clk_msm8996_register_clks(struct device *dev,
 {
        int i, ret;
 
+       /* Select GPLL0 for 300MHz for both clusters */
+       regmap_write(regmap, PERFCL_REG_OFFSET + MUX_OFFSET, 0xc);
+       regmap_write(regmap, PWRCL_REG_OFFSET + MUX_OFFSET, 0xc);
+
+       /* Ensure write goes through before PLLs are reconfigured */
+       udelay(5);
+
        clk_alpha_pll_configure(&pwrcl_pll, regmap, &hfpll_config);
        clk_alpha_pll_configure(&perfcl_pll, regmap, &hfpll_config);
        clk_alpha_pll_configure(&pwrcl_alt_pll, regmap, &altpll_config);
        clk_alpha_pll_configure(&perfcl_alt_pll, regmap, &altpll_config);
 
+       /* Wait for PLL(s) to lock */
+       udelay(50);
+
        qcom_cpu_clk_msm8996_acd_init(regmap);
 
+       /* Switch clusters to use the ACD leg */
+       regmap_write(regmap, PWRCL_REG_OFFSET + MUX_OFFSET, 0x2);
+       regmap_write(regmap, PERFCL_REG_OFFSET + MUX_OFFSET, 0x2);
+
        for (i = 0; i < ARRAY_SIZE(cpu_msm8996_hw_clks); i++) {
                ret = devm_clk_hw_register(dev, cpu_msm8996_hw_clks[i]);
                if (ret)