@@ -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
8490static 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