1 // SPDX-License-Identifier: GPL-2.0 2 /* 3 * Copyright (c) 2015, 2018, The Linux Foundation. All rights reserved. 4 * Copyright (c) 2021, 2023, Qualcomm Innovation Center, Inc. All rights reserved. 5 */ 6 7 #include <linux/kernel.h> 8 #include <linux/export.h> 9 #include <linux/clk-provider.h> 10 #include <linux/regmap.h> 11 #include <linux/delay.h> 12 13 #include "clk-alpha-pll.h" 14 #include "common.h" 15 16 #define PLL_MODE(p) ((p)->offset + 0x0) 17 # define PLL_OUTCTRL BIT(0) 18 # define PLL_BYPASSNL BIT(1) 19 # define PLL_RESET_N BIT(2) 20 # define PLL_OFFLINE_REQ BIT(7) 21 # define PLL_LOCK_COUNT_SHIFT 8 22 # define PLL_LOCK_COUNT_MASK 0x3f 23 # define PLL_BIAS_COUNT_SHIFT 14 24 # define PLL_BIAS_COUNT_MASK 0x3f 25 # define PLL_VOTE_FSM_ENA BIT(20) 26 # define PLL_FSM_ENA BIT(20) 27 # define PLL_VOTE_FSM_RESET BIT(21) 28 # define PLL_UPDATE BIT(22) 29 # define PLL_UPDATE_BYPASS BIT(23) 30 # define PLL_FSM_LEGACY_MODE BIT(24) 31 # define PLL_OFFLINE_ACK BIT(28) 32 # define ALPHA_PLL_ACK_LATCH BIT(29) 33 # define PLL_ACTIVE_FLAG BIT(30) 34 # define PLL_LOCK_DET BIT(31) 35 36 #define PLL_L_VAL(p) ((p)->offset + (p)->regs[PLL_OFF_L_VAL]) 37 #define PLL_CAL_L_VAL(p) ((p)->offset + (p)->regs[PLL_OFF_CAL_L_VAL]) 38 #define PLL_ALPHA_VAL(p) ((p)->offset + (p)->regs[PLL_OFF_ALPHA_VAL]) 39 #define PLL_ALPHA_VAL_U(p) ((p)->offset + (p)->regs[PLL_OFF_ALPHA_VAL_U]) 40 41 #define PLL_USER_CTL(p) ((p)->offset + (p)->regs[PLL_OFF_USER_CTL]) 42 # define PLL_POST_DIV_SHIFT 8 43 # define PLL_POST_DIV_MASK(p) GENMASK((p)->width, 0) 44 # define PLL_ALPHA_EN BIT(24) 45 # define PLL_ALPHA_MODE BIT(25) 46 # define PLL_VCO_SHIFT 20 47 # define PLL_VCO_MASK 0x3 48 49 #define PLL_USER_CTL_U(p) ((p)->offset + (p)->regs[PLL_OFF_USER_CTL_U]) 50 #define PLL_USER_CTL_U1(p) ((p)->offset + (p)->regs[PLL_OFF_USER_CTL_U1]) 51 52 #define PLL_CONFIG_CTL(p) ((p)->offset + (p)->regs[PLL_OFF_CONFIG_CTL]) 53 #define PLL_CONFIG_CTL_U(p) ((p)->offset + (p)->regs[PLL_OFF_CONFIG_CTL_U]) 54 #define PLL_CONFIG_CTL_U1(p) ((p)->offset + (p)->regs[PLL_OFF_CONFIG_CTL_U1]) 55 #define PLL_TEST_CTL(p) ((p)->offset + (p)->regs[PLL_OFF_TEST_CTL]) 56 #define PLL_TEST_CTL_U(p) ((p)->offset + (p)->regs[PLL_OFF_TEST_CTL_U]) 57 #define PLL_TEST_CTL_U1(p) ((p)->offset + (p)->regs[PLL_OFF_TEST_CTL_U1]) 58 #define PLL_TEST_CTL_U2(p) ((p)->offset + (p)->regs[PLL_OFF_TEST_CTL_U2]) 59 #define PLL_STATUS(p) ((p)->offset + (p)->regs[PLL_OFF_STATUS]) 60 #define PLL_OPMODE(p) ((p)->offset + (p)->regs[PLL_OFF_OPMODE]) 61 #define PLL_FRAC(p) ((p)->offset + (p)->regs[PLL_OFF_FRAC]) 62 63 const u8 clk_alpha_pll_regs[][PLL_OFF_MAX_REGS] = { 64 [CLK_ALPHA_PLL_TYPE_DEFAULT] = { 65 [PLL_OFF_L_VAL] = 0x04, 66 [PLL_OFF_ALPHA_VAL] = 0x08, 67 [PLL_OFF_ALPHA_VAL_U] = 0x0c, 68 [PLL_OFF_USER_CTL] = 0x10, 69 [PLL_OFF_USER_CTL_U] = 0x14, 70 [PLL_OFF_CONFIG_CTL] = 0x18, 71 [PLL_OFF_TEST_CTL] = 0x1c, 72 [PLL_OFF_TEST_CTL_U] = 0x20, 73 [PLL_OFF_STATUS] = 0x24, 74 }, 75 [CLK_ALPHA_PLL_TYPE_HUAYRA] = { 76 [PLL_OFF_L_VAL] = 0x04, 77 [PLL_OFF_ALPHA_VAL] = 0x08, 78 [PLL_OFF_USER_CTL] = 0x10, 79 [PLL_OFF_CONFIG_CTL] = 0x14, 80 [PLL_OFF_CONFIG_CTL_U] = 0x18, 81 [PLL_OFF_TEST_CTL] = 0x1c, 82 [PLL_OFF_TEST_CTL_U] = 0x20, 83 [PLL_OFF_STATUS] = 0x24, 84 }, 85 [CLK_ALPHA_PLL_TYPE_BRAMMO] = { 86 [PLL_OFF_L_VAL] = 0x04, 87 [PLL_OFF_ALPHA_VAL] = 0x08, 88 [PLL_OFF_ALPHA_VAL_U] = 0x0c, 89 [PLL_OFF_USER_CTL] = 0x10, 90 [PLL_OFF_CONFIG_CTL] = 0x18, 91 [PLL_OFF_TEST_CTL] = 0x1c, 92 [PLL_OFF_STATUS] = 0x24, 93 }, 94 [CLK_ALPHA_PLL_TYPE_FABIA] = { 95 [PLL_OFF_L_VAL] = 0x04, 96 [PLL_OFF_USER_CTL] = 0x0c, 97 [PLL_OFF_USER_CTL_U] = 0x10, 98 [PLL_OFF_CONFIG_CTL] = 0x14, 99 [PLL_OFF_CONFIG_CTL_U] = 0x18, 100 [PLL_OFF_TEST_CTL] = 0x1c, 101 [PLL_OFF_TEST_CTL_U] = 0x20, 102 [PLL_OFF_STATUS] = 0x24, 103 [PLL_OFF_OPMODE] = 0x2c, 104 [PLL_OFF_FRAC] = 0x38, 105 }, 106 [CLK_ALPHA_PLL_TYPE_TRION] = { 107 [PLL_OFF_L_VAL] = 0x04, 108 [PLL_OFF_CAL_L_VAL] = 0x08, 109 [PLL_OFF_USER_CTL] = 0x0c, 110 [PLL_OFF_USER_CTL_U] = 0x10, 111 [PLL_OFF_USER_CTL_U1] = 0x14, 112 [PLL_OFF_CONFIG_CTL] = 0x18, 113 [PLL_OFF_CONFIG_CTL_U] = 0x1c, 114 [PLL_OFF_CONFIG_CTL_U1] = 0x20, 115 [PLL_OFF_TEST_CTL] = 0x24, 116 [PLL_OFF_TEST_CTL_U] = 0x28, 117 [PLL_OFF_TEST_CTL_U1] = 0x2c, 118 [PLL_OFF_STATUS] = 0x30, 119 [PLL_OFF_OPMODE] = 0x38, 120 [PLL_OFF_ALPHA_VAL] = 0x40, 121 }, 122 [CLK_ALPHA_PLL_TYPE_AGERA] = { 123 [PLL_OFF_L_VAL] = 0x04, 124 [PLL_OFF_ALPHA_VAL] = 0x08, 125 [PLL_OFF_USER_CTL] = 0x0c, 126 [PLL_OFF_CONFIG_CTL] = 0x10, 127 [PLL_OFF_CONFIG_CTL_U] = 0x14, 128 [PLL_OFF_TEST_CTL] = 0x18, 129 [PLL_OFF_TEST_CTL_U] = 0x1c, 130 [PLL_OFF_STATUS] = 0x2c, 131 }, 132 [CLK_ALPHA_PLL_TYPE_ZONDA] = { 133 [PLL_OFF_L_VAL] = 0x04, 134 [PLL_OFF_ALPHA_VAL] = 0x08, 135 [PLL_OFF_USER_CTL] = 0x0c, 136 [PLL_OFF_CONFIG_CTL] = 0x10, 137 [PLL_OFF_CONFIG_CTL_U] = 0x14, 138 [PLL_OFF_CONFIG_CTL_U1] = 0x18, 139 [PLL_OFF_TEST_CTL] = 0x1c, 140 [PLL_OFF_TEST_CTL_U] = 0x20, 141 [PLL_OFF_TEST_CTL_U1] = 0x24, 142 [PLL_OFF_OPMODE] = 0x28, 143 [PLL_OFF_STATUS] = 0x38, 144 }, 145 [CLK_ALPHA_PLL_TYPE_LUCID_EVO] = { 146 [PLL_OFF_OPMODE] = 0x04, 147 [PLL_OFF_STATUS] = 0x0c, 148 [PLL_OFF_L_VAL] = 0x10, 149 [PLL_OFF_ALPHA_VAL] = 0x14, 150 [PLL_OFF_USER_CTL] = 0x18, 151 [PLL_OFF_USER_CTL_U] = 0x1c, 152 [PLL_OFF_CONFIG_CTL] = 0x20, 153 [PLL_OFF_CONFIG_CTL_U] = 0x24, 154 [PLL_OFF_CONFIG_CTL_U1] = 0x28, 155 [PLL_OFF_TEST_CTL] = 0x2c, 156 [PLL_OFF_TEST_CTL_U] = 0x30, 157 [PLL_OFF_TEST_CTL_U1] = 0x34, 158 }, 159 [CLK_ALPHA_PLL_TYPE_LUCID_OLE] = { 160 [PLL_OFF_OPMODE] = 0x04, 161 [PLL_OFF_STATE] = 0x08, 162 [PLL_OFF_STATUS] = 0x0c, 163 [PLL_OFF_L_VAL] = 0x10, 164 [PLL_OFF_ALPHA_VAL] = 0x14, 165 [PLL_OFF_USER_CTL] = 0x18, 166 [PLL_OFF_USER_CTL_U] = 0x1c, 167 [PLL_OFF_CONFIG_CTL] = 0x20, 168 [PLL_OFF_CONFIG_CTL_U] = 0x24, 169 [PLL_OFF_CONFIG_CTL_U1] = 0x28, 170 [PLL_OFF_TEST_CTL] = 0x2c, 171 [PLL_OFF_TEST_CTL_U] = 0x30, 172 [PLL_OFF_TEST_CTL_U1] = 0x34, 173 [PLL_OFF_TEST_CTL_U2] = 0x38, 174 }, 175 [CLK_ALPHA_PLL_TYPE_RIVIAN_EVO] = { 176 [PLL_OFF_OPMODE] = 0x04, 177 [PLL_OFF_STATUS] = 0x0c, 178 [PLL_OFF_L_VAL] = 0x10, 179 [PLL_OFF_USER_CTL] = 0x14, 180 [PLL_OFF_USER_CTL_U] = 0x18, 181 [PLL_OFF_CONFIG_CTL] = 0x1c, 182 [PLL_OFF_CONFIG_CTL_U] = 0x20, 183 [PLL_OFF_CONFIG_CTL_U1] = 0x24, 184 [PLL_OFF_TEST_CTL] = 0x28, 185 [PLL_OFF_TEST_CTL_U] = 0x2c, 186 }, 187 [CLK_ALPHA_PLL_TYPE_DEFAULT_EVO] = { 188 [PLL_OFF_L_VAL] = 0x04, 189 [PLL_OFF_ALPHA_VAL] = 0x08, 190 [PLL_OFF_ALPHA_VAL_U] = 0x0c, 191 [PLL_OFF_TEST_CTL] = 0x10, 192 [PLL_OFF_TEST_CTL_U] = 0x14, 193 [PLL_OFF_USER_CTL] = 0x18, 194 [PLL_OFF_USER_CTL_U] = 0x1c, 195 [PLL_OFF_CONFIG_CTL] = 0x20, 196 [PLL_OFF_STATUS] = 0x24, 197 }, 198 [CLK_ALPHA_PLL_TYPE_BRAMMO_EVO] = { 199 [PLL_OFF_L_VAL] = 0x04, 200 [PLL_OFF_ALPHA_VAL] = 0x08, 201 [PLL_OFF_ALPHA_VAL_U] = 0x0c, 202 [PLL_OFF_TEST_CTL] = 0x10, 203 [PLL_OFF_TEST_CTL_U] = 0x14, 204 [PLL_OFF_USER_CTL] = 0x18, 205 [PLL_OFF_CONFIG_CTL] = 0x1C, 206 [PLL_OFF_STATUS] = 0x20, 207 }, 208 [CLK_ALPHA_PLL_TYPE_STROMER] = { 209 [PLL_OFF_L_VAL] = 0x08, 210 [PLL_OFF_ALPHA_VAL] = 0x10, 211 [PLL_OFF_ALPHA_VAL_U] = 0x14, 212 [PLL_OFF_USER_CTL] = 0x18, 213 [PLL_OFF_USER_CTL_U] = 0x1c, 214 [PLL_OFF_CONFIG_CTL] = 0x20, 215 [PLL_OFF_CONFIG_CTL_U] = 0xff, 216 [PLL_OFF_TEST_CTL] = 0x30, 217 [PLL_OFF_TEST_CTL_U] = 0x34, 218 [PLL_OFF_STATUS] = 0x28, 219 }, 220 [CLK_ALPHA_PLL_TYPE_STROMER_PLUS] = { 221 [PLL_OFF_L_VAL] = 0x04, 222 [PLL_OFF_USER_CTL] = 0x08, 223 [PLL_OFF_USER_CTL_U] = 0x0c, 224 [PLL_OFF_CONFIG_CTL] = 0x10, 225 [PLL_OFF_TEST_CTL] = 0x14, 226 [PLL_OFF_TEST_CTL_U] = 0x18, 227 [PLL_OFF_STATUS] = 0x1c, 228 [PLL_OFF_ALPHA_VAL] = 0x24, 229 [PLL_OFF_ALPHA_VAL_U] = 0x28, 230 }, 231 }; 232 EXPORT_SYMBOL_GPL(clk_alpha_pll_regs); 233 234 /* 235 * Even though 40 bits are present, use only 32 for ease of calculation. 236 */ 237 #define ALPHA_REG_BITWIDTH 40 238 #define ALPHA_REG_16BIT_WIDTH 16 239 #define ALPHA_BITWIDTH 32U 240 #define ALPHA_SHIFT(w) min(w, ALPHA_BITWIDTH) 241 242 #define ALPHA_PLL_STATUS_REG_SHIFT 8 243 244 #define PLL_HUAYRA_M_WIDTH 8 245 #define PLL_HUAYRA_M_SHIFT 8 246 #define PLL_HUAYRA_M_MASK 0xff 247 #define PLL_HUAYRA_N_SHIFT 0 248 #define PLL_HUAYRA_N_MASK 0xff 249 #define PLL_HUAYRA_ALPHA_WIDTH 16 250 251 #define PLL_STANDBY 0x0 252 #define PLL_RUN 0x1 253 #define PLL_OUT_MASK 0x7 254 #define PLL_RATE_MARGIN 500 255 256 /* TRION PLL specific settings and offsets */ 257 #define TRION_PLL_CAL_VAL 0x44 258 #define TRION_PCAL_DONE BIT(26) 259 260 /* LUCID PLL specific settings and offsets */ 261 #define LUCID_PCAL_DONE BIT(27) 262 263 /* LUCID 5LPE PLL specific settings and offsets */ 264 #define LUCID_5LPE_PCAL_DONE BIT(11) 265 #define LUCID_5LPE_ALPHA_PLL_ACK_LATCH BIT(13) 266 #define LUCID_5LPE_PLL_LATCH_INPUT BIT(14) 267 #define LUCID_5LPE_ENABLE_VOTE_RUN BIT(21) 268 269 /* LUCID EVO PLL specific settings and offsets */ 270 #define LUCID_EVO_PCAL_NOT_DONE BIT(8) 271 #define LUCID_EVO_ENABLE_VOTE_RUN BIT(25) 272 #define LUCID_EVO_PLL_L_VAL_MASK GENMASK(15, 0) 273 #define LUCID_EVO_PLL_CAL_L_VAL_SHIFT 16 274 275 /* ZONDA PLL specific */ 276 #define ZONDA_PLL_OUT_MASK 0xf 277 #define ZONDA_STAY_IN_CFA BIT(16) 278 #define ZONDA_PLL_FREQ_LOCK_DET BIT(29) 279 280 #define pll_alpha_width(p) \ 281 ((PLL_ALPHA_VAL_U(p) - PLL_ALPHA_VAL(p) == 4) ? \ 282 ALPHA_REG_BITWIDTH : ALPHA_REG_16BIT_WIDTH) 283 284 #define pll_has_64bit_config(p) ((PLL_CONFIG_CTL_U(p) - PLL_CONFIG_CTL(p)) == 4) 285 286 #define to_clk_alpha_pll(_hw) container_of(to_clk_regmap(_hw), \ 287 struct clk_alpha_pll, clkr) 288 289 #define to_clk_alpha_pll_postdiv(_hw) container_of(to_clk_regmap(_hw), \ 290 struct clk_alpha_pll_postdiv, clkr) 291 292 static int wait_for_pll(struct clk_alpha_pll *pll, u32 mask, bool inverse, 293 const char *action) 294 { 295 u32 val; 296 int count; 297 int ret; 298 const char *name = clk_hw_get_name(&pll->clkr.hw); 299 300 ret = regmap_read(pll->clkr.regmap, PLL_MODE(pll), &val); 301 if (ret) 302 return ret; 303 304 for (count = 200; count > 0; count--) { 305 ret = regmap_read(pll->clkr.regmap, PLL_MODE(pll), &val); 306 if (ret) 307 return ret; 308 if (inverse && !(val & mask)) 309 return 0; 310 else if ((val & mask) == mask) 311 return 0; 312 313 udelay(1); 314 } 315 316 WARN(1, "%s failed to %s!\n", name, action); 317 return -ETIMEDOUT; 318 } 319 320 #define wait_for_pll_enable_active(pll) \ 321 wait_for_pll(pll, PLL_ACTIVE_FLAG, 0, "enable") 322 323 #define wait_for_pll_enable_lock(pll) \ 324 wait_for_pll(pll, PLL_LOCK_DET, 0, "enable") 325 326 #define wait_for_zonda_pll_freq_lock(pll) \ 327 wait_for_pll(pll, ZONDA_PLL_FREQ_LOCK_DET, 0, "freq enable") 328 329 #define wait_for_pll_disable(pll) \ 330 wait_for_pll(pll, PLL_ACTIVE_FLAG, 1, "disable") 331 332 #define wait_for_pll_offline(pll) \ 333 wait_for_pll(pll, PLL_OFFLINE_ACK, 0, "offline") 334 335 #define wait_for_pll_update(pll) \ 336 wait_for_pll(pll, PLL_UPDATE, 1, "update") 337 338 #define wait_for_pll_update_ack_set(pll) \ 339 wait_for_pll(pll, ALPHA_PLL_ACK_LATCH, 0, "update_ack_set") 340 341 #define wait_for_pll_update_ack_clear(pll) \ 342 wait_for_pll(pll, ALPHA_PLL_ACK_LATCH, 1, "update_ack_clear") 343 344 static void clk_alpha_pll_write_config(struct regmap *regmap, unsigned int reg, 345 unsigned int val) 346 { 347 if (val) 348 regmap_write(regmap, reg, val); 349 } 350 351 void clk_alpha_pll_configure(struct clk_alpha_pll *pll, struct regmap *regmap, 352 const struct alpha_pll_config *config) 353 { 354 u32 val, mask; 355 356 regmap_write(regmap, PLL_L_VAL(pll), config->l); 357 regmap_write(regmap, PLL_ALPHA_VAL(pll), config->alpha); 358 regmap_write(regmap, PLL_CONFIG_CTL(pll), config->config_ctl_val); 359 360 if (pll_has_64bit_config(pll)) 361 regmap_write(regmap, PLL_CONFIG_CTL_U(pll), 362 config->config_ctl_hi_val); 363 364 if (pll_alpha_width(pll) > 32) 365 regmap_write(regmap, PLL_ALPHA_VAL_U(pll), config->alpha_hi); 366 367 val = config->main_output_mask; 368 val |= config->aux_output_mask; 369 val |= config->aux2_output_mask; 370 val |= config->early_output_mask; 371 val |= config->pre_div_val; 372 val |= config->post_div_val; 373 val |= config->vco_val; 374 val |= config->alpha_en_mask; 375 val |= config->alpha_mode_mask; 376 377 mask = config->main_output_mask; 378 mask |= config->aux_output_mask; 379 mask |= config->aux2_output_mask; 380 mask |= config->early_output_mask; 381 mask |= config->pre_div_mask; 382 mask |= config->post_div_mask; 383 mask |= config->vco_mask; 384 385 regmap_update_bits(regmap, PLL_USER_CTL(pll), mask, val); 386 387 if (config->test_ctl_mask) 388 regmap_update_bits(regmap, PLL_TEST_CTL(pll), 389 config->test_ctl_mask, 390 config->test_ctl_val); 391 else 392 clk_alpha_pll_write_config(regmap, PLL_TEST_CTL(pll), 393 config->test_ctl_val); 394 395 if (config->test_ctl_hi_mask) 396 regmap_update_bits(regmap, PLL_TEST_CTL_U(pll), 397 config->test_ctl_hi_mask, 398 config->test_ctl_hi_val); 399 else 400 clk_alpha_pll_write_config(regmap, PLL_TEST_CTL_U(pll), 401 config->test_ctl_hi_val); 402 403 if (pll->flags & SUPPORTS_FSM_MODE) 404 qcom_pll_set_fsm_mode(regmap, PLL_MODE(pll), 6, 0); 405 } 406 EXPORT_SYMBOL_GPL(clk_alpha_pll_configure); 407 408 static int clk_alpha_pll_hwfsm_enable(struct clk_hw *hw) 409 { 410 int ret; 411 struct clk_alpha_pll *pll = to_clk_alpha_pll(hw); 412 u32 val; 413 414 ret = regmap_read(pll->clkr.regmap, PLL_MODE(pll), &val); 415 if (ret) 416 return ret; 417 418 val |= PLL_FSM_ENA; 419 420 if (pll->flags & SUPPORTS_OFFLINE_REQ) 421 val &= ~PLL_OFFLINE_REQ; 422 423 ret = regmap_write(pll->clkr.regmap, PLL_MODE(pll), val); 424 if (ret) 425 return ret; 426 427 /* Make sure enable request goes through before waiting for update */ 428 mb(); 429 430 return wait_for_pll_enable_active(pll); 431 } 432 433 static void clk_alpha_pll_hwfsm_disable(struct clk_hw *hw) 434 { 435 int ret; 436 struct clk_alpha_pll *pll = to_clk_alpha_pll(hw); 437 u32 val; 438 439 ret = regmap_read(pll->clkr.regmap, PLL_MODE(pll), &val); 440 if (ret) 441 return; 442 443 if (pll->flags & SUPPORTS_OFFLINE_REQ) { 444 ret = regmap_update_bits(pll->clkr.regmap, PLL_MODE(pll), 445 PLL_OFFLINE_REQ, PLL_OFFLINE_REQ); 446 if (ret) 447 return; 448 449 ret = wait_for_pll_offline(pll); 450 if (ret) 451 return; 452 } 453 454 /* Disable hwfsm */ 455 ret = regmap_update_bits(pll->clkr.regmap, PLL_MODE(pll), 456 PLL_FSM_ENA, 0); 457 if (ret) 458 return; 459 460 wait_for_pll_disable(pll); 461 } 462 463 static int pll_is_enabled(struct clk_hw *hw, u32 mask) 464 { 465 int ret; 466 struct clk_alpha_pll *pll = to_clk_alpha_pll(hw); 467 u32 val; 468 469 ret = regmap_read(pll->clkr.regmap, PLL_MODE(pll), &val); 470 if (ret) 471 return ret; 472 473 return !!(val & mask); 474 } 475 476 static int clk_alpha_pll_hwfsm_is_enabled(struct clk_hw *hw) 477 { 478 return pll_is_enabled(hw, PLL_ACTIVE_FLAG); 479 } 480 481 static int clk_alpha_pll_is_enabled(struct clk_hw *hw) 482 { 483 return pll_is_enabled(hw, PLL_LOCK_DET); 484 } 485 486 static int clk_alpha_pll_enable(struct clk_hw *hw) 487 { 488 int ret; 489 struct clk_alpha_pll *pll = to_clk_alpha_pll(hw); 490 u32 val, mask; 491 492 mask = PLL_OUTCTRL | PLL_RESET_N | PLL_BYPASSNL; 493 ret = regmap_read(pll->clkr.regmap, PLL_MODE(pll), &val); 494 if (ret) 495 return ret; 496 497 /* If in FSM mode, just vote for it */ 498 if (val & PLL_VOTE_FSM_ENA) { 499 ret = clk_enable_regmap(hw); 500 if (ret) 501 return ret; 502 return wait_for_pll_enable_active(pll); 503 } 504 505 /* Skip if already enabled */ 506 if ((val & mask) == mask) 507 return 0; 508 509 ret = regmap_update_bits(pll->clkr.regmap, PLL_MODE(pll), 510 PLL_BYPASSNL, PLL_BYPASSNL); 511 if (ret) 512 return ret; 513 514 /* 515 * H/W requires a 5us delay between disabling the bypass and 516 * de-asserting the reset. 517 */ 518 mb(); 519 udelay(5); 520 521 ret = regmap_update_bits(pll->clkr.regmap, PLL_MODE(pll), 522 PLL_RESET_N, PLL_RESET_N); 523 if (ret) 524 return ret; 525 526 ret = wait_for_pll_enable_lock(pll); 527 if (ret) 528 return ret; 529 530 ret = regmap_update_bits(pll->clkr.regmap, PLL_MODE(pll), 531 PLL_OUTCTRL, PLL_OUTCTRL); 532 533 /* Ensure that the write above goes through before returning. */ 534 mb(); 535 return ret; 536 } 537 538 static void clk_alpha_pll_disable(struct clk_hw *hw) 539 { 540 int ret; 541 struct clk_alpha_pll *pll = to_clk_alpha_pll(hw); 542 u32 val, mask; 543 544 ret = regmap_read(pll->clkr.regmap, PLL_MODE(pll), &val); 545 if (ret) 546 return; 547 548 /* If in FSM mode, just unvote it */ 549 if (val & PLL_VOTE_FSM_ENA) { 550 clk_disable_regmap(hw); 551 return; 552 } 553 554 mask = PLL_OUTCTRL; 555 regmap_update_bits(pll->clkr.regmap, PLL_MODE(pll), mask, 0); 556 557 /* Delay of 2 output clock ticks required until output is disabled */ 558 mb(); 559 udelay(1); 560 561 mask = PLL_RESET_N | PLL_BYPASSNL; 562 regmap_update_bits(pll->clkr.regmap, PLL_MODE(pll), mask, 0); 563 } 564 565 static unsigned long 566 alpha_pll_calc_rate(u64 prate, u32 l, u32 a, u32 alpha_width) 567 { 568 return (prate * l) + ((prate * a) >> ALPHA_SHIFT(alpha_width)); 569 } 570 571 static unsigned long 572 alpha_pll_round_rate(unsigned long rate, unsigned long prate, u32 *l, u64 *a, 573 u32 alpha_width) 574 { 575 u64 remainder; 576 u64 quotient; 577 578 quotient = rate; 579 remainder = do_div(quotient, prate); 580 *l = quotient; 581 582 if (!remainder) { 583 *a = 0; 584 return rate; 585 } 586 587 /* Upper ALPHA_BITWIDTH bits of Alpha */ 588 quotient = remainder << ALPHA_SHIFT(alpha_width); 589 590 remainder = do_div(quotient, prate); 591 592 if (remainder) 593 quotient++; 594 595 *a = quotient; 596 return alpha_pll_calc_rate(prate, *l, *a, alpha_width); 597 } 598 599 static const struct pll_vco * 600 alpha_pll_find_vco(const struct clk_alpha_pll *pll, unsigned long rate) 601 { 602 const struct pll_vco *v = pll->vco_table; 603 const struct pll_vco *end = v + pll->num_vco; 604 605 for (; v < end; v++) 606 if (rate >= v->min_freq && rate <= v->max_freq) 607 return v; 608 609 return NULL; 610 } 611 612 static unsigned long 613 clk_alpha_pll_recalc_rate(struct clk_hw *hw, unsigned long parent_rate) 614 { 615 u32 l, low, high, ctl; 616 u64 a = 0, prate = parent_rate; 617 struct clk_alpha_pll *pll = to_clk_alpha_pll(hw); 618 u32 alpha_width = pll_alpha_width(pll); 619 620 regmap_read(pll->clkr.regmap, PLL_L_VAL(pll), &l); 621 622 regmap_read(pll->clkr.regmap, PLL_USER_CTL(pll), &ctl); 623 if (ctl & PLL_ALPHA_EN) { 624 regmap_read(pll->clkr.regmap, PLL_ALPHA_VAL(pll), &low); 625 if (alpha_width > 32) { 626 regmap_read(pll->clkr.regmap, PLL_ALPHA_VAL_U(pll), 627 &high); 628 a = (u64)high << 32 | low; 629 } else { 630 a = low & GENMASK(alpha_width - 1, 0); 631 } 632 633 if (alpha_width > ALPHA_BITWIDTH) 634 a >>= alpha_width - ALPHA_BITWIDTH; 635 } 636 637 return alpha_pll_calc_rate(prate, l, a, alpha_width); 638 } 639 640 641 static int __clk_alpha_pll_update_latch(struct clk_alpha_pll *pll) 642 { 643 int ret; 644 u32 mode; 645 646 regmap_read(pll->clkr.regmap, PLL_MODE(pll), &mode); 647 648 /* Latch the input to the PLL */ 649 regmap_update_bits(pll->clkr.regmap, PLL_MODE(pll), PLL_UPDATE, 650 PLL_UPDATE); 651 652 /* Wait for 2 reference cycle before checking ACK bit */ 653 udelay(1); 654 655 /* 656 * PLL will latch the new L, Alpha and freq control word. 657 * PLL will respond by raising PLL_ACK_LATCH output when new programming 658 * has been latched in and PLL is being updated. When 659 * UPDATE_LOGIC_BYPASS bit is not set, PLL_UPDATE will be cleared 660 * automatically by hardware when PLL_ACK_LATCH is asserted by PLL. 661 */ 662 if (mode & PLL_UPDATE_BYPASS) { 663 ret = wait_for_pll_update_ack_set(pll); 664 if (ret) 665 return ret; 666 667 regmap_update_bits(pll->clkr.regmap, PLL_MODE(pll), PLL_UPDATE, 0); 668 } else { 669 ret = wait_for_pll_update(pll); 670 if (ret) 671 return ret; 672 } 673 674 ret = wait_for_pll_update_ack_clear(pll); 675 if (ret) 676 return ret; 677 678 /* Wait for PLL output to stabilize */ 679 udelay(10); 680 681 return 0; 682 } 683 684 static int clk_alpha_pll_update_latch(struct clk_alpha_pll *pll, 685 int (*is_enabled)(struct clk_hw *)) 686 { 687 if (!is_enabled(&pll->clkr.hw) || 688 !(pll->flags & SUPPORTS_DYNAMIC_UPDATE)) 689 return 0; 690 691 return __clk_alpha_pll_update_latch(pll); 692 } 693 694 static int __clk_alpha_pll_set_rate(struct clk_hw *hw, unsigned long rate, 695 unsigned long prate, 696 int (*is_enabled)(struct clk_hw *)) 697 { 698 struct clk_alpha_pll *pll = to_clk_alpha_pll(hw); 699 const struct pll_vco *vco; 700 u32 l, alpha_width = pll_alpha_width(pll); 701 u64 a; 702 703 rate = alpha_pll_round_rate(rate, prate, &l, &a, alpha_width); 704 vco = alpha_pll_find_vco(pll, rate); 705 if (pll->vco_table && !vco) { 706 pr_err("%s: alpha pll not in a valid vco range\n", 707 clk_hw_get_name(hw)); 708 return -EINVAL; 709 } 710 711 regmap_write(pll->clkr.regmap, PLL_L_VAL(pll), l); 712 713 if (alpha_width > ALPHA_BITWIDTH) 714 a <<= alpha_width - ALPHA_BITWIDTH; 715 716 if (alpha_width > 32) 717 regmap_write(pll->clkr.regmap, PLL_ALPHA_VAL_U(pll), a >> 32); 718 719 regmap_write(pll->clkr.regmap, PLL_ALPHA_VAL(pll), a); 720 721 if (vco) { 722 regmap_update_bits(pll->clkr.regmap, PLL_USER_CTL(pll), 723 PLL_VCO_MASK << PLL_VCO_SHIFT, 724 vco->val << PLL_VCO_SHIFT); 725 } 726 727 regmap_update_bits(pll->clkr.regmap, PLL_USER_CTL(pll), 728 PLL_ALPHA_EN, PLL_ALPHA_EN); 729 730 return clk_alpha_pll_update_latch(pll, is_enabled); 731 } 732 733 static int clk_alpha_pll_set_rate(struct clk_hw *hw, unsigned long rate, 734 unsigned long prate) 735 { 736 return __clk_alpha_pll_set_rate(hw, rate, prate, 737 clk_alpha_pll_is_enabled); 738 } 739 740 static int clk_alpha_pll_hwfsm_set_rate(struct clk_hw *hw, unsigned long rate, 741 unsigned long prate) 742 { 743 return __clk_alpha_pll_set_rate(hw, rate, prate, 744 clk_alpha_pll_hwfsm_is_enabled); 745 } 746 747 static long clk_alpha_pll_round_rate(struct clk_hw *hw, unsigned long rate, 748 unsigned long *prate) 749 { 750 struct clk_alpha_pll *pll = to_clk_alpha_pll(hw); 751 u32 l, alpha_width = pll_alpha_width(pll); 752 u64 a; 753 unsigned long min_freq, max_freq; 754 755 rate = alpha_pll_round_rate(rate, *prate, &l, &a, alpha_width); 756 if (!pll->vco_table || alpha_pll_find_vco(pll, rate)) 757 return rate; 758 759 min_freq = pll->vco_table[0].min_freq; 760 max_freq = pll->vco_table[pll->num_vco - 1].max_freq; 761 762 return clamp(rate, min_freq, max_freq); 763 } 764 765 static unsigned long 766 alpha_huayra_pll_calc_rate(u64 prate, u32 l, u32 a) 767 { 768 /* 769 * a contains 16 bit alpha_val in two’s complement number in the range 770 * of [-0.5, 0.5). 771 */ 772 if (a >= BIT(PLL_HUAYRA_ALPHA_WIDTH - 1)) 773 l -= 1; 774 775 return (prate * l) + (prate * a >> PLL_HUAYRA_ALPHA_WIDTH); 776 } 777 778 static unsigned long 779 alpha_huayra_pll_round_rate(unsigned long rate, unsigned long prate, 780 u32 *l, u32 *a) 781 { 782 u64 remainder; 783 u64 quotient; 784 785 quotient = rate; 786 remainder = do_div(quotient, prate); 787 *l = quotient; 788 789 if (!remainder) { 790 *a = 0; 791 return rate; 792 } 793 794 quotient = remainder << PLL_HUAYRA_ALPHA_WIDTH; 795 remainder = do_div(quotient, prate); 796 797 if (remainder) 798 quotient++; 799 800 /* 801 * alpha_val should be in two’s complement number in the range 802 * of [-0.5, 0.5) so if quotient >= 0.5 then increment the l value 803 * since alpha value will be subtracted in this case. 804 */ 805 if (quotient >= BIT(PLL_HUAYRA_ALPHA_WIDTH - 1)) 806 *l += 1; 807 808 *a = quotient; 809 return alpha_huayra_pll_calc_rate(prate, *l, *a); 810 } 811 812 static unsigned long 813 alpha_pll_huayra_recalc_rate(struct clk_hw *hw, unsigned long parent_rate) 814 { 815 u64 rate = parent_rate, tmp; 816 struct clk_alpha_pll *pll = to_clk_alpha_pll(hw); 817 u32 l, alpha = 0, ctl, alpha_m, alpha_n; 818 819 regmap_read(pll->clkr.regmap, PLL_L_VAL(pll), &l); 820 regmap_read(pll->clkr.regmap, PLL_USER_CTL(pll), &ctl); 821 822 if (ctl & PLL_ALPHA_EN) { 823 regmap_read(pll->clkr.regmap, PLL_ALPHA_VAL(pll), &alpha); 824 /* 825 * Depending upon alpha_mode, it can be treated as M/N value or 826 * as a two’s complement number. When alpha_mode=1, 827 * pll_alpha_val<15:8>=M and pll_apla_val<7:0>=N 828 * 829 * Fout=FIN*(L+(M/N)) 830 * 831 * M is a signed number (-128 to 127) and N is unsigned 832 * (0 to 255). M/N has to be within +/-0.5. 833 * 834 * When alpha_mode=0, it is a two’s complement number in the 835 * range [-0.5, 0.5). 836 * 837 * Fout=FIN*(L+(alpha_val)/2^16) 838 * 839 * where alpha_val is two’s complement number. 840 */ 841 if (!(ctl & PLL_ALPHA_MODE)) 842 return alpha_huayra_pll_calc_rate(rate, l, alpha); 843 844 alpha_m = alpha >> PLL_HUAYRA_M_SHIFT & PLL_HUAYRA_M_MASK; 845 alpha_n = alpha >> PLL_HUAYRA_N_SHIFT & PLL_HUAYRA_N_MASK; 846 847 rate *= l; 848 tmp = parent_rate; 849 if (alpha_m >= BIT(PLL_HUAYRA_M_WIDTH - 1)) { 850 alpha_m = BIT(PLL_HUAYRA_M_WIDTH) - alpha_m; 851 tmp *= alpha_m; 852 do_div(tmp, alpha_n); 853 rate -= tmp; 854 } else { 855 tmp *= alpha_m; 856 do_div(tmp, alpha_n); 857 rate += tmp; 858 } 859 860 return rate; 861 } 862 863 return alpha_huayra_pll_calc_rate(rate, l, alpha); 864 } 865 866 static int alpha_pll_huayra_set_rate(struct clk_hw *hw, unsigned long rate, 867 unsigned long prate) 868 { 869 struct clk_alpha_pll *pll = to_clk_alpha_pll(hw); 870 u32 l, a, ctl, cur_alpha = 0; 871 872 rate = alpha_huayra_pll_round_rate(rate, prate, &l, &a); 873 874 regmap_read(pll->clkr.regmap, PLL_USER_CTL(pll), &ctl); 875 876 if (ctl & PLL_ALPHA_EN) 877 regmap_read(pll->clkr.regmap, PLL_ALPHA_VAL(pll), &cur_alpha); 878 879 /* 880 * Huayra PLL supports PLL dynamic programming. User can change L_VAL, 881 * without having to go through the power on sequence. 882 */ 883 if (clk_alpha_pll_is_enabled(hw)) { 884 if (cur_alpha != a) { 885 pr_err("%s: clock needs to be gated\n", 886 clk_hw_get_name(hw)); 887 return -EBUSY; 888 } 889 890 regmap_write(pll->clkr.regmap, PLL_L_VAL(pll), l); 891 /* Ensure that the write above goes to detect L val change. */ 892 mb(); 893 return wait_for_pll_enable_lock(pll); 894 } 895 896 regmap_write(pll->clkr.regmap, PLL_L_VAL(pll), l); 897 regmap_write(pll->clkr.regmap, PLL_ALPHA_VAL(pll), a); 898 899 if (a == 0) 900 regmap_update_bits(pll->clkr.regmap, PLL_USER_CTL(pll), 901 PLL_ALPHA_EN, 0x0); 902 else 903 regmap_update_bits(pll->clkr.regmap, PLL_USER_CTL(pll), 904 PLL_ALPHA_EN | PLL_ALPHA_MODE, PLL_ALPHA_EN); 905 906 return 0; 907 } 908 909 static long alpha_pll_huayra_round_rate(struct clk_hw *hw, unsigned long rate, 910 unsigned long *prate) 911 { 912 u32 l, a; 913 914 return alpha_huayra_pll_round_rate(rate, *prate, &l, &a); 915 } 916 917 static int trion_pll_is_enabled(struct clk_alpha_pll *pll, 918 struct regmap *regmap) 919 { 920 u32 mode_val, opmode_val; 921 int ret; 922 923 ret = regmap_read(regmap, PLL_MODE(pll), &mode_val); 924 ret |= regmap_read(regmap, PLL_OPMODE(pll), &opmode_val); 925 if (ret) 926 return 0; 927 928 return ((opmode_val & PLL_RUN) && (mode_val & PLL_OUTCTRL)); 929 } 930 931 static int clk_trion_pll_is_enabled(struct clk_hw *hw) 932 { 933 struct clk_alpha_pll *pll = to_clk_alpha_pll(hw); 934 935 return trion_pll_is_enabled(pll, pll->clkr.regmap); 936 } 937 938 static int clk_trion_pll_enable(struct clk_hw *hw) 939 { 940 struct clk_alpha_pll *pll = to_clk_alpha_pll(hw); 941 struct regmap *regmap = pll->clkr.regmap; 942 u32 val; 943 int ret; 944 945 ret = regmap_read(regmap, PLL_MODE(pll), &val); 946 if (ret) 947 return ret; 948 949 /* If in FSM mode, just vote for it */ 950 if (val & PLL_VOTE_FSM_ENA) { 951 ret = clk_enable_regmap(hw); 952 if (ret) 953 return ret; 954 return wait_for_pll_enable_active(pll); 955 } 956 957 /* Set operation mode to RUN */ 958 regmap_write(regmap, PLL_OPMODE(pll), PLL_RUN); 959 960 ret = wait_for_pll_enable_lock(pll); 961 if (ret) 962 return ret; 963 964 /* Enable the PLL outputs */ 965 ret = regmap_update_bits(regmap, PLL_USER_CTL(pll), 966 PLL_OUT_MASK, PLL_OUT_MASK); 967 if (ret) 968 return ret; 969 970 /* Enable the global PLL outputs */ 971 return regmap_update_bits(regmap, PLL_MODE(pll), 972 PLL_OUTCTRL, PLL_OUTCTRL); 973 } 974 975 static void clk_trion_pll_disable(struct clk_hw *hw) 976 { 977 struct clk_alpha_pll *pll = to_clk_alpha_pll(hw); 978 struct regmap *regmap = pll->clkr.regmap; 979 u32 val; 980 int ret; 981 982 ret = regmap_read(regmap, PLL_MODE(pll), &val); 983 if (ret) 984 return; 985 986 /* If in FSM mode, just unvote it */ 987 if (val & PLL_VOTE_FSM_ENA) { 988 clk_disable_regmap(hw); 989 return; 990 } 991 992 /* Disable the global PLL output */ 993 ret = regmap_update_bits(regmap, PLL_MODE(pll), PLL_OUTCTRL, 0); 994 if (ret) 995 return; 996 997 /* Disable the PLL outputs */ 998 ret = regmap_update_bits(regmap, PLL_USER_CTL(pll), 999 PLL_OUT_MASK, 0); 1000 if (ret) 1001 return; 1002 1003 /* Place the PLL mode in STANDBY */ 1004 regmap_write(regmap, PLL_OPMODE(pll), PLL_STANDBY); 1005 regmap_update_bits(regmap, PLL_MODE(pll), PLL_RESET_N, PLL_RESET_N); 1006 } 1007 1008 static unsigned long 1009 clk_trion_pll_recalc_rate(struct clk_hw *hw, unsigned long parent_rate) 1010 { 1011 struct clk_alpha_pll *pll = to_clk_alpha_pll(hw); 1012 u32 l, frac, alpha_width = pll_alpha_width(pll); 1013 1014 regmap_read(pll->clkr.regmap, PLL_L_VAL(pll), &l); 1015 regmap_read(pll->clkr.regmap, PLL_ALPHA_VAL(pll), &frac); 1016 1017 return alpha_pll_calc_rate(parent_rate, l, frac, alpha_width); 1018 } 1019 1020 const struct clk_ops clk_alpha_pll_fixed_ops = { 1021 .enable = clk_alpha_pll_enable, 1022 .disable = clk_alpha_pll_disable, 1023 .is_enabled = clk_alpha_pll_is_enabled, 1024 .recalc_rate = clk_alpha_pll_recalc_rate, 1025 }; 1026 EXPORT_SYMBOL_GPL(clk_alpha_pll_fixed_ops); 1027 1028 const struct clk_ops clk_alpha_pll_ops = { 1029 .enable = clk_alpha_pll_enable, 1030 .disable = clk_alpha_pll_disable, 1031 .is_enabled = clk_alpha_pll_is_enabled, 1032 .recalc_rate = clk_alpha_pll_recalc_rate, 1033 .round_rate = clk_alpha_pll_round_rate, 1034 .set_rate = clk_alpha_pll_set_rate, 1035 }; 1036 EXPORT_SYMBOL_GPL(clk_alpha_pll_ops); 1037 1038 const struct clk_ops clk_alpha_pll_huayra_ops = { 1039 .enable = clk_alpha_pll_enable, 1040 .disable = clk_alpha_pll_disable, 1041 .is_enabled = clk_alpha_pll_is_enabled, 1042 .recalc_rate = alpha_pll_huayra_recalc_rate, 1043 .round_rate = alpha_pll_huayra_round_rate, 1044 .set_rate = alpha_pll_huayra_set_rate, 1045 }; 1046 EXPORT_SYMBOL_GPL(clk_alpha_pll_huayra_ops); 1047 1048 const struct clk_ops clk_alpha_pll_hwfsm_ops = { 1049 .enable = clk_alpha_pll_hwfsm_enable, 1050 .disable = clk_alpha_pll_hwfsm_disable, 1051 .is_enabled = clk_alpha_pll_hwfsm_is_enabled, 1052 .recalc_rate = clk_alpha_pll_recalc_rate, 1053 .round_rate = clk_alpha_pll_round_rate, 1054 .set_rate = clk_alpha_pll_hwfsm_set_rate, 1055 }; 1056 EXPORT_SYMBOL_GPL(clk_alpha_pll_hwfsm_ops); 1057 1058 const struct clk_ops clk_alpha_pll_fixed_trion_ops = { 1059 .enable = clk_trion_pll_enable, 1060 .disable = clk_trion_pll_disable, 1061 .is_enabled = clk_trion_pll_is_enabled, 1062 .recalc_rate = clk_trion_pll_recalc_rate, 1063 .round_rate = clk_alpha_pll_round_rate, 1064 }; 1065 EXPORT_SYMBOL_GPL(clk_alpha_pll_fixed_trion_ops); 1066 1067 static unsigned long 1068 clk_alpha_pll_postdiv_recalc_rate(struct clk_hw *hw, unsigned long parent_rate) 1069 { 1070 struct clk_alpha_pll_postdiv *pll = to_clk_alpha_pll_postdiv(hw); 1071 u32 ctl; 1072 1073 regmap_read(pll->clkr.regmap, PLL_USER_CTL(pll), &ctl); 1074 1075 ctl >>= PLL_POST_DIV_SHIFT; 1076 ctl &= PLL_POST_DIV_MASK(pll); 1077 1078 return parent_rate >> fls(ctl); 1079 } 1080 1081 static const struct clk_div_table clk_alpha_div_table[] = { 1082 { 0x0, 1 }, 1083 { 0x1, 2 }, 1084 { 0x3, 4 }, 1085 { 0x7, 8 }, 1086 { 0xf, 16 }, 1087 { } 1088 }; 1089 1090 static const struct clk_div_table clk_alpha_2bit_div_table[] = { 1091 { 0x0, 1 }, 1092 { 0x1, 2 }, 1093 { 0x3, 4 }, 1094 { } 1095 }; 1096 1097 static long 1098 clk_alpha_pll_postdiv_round_rate(struct clk_hw *hw, unsigned long rate, 1099 unsigned long *prate) 1100 { 1101 struct clk_alpha_pll_postdiv *pll = to_clk_alpha_pll_postdiv(hw); 1102 const struct clk_div_table *table; 1103 1104 if (pll->width == 2) 1105 table = clk_alpha_2bit_div_table; 1106 else 1107 table = clk_alpha_div_table; 1108 1109 return divider_round_rate(hw, rate, prate, table, 1110 pll->width, CLK_DIVIDER_POWER_OF_TWO); 1111 } 1112 1113 static long 1114 clk_alpha_pll_postdiv_round_ro_rate(struct clk_hw *hw, unsigned long rate, 1115 unsigned long *prate) 1116 { 1117 struct clk_alpha_pll_postdiv *pll = to_clk_alpha_pll_postdiv(hw); 1118 u32 ctl, div; 1119 1120 regmap_read(pll->clkr.regmap, PLL_USER_CTL(pll), &ctl); 1121 1122 ctl >>= PLL_POST_DIV_SHIFT; 1123 ctl &= BIT(pll->width) - 1; 1124 div = 1 << fls(ctl); 1125 1126 if (clk_hw_get_flags(hw) & CLK_SET_RATE_PARENT) 1127 *prate = clk_hw_round_rate(clk_hw_get_parent(hw), div * rate); 1128 1129 return DIV_ROUND_UP_ULL((u64)*prate, div); 1130 } 1131 1132 static int clk_alpha_pll_postdiv_set_rate(struct clk_hw *hw, unsigned long rate, 1133 unsigned long parent_rate) 1134 { 1135 struct clk_alpha_pll_postdiv *pll = to_clk_alpha_pll_postdiv(hw); 1136 int div; 1137 1138 /* 16 -> 0xf, 8 -> 0x7, 4 -> 0x3, 2 -> 0x1, 1 -> 0x0 */ 1139 div = DIV_ROUND_UP_ULL(parent_rate, rate) - 1; 1140 1141 return regmap_update_bits(pll->clkr.regmap, PLL_USER_CTL(pll), 1142 PLL_POST_DIV_MASK(pll) << PLL_POST_DIV_SHIFT, 1143 div << PLL_POST_DIV_SHIFT); 1144 } 1145 1146 const struct clk_ops clk_alpha_pll_postdiv_ops = { 1147 .recalc_rate = clk_alpha_pll_postdiv_recalc_rate, 1148 .round_rate = clk_alpha_pll_postdiv_round_rate, 1149 .set_rate = clk_alpha_pll_postdiv_set_rate, 1150 }; 1151 EXPORT_SYMBOL_GPL(clk_alpha_pll_postdiv_ops); 1152 1153 const struct clk_ops clk_alpha_pll_postdiv_ro_ops = { 1154 .round_rate = clk_alpha_pll_postdiv_round_ro_rate, 1155 .recalc_rate = clk_alpha_pll_postdiv_recalc_rate, 1156 }; 1157 EXPORT_SYMBOL_GPL(clk_alpha_pll_postdiv_ro_ops); 1158 1159 void clk_fabia_pll_configure(struct clk_alpha_pll *pll, struct regmap *regmap, 1160 const struct alpha_pll_config *config) 1161 { 1162 u32 val, mask; 1163 1164 clk_alpha_pll_write_config(regmap, PLL_L_VAL(pll), config->l); 1165 clk_alpha_pll_write_config(regmap, PLL_FRAC(pll), config->alpha); 1166 clk_alpha_pll_write_config(regmap, PLL_CONFIG_CTL(pll), 1167 config->config_ctl_val); 1168 clk_alpha_pll_write_config(regmap, PLL_CONFIG_CTL_U(pll), 1169 config->config_ctl_hi_val); 1170 clk_alpha_pll_write_config(regmap, PLL_USER_CTL(pll), 1171 config->user_ctl_val); 1172 clk_alpha_pll_write_config(regmap, PLL_USER_CTL_U(pll), 1173 config->user_ctl_hi_val); 1174 clk_alpha_pll_write_config(regmap, PLL_TEST_CTL(pll), 1175 config->test_ctl_val); 1176 clk_alpha_pll_write_config(regmap, PLL_TEST_CTL_U(pll), 1177 config->test_ctl_hi_val); 1178 1179 if (config->post_div_mask) { 1180 mask = config->post_div_mask; 1181 val = config->post_div_val; 1182 regmap_update_bits(regmap, PLL_USER_CTL(pll), mask, val); 1183 } 1184 1185 if (pll->flags & SUPPORTS_FSM_LEGACY_MODE) 1186 regmap_update_bits(regmap, PLL_MODE(pll), PLL_FSM_LEGACY_MODE, 1187 PLL_FSM_LEGACY_MODE); 1188 1189 regmap_update_bits(regmap, PLL_MODE(pll), PLL_UPDATE_BYPASS, 1190 PLL_UPDATE_BYPASS); 1191 1192 regmap_update_bits(regmap, PLL_MODE(pll), PLL_RESET_N, PLL_RESET_N); 1193 } 1194 EXPORT_SYMBOL_GPL(clk_fabia_pll_configure); 1195 1196 static int alpha_pll_fabia_enable(struct clk_hw *hw) 1197 { 1198 int ret; 1199 struct clk_alpha_pll *pll = to_clk_alpha_pll(hw); 1200 u32 val, opmode_val; 1201 struct regmap *regmap = pll->clkr.regmap; 1202 1203 ret = regmap_read(regmap, PLL_MODE(pll), &val); 1204 if (ret) 1205 return ret; 1206 1207 /* If in FSM mode, just vote for it */ 1208 if (val & PLL_VOTE_FSM_ENA) { 1209 ret = clk_enable_regmap(hw); 1210 if (ret) 1211 return ret; 1212 return wait_for_pll_enable_active(pll); 1213 } 1214 1215 ret = regmap_read(regmap, PLL_OPMODE(pll), &opmode_val); 1216 if (ret) 1217 return ret; 1218 1219 /* Skip If PLL is already running */ 1220 if ((opmode_val & PLL_RUN) && (val & PLL_OUTCTRL)) 1221 return 0; 1222 1223 ret = regmap_update_bits(regmap, PLL_MODE(pll), PLL_OUTCTRL, 0); 1224 if (ret) 1225 return ret; 1226 1227 ret = regmap_write(regmap, PLL_OPMODE(pll), PLL_STANDBY); 1228 if (ret) 1229 return ret; 1230 1231 ret = regmap_update_bits(regmap, PLL_MODE(pll), PLL_RESET_N, 1232 PLL_RESET_N); 1233 if (ret) 1234 return ret; 1235 1236 ret = regmap_write(regmap, PLL_OPMODE(pll), PLL_RUN); 1237 if (ret) 1238 return ret; 1239 1240 ret = wait_for_pll_enable_lock(pll); 1241 if (ret) 1242 return ret; 1243 1244 ret = regmap_update_bits(regmap, PLL_USER_CTL(pll), 1245 PLL_OUT_MASK, PLL_OUT_MASK); 1246 if (ret) 1247 return ret; 1248 1249 return regmap_update_bits(regmap, PLL_MODE(pll), PLL_OUTCTRL, 1250 PLL_OUTCTRL); 1251 } 1252 1253 static void alpha_pll_fabia_disable(struct clk_hw *hw) 1254 { 1255 int ret; 1256 struct clk_alpha_pll *pll = to_clk_alpha_pll(hw); 1257 u32 val; 1258 struct regmap *regmap = pll->clkr.regmap; 1259 1260 ret = regmap_read(regmap, PLL_MODE(pll), &val); 1261 if (ret) 1262 return; 1263 1264 /* If in FSM mode, just unvote it */ 1265 if (val & PLL_FSM_ENA) { 1266 clk_disable_regmap(hw); 1267 return; 1268 } 1269 1270 ret = regmap_update_bits(regmap, PLL_MODE(pll), PLL_OUTCTRL, 0); 1271 if (ret) 1272 return; 1273 1274 /* Disable main outputs */ 1275 ret = regmap_update_bits(regmap, PLL_USER_CTL(pll), PLL_OUT_MASK, 0); 1276 if (ret) 1277 return; 1278 1279 /* Place the PLL in STANDBY */ 1280 regmap_write(regmap, PLL_OPMODE(pll), PLL_STANDBY); 1281 } 1282 1283 static unsigned long alpha_pll_fabia_recalc_rate(struct clk_hw *hw, 1284 unsigned long parent_rate) 1285 { 1286 struct clk_alpha_pll *pll = to_clk_alpha_pll(hw); 1287 u32 l, frac, alpha_width = pll_alpha_width(pll); 1288 1289 regmap_read(pll->clkr.regmap, PLL_L_VAL(pll), &l); 1290 regmap_read(pll->clkr.regmap, PLL_FRAC(pll), &frac); 1291 1292 return alpha_pll_calc_rate(parent_rate, l, frac, alpha_width); 1293 } 1294 1295 /* 1296 * Due to limited number of bits for fractional rate programming, the 1297 * rounded up rate could be marginally higher than the requested rate. 1298 */ 1299 static int alpha_pll_check_rate_margin(struct clk_hw *hw, 1300 unsigned long rrate, unsigned long rate) 1301 { 1302 unsigned long rate_margin = rate + PLL_RATE_MARGIN; 1303 1304 if (rrate > rate_margin || rrate < rate) { 1305 pr_err("%s: Rounded rate %lu not within range [%lu, %lu)\n", 1306 clk_hw_get_name(hw), rrate, rate, rate_margin); 1307 return -EINVAL; 1308 } 1309 1310 return 0; 1311 } 1312 1313 static int alpha_pll_fabia_set_rate(struct clk_hw *hw, unsigned long rate, 1314 unsigned long prate) 1315 { 1316 struct clk_alpha_pll *pll = to_clk_alpha_pll(hw); 1317 u32 l, alpha_width = pll_alpha_width(pll); 1318 unsigned long rrate; 1319 int ret; 1320 u64 a; 1321 1322 rrate = alpha_pll_round_rate(rate, prate, &l, &a, alpha_width); 1323 1324 ret = alpha_pll_check_rate_margin(hw, rrate, rate); 1325 if (ret < 0) 1326 return ret; 1327 1328 regmap_write(pll->clkr.regmap, PLL_L_VAL(pll), l); 1329 regmap_write(pll->clkr.regmap, PLL_FRAC(pll), a); 1330 1331 return __clk_alpha_pll_update_latch(pll); 1332 } 1333 1334 static int alpha_pll_fabia_prepare(struct clk_hw *hw) 1335 { 1336 struct clk_alpha_pll *pll = to_clk_alpha_pll(hw); 1337 const struct pll_vco *vco; 1338 struct clk_hw *parent_hw; 1339 unsigned long cal_freq, rrate; 1340 u32 cal_l, val, alpha_width = pll_alpha_width(pll); 1341 const char *name = clk_hw_get_name(hw); 1342 u64 a; 1343 int ret; 1344 1345 /* Check if calibration needs to be done i.e. PLL is in reset */ 1346 ret = regmap_read(pll->clkr.regmap, PLL_MODE(pll), &val); 1347 if (ret) 1348 return ret; 1349 1350 /* Return early if calibration is not needed. */ 1351 if (val & PLL_RESET_N) 1352 return 0; 1353 1354 vco = alpha_pll_find_vco(pll, clk_hw_get_rate(hw)); 1355 if (!vco) { 1356 pr_err("%s: alpha pll not in a valid vco range\n", name); 1357 return -EINVAL; 1358 } 1359 1360 cal_freq = DIV_ROUND_CLOSEST((pll->vco_table[0].min_freq + 1361 pll->vco_table[0].max_freq) * 54, 100); 1362 1363 parent_hw = clk_hw_get_parent(hw); 1364 if (!parent_hw) 1365 return -EINVAL; 1366 1367 rrate = alpha_pll_round_rate(cal_freq, clk_hw_get_rate(parent_hw), 1368 &cal_l, &a, alpha_width); 1369 1370 ret = alpha_pll_check_rate_margin(hw, rrate, cal_freq); 1371 if (ret < 0) 1372 return ret; 1373 1374 /* Setup PLL for calibration frequency */ 1375 regmap_write(pll->clkr.regmap, PLL_CAL_L_VAL(pll), cal_l); 1376 1377 /* Bringup the PLL at calibration frequency */ 1378 ret = clk_alpha_pll_enable(hw); 1379 if (ret) { 1380 pr_err("%s: alpha pll calibration failed\n", name); 1381 return ret; 1382 } 1383 1384 clk_alpha_pll_disable(hw); 1385 1386 return 0; 1387 } 1388 1389 const struct clk_ops clk_alpha_pll_fabia_ops = { 1390 .prepare = alpha_pll_fabia_prepare, 1391 .enable = alpha_pll_fabia_enable, 1392 .disable = alpha_pll_fabia_disable, 1393 .is_enabled = clk_alpha_pll_is_enabled, 1394 .set_rate = alpha_pll_fabia_set_rate, 1395 .recalc_rate = alpha_pll_fabia_recalc_rate, 1396 .round_rate = clk_alpha_pll_round_rate, 1397 }; 1398 EXPORT_SYMBOL_GPL(clk_alpha_pll_fabia_ops); 1399 1400 const struct clk_ops clk_alpha_pll_fixed_fabia_ops = { 1401 .enable = alpha_pll_fabia_enable, 1402 .disable = alpha_pll_fabia_disable, 1403 .is_enabled = clk_alpha_pll_is_enabled, 1404 .recalc_rate = alpha_pll_fabia_recalc_rate, 1405 .round_rate = clk_alpha_pll_round_rate, 1406 }; 1407 EXPORT_SYMBOL_GPL(clk_alpha_pll_fixed_fabia_ops); 1408 1409 static unsigned long clk_alpha_pll_postdiv_fabia_recalc_rate(struct clk_hw *hw, 1410 unsigned long parent_rate) 1411 { 1412 struct clk_alpha_pll_postdiv *pll = to_clk_alpha_pll_postdiv(hw); 1413 u32 i, div = 1, val; 1414 int ret; 1415 1416 ret = regmap_read(pll->clkr.regmap, PLL_USER_CTL(pll), &val); 1417 if (ret) 1418 return ret; 1419 1420 val >>= pll->post_div_shift; 1421 val &= BIT(pll->width) - 1; 1422 1423 for (i = 0; i < pll->num_post_div; i++) { 1424 if (pll->post_div_table[i].val == val) { 1425 div = pll->post_div_table[i].div; 1426 break; 1427 } 1428 } 1429 1430 return (parent_rate / div); 1431 } 1432 1433 static unsigned long 1434 clk_trion_pll_postdiv_recalc_rate(struct clk_hw *hw, unsigned long parent_rate) 1435 { 1436 struct clk_alpha_pll_postdiv *pll = to_clk_alpha_pll_postdiv(hw); 1437 struct regmap *regmap = pll->clkr.regmap; 1438 u32 i, div = 1, val; 1439 1440 regmap_read(regmap, PLL_USER_CTL(pll), &val); 1441 1442 val >>= pll->post_div_shift; 1443 val &= PLL_POST_DIV_MASK(pll); 1444 1445 for (i = 0; i < pll->num_post_div; i++) { 1446 if (pll->post_div_table[i].val == val) { 1447 div = pll->post_div_table[i].div; 1448 break; 1449 } 1450 } 1451 1452 return (parent_rate / div); 1453 } 1454 1455 static long 1456 clk_trion_pll_postdiv_round_rate(struct clk_hw *hw, unsigned long rate, 1457 unsigned long *prate) 1458 { 1459 struct clk_alpha_pll_postdiv *pll = to_clk_alpha_pll_postdiv(hw); 1460 1461 return divider_round_rate(hw, rate, prate, pll->post_div_table, 1462 pll->width, CLK_DIVIDER_ROUND_CLOSEST); 1463 }; 1464 1465 static int 1466 clk_trion_pll_postdiv_set_rate(struct clk_hw *hw, unsigned long rate, 1467 unsigned long parent_rate) 1468 { 1469 struct clk_alpha_pll_postdiv *pll = to_clk_alpha_pll_postdiv(hw); 1470 struct regmap *regmap = pll->clkr.regmap; 1471 int i, val = 0, div; 1472 1473 div = DIV_ROUND_UP_ULL(parent_rate, rate); 1474 for (i = 0; i < pll->num_post_div; i++) { 1475 if (pll->post_div_table[i].div == div) { 1476 val = pll->post_div_table[i].val; 1477 break; 1478 } 1479 } 1480 1481 return regmap_update_bits(regmap, PLL_USER_CTL(pll), 1482 PLL_POST_DIV_MASK(pll) << PLL_POST_DIV_SHIFT, 1483 val << PLL_POST_DIV_SHIFT); 1484 } 1485 1486 const struct clk_ops clk_alpha_pll_postdiv_trion_ops = { 1487 .recalc_rate = clk_trion_pll_postdiv_recalc_rate, 1488 .round_rate = clk_trion_pll_postdiv_round_rate, 1489 .set_rate = clk_trion_pll_postdiv_set_rate, 1490 }; 1491 EXPORT_SYMBOL_GPL(clk_alpha_pll_postdiv_trion_ops); 1492 1493 static long clk_alpha_pll_postdiv_fabia_round_rate(struct clk_hw *hw, 1494 unsigned long rate, unsigned long *prate) 1495 { 1496 struct clk_alpha_pll_postdiv *pll = to_clk_alpha_pll_postdiv(hw); 1497 1498 return divider_round_rate(hw, rate, prate, pll->post_div_table, 1499 pll->width, CLK_DIVIDER_ROUND_CLOSEST); 1500 } 1501 1502 static int clk_alpha_pll_postdiv_fabia_set_rate(struct clk_hw *hw, 1503 unsigned long rate, unsigned long parent_rate) 1504 { 1505 struct clk_alpha_pll_postdiv *pll = to_clk_alpha_pll_postdiv(hw); 1506 int i, val = 0, div, ret; 1507 1508 /* 1509 * If the PLL is in FSM mode, then treat set_rate callback as a 1510 * no-operation. 1511 */ 1512 ret = regmap_read(pll->clkr.regmap, PLL_MODE(pll), &val); 1513 if (ret) 1514 return ret; 1515 1516 if (val & PLL_VOTE_FSM_ENA) 1517 return 0; 1518 1519 div = DIV_ROUND_UP_ULL(parent_rate, rate); 1520 for (i = 0; i < pll->num_post_div; i++) { 1521 if (pll->post_div_table[i].div == div) { 1522 val = pll->post_div_table[i].val; 1523 break; 1524 } 1525 } 1526 1527 return regmap_update_bits(pll->clkr.regmap, PLL_USER_CTL(pll), 1528 (BIT(pll->width) - 1) << pll->post_div_shift, 1529 val << pll->post_div_shift); 1530 } 1531 1532 const struct clk_ops clk_alpha_pll_postdiv_fabia_ops = { 1533 .recalc_rate = clk_alpha_pll_postdiv_fabia_recalc_rate, 1534 .round_rate = clk_alpha_pll_postdiv_fabia_round_rate, 1535 .set_rate = clk_alpha_pll_postdiv_fabia_set_rate, 1536 }; 1537 EXPORT_SYMBOL_GPL(clk_alpha_pll_postdiv_fabia_ops); 1538 1539 /** 1540 * clk_trion_pll_configure - configure the trion pll 1541 * 1542 * @pll: clk alpha pll 1543 * @regmap: register map 1544 * @config: configuration to apply for pll 1545 */ 1546 void clk_trion_pll_configure(struct clk_alpha_pll *pll, struct regmap *regmap, 1547 const struct alpha_pll_config *config) 1548 { 1549 /* 1550 * If the bootloader left the PLL enabled it's likely that there are 1551 * RCGs that will lock up if we disable the PLL below. 1552 */ 1553 if (trion_pll_is_enabled(pll, regmap)) { 1554 pr_debug("Trion PLL is already enabled, skipping configuration\n"); 1555 return; 1556 } 1557 1558 clk_alpha_pll_write_config(regmap, PLL_L_VAL(pll), config->l); 1559 regmap_write(regmap, PLL_CAL_L_VAL(pll), TRION_PLL_CAL_VAL); 1560 clk_alpha_pll_write_config(regmap, PLL_ALPHA_VAL(pll), config->alpha); 1561 clk_alpha_pll_write_config(regmap, PLL_CONFIG_CTL(pll), 1562 config->config_ctl_val); 1563 clk_alpha_pll_write_config(regmap, PLL_CONFIG_CTL_U(pll), 1564 config->config_ctl_hi_val); 1565 clk_alpha_pll_write_config(regmap, PLL_CONFIG_CTL_U1(pll), 1566 config->config_ctl_hi1_val); 1567 clk_alpha_pll_write_config(regmap, PLL_USER_CTL(pll), 1568 config->user_ctl_val); 1569 clk_alpha_pll_write_config(regmap, PLL_USER_CTL_U(pll), 1570 config->user_ctl_hi_val); 1571 clk_alpha_pll_write_config(regmap, PLL_USER_CTL_U1(pll), 1572 config->user_ctl_hi1_val); 1573 clk_alpha_pll_write_config(regmap, PLL_TEST_CTL(pll), 1574 config->test_ctl_val); 1575 clk_alpha_pll_write_config(regmap, PLL_TEST_CTL_U(pll), 1576 config->test_ctl_hi_val); 1577 clk_alpha_pll_write_config(regmap, PLL_TEST_CTL_U1(pll), 1578 config->test_ctl_hi1_val); 1579 1580 regmap_update_bits(regmap, PLL_MODE(pll), PLL_UPDATE_BYPASS, 1581 PLL_UPDATE_BYPASS); 1582 1583 /* Disable PLL output */ 1584 regmap_update_bits(regmap, PLL_MODE(pll), PLL_OUTCTRL, 0); 1585 1586 /* Set operation mode to OFF */ 1587 regmap_write(regmap, PLL_OPMODE(pll), PLL_STANDBY); 1588 1589 /* Place the PLL in STANDBY mode */ 1590 regmap_update_bits(regmap, PLL_MODE(pll), PLL_RESET_N, PLL_RESET_N); 1591 } 1592 EXPORT_SYMBOL_GPL(clk_trion_pll_configure); 1593 1594 /* 1595 * The TRION PLL requires a power-on self-calibration which happens when the 1596 * PLL comes out of reset. Calibrate in case it is not completed. 1597 */ 1598 static int __alpha_pll_trion_prepare(struct clk_hw *hw, u32 pcal_done) 1599 { 1600 struct clk_alpha_pll *pll = to_clk_alpha_pll(hw); 1601 u32 val; 1602 int ret; 1603 1604 /* Return early if calibration is not needed. */ 1605 regmap_read(pll->clkr.regmap, PLL_STATUS(pll), &val); 1606 if (val & pcal_done) 1607 return 0; 1608 1609 /* On/off to calibrate */ 1610 ret = clk_trion_pll_enable(hw); 1611 if (!ret) 1612 clk_trion_pll_disable(hw); 1613 1614 return ret; 1615 } 1616 1617 static int alpha_pll_trion_prepare(struct clk_hw *hw) 1618 { 1619 return __alpha_pll_trion_prepare(hw, TRION_PCAL_DONE); 1620 } 1621 1622 static int alpha_pll_lucid_prepare(struct clk_hw *hw) 1623 { 1624 return __alpha_pll_trion_prepare(hw, LUCID_PCAL_DONE); 1625 } 1626 1627 static int __alpha_pll_trion_set_rate(struct clk_hw *hw, unsigned long rate, 1628 unsigned long prate, u32 latch_bit, u32 latch_ack) 1629 { 1630 struct clk_alpha_pll *pll = to_clk_alpha_pll(hw); 1631 unsigned long rrate; 1632 u32 val, l, alpha_width = pll_alpha_width(pll); 1633 u64 a; 1634 int ret; 1635 1636 rrate = alpha_pll_round_rate(rate, prate, &l, &a, alpha_width); 1637 1638 ret = alpha_pll_check_rate_margin(hw, rrate, rate); 1639 if (ret < 0) 1640 return ret; 1641 1642 regmap_write(pll->clkr.regmap, PLL_L_VAL(pll), l); 1643 regmap_write(pll->clkr.regmap, PLL_ALPHA_VAL(pll), a); 1644 1645 /* Latch the PLL input */ 1646 ret = regmap_update_bits(pll->clkr.regmap, PLL_MODE(pll), latch_bit, latch_bit); 1647 if (ret) 1648 return ret; 1649 1650 /* Wait for 2 reference cycles before checking the ACK bit. */ 1651 udelay(1); 1652 regmap_read(pll->clkr.regmap, PLL_MODE(pll), &val); 1653 if (!(val & latch_ack)) { 1654 pr_err("Lucid PLL latch failed. Output may be unstable!\n"); 1655 return -EINVAL; 1656 } 1657 1658 /* Return the latch input to 0 */ 1659 ret = regmap_update_bits(pll->clkr.regmap, PLL_MODE(pll), latch_bit, 0); 1660 if (ret) 1661 return ret; 1662 1663 if (clk_hw_is_enabled(hw)) { 1664 ret = wait_for_pll_enable_lock(pll); 1665 if (ret) 1666 return ret; 1667 } 1668 1669 /* Wait for PLL output to stabilize */ 1670 udelay(100); 1671 return 0; 1672 } 1673 1674 static int alpha_pll_trion_set_rate(struct clk_hw *hw, unsigned long rate, 1675 unsigned long prate) 1676 { 1677 return __alpha_pll_trion_set_rate(hw, rate, prate, PLL_UPDATE, ALPHA_PLL_ACK_LATCH); 1678 } 1679 1680 const struct clk_ops clk_alpha_pll_trion_ops = { 1681 .prepare = alpha_pll_trion_prepare, 1682 .enable = clk_trion_pll_enable, 1683 .disable = clk_trion_pll_disable, 1684 .is_enabled = clk_trion_pll_is_enabled, 1685 .recalc_rate = clk_trion_pll_recalc_rate, 1686 .round_rate = clk_alpha_pll_round_rate, 1687 .set_rate = alpha_pll_trion_set_rate, 1688 }; 1689 EXPORT_SYMBOL_GPL(clk_alpha_pll_trion_ops); 1690 1691 const struct clk_ops clk_alpha_pll_lucid_ops = { 1692 .prepare = alpha_pll_lucid_prepare, 1693 .enable = clk_trion_pll_enable, 1694 .disable = clk_trion_pll_disable, 1695 .is_enabled = clk_trion_pll_is_enabled, 1696 .recalc_rate = clk_trion_pll_recalc_rate, 1697 .round_rate = clk_alpha_pll_round_rate, 1698 .set_rate = alpha_pll_trion_set_rate, 1699 }; 1700 EXPORT_SYMBOL_GPL(clk_alpha_pll_lucid_ops); 1701 1702 const struct clk_ops clk_alpha_pll_postdiv_lucid_ops = { 1703 .recalc_rate = clk_alpha_pll_postdiv_fabia_recalc_rate, 1704 .round_rate = clk_alpha_pll_postdiv_fabia_round_rate, 1705 .set_rate = clk_alpha_pll_postdiv_fabia_set_rate, 1706 }; 1707 EXPORT_SYMBOL_GPL(clk_alpha_pll_postdiv_lucid_ops); 1708 1709 void clk_agera_pll_configure(struct clk_alpha_pll *pll, struct regmap *regmap, 1710 const struct alpha_pll_config *config) 1711 { 1712 clk_alpha_pll_write_config(regmap, PLL_L_VAL(pll), config->l); 1713 clk_alpha_pll_write_config(regmap, PLL_ALPHA_VAL(pll), config->alpha); 1714 clk_alpha_pll_write_config(regmap, PLL_USER_CTL(pll), 1715 config->user_ctl_val); 1716 clk_alpha_pll_write_config(regmap, PLL_CONFIG_CTL(pll), 1717 config->config_ctl_val); 1718 clk_alpha_pll_write_config(regmap, PLL_CONFIG_CTL_U(pll), 1719 config->config_ctl_hi_val); 1720 clk_alpha_pll_write_config(regmap, PLL_TEST_CTL(pll), 1721 config->test_ctl_val); 1722 clk_alpha_pll_write_config(regmap, PLL_TEST_CTL_U(pll), 1723 config->test_ctl_hi_val); 1724 } 1725 EXPORT_SYMBOL_GPL(clk_agera_pll_configure); 1726 1727 static int clk_alpha_pll_agera_set_rate(struct clk_hw *hw, unsigned long rate, 1728 unsigned long prate) 1729 { 1730 struct clk_alpha_pll *pll = to_clk_alpha_pll(hw); 1731 u32 l, alpha_width = pll_alpha_width(pll); 1732 int ret; 1733 unsigned long rrate; 1734 u64 a; 1735 1736 rrate = alpha_pll_round_rate(rate, prate, &l, &a, alpha_width); 1737 ret = alpha_pll_check_rate_margin(hw, rrate, rate); 1738 if (ret < 0) 1739 return ret; 1740 1741 /* change L_VAL without having to go through the power on sequence */ 1742 regmap_write(pll->clkr.regmap, PLL_L_VAL(pll), l); 1743 regmap_write(pll->clkr.regmap, PLL_ALPHA_VAL(pll), a); 1744 1745 if (clk_hw_is_enabled(hw)) 1746 return wait_for_pll_enable_lock(pll); 1747 1748 return 0; 1749 } 1750 1751 const struct clk_ops clk_alpha_pll_agera_ops = { 1752 .enable = clk_alpha_pll_enable, 1753 .disable = clk_alpha_pll_disable, 1754 .is_enabled = clk_alpha_pll_is_enabled, 1755 .recalc_rate = alpha_pll_fabia_recalc_rate, 1756 .round_rate = clk_alpha_pll_round_rate, 1757 .set_rate = clk_alpha_pll_agera_set_rate, 1758 }; 1759 EXPORT_SYMBOL_GPL(clk_alpha_pll_agera_ops); 1760 1761 static int alpha_pll_lucid_5lpe_enable(struct clk_hw *hw) 1762 { 1763 struct clk_alpha_pll *pll = to_clk_alpha_pll(hw); 1764 u32 val; 1765 int ret; 1766 1767 ret = regmap_read(pll->clkr.regmap, PLL_USER_CTL(pll), &val); 1768 if (ret) 1769 return ret; 1770 1771 /* If in FSM mode, just vote for it */ 1772 if (val & LUCID_5LPE_ENABLE_VOTE_RUN) { 1773 ret = clk_enable_regmap(hw); 1774 if (ret) 1775 return ret; 1776 return wait_for_pll_enable_lock(pll); 1777 } 1778 1779 /* Check if PLL is already enabled, return if enabled */ 1780 ret = trion_pll_is_enabled(pll, pll->clkr.regmap); 1781 if (ret < 0) 1782 return ret; 1783 1784 ret = regmap_update_bits(pll->clkr.regmap, PLL_MODE(pll), PLL_RESET_N, PLL_RESET_N); 1785 if (ret) 1786 return ret; 1787 1788 regmap_write(pll->clkr.regmap, PLL_OPMODE(pll), PLL_RUN); 1789 1790 ret = wait_for_pll_enable_lock(pll); 1791 if (ret) 1792 return ret; 1793 1794 /* Enable the PLL outputs */ 1795 ret = regmap_update_bits(pll->clkr.regmap, PLL_USER_CTL(pll), PLL_OUT_MASK, PLL_OUT_MASK); 1796 if (ret) 1797 return ret; 1798 1799 /* Enable the global PLL outputs */ 1800 return regmap_update_bits(pll->clkr.regmap, PLL_MODE(pll), PLL_OUTCTRL, PLL_OUTCTRL); 1801 } 1802 1803 static void alpha_pll_lucid_5lpe_disable(struct clk_hw *hw) 1804 { 1805 struct clk_alpha_pll *pll = to_clk_alpha_pll(hw); 1806 u32 val; 1807 int ret; 1808 1809 ret = regmap_read(pll->clkr.regmap, PLL_USER_CTL(pll), &val); 1810 if (ret) 1811 return; 1812 1813 /* If in FSM mode, just unvote it */ 1814 if (val & LUCID_5LPE_ENABLE_VOTE_RUN) { 1815 clk_disable_regmap(hw); 1816 return; 1817 } 1818 1819 /* Disable the global PLL output */ 1820 ret = regmap_update_bits(pll->clkr.regmap, PLL_MODE(pll), PLL_OUTCTRL, 0); 1821 if (ret) 1822 return; 1823 1824 /* Disable the PLL outputs */ 1825 ret = regmap_update_bits(pll->clkr.regmap, PLL_USER_CTL(pll), PLL_OUT_MASK, 0); 1826 if (ret) 1827 return; 1828 1829 /* Place the PLL mode in STANDBY */ 1830 regmap_write(pll->clkr.regmap, PLL_OPMODE(pll), PLL_STANDBY); 1831 } 1832 1833 /* 1834 * The Lucid 5LPE PLL requires a power-on self-calibration which happens 1835 * when the PLL comes out of reset. Calibrate in case it is not completed. 1836 */ 1837 static int alpha_pll_lucid_5lpe_prepare(struct clk_hw *hw) 1838 { 1839 struct clk_alpha_pll *pll = to_clk_alpha_pll(hw); 1840 struct clk_hw *p; 1841 u32 val = 0; 1842 int ret; 1843 1844 /* Return early if calibration is not needed. */ 1845 regmap_read(pll->clkr.regmap, PLL_MODE(pll), &val); 1846 if (val & LUCID_5LPE_PCAL_DONE) 1847 return 0; 1848 1849 p = clk_hw_get_parent(hw); 1850 if (!p) 1851 return -EINVAL; 1852 1853 ret = alpha_pll_lucid_5lpe_enable(hw); 1854 if (ret) 1855 return ret; 1856 1857 alpha_pll_lucid_5lpe_disable(hw); 1858 1859 return 0; 1860 } 1861 1862 static int alpha_pll_lucid_5lpe_set_rate(struct clk_hw *hw, unsigned long rate, 1863 unsigned long prate) 1864 { 1865 return __alpha_pll_trion_set_rate(hw, rate, prate, 1866 LUCID_5LPE_PLL_LATCH_INPUT, 1867 LUCID_5LPE_ALPHA_PLL_ACK_LATCH); 1868 } 1869 1870 static int __clk_lucid_pll_postdiv_set_rate(struct clk_hw *hw, unsigned long rate, 1871 unsigned long parent_rate, 1872 unsigned long enable_vote_run) 1873 { 1874 struct clk_alpha_pll_postdiv *pll = to_clk_alpha_pll_postdiv(hw); 1875 struct regmap *regmap = pll->clkr.regmap; 1876 int i, val, div, ret; 1877 u32 mask; 1878 1879 /* 1880 * If the PLL is in FSM mode, then treat set_rate callback as a 1881 * no-operation. 1882 */ 1883 ret = regmap_read(regmap, PLL_USER_CTL(pll), &val); 1884 if (ret) 1885 return ret; 1886 1887 if (val & enable_vote_run) 1888 return 0; 1889 1890 if (!pll->post_div_table) { 1891 pr_err("Missing the post_div_table for the %s PLL\n", 1892 clk_hw_get_name(&pll->clkr.hw)); 1893 return -EINVAL; 1894 } 1895 1896 div = DIV_ROUND_UP_ULL((u64)parent_rate, rate); 1897 for (i = 0; i < pll->num_post_div; i++) { 1898 if (pll->post_div_table[i].div == div) { 1899 val = pll->post_div_table[i].val; 1900 break; 1901 } 1902 } 1903 1904 mask = GENMASK(pll->width + pll->post_div_shift - 1, pll->post_div_shift); 1905 return regmap_update_bits(pll->clkr.regmap, PLL_USER_CTL(pll), 1906 mask, val << pll->post_div_shift); 1907 } 1908 1909 static int clk_lucid_5lpe_pll_postdiv_set_rate(struct clk_hw *hw, unsigned long rate, 1910 unsigned long parent_rate) 1911 { 1912 return __clk_lucid_pll_postdiv_set_rate(hw, rate, parent_rate, LUCID_5LPE_ENABLE_VOTE_RUN); 1913 } 1914 1915 const struct clk_ops clk_alpha_pll_lucid_5lpe_ops = { 1916 .prepare = alpha_pll_lucid_5lpe_prepare, 1917 .enable = alpha_pll_lucid_5lpe_enable, 1918 .disable = alpha_pll_lucid_5lpe_disable, 1919 .is_enabled = clk_trion_pll_is_enabled, 1920 .recalc_rate = clk_trion_pll_recalc_rate, 1921 .round_rate = clk_alpha_pll_round_rate, 1922 .set_rate = alpha_pll_lucid_5lpe_set_rate, 1923 }; 1924 EXPORT_SYMBOL_GPL(clk_alpha_pll_lucid_5lpe_ops); 1925 1926 const struct clk_ops clk_alpha_pll_fixed_lucid_5lpe_ops = { 1927 .enable = alpha_pll_lucid_5lpe_enable, 1928 .disable = alpha_pll_lucid_5lpe_disable, 1929 .is_enabled = clk_trion_pll_is_enabled, 1930 .recalc_rate = clk_trion_pll_recalc_rate, 1931 .round_rate = clk_alpha_pll_round_rate, 1932 }; 1933 EXPORT_SYMBOL_GPL(clk_alpha_pll_fixed_lucid_5lpe_ops); 1934 1935 const struct clk_ops clk_alpha_pll_postdiv_lucid_5lpe_ops = { 1936 .recalc_rate = clk_alpha_pll_postdiv_fabia_recalc_rate, 1937 .round_rate = clk_alpha_pll_postdiv_fabia_round_rate, 1938 .set_rate = clk_lucid_5lpe_pll_postdiv_set_rate, 1939 }; 1940 EXPORT_SYMBOL_GPL(clk_alpha_pll_postdiv_lucid_5lpe_ops); 1941 1942 void clk_zonda_pll_configure(struct clk_alpha_pll *pll, struct regmap *regmap, 1943 const struct alpha_pll_config *config) 1944 { 1945 clk_alpha_pll_write_config(regmap, PLL_L_VAL(pll), config->l); 1946 clk_alpha_pll_write_config(regmap, PLL_ALPHA_VAL(pll), config->alpha); 1947 clk_alpha_pll_write_config(regmap, PLL_CONFIG_CTL(pll), config->config_ctl_val); 1948 clk_alpha_pll_write_config(regmap, PLL_CONFIG_CTL_U(pll), config->config_ctl_hi_val); 1949 clk_alpha_pll_write_config(regmap, PLL_CONFIG_CTL_U1(pll), config->config_ctl_hi1_val); 1950 clk_alpha_pll_write_config(regmap, PLL_USER_CTL(pll), config->user_ctl_val); 1951 clk_alpha_pll_write_config(regmap, PLL_USER_CTL_U(pll), config->user_ctl_hi_val); 1952 clk_alpha_pll_write_config(regmap, PLL_USER_CTL_U1(pll), config->user_ctl_hi1_val); 1953 clk_alpha_pll_write_config(regmap, PLL_TEST_CTL(pll), config->test_ctl_val); 1954 clk_alpha_pll_write_config(regmap, PLL_TEST_CTL_U(pll), config->test_ctl_hi_val); 1955 clk_alpha_pll_write_config(regmap, PLL_TEST_CTL_U1(pll), config->test_ctl_hi1_val); 1956 1957 regmap_update_bits(regmap, PLL_MODE(pll), PLL_BYPASSNL, 0); 1958 1959 /* Disable PLL output */ 1960 regmap_update_bits(regmap, PLL_MODE(pll), PLL_OUTCTRL, 0); 1961 1962 /* Set operation mode to OFF */ 1963 regmap_write(regmap, PLL_OPMODE(pll), PLL_STANDBY); 1964 1965 /* Place the PLL in STANDBY mode */ 1966 regmap_update_bits(regmap, PLL_MODE(pll), PLL_RESET_N, PLL_RESET_N); 1967 } 1968 EXPORT_SYMBOL_GPL(clk_zonda_pll_configure); 1969 1970 static int clk_zonda_pll_enable(struct clk_hw *hw) 1971 { 1972 struct clk_alpha_pll *pll = to_clk_alpha_pll(hw); 1973 struct regmap *regmap = pll->clkr.regmap; 1974 u32 val; 1975 int ret; 1976 1977 regmap_read(regmap, PLL_MODE(pll), &val); 1978 1979 /* If in FSM mode, just vote for it */ 1980 if (val & PLL_VOTE_FSM_ENA) { 1981 ret = clk_enable_regmap(hw); 1982 if (ret) 1983 return ret; 1984 return wait_for_pll_enable_active(pll); 1985 } 1986 1987 /* Get the PLL out of bypass mode */ 1988 regmap_update_bits(regmap, PLL_MODE(pll), PLL_BYPASSNL, PLL_BYPASSNL); 1989 1990 /* 1991 * H/W requires a 1us delay between disabling the bypass and 1992 * de-asserting the reset. 1993 */ 1994 udelay(1); 1995 1996 regmap_update_bits(regmap, PLL_MODE(pll), PLL_RESET_N, PLL_RESET_N); 1997 1998 /* Set operation mode to RUN */ 1999 regmap_write(regmap, PLL_OPMODE(pll), PLL_RUN); 2000 2001 regmap_read(regmap, PLL_TEST_CTL(pll), &val); 2002 2003 /* If cfa mode then poll for freq lock */ 2004 if (val & ZONDA_STAY_IN_CFA) 2005 ret = wait_for_zonda_pll_freq_lock(pll); 2006 else 2007 ret = wait_for_pll_enable_lock(pll); 2008 if (ret) 2009 return ret; 2010 2011 /* Enable the PLL outputs */ 2012 regmap_update_bits(regmap, PLL_USER_CTL(pll), ZONDA_PLL_OUT_MASK, ZONDA_PLL_OUT_MASK); 2013 2014 /* Enable the global PLL outputs */ 2015 regmap_update_bits(regmap, PLL_MODE(pll), PLL_OUTCTRL, PLL_OUTCTRL); 2016 2017 return 0; 2018 } 2019 2020 static void clk_zonda_pll_disable(struct clk_hw *hw) 2021 { 2022 struct clk_alpha_pll *pll = to_clk_alpha_pll(hw); 2023 struct regmap *regmap = pll->clkr.regmap; 2024 u32 val; 2025 2026 regmap_read(regmap, PLL_MODE(pll), &val); 2027 2028 /* If in FSM mode, just unvote it */ 2029 if (val & PLL_VOTE_FSM_ENA) { 2030 clk_disable_regmap(hw); 2031 return; 2032 } 2033 2034 /* Disable the global PLL output */ 2035 regmap_update_bits(regmap, PLL_MODE(pll), PLL_OUTCTRL, 0); 2036 2037 /* Disable the PLL outputs */ 2038 regmap_update_bits(regmap, PLL_USER_CTL(pll), ZONDA_PLL_OUT_MASK, 0); 2039 2040 /* Put the PLL in bypass and reset */ 2041 regmap_update_bits(regmap, PLL_MODE(pll), PLL_RESET_N | PLL_BYPASSNL, 0); 2042 2043 /* Place the PLL mode in OFF state */ 2044 regmap_write(regmap, PLL_OPMODE(pll), 0x0); 2045 } 2046 2047 static int clk_zonda_pll_set_rate(struct clk_hw *hw, unsigned long rate, 2048 unsigned long prate) 2049 { 2050 struct clk_alpha_pll *pll = to_clk_alpha_pll(hw); 2051 unsigned long rrate; 2052 u32 test_ctl_val; 2053 u32 l, alpha_width = pll_alpha_width(pll); 2054 u64 a; 2055 int ret; 2056 2057 rrate = alpha_pll_round_rate(rate, prate, &l, &a, alpha_width); 2058 2059 ret = alpha_pll_check_rate_margin(hw, rrate, rate); 2060 if (ret < 0) 2061 return ret; 2062 2063 regmap_write(pll->clkr.regmap, PLL_ALPHA_VAL(pll), a); 2064 regmap_write(pll->clkr.regmap, PLL_L_VAL(pll), l); 2065 2066 /* Wait before polling for the frequency latch */ 2067 udelay(5); 2068 2069 /* Read stay in cfa mode */ 2070 regmap_read(pll->clkr.regmap, PLL_TEST_CTL(pll), &test_ctl_val); 2071 2072 /* If cfa mode then poll for freq lock */ 2073 if (test_ctl_val & ZONDA_STAY_IN_CFA) 2074 ret = wait_for_zonda_pll_freq_lock(pll); 2075 else 2076 ret = wait_for_pll_enable_lock(pll); 2077 if (ret) 2078 return ret; 2079 2080 /* Wait for PLL output to stabilize */ 2081 udelay(100); 2082 return 0; 2083 } 2084 2085 const struct clk_ops clk_alpha_pll_zonda_ops = { 2086 .enable = clk_zonda_pll_enable, 2087 .disable = clk_zonda_pll_disable, 2088 .is_enabled = clk_trion_pll_is_enabled, 2089 .recalc_rate = clk_trion_pll_recalc_rate, 2090 .round_rate = clk_alpha_pll_round_rate, 2091 .set_rate = clk_zonda_pll_set_rate, 2092 }; 2093 EXPORT_SYMBOL_GPL(clk_alpha_pll_zonda_ops); 2094 2095 void clk_lucid_evo_pll_configure(struct clk_alpha_pll *pll, struct regmap *regmap, 2096 const struct alpha_pll_config *config) 2097 { 2098 u32 lval = config->l; 2099 2100 lval |= TRION_PLL_CAL_VAL << LUCID_EVO_PLL_CAL_L_VAL_SHIFT; 2101 clk_alpha_pll_write_config(regmap, PLL_L_VAL(pll), lval); 2102 clk_alpha_pll_write_config(regmap, PLL_ALPHA_VAL(pll), config->alpha); 2103 clk_alpha_pll_write_config(regmap, PLL_CONFIG_CTL(pll), config->config_ctl_val); 2104 clk_alpha_pll_write_config(regmap, PLL_CONFIG_CTL_U(pll), config->config_ctl_hi_val); 2105 clk_alpha_pll_write_config(regmap, PLL_CONFIG_CTL_U1(pll), config->config_ctl_hi1_val); 2106 clk_alpha_pll_write_config(regmap, PLL_USER_CTL(pll), config->user_ctl_val); 2107 clk_alpha_pll_write_config(regmap, PLL_USER_CTL_U(pll), config->user_ctl_hi_val); 2108 clk_alpha_pll_write_config(regmap, PLL_TEST_CTL(pll), config->test_ctl_val); 2109 clk_alpha_pll_write_config(regmap, PLL_TEST_CTL_U(pll), config->test_ctl_hi_val); 2110 clk_alpha_pll_write_config(regmap, PLL_TEST_CTL_U1(pll), config->test_ctl_hi1_val); 2111 clk_alpha_pll_write_config(regmap, PLL_TEST_CTL_U2(pll), config->test_ctl_hi2_val); 2112 2113 /* Disable PLL output */ 2114 regmap_update_bits(regmap, PLL_MODE(pll), PLL_OUTCTRL, 0); 2115 2116 /* Set operation mode to STANDBY and de-assert the reset */ 2117 regmap_write(regmap, PLL_OPMODE(pll), PLL_STANDBY); 2118 regmap_update_bits(regmap, PLL_MODE(pll), PLL_RESET_N, PLL_RESET_N); 2119 } 2120 EXPORT_SYMBOL_GPL(clk_lucid_evo_pll_configure); 2121 2122 static int alpha_pll_lucid_evo_enable(struct clk_hw *hw) 2123 { 2124 struct clk_alpha_pll *pll = to_clk_alpha_pll(hw); 2125 struct regmap *regmap = pll->clkr.regmap; 2126 u32 val; 2127 int ret; 2128 2129 ret = regmap_read(regmap, PLL_USER_CTL(pll), &val); 2130 if (ret) 2131 return ret; 2132 2133 /* If in FSM mode, just vote for it */ 2134 if (val & LUCID_EVO_ENABLE_VOTE_RUN) { 2135 ret = clk_enable_regmap(hw); 2136 if (ret) 2137 return ret; 2138 return wait_for_pll_enable_lock(pll); 2139 } 2140 2141 /* Check if PLL is already enabled */ 2142 ret = trion_pll_is_enabled(pll, regmap); 2143 if (ret < 0) { 2144 return ret; 2145 } else if (ret) { 2146 pr_warn("%s PLL is already enabled\n", clk_hw_get_name(&pll->clkr.hw)); 2147 return 0; 2148 } 2149 2150 ret = regmap_update_bits(regmap, PLL_MODE(pll), PLL_RESET_N, PLL_RESET_N); 2151 if (ret) 2152 return ret; 2153 2154 /* Set operation mode to RUN */ 2155 regmap_write(regmap, PLL_OPMODE(pll), PLL_RUN); 2156 2157 ret = wait_for_pll_enable_lock(pll); 2158 if (ret) 2159 return ret; 2160 2161 /* Enable the PLL outputs */ 2162 ret = regmap_update_bits(regmap, PLL_USER_CTL(pll), PLL_OUT_MASK, PLL_OUT_MASK); 2163 if (ret) 2164 return ret; 2165 2166 /* Enable the global PLL outputs */ 2167 ret = regmap_update_bits(regmap, PLL_MODE(pll), PLL_OUTCTRL, PLL_OUTCTRL); 2168 if (ret) 2169 return ret; 2170 2171 /* Ensure that the write above goes through before returning. */ 2172 mb(); 2173 return ret; 2174 } 2175 2176 static void _alpha_pll_lucid_evo_disable(struct clk_hw *hw, bool reset) 2177 { 2178 struct clk_alpha_pll *pll = to_clk_alpha_pll(hw); 2179 struct regmap *regmap = pll->clkr.regmap; 2180 u32 val; 2181 int ret; 2182 2183 ret = regmap_read(regmap, PLL_USER_CTL(pll), &val); 2184 if (ret) 2185 return; 2186 2187 /* If in FSM mode, just unvote it */ 2188 if (val & LUCID_EVO_ENABLE_VOTE_RUN) { 2189 clk_disable_regmap(hw); 2190 return; 2191 } 2192 2193 /* Disable the global PLL output */ 2194 ret = regmap_update_bits(regmap, PLL_MODE(pll), PLL_OUTCTRL, 0); 2195 if (ret) 2196 return; 2197 2198 /* Disable the PLL outputs */ 2199 ret = regmap_update_bits(regmap, PLL_USER_CTL(pll), PLL_OUT_MASK, 0); 2200 if (ret) 2201 return; 2202 2203 /* Place the PLL mode in STANDBY */ 2204 regmap_write(regmap, PLL_OPMODE(pll), PLL_STANDBY); 2205 2206 if (reset) 2207 regmap_update_bits(regmap, PLL_MODE(pll), PLL_RESET_N, 0); 2208 } 2209 2210 static int _alpha_pll_lucid_evo_prepare(struct clk_hw *hw, bool reset) 2211 { 2212 struct clk_alpha_pll *pll = to_clk_alpha_pll(hw); 2213 struct clk_hw *p; 2214 u32 val = 0; 2215 int ret; 2216 2217 /* Return early if calibration is not needed. */ 2218 regmap_read(pll->clkr.regmap, PLL_MODE(pll), &val); 2219 if (!(val & LUCID_EVO_PCAL_NOT_DONE)) 2220 return 0; 2221 2222 p = clk_hw_get_parent(hw); 2223 if (!p) 2224 return -EINVAL; 2225 2226 ret = alpha_pll_lucid_evo_enable(hw); 2227 if (ret) 2228 return ret; 2229 2230 _alpha_pll_lucid_evo_disable(hw, reset); 2231 2232 return 0; 2233 } 2234 2235 static void alpha_pll_lucid_evo_disable(struct clk_hw *hw) 2236 { 2237 _alpha_pll_lucid_evo_disable(hw, false); 2238 } 2239 2240 static int alpha_pll_lucid_evo_prepare(struct clk_hw *hw) 2241 { 2242 return _alpha_pll_lucid_evo_prepare(hw, false); 2243 } 2244 2245 static void alpha_pll_reset_lucid_evo_disable(struct clk_hw *hw) 2246 { 2247 _alpha_pll_lucid_evo_disable(hw, true); 2248 } 2249 2250 static int alpha_pll_reset_lucid_evo_prepare(struct clk_hw *hw) 2251 { 2252 return _alpha_pll_lucid_evo_prepare(hw, true); 2253 } 2254 2255 static unsigned long alpha_pll_lucid_evo_recalc_rate(struct clk_hw *hw, 2256 unsigned long parent_rate) 2257 { 2258 struct clk_alpha_pll *pll = to_clk_alpha_pll(hw); 2259 struct regmap *regmap = pll->clkr.regmap; 2260 u32 l, frac; 2261 2262 regmap_read(regmap, PLL_L_VAL(pll), &l); 2263 l &= LUCID_EVO_PLL_L_VAL_MASK; 2264 regmap_read(regmap, PLL_ALPHA_VAL(pll), &frac); 2265 2266 return alpha_pll_calc_rate(parent_rate, l, frac, pll_alpha_width(pll)); 2267 } 2268 2269 static int clk_lucid_evo_pll_postdiv_set_rate(struct clk_hw *hw, unsigned long rate, 2270 unsigned long parent_rate) 2271 { 2272 return __clk_lucid_pll_postdiv_set_rate(hw, rate, parent_rate, LUCID_EVO_ENABLE_VOTE_RUN); 2273 } 2274 2275 const struct clk_ops clk_alpha_pll_fixed_lucid_evo_ops = { 2276 .enable = alpha_pll_lucid_evo_enable, 2277 .disable = alpha_pll_lucid_evo_disable, 2278 .is_enabled = clk_trion_pll_is_enabled, 2279 .recalc_rate = alpha_pll_lucid_evo_recalc_rate, 2280 .round_rate = clk_alpha_pll_round_rate, 2281 }; 2282 EXPORT_SYMBOL_GPL(clk_alpha_pll_fixed_lucid_evo_ops); 2283 2284 const struct clk_ops clk_alpha_pll_postdiv_lucid_evo_ops = { 2285 .recalc_rate = clk_alpha_pll_postdiv_fabia_recalc_rate, 2286 .round_rate = clk_alpha_pll_postdiv_fabia_round_rate, 2287 .set_rate = clk_lucid_evo_pll_postdiv_set_rate, 2288 }; 2289 EXPORT_SYMBOL_GPL(clk_alpha_pll_postdiv_lucid_evo_ops); 2290 2291 const struct clk_ops clk_alpha_pll_lucid_evo_ops = { 2292 .prepare = alpha_pll_lucid_evo_prepare, 2293 .enable = alpha_pll_lucid_evo_enable, 2294 .disable = alpha_pll_lucid_evo_disable, 2295 .is_enabled = clk_trion_pll_is_enabled, 2296 .recalc_rate = alpha_pll_lucid_evo_recalc_rate, 2297 .round_rate = clk_alpha_pll_round_rate, 2298 .set_rate = alpha_pll_lucid_5lpe_set_rate, 2299 }; 2300 EXPORT_SYMBOL_GPL(clk_alpha_pll_lucid_evo_ops); 2301 2302 const struct clk_ops clk_alpha_pll_reset_lucid_evo_ops = { 2303 .prepare = alpha_pll_reset_lucid_evo_prepare, 2304 .enable = alpha_pll_lucid_evo_enable, 2305 .disable = alpha_pll_reset_lucid_evo_disable, 2306 .is_enabled = clk_trion_pll_is_enabled, 2307 .recalc_rate = alpha_pll_lucid_evo_recalc_rate, 2308 .round_rate = clk_alpha_pll_round_rate, 2309 .set_rate = alpha_pll_lucid_5lpe_set_rate, 2310 }; 2311 EXPORT_SYMBOL_GPL(clk_alpha_pll_reset_lucid_evo_ops); 2312 2313 void clk_rivian_evo_pll_configure(struct clk_alpha_pll *pll, struct regmap *regmap, 2314 const struct alpha_pll_config *config) 2315 { 2316 clk_alpha_pll_write_config(regmap, PLL_CONFIG_CTL(pll), config->config_ctl_val); 2317 clk_alpha_pll_write_config(regmap, PLL_CONFIG_CTL_U(pll), config->config_ctl_hi_val); 2318 clk_alpha_pll_write_config(regmap, PLL_CONFIG_CTL_U1(pll), config->config_ctl_hi1_val); 2319 clk_alpha_pll_write_config(regmap, PLL_TEST_CTL(pll), config->test_ctl_val); 2320 clk_alpha_pll_write_config(regmap, PLL_TEST_CTL_U(pll), config->test_ctl_hi_val); 2321 clk_alpha_pll_write_config(regmap, PLL_L_VAL(pll), config->l); 2322 clk_alpha_pll_write_config(regmap, PLL_USER_CTL(pll), config->user_ctl_val); 2323 clk_alpha_pll_write_config(regmap, PLL_USER_CTL_U(pll), config->user_ctl_hi_val); 2324 2325 regmap_write(regmap, PLL_OPMODE(pll), PLL_STANDBY); 2326 2327 regmap_update_bits(regmap, PLL_MODE(pll), 2328 PLL_RESET_N | PLL_BYPASSNL | PLL_OUTCTRL, 2329 PLL_RESET_N | PLL_BYPASSNL); 2330 } 2331 EXPORT_SYMBOL_GPL(clk_rivian_evo_pll_configure); 2332 2333 static unsigned long clk_rivian_evo_pll_recalc_rate(struct clk_hw *hw, 2334 unsigned long parent_rate) 2335 { 2336 struct clk_alpha_pll *pll = to_clk_alpha_pll(hw); 2337 u32 l; 2338 2339 regmap_read(pll->clkr.regmap, PLL_L_VAL(pll), &l); 2340 2341 return parent_rate * l; 2342 } 2343 2344 static long clk_rivian_evo_pll_round_rate(struct clk_hw *hw, unsigned long rate, 2345 unsigned long *prate) 2346 { 2347 struct clk_alpha_pll *pll = to_clk_alpha_pll(hw); 2348 unsigned long min_freq, max_freq; 2349 u32 l; 2350 u64 a; 2351 2352 rate = alpha_pll_round_rate(rate, *prate, &l, &a, 0); 2353 if (!pll->vco_table || alpha_pll_find_vco(pll, rate)) 2354 return rate; 2355 2356 min_freq = pll->vco_table[0].min_freq; 2357 max_freq = pll->vco_table[pll->num_vco - 1].max_freq; 2358 2359 return clamp(rate, min_freq, max_freq); 2360 } 2361 2362 const struct clk_ops clk_alpha_pll_rivian_evo_ops = { 2363 .enable = alpha_pll_lucid_5lpe_enable, 2364 .disable = alpha_pll_lucid_5lpe_disable, 2365 .is_enabled = clk_trion_pll_is_enabled, 2366 .recalc_rate = clk_rivian_evo_pll_recalc_rate, 2367 .round_rate = clk_rivian_evo_pll_round_rate, 2368 }; 2369 EXPORT_SYMBOL_GPL(clk_alpha_pll_rivian_evo_ops); 2370 2371 void clk_stromer_pll_configure(struct clk_alpha_pll *pll, struct regmap *regmap, 2372 const struct alpha_pll_config *config) 2373 { 2374 u32 val, val_u, mask, mask_u; 2375 2376 regmap_write(regmap, PLL_L_VAL(pll), config->l); 2377 regmap_write(regmap, PLL_ALPHA_VAL(pll), config->alpha); 2378 regmap_write(regmap, PLL_CONFIG_CTL(pll), config->config_ctl_val); 2379 2380 if (pll_has_64bit_config(pll)) 2381 regmap_write(regmap, PLL_CONFIG_CTL_U(pll), 2382 config->config_ctl_hi_val); 2383 2384 if (pll_alpha_width(pll) > 32) 2385 regmap_write(regmap, PLL_ALPHA_VAL_U(pll), config->alpha_hi); 2386 2387 val = config->main_output_mask; 2388 val |= config->aux_output_mask; 2389 val |= config->aux2_output_mask; 2390 val |= config->early_output_mask; 2391 val |= config->pre_div_val; 2392 val |= config->post_div_val; 2393 val |= config->vco_val; 2394 val |= config->alpha_en_mask; 2395 val |= config->alpha_mode_mask; 2396 2397 mask = config->main_output_mask; 2398 mask |= config->aux_output_mask; 2399 mask |= config->aux2_output_mask; 2400 mask |= config->early_output_mask; 2401 mask |= config->pre_div_mask; 2402 mask |= config->post_div_mask; 2403 mask |= config->vco_mask; 2404 mask |= config->alpha_en_mask; 2405 mask |= config->alpha_mode_mask; 2406 2407 regmap_update_bits(regmap, PLL_USER_CTL(pll), mask, val); 2408 2409 /* Stromer APSS PLL does not enable LOCK_DET by default, so enable it */ 2410 val_u = config->status_val << ALPHA_PLL_STATUS_REG_SHIFT; 2411 val_u |= config->lock_det; 2412 2413 mask_u = config->status_mask; 2414 mask_u |= config->lock_det; 2415 2416 regmap_update_bits(regmap, PLL_USER_CTL_U(pll), mask_u, val_u); 2417 regmap_write(regmap, PLL_TEST_CTL(pll), config->test_ctl_val); 2418 regmap_write(regmap, PLL_TEST_CTL_U(pll), config->test_ctl_hi_val); 2419 2420 if (pll->flags & SUPPORTS_FSM_MODE) 2421 qcom_pll_set_fsm_mode(regmap, PLL_MODE(pll), 6, 0); 2422 } 2423 EXPORT_SYMBOL_GPL(clk_stromer_pll_configure); 2424 2425 static int clk_alpha_pll_stromer_determine_rate(struct clk_hw *hw, 2426 struct clk_rate_request *req) 2427 { 2428 u32 l; 2429 u64 a; 2430 2431 req->rate = alpha_pll_round_rate(req->rate, req->best_parent_rate, 2432 &l, &a, ALPHA_REG_BITWIDTH); 2433 2434 return 0; 2435 } 2436 2437 static int clk_alpha_pll_stromer_set_rate(struct clk_hw *hw, unsigned long rate, 2438 unsigned long prate) 2439 { 2440 struct clk_alpha_pll *pll = to_clk_alpha_pll(hw); 2441 int ret; 2442 u32 l; 2443 u64 a; 2444 2445 rate = alpha_pll_round_rate(rate, prate, &l, &a, ALPHA_REG_BITWIDTH); 2446 2447 regmap_write(pll->clkr.regmap, PLL_L_VAL(pll), l); 2448 regmap_write(pll->clkr.regmap, PLL_ALPHA_VAL(pll), a); 2449 regmap_write(pll->clkr.regmap, PLL_ALPHA_VAL_U(pll), 2450 a >> ALPHA_BITWIDTH); 2451 2452 regmap_update_bits(pll->clkr.regmap, PLL_USER_CTL(pll), 2453 PLL_ALPHA_EN, PLL_ALPHA_EN); 2454 2455 if (!clk_hw_is_enabled(hw)) 2456 return 0; 2457 2458 /* 2459 * Stromer PLL supports Dynamic programming. 2460 * It allows the PLL frequency to be changed on-the-fly without first 2461 * execution of a shutdown procedure followed by a bring up procedure. 2462 */ 2463 regmap_update_bits(pll->clkr.regmap, PLL_MODE(pll), PLL_UPDATE, 2464 PLL_UPDATE); 2465 2466 ret = wait_for_pll_update(pll); 2467 if (ret) 2468 return ret; 2469 2470 return wait_for_pll_enable_lock(pll); 2471 } 2472 2473 const struct clk_ops clk_alpha_pll_stromer_ops = { 2474 .enable = clk_alpha_pll_enable, 2475 .disable = clk_alpha_pll_disable, 2476 .is_enabled = clk_alpha_pll_is_enabled, 2477 .recalc_rate = clk_alpha_pll_recalc_rate, 2478 .determine_rate = clk_alpha_pll_stromer_determine_rate, 2479 .set_rate = clk_alpha_pll_stromer_set_rate, 2480 }; 2481 EXPORT_SYMBOL_GPL(clk_alpha_pll_stromer_ops); 2482