FILE
rcar-gen3-cpg.c
File preview with syntax highlighting.
linux-6.19.14/drivers/clk/renesas/rcar-gen3-cpg.c
1// SPDX-License-Identifier: GPL-2.0 2/* 3 * R-Car Gen3 Clock Pulse Generator 4 * 5 * Copyright (C) 2015-2018 Glider bvba 6 * Copyright (C) 2019 Renesas Electronics Corp. 7 * 8 * Based on clk-rcar-gen3.c 9 * 10 * Copyright (C) 2015 Renesas Electronics Corp. 11 */ 12 13#include <linux/bug.h> 14#include <linux/bitfield.h> 15#include <linux/clk.h> 16#include <linux/clk-provider.h> 17#include <linux/device.h> 18#include <linux/err.h> 19#include <linux/init.h> 20#include <linux/io.h> 21#include <linux/pm.h> 22#include <linux/slab.h> 23#include <linux/sys_soc.h> 24 25#include "renesas-cpg-mssr.h" 26#include "rcar-cpg-lib.h" 27#include "rcar-gen3-cpg.h" 28 29#define CPG_PLLECR 0x00d0 /* PLL Enable Control Register */ 30 31#define CPG_PLLECR_PLLST(n) BIT(8 + (n)) /* PLLn Circuit Status */ 32 33#define CPG_PLL0CR 0x00d8 /* PLLn Control Registers */ 34#define CPG_PLL2CR 0x002c 35#define CPG_PLL4CR 0x01f4 36 37#define CPG_PLLnCR_STC_MASK GENMASK(30, 24) /* PLL Circuit Mult. Ratio */ 38 39#define CPG_RCKCR_CKSEL BIT(15) /* RCLK Clock Source Select */ 40 41/* PLL Clocks */ 42struct cpg_pll_clk { 43 struct clk_hw hw; 44 void __iomem *pllcr_reg; 45 void __iomem *pllecr_reg; 46 unsigned int fixed_mult; 47 u32 pllecr_pllst_mask; 48}; 49 50#define to_pll_clk(_hw) container_of(_hw, struct cpg_pll_clk, hw) 51 52static unsigned long cpg_pll_clk_recalc_rate(struct clk_hw *hw, 53 unsigned long parent_rate) 54{ 55 struct cpg_pll_clk *pll_clk = to_pll_clk(hw); 56 unsigned int mult; 57 58 mult = FIELD_GET(CPG_PLLnCR_STC_MASK, readl(pll_clk->pllcr_reg)) + 1; 59 60 return parent_rate * mult * pll_clk->fixed_mult; 61} 62 63static int cpg_pll_clk_determine_rate(struct clk_hw *hw, 64 struct clk_rate_request *req) 65{ 66 struct cpg_pll_clk *pll_clk = to_pll_clk(hw); 67 unsigned int min_mult, max_mult, mult; 68 unsigned long prate; 69 70 prate = req->best_parent_rate * pll_clk->fixed_mult; 71 min_mult = max(div64_ul(req->min_rate, prate), 1ULL); 72 max_mult = min(div64_ul(req->max_rate, prate), 128ULL); 73 if (max_mult < min_mult) 74 return -EINVAL; 75 76 mult = DIV_ROUND_CLOSEST_ULL(req->rate, prate); 77 mult = clamp(mult, min_mult, max_mult); 78 79 req->rate = prate * mult; 80 return 0; 81} 82 83static int cpg_pll_clk_set_rate(struct clk_hw *hw, unsigned long rate, 84 unsigned long parent_rate) 85{ 86 struct cpg_pll_clk *pll_clk = to_pll_clk(hw); 87 unsigned int mult, i; 88 u32 val; 89 90 mult = DIV_ROUND_CLOSEST_ULL(rate, parent_rate * pll_clk->fixed_mult); 91 mult = clamp(mult, 1U, 128U); 92 93 val = readl(pll_clk->pllcr_reg); 94 val &= ~CPG_PLLnCR_STC_MASK; 95 val |= FIELD_PREP(CPG_PLLnCR_STC_MASK, mult - 1); 96 writel(val, pll_clk->pllcr_reg); 97 98 for (i = 1000; i; i--) { 99 if (readl(pll_clk->pllecr_reg) & pll_clk->pllecr_pllst_mask) 100 return 0; 101 102 cpu_relax(); 103 } 104 105 return -ETIMEDOUT; 106} 107 108static const struct clk_ops cpg_pll_clk_ops = { 109 .recalc_rate = cpg_pll_clk_recalc_rate, 110 .determine_rate = cpg_pll_clk_determine_rate, 111 .set_rate = cpg_pll_clk_set_rate, 112}; 113 114static struct clk * __init cpg_pll_clk_register(const char *name, 115 const char *parent_name, 116 void __iomem *base, 117 unsigned int mult, 118 unsigned int offset, 119 unsigned int index) 120 121{ 122 struct cpg_pll_clk *pll_clk; 123 struct clk_init_data init = {}; 124 struct clk *clk; 125 126 pll_clk = kzalloc(sizeof(*pll_clk), GFP_KERNEL); 127 if (!pll_clk) 128 return ERR_PTR(-ENOMEM); 129 130 init.name = name; 131 init.ops = &cpg_pll_clk_ops; 132 init.parent_names = &parent_name; 133 init.num_parents = 1; 134 135 pll_clk->hw.init = &init; 136 pll_clk->pllcr_reg = base + offset; 137 pll_clk->pllecr_reg = base + CPG_PLLECR; 138 pll_clk->fixed_mult = mult; /* PLL refclk x (setting + 1) x mult */ 139 pll_clk->pllecr_pllst_mask = CPG_PLLECR_PLLST(index); 140 141 clk = clk_register(NULL, &pll_clk->hw); 142 if (IS_ERR(clk)) 143 kfree(pll_clk); 144 145 return clk; 146} 147 148/* 149 * Z Clock & Z2 Clock 150 * 151 * Traits of this clock: 152 * prepare - clk_prepare only ensures that parents are prepared 153 * enable - clk_enable only ensures that parents are enabled 154 * rate - rate is adjustable. 155 * clk->rate = (parent->rate * mult / 32 ) / fixed_div 156 * parent - fixed parent. No clk_set_parent support 157 */ 158#define CPG_FRQCRB 0x00000004 159#define CPG_FRQCRB_KICK BIT(31) 160#define CPG_FRQCRC 0x000000e0 161 162struct cpg_z_clk { 163 struct clk_hw hw; 164 void __iomem *reg; 165 void __iomem *kick_reg; 166 unsigned long max_rate; /* Maximum rate for normal mode */ 167 unsigned int fixed_div; 168 u32 mask; 169}; 170 171#define to_z_clk(_hw) container_of(_hw, struct cpg_z_clk, hw) 172 173static unsigned long cpg_z_clk_recalc_rate(struct clk_hw *hw, 174 unsigned long parent_rate) 175{ 176 struct cpg_z_clk *zclk = to_z_clk(hw); 177 unsigned int mult = 32 - field_get(zclk->mask, readl(zclk->reg)); 178 179 return DIV_ROUND_CLOSEST_ULL((u64)parent_rate * mult, 180 32 * zclk->fixed_div); 181} 182 183static int cpg_z_clk_determine_rate(struct clk_hw *hw, 184 struct clk_rate_request *req) 185{ 186 struct cpg_z_clk *zclk = to_z_clk(hw); 187 unsigned int min_mult, max_mult, mult; 188 unsigned long rate, prate; 189 190 rate = min(req->rate, req->max_rate); 191 if (rate <= zclk->max_rate) { 192 /* Set parent rate to initial value for normal modes */ 193 prate = zclk->max_rate; 194 } else { 195 /* Set increased parent rate for boost modes */ 196 prate = rate; 197 } 198 req->best_parent_rate = clk_hw_round_rate(clk_hw_get_parent(hw), 199 prate * zclk->fixed_div); 200 201 prate = req->best_parent_rate / zclk->fixed_div; 202 min_mult = max(div64_ul(req->min_rate * 32ULL, prate), 1ULL); 203 max_mult = min(div64_ul(req->max_rate * 32ULL, prate), 32ULL); 204 if (max_mult < min_mult) 205 return -EINVAL; 206 207 mult = DIV_ROUND_CLOSEST_ULL(rate * 32ULL, prate); 208 mult = clamp(mult, min_mult, max_mult); 209 210 req->rate = DIV_ROUND_CLOSEST_ULL((u64)prate * mult, 32); 211 return 0; 212} 213 214static int cpg_z_clk_set_rate(struct clk_hw *hw, unsigned long rate, 215 unsigned long parent_rate) 216{ 217 struct cpg_z_clk *zclk = to_z_clk(hw); 218 unsigned int mult; 219 unsigned int i; 220 221 mult = DIV64_U64_ROUND_CLOSEST(rate * 32ULL * zclk->fixed_div, 222 parent_rate); 223 mult = clamp(mult, 1U, 32U); 224 225 if (readl(zclk->kick_reg) & CPG_FRQCRB_KICK) 226 return -EBUSY; 227 228 cpg_reg_modify(zclk->reg, zclk->mask, 229 field_prep(zclk->mask, 32 - mult)); 230 231 /* 232 * Set KICK bit in FRQCRB to update hardware setting and wait for 233 * clock change completion. 234 */ 235 cpg_reg_modify(zclk->kick_reg, 0, CPG_FRQCRB_KICK); 236 237 /* 238 * Note: There is no HW information about the worst case latency. 239 * 240 * Using experimental measurements, it seems that no more than 241 * ~10 iterations are needed, independently of the CPU rate. 242 * Since this value might be dependent on external xtal rate, pll1 243 * rate or even the other emulation clocks rate, use 1000 as a 244 * "super" safe value. 245 */ 246 for (i = 1000; i; i--) { 247 if (!(readl(zclk->kick_reg) & CPG_FRQCRB_KICK)) 248 return 0; 249 250 cpu_relax(); 251 } 252 253 return -ETIMEDOUT; 254} 255 256static const struct clk_ops cpg_z_clk_ops = { 257 .recalc_rate = cpg_z_clk_recalc_rate, 258 .determine_rate = cpg_z_clk_determine_rate, 259 .set_rate = cpg_z_clk_set_rate, 260}; 261 262static struct clk * __init __cpg_z_clk_register(const char *name, 263 const char *parent_name, 264 void __iomem *reg, 265 unsigned int div, 266 unsigned int offset, 267 unsigned int fcr, 268 unsigned int flags) 269{ 270 struct clk_init_data init = {}; 271 struct cpg_z_clk *zclk; 272 struct clk *clk; 273 274 zclk = kzalloc(sizeof(*zclk), GFP_KERNEL); 275 if (!zclk) 276 return ERR_PTR(-ENOMEM); 277 278 init.name = name; 279 init.ops = &cpg_z_clk_ops; 280 init.flags = flags; 281 init.parent_names = &parent_name; 282 init.num_parents = 1; 283 284 zclk->reg = reg + fcr; 285 zclk->kick_reg = reg + CPG_FRQCRB; 286 zclk->hw.init = &init; 287 zclk->mask = GENMASK(offset + 4, offset); 288 zclk->fixed_div = div; /* PLLVCO x 1/div x SYS-CPU divider */ 289 290 clk = clk_register(NULL, &zclk->hw); 291 if (IS_ERR(clk)) { 292 kfree(zclk); 293 return clk; 294 } 295 296 zclk->max_rate = clk_hw_get_rate(clk_hw_get_parent(&zclk->hw)) / 297 zclk->fixed_div; 298 return clk; 299} 300 301static struct clk * __init cpg_z_clk_register(const char *name, 302 const char *parent_name, 303 void __iomem *reg, 304 unsigned int div, 305 unsigned int offset) 306{ 307 return __cpg_z_clk_register(name, parent_name, reg, div, offset, 308 CPG_FRQCRC, CLK_SET_RATE_PARENT); 309} 310 311static struct clk * __init cpg_zg_clk_register(const char *name, 312 const char *parent_name, 313 void __iomem *reg, 314 unsigned int div, 315 unsigned int offset) 316{ 317 return __cpg_z_clk_register(name, parent_name, reg, div, offset, 318 CPG_FRQCRB, 0); 319 320} 321 322static const struct clk_div_table cpg_rpcsrc_div_table[] = { 323 { 2, 5 }, { 3, 6 }, { 0, 0 }, 324}; 325 326static const struct rcar_gen3_cpg_pll_config *cpg_pll_config __initdata; 327static unsigned int cpg_clk_extalr __initdata; 328static u32 cpg_mode __initdata; 329static u32 cpg_quirks __initdata; 330 331#define RCKCR_CKSEL BIT(1) /* Manual RCLK parent selection */ 332 333static const struct soc_device_attribute cpg_quirks_match[] __initconst = { 334 { 335 .soc_id = "r8a7796", .revision = "ES1.0", 336 .data = (void *)(RCKCR_CKSEL), 337 }, 338 { /* sentinel */ } 339}; 340 341struct clk * __init rcar_gen3_cpg_clk_register(struct device *dev, 342 const struct cpg_core_clk *core, const struct cpg_mssr_info *info, 343 struct cpg_mssr_pub *pub) 344{ 345 struct raw_notifier_head *notifiers = &pub->notifiers; 346 void __iomem *base = pub->base0; 347 struct clk **clks = pub->clks; 348 const struct clk *parent; 349 unsigned int mult = 1; 350 unsigned int div = 1; 351 u32 value; 352 353 parent = clks[core->parent & 0xffff]; /* some types use high bits */ 354 if (IS_ERR(parent)) 355 return ERR_CAST(parent); 356 357 switch (core->type) { 358 case CLK_TYPE_GEN3_MAIN: 359 div = cpg_pll_config->extal_div; 360 break; 361 362 case CLK_TYPE_GEN3_PLL0: 363 /* 364 * PLL0 is implemented as a custom clock, to change the 365 * multiplier when cpufreq changes between normal and boost 366 * modes. 367 */ 368 return cpg_pll_clk_register(core->name, __clk_get_name(parent), 369 base, 2, CPG_PLL0CR, 0); 370 371 case CLK_TYPE_GEN3_PLL1: 372 mult = cpg_pll_config->pll1_mult; 373 div = cpg_pll_config->pll1_div; 374 break; 375 376 case CLK_TYPE_GEN3_PLL2: 377 /* 378 * PLL2 is implemented as a custom clock, to change the 379 * multiplier when cpufreq changes between normal and boost 380 * modes. 381 */ 382 return cpg_pll_clk_register(core->name, __clk_get_name(parent), 383 base, 2, CPG_PLL2CR, 2); 384 385 case CLK_TYPE_GEN3_PLL3: 386 mult = cpg_pll_config->pll3_mult; 387 div = cpg_pll_config->pll3_div; 388 break; 389 390 case CLK_TYPE_GEN3_PLL4: 391 /* 392 * PLL4 is a configurable multiplier clock. Register it as a 393 * fixed factor clock for now as there's no generic multiplier 394 * clock implementation and we currently have no need to change 395 * the multiplier value. 396 */ 397 value = readl(base + CPG_PLL4CR); 398 mult = (((value >> 24) & 0x7f) + 1) * 2; 399 break; 400 401 case CLK_TYPE_GEN3_SDH: 402 return cpg_sdh_clk_register(core->name, base + core->offset, 403 __clk_get_name(parent), notifiers); 404 405 case CLK_TYPE_GEN3_SD: 406 return cpg_sd_clk_register(core->name, base + core->offset, 407 __clk_get_name(parent)); 408 409 case CLK_TYPE_GEN3_R: 410 if (cpg_quirks & RCKCR_CKSEL) { 411 struct cpg_simple_notifier *csn; 412 413 csn = kzalloc(sizeof(*csn), GFP_KERNEL); 414 if (!csn) 415 return ERR_PTR(-ENOMEM); 416 417 csn->reg = base + CPG_RCKCR; 418 419 /* 420 * RINT is default. 421 * Only if EXTALR is populated, we switch to it. 422 */ 423 value = readl(csn->reg) & 0x3f; 424 425 if (clk_get_rate(clks[cpg_clk_extalr])) { 426 parent = clks[cpg_clk_extalr]; 427 value |= CPG_RCKCR_CKSEL; 428 } 429 430 writel(value, csn->reg); 431 cpg_simple_notifier_register(notifiers, csn); 432 break; 433 } 434 435 /* Select parent clock of RCLK by MD28 */ 436 if (cpg_mode & BIT(28)) 437 parent = clks[cpg_clk_extalr]; 438 break; 439 440 case CLK_TYPE_GEN3_MDSEL: 441 /* 442 * Clock selectable between two parents and two fixed dividers 443 * using a mode pin 444 */ 445 if (cpg_mode & BIT(core->offset)) { 446 div = core->div & 0xffff; 447 } else { 448 parent = clks[core->parent >> 16]; 449 if (IS_ERR(parent)) 450 return ERR_CAST(parent); 451 div = core->div >> 16; 452 } 453 mult = 1; 454 break; 455 456 case CLK_TYPE_GEN3_Z: 457 return cpg_z_clk_register(core->name, __clk_get_name(parent), 458 base, core->div, core->offset); 459 460 case CLK_TYPE_GEN3_ZG: 461 return cpg_zg_clk_register(core->name, __clk_get_name(parent), 462 base, core->div, core->offset); 463 464 case CLK_TYPE_GEN3_OSC: 465 /* 466 * Clock combining OSC EXTAL predivider and a fixed divider 467 */ 468 div = cpg_pll_config->osc_prediv * core->div; 469 break; 470 471 case CLK_TYPE_GEN3_RCKSEL: 472 /* 473 * Clock selectable between two parents and two fixed dividers 474 * using RCKCR.CKSEL 475 */ 476 if (readl(base + CPG_RCKCR) & CPG_RCKCR_CKSEL) { 477 div = core->div & 0xffff; 478 } else { 479 parent = clks[core->parent >> 16]; 480 if (IS_ERR(parent)) 481 return ERR_CAST(parent); 482 div = core->div >> 16; 483 } 484 break; 485 486 case CLK_TYPE_GEN3_RPCSRC: 487 return clk_register_divider_table(NULL, core->name, 488 __clk_get_name(parent), 0, 489 base + CPG_RPCCKCR, 3, 2, 0, 490 cpg_rpcsrc_div_table, 491 &cpg_lock); 492 493 case CLK_TYPE_GEN3_E3_RPCSRC: 494 /* 495 * Register RPCSRC as fixed factor clock based on the 496 * MD[4:1] pins and CPG_RPCCKCR[4:3] register value for 497 * which has been set prior to booting the kernel. 498 */ 499 value = (readl(base + CPG_RPCCKCR) & GENMASK(4, 3)) >> 3; 500 501 switch (value) { 502 case 0: 503 div = 5; 504 break; 505 case 1: 506 div = 3; 507 break; 508 case 2: 509 parent = clks[core->parent >> 16]; 510 if (IS_ERR(parent)) 511 return ERR_CAST(parent); 512 div = core->div; 513 break; 514 case 3: 515 default: 516 div = 2; 517 break; 518 } 519 break; 520 521 case CLK_TYPE_GEN3_RPC: 522 return cpg_rpc_clk_register(core->name, base + CPG_RPCCKCR, 523 __clk_get_name(parent), notifiers); 524 525 case CLK_TYPE_GEN3_RPCD2: 526 return cpg_rpcd2_clk_register(core->name, base + CPG_RPCCKCR, 527 __clk_get_name(parent)); 528 529 default: 530 return ERR_PTR(-EINVAL); 531 } 532 533 return clk_register_fixed_factor(NULL, core->name, 534 __clk_get_name(parent), 0, mult, div); 535} 536 537int __init rcar_gen3_cpg_init(const struct rcar_gen3_cpg_pll_config *config, 538 unsigned int clk_extalr, u32 mode) 539{ 540 const struct soc_device_attribute *attr; 541 542 cpg_pll_config = config; 543 cpg_clk_extalr = clk_extalr; 544 cpg_mode = mode; 545 attr = soc_device_match(cpg_quirks_match); 546 if (attr) 547 cpg_quirks = (uintptr_t)attr->data; 548 pr_debug("%s: mode = 0x%x quirks = 0x%x\n", __func__, mode, cpg_quirks); 549 550 return 0; 551}
~/
Read-only file preview.