Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

clk: qcom: handle alpha PLLs with 16bit alpha val registers

Some alpha PLLs have support for only a 16bit programable Alpha Value
(as against the default 40bits). Add a flag to handle the 16bit alpha
registers

Signed-off-by: Rajendra Nayak <rnayak@codeaurora.org>
Signed-off-by: Stephen Boyd <sboyd@codeaurora.org>

authored by

Rajendra Nayak and committed by
Stephen Boyd
31256f48 9f4e6277

+18 -7
+17 -7
drivers/clk/qcom/clk-alpha-pll.c
··· 59 59 */ 60 60 #define ALPHA_REG_BITWIDTH 40 61 61 #define ALPHA_BITWIDTH 32 62 + #define ALPHA_16BIT_MASK 0xffff 62 63 63 64 #define to_clk_alpha_pll(_hw) container_of(to_clk_regmap(_hw), \ 64 65 struct clk_alpha_pll, clkr) ··· 335 334 regmap_read(pll->clkr.regmap, off + PLL_USER_CTL, &ctl); 336 335 if (ctl & PLL_ALPHA_EN) { 337 336 regmap_read(pll->clkr.regmap, off + PLL_ALPHA_VAL, &low); 338 - regmap_read(pll->clkr.regmap, off + PLL_ALPHA_VAL_U, &high); 339 - a = (u64)high << 32 | low; 340 - a >>= ALPHA_REG_BITWIDTH - ALPHA_BITWIDTH; 337 + if (pll->flags & SUPPORTS_16BIT_ALPHA) { 338 + a = low & ALPHA_16BIT_MASK; 339 + } else { 340 + regmap_read(pll->clkr.regmap, off + PLL_ALPHA_VAL_U, 341 + &high); 342 + a = (u64)high << 32 | low; 343 + a >>= ALPHA_REG_BITWIDTH - ALPHA_BITWIDTH; 344 + } 341 345 } 342 346 343 347 return alpha_pll_calc_rate(prate, l, a); ··· 363 357 return -EINVAL; 364 358 } 365 359 366 - a <<= (ALPHA_REG_BITWIDTH - ALPHA_BITWIDTH); 367 - 368 360 regmap_write(pll->clkr.regmap, off + PLL_L_VAL, l); 369 - regmap_write(pll->clkr.regmap, off + PLL_ALPHA_VAL, a); 370 - regmap_write(pll->clkr.regmap, off + PLL_ALPHA_VAL_U, a >> 32); 361 + 362 + if (pll->flags & SUPPORTS_16BIT_ALPHA) { 363 + regmap_write(pll->clkr.regmap, off + PLL_ALPHA_VAL, 364 + a & ALPHA_16BIT_MASK); 365 + } else { 366 + a <<= (ALPHA_REG_BITWIDTH - ALPHA_BITWIDTH); 367 + regmap_write(pll->clkr.regmap, off + PLL_ALPHA_VAL_U, a >> 32); 368 + } 371 369 372 370 regmap_update_bits(pll->clkr.regmap, off + PLL_USER_CTL, 373 371 PLL_VCO_MASK << PLL_VCO_SHIFT,
+1
drivers/clk/qcom/clk-alpha-pll.h
··· 35 35 const struct pll_vco *vco_table; 36 36 size_t num_vco; 37 37 #define SUPPORTS_OFFLINE_REQ BIT(0) 38 + #define SUPPORTS_16BIT_ALPHA BIT(1) 38 39 u8 flags; 39 40 40 41 struct clk_regmap clkr;