clk: qcom: cpu-8996: fix ACD initialization
authorDmitry Baryshkov <dmitry.baryshkov@linaro.org>
Fri, 13 Jan 2023 12:05:41 +0000 (14:05 +0200)
committerBjorn Andersson <andersson@kernel.org>
Thu, 19 Jan 2023 04:50:01 +0000 (22:50 -0600)
The vendor kernel applies different order while programming SSSCTL and
L2ACDCR registers on power and performance clusters. However it was
demonstrated that doing this upstream results in the board reset. Make
both clusters use the same sequence, which fixes the reset.

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-12-dmitry.baryshkov@linaro.org
drivers/clk/qcom/clk-cpu-8996.c

index 244b7279921452a62c43539df3f5a0bfd91b2c7e..746fa0e2ef67f6c24459841ff57fc4cda9bac859 100644 (file)
@@ -475,9 +475,9 @@ static int qcom_cpu_clk_msm8996_register_clks(struct device *dev,
        return ret;
 }
 
-#define CPU_AFINITY_MASK 0xFFF
-#define PWRCL_CPU_REG_MASK 0x3
-#define PERFCL_CPU_REG_MASK 0x103
+#define CPU_CLUSTER_AFFINITY_MASK 0xf00
+#define PWRCL_AFFINITY_MASK 0x000
+#define PERFCL_AFFINITY_MASK 0x100
 
 #define L2ACDCR_REG 0x580ULL
 #define L2ACDTD_REG 0x581ULL
@@ -498,21 +498,17 @@ static void qcom_cpu_clk_msm8996_acd_init(struct regmap *regmap)
        if (val == 0x00006a11)
                goto out;
 
-       hwid = read_cpuid_mpidr() & CPU_AFINITY_MASK;
-
        kryo_l2_set_indirect_reg(L2ACDTD_REG, 0x00006a11);
        kryo_l2_set_indirect_reg(L2ACDDVMRC_REG, 0x000e0f0f);
        kryo_l2_set_indirect_reg(L2ACDSSCR_REG, 0x00000601);
 
-       if (PWRCL_CPU_REG_MASK == (hwid | PWRCL_CPU_REG_MASK)) {
-               regmap_write(regmap, PWRCL_REG_OFFSET + SSSCTL_OFFSET, 0xf);
-               kryo_l2_set_indirect_reg(L2ACDCR_REG, 0x002c5ffd);
-       }
+       kryo_l2_set_indirect_reg(L2ACDCR_REG, 0x002c5ffd);
 
-       if (PERFCL_CPU_REG_MASK == (hwid | PERFCL_CPU_REG_MASK)) {
-               kryo_l2_set_indirect_reg(L2ACDCR_REG, 0x002c5ffd);
+       hwid = read_cpuid_mpidr();
+       if ((hwid & CPU_CLUSTER_AFFINITY_MASK) == PWRCL_AFFINITY_MASK)
+               regmap_write(regmap, PWRCL_REG_OFFSET + SSSCTL_OFFSET, 0xf);
+       else
                regmap_write(regmap, PERFCL_REG_OFFSET + SSSCTL_OFFSET, 0xf);
-       }
 
 out:
        spin_unlock_irqrestore(&qcom_clk_acd_lock, flags);