Skip to content

Commit 9daaaaa

Browse files
lumagandersson
authored andcommitted
clk: qcom: cpu-8996: change setup sequence to follow vendor kernel
Add missing register writes to CPU clocks setup procedure. This makes it follow the setup procedure used in msm-3.18 kernel. Reviewed-by: Konrad Dybcio <[email protected]> Signed-off-by: Dmitry Baryshkov <[email protected]> Signed-off-by: Bjorn Andersson <[email protected]> Link: https://lore.kernel.org/r/[email protected]
1 parent 682c6a4 commit 9daaaaa

File tree

1 file changed

+29
-2
lines changed

1 file changed

+29
-2
lines changed

drivers/clk/qcom/clk-cpu-8996.c

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,10 +76,16 @@ enum _pmux_input {
7676
#define PWRCL_REG_OFFSET 0x0
7777
#define PERFCL_REG_OFFSET 0x80000
7878
#define MUX_OFFSET 0x40
79+
#define CLK_CTL_OFFSET 0x44
80+
#define CLK_CTL_AUTO_CLK_SEL BIT(8)
7981
#define ALT_PLL_OFFSET 0x100
8082
#define SSSCTL_OFFSET 0x160
83+
#define PSCTL_OFFSET 0x164
8184

8285
#define PMUX_MASK 0x3
86+
#define MUX_AUTO_CLK_SEL_ALWAYS_ON_MASK GENMASK(5, 4)
87+
#define MUX_AUTO_CLK_SEL_ALWAYS_ON_GPLL0_SEL \
88+
FIELD_PREP(MUX_AUTO_CLK_SEL_ALWAYS_ON_MASK, 0x03)
8389

8490
static const u8 prim_pll_regs[PLL_OFF_MAX_REGS] = {
8591
[PLL_OFF_L_VAL] = 0x04,
@@ -439,6 +445,14 @@ static int qcom_cpu_clk_msm8996_register_clks(struct device *dev,
439445
/* Ensure write goes through before PLLs are reconfigured */
440446
udelay(5);
441447

448+
/* Set the auto clock sel always-on source to GPLL0/2 (300MHz) */
449+
regmap_update_bits(regmap, PWRCL_REG_OFFSET + MUX_OFFSET,
450+
MUX_AUTO_CLK_SEL_ALWAYS_ON_MASK,
451+
MUX_AUTO_CLK_SEL_ALWAYS_ON_GPLL0_SEL);
452+
regmap_update_bits(regmap, PERFCL_REG_OFFSET + MUX_OFFSET,
453+
MUX_AUTO_CLK_SEL_ALWAYS_ON_MASK,
454+
MUX_AUTO_CLK_SEL_ALWAYS_ON_GPLL0_SEL);
455+
442456
clk_alpha_pll_configure(&pwrcl_pll, regmap, &hfpll_config);
443457
clk_alpha_pll_configure(&perfcl_pll, regmap, &hfpll_config);
444458
clk_alpha_pll_configure(&pwrcl_alt_pll, regmap, &altpll_config);
@@ -447,11 +461,24 @@ static int qcom_cpu_clk_msm8996_register_clks(struct device *dev,
447461
/* Wait for PLL(s) to lock */
448462
udelay(50);
449463

464+
/* Enable auto clock selection for both clusters */
465+
regmap_update_bits(regmap, PWRCL_REG_OFFSET + CLK_CTL_OFFSET,
466+
CLK_CTL_AUTO_CLK_SEL, CLK_CTL_AUTO_CLK_SEL);
467+
regmap_update_bits(regmap, PERFCL_REG_OFFSET + CLK_CTL_OFFSET,
468+
CLK_CTL_AUTO_CLK_SEL, CLK_CTL_AUTO_CLK_SEL);
469+
470+
/* Ensure write goes through before muxes are switched */
471+
udelay(5);
472+
450473
qcom_cpu_clk_msm8996_acd_init(regmap);
451474

475+
/* Pulse swallower and soft-start settings */
476+
regmap_write(regmap, PWRCL_REG_OFFSET + PSCTL_OFFSET, 0x00030005);
477+
regmap_write(regmap, PERFCL_REG_OFFSET + PSCTL_OFFSET, 0x00030005);
478+
452479
/* Switch clusters to use the ACD leg */
453-
regmap_write(regmap, PWRCL_REG_OFFSET + MUX_OFFSET, 0x2);
454-
regmap_write(regmap, PERFCL_REG_OFFSET + MUX_OFFSET, 0x2);
480+
regmap_write(regmap, PWRCL_REG_OFFSET + MUX_OFFSET, 0x32);
481+
regmap_write(regmap, PERFCL_REG_OFFSET + MUX_OFFSET, 0x32);
455482

456483
for (i = 0; i < ARRAY_SIZE(cpu_msm8996_hw_clks); i++) {
457484
ret = devm_clk_hw_register(dev, cpu_msm8996_hw_clks[i]);

0 commit comments

Comments
 (0)