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

clk: renesas: Add family-specific clock driver for RZ/V2H(P)

Add family-specific clock driver for RZ/V2H(P) SoCs.

Signed-off-by: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>
Reviewed-by: Geert Uytterhoeven <geert+renesas@glider.be>
Link: https://lore.kernel.org/20240729202645.263525-3-prabhakar.mahadev-lad.rj@bp.renesas.com
Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>

authored by

Lad Prabhakar and committed by
Geert Uytterhoeven
dd22e562 042859e8

+838
+4
drivers/clk/renesas/Kconfig
··· 228 228 bool "RZ/{G2L,G2UL,G3S,V2L} family clock support" if COMPILE_TEST 229 229 select RESET_CONTROLLER 230 230 231 + config CLK_RZV2H 232 + bool "RZ/V2H(P) family clock support" if COMPILE_TEST 233 + select RESET_CONTROLLER 234 + 231 235 # Generic 232 236 config CLK_RENESAS_CPG_MSSR 233 237 bool "CPG/MSSR clock support" if COMPILE_TEST
+1
drivers/clk/renesas/Makefile
··· 46 46 obj-$(CONFIG_CLK_RCAR_GEN4_CPG) += rcar-gen4-cpg.o 47 47 obj-$(CONFIG_CLK_RCAR_USB2_CLOCK_SEL) += rcar-usb2-clock-sel.o 48 48 obj-$(CONFIG_CLK_RZG2L) += rzg2l-cpg.o 49 + obj-$(CONFIG_CLK_RZV2H) += rzv2h-cpg.o 49 50 50 51 # Generic 51 52 obj-$(CONFIG_CLK_RENESAS_CPG_MSSR) += renesas-cpg-mssr.o
+684
drivers/clk/renesas/rzv2h-cpg.c
··· 1 + // SPDX-License-Identifier: GPL-2.0 2 + /* 3 + * Renesas RZ/V2H(P) Clock Pulse Generator 4 + * 5 + * Copyright (C) 2024 Renesas Electronics Corp. 6 + * 7 + * Based on rzg2l-cpg.c 8 + * 9 + * Copyright (C) 2015 Glider bvba 10 + * Copyright (C) 2013 Ideas On Board SPRL 11 + * Copyright (C) 2015 Renesas Electronics Corp. 12 + */ 13 + 14 + #include <linux/bitfield.h> 15 + #include <linux/clk.h> 16 + #include <linux/clk-provider.h> 17 + #include <linux/delay.h> 18 + #include <linux/init.h> 19 + #include <linux/iopoll.h> 20 + #include <linux/mod_devicetable.h> 21 + #include <linux/module.h> 22 + #include <linux/of.h> 23 + #include <linux/platform_device.h> 24 + #include <linux/pm_clock.h> 25 + #include <linux/pm_domain.h> 26 + #include <linux/reset-controller.h> 27 + 28 + #include <dt-bindings/clock/renesas-cpg-mssr.h> 29 + 30 + #include "rzv2h-cpg.h" 31 + 32 + #ifdef DEBUG 33 + #define WARN_DEBUG(x) WARN_ON(x) 34 + #else 35 + #define WARN_DEBUG(x) do { } while (0) 36 + #endif 37 + 38 + #define GET_CLK_ON_OFFSET(x) (0x600 + ((x) * 4)) 39 + #define GET_CLK_MON_OFFSET(x) (0x800 + ((x) * 4)) 40 + #define GET_RST_OFFSET(x) (0x900 + ((x) * 4)) 41 + #define GET_RST_MON_OFFSET(x) (0xA00 + ((x) * 4)) 42 + 43 + #define KDIV(val) ((s16)FIELD_GET(GENMASK(31, 16), (val))) 44 + #define MDIV(val) FIELD_GET(GENMASK(15, 6), (val)) 45 + #define PDIV(val) FIELD_GET(GENMASK(5, 0), (val)) 46 + #define SDIV(val) FIELD_GET(GENMASK(2, 0), (val)) 47 + 48 + #define GET_MOD_CLK_ID(base, index, bit) \ 49 + ((base) + ((((index) * (16))) + (bit))) 50 + 51 + /** 52 + * struct rzv2h_cpg_priv - Clock Pulse Generator Private Data 53 + * 54 + * @dev: CPG device 55 + * @base: CPG register block base address 56 + * @clks: Array containing all Core and Module Clocks 57 + * @num_core_clks: Number of Core Clocks in clks[] 58 + * @num_mod_clks: Number of Module Clocks in clks[] 59 + * @resets: Array of resets 60 + * @num_resets: Number of Module Resets in info->resets[] 61 + * @last_dt_core_clk: ID of the last Core Clock exported to DT 62 + * @rcdev: Reset controller entity 63 + */ 64 + struct rzv2h_cpg_priv { 65 + struct device *dev; 66 + void __iomem *base; 67 + 68 + struct clk **clks; 69 + unsigned int num_core_clks; 70 + unsigned int num_mod_clks; 71 + struct rzv2h_reset *resets; 72 + unsigned int num_resets; 73 + unsigned int last_dt_core_clk; 74 + 75 + struct reset_controller_dev rcdev; 76 + }; 77 + 78 + #define rcdev_to_priv(x) container_of(x, struct rzv2h_cpg_priv, rcdev) 79 + 80 + struct pll_clk { 81 + struct rzv2h_cpg_priv *priv; 82 + void __iomem *base; 83 + struct clk_hw hw; 84 + unsigned int conf; 85 + unsigned int type; 86 + }; 87 + 88 + #define to_pll(_hw) container_of(_hw, struct pll_clk, hw) 89 + 90 + /** 91 + * struct mod_clock - Module clock 92 + * 93 + * @priv: CPG private data 94 + * @hw: handle between common and hardware-specific interfaces 95 + * @on_index: register offset 96 + * @on_bit: ON/MON bit 97 + * @mon_index: monitor register offset 98 + * @mon_bit: montor bit 99 + */ 100 + struct mod_clock { 101 + struct rzv2h_cpg_priv *priv; 102 + struct clk_hw hw; 103 + u8 on_index; 104 + u8 on_bit; 105 + s8 mon_index; 106 + u8 mon_bit; 107 + }; 108 + 109 + #define to_mod_clock(_hw) container_of(_hw, struct mod_clock, hw) 110 + 111 + static unsigned long rzv2h_cpg_pll_clk_recalc_rate(struct clk_hw *hw, 112 + unsigned long parent_rate) 113 + { 114 + struct pll_clk *pll_clk = to_pll(hw); 115 + struct rzv2h_cpg_priv *priv = pll_clk->priv; 116 + unsigned int clk1, clk2; 117 + u64 rate; 118 + 119 + if (!PLL_CLK_ACCESS(pll_clk->conf)) 120 + return 0; 121 + 122 + clk1 = readl(priv->base + PLL_CLK1_OFFSET(pll_clk->conf)); 123 + clk2 = readl(priv->base + PLL_CLK2_OFFSET(pll_clk->conf)); 124 + 125 + rate = mul_u64_u32_shr(parent_rate, (MDIV(clk1) << 16) + KDIV(clk1), 126 + 16 + SDIV(clk2)); 127 + 128 + return DIV_ROUND_CLOSEST_ULL(rate, PDIV(clk1)); 129 + } 130 + 131 + static const struct clk_ops rzv2h_cpg_pll_ops = { 132 + .recalc_rate = rzv2h_cpg_pll_clk_recalc_rate, 133 + }; 134 + 135 + static struct clk * __init 136 + rzv2h_cpg_pll_clk_register(const struct cpg_core_clk *core, 137 + struct rzv2h_cpg_priv *priv, 138 + const struct clk_ops *ops) 139 + { 140 + void __iomem *base = priv->base; 141 + struct device *dev = priv->dev; 142 + struct clk_init_data init; 143 + const struct clk *parent; 144 + const char *parent_name; 145 + struct pll_clk *pll_clk; 146 + int ret; 147 + 148 + parent = priv->clks[core->parent]; 149 + if (IS_ERR(parent)) 150 + return ERR_CAST(parent); 151 + 152 + pll_clk = devm_kzalloc(dev, sizeof(*pll_clk), GFP_KERNEL); 153 + if (!pll_clk) 154 + return ERR_PTR(-ENOMEM); 155 + 156 + parent_name = __clk_get_name(parent); 157 + init.name = core->name; 158 + init.ops = ops; 159 + init.flags = 0; 160 + init.parent_names = &parent_name; 161 + init.num_parents = 1; 162 + 163 + pll_clk->hw.init = &init; 164 + pll_clk->conf = core->conf; 165 + pll_clk->base = base; 166 + pll_clk->priv = priv; 167 + pll_clk->type = core->type; 168 + 169 + ret = devm_clk_hw_register(dev, &pll_clk->hw); 170 + if (ret) 171 + return ERR_PTR(ret); 172 + 173 + return pll_clk->hw.clk; 174 + } 175 + 176 + static struct clk 177 + *rzv2h_cpg_clk_src_twocell_get(struct of_phandle_args *clkspec, 178 + void *data) 179 + { 180 + unsigned int clkidx = clkspec->args[1]; 181 + struct rzv2h_cpg_priv *priv = data; 182 + struct device *dev = priv->dev; 183 + const char *type; 184 + struct clk *clk; 185 + 186 + switch (clkspec->args[0]) { 187 + case CPG_CORE: 188 + type = "core"; 189 + if (clkidx > priv->last_dt_core_clk) { 190 + dev_err(dev, "Invalid %s clock index %u\n", type, clkidx); 191 + return ERR_PTR(-EINVAL); 192 + } 193 + clk = priv->clks[clkidx]; 194 + break; 195 + 196 + case CPG_MOD: 197 + type = "module"; 198 + if (clkidx >= priv->num_mod_clks) { 199 + dev_err(dev, "Invalid %s clock index %u\n", type, clkidx); 200 + return ERR_PTR(-EINVAL); 201 + } 202 + clk = priv->clks[priv->num_core_clks + clkidx]; 203 + break; 204 + 205 + default: 206 + dev_err(dev, "Invalid CPG clock type %u\n", clkspec->args[0]); 207 + return ERR_PTR(-EINVAL); 208 + } 209 + 210 + if (IS_ERR(clk)) 211 + dev_err(dev, "Cannot get %s clock %u: %ld", type, clkidx, 212 + PTR_ERR(clk)); 213 + else 214 + dev_dbg(dev, "clock (%u, %u) is %pC at %lu Hz\n", 215 + clkspec->args[0], clkspec->args[1], clk, 216 + clk_get_rate(clk)); 217 + return clk; 218 + } 219 + 220 + static void __init 221 + rzv2h_cpg_register_core_clk(const struct cpg_core_clk *core, 222 + struct rzv2h_cpg_priv *priv) 223 + { 224 + struct clk *clk = ERR_PTR(-EOPNOTSUPP), *parent; 225 + unsigned int id = core->id, div = core->div; 226 + struct device *dev = priv->dev; 227 + const char *parent_name; 228 + struct clk_hw *clk_hw; 229 + 230 + WARN_DEBUG(id >= priv->num_core_clks); 231 + WARN_DEBUG(PTR_ERR(priv->clks[id]) != -ENOENT); 232 + 233 + switch (core->type) { 234 + case CLK_TYPE_IN: 235 + clk = of_clk_get_by_name(priv->dev->of_node, core->name); 236 + break; 237 + case CLK_TYPE_FF: 238 + WARN_DEBUG(core->parent >= priv->num_core_clks); 239 + parent = priv->clks[core->parent]; 240 + if (IS_ERR(parent)) { 241 + clk = parent; 242 + goto fail; 243 + } 244 + 245 + parent_name = __clk_get_name(parent); 246 + clk_hw = devm_clk_hw_register_fixed_factor(dev, core->name, 247 + parent_name, CLK_SET_RATE_PARENT, 248 + core->mult, div); 249 + if (IS_ERR(clk_hw)) 250 + clk = ERR_CAST(clk_hw); 251 + else 252 + clk = clk_hw->clk; 253 + break; 254 + case CLK_TYPE_PLL: 255 + clk = rzv2h_cpg_pll_clk_register(core, priv, &rzv2h_cpg_pll_ops); 256 + break; 257 + default: 258 + goto fail; 259 + } 260 + 261 + if (IS_ERR_OR_NULL(clk)) 262 + goto fail; 263 + 264 + dev_dbg(dev, "Core clock %pC at %lu Hz\n", clk, clk_get_rate(clk)); 265 + priv->clks[id] = clk; 266 + return; 267 + 268 + fail: 269 + dev_err(dev, "Failed to register core clock %s: %ld\n", 270 + core->name, PTR_ERR(clk)); 271 + } 272 + 273 + static int rzv2h_mod_clock_endisable(struct clk_hw *hw, bool enable) 274 + { 275 + struct mod_clock *clock = to_mod_clock(hw); 276 + unsigned int reg = GET_CLK_ON_OFFSET(clock->on_index); 277 + struct rzv2h_cpg_priv *priv = clock->priv; 278 + u32 bitmask = BIT(clock->on_bit); 279 + struct device *dev = priv->dev; 280 + u32 value; 281 + int error; 282 + 283 + dev_dbg(dev, "CLK_ON 0x%x/%pC %s\n", reg, hw->clk, 284 + enable ? "ON" : "OFF"); 285 + 286 + value = bitmask << 16; 287 + if (enable) 288 + value |= bitmask; 289 + 290 + writel(value, priv->base + reg); 291 + 292 + if (!enable || clock->mon_index < 0) 293 + return 0; 294 + 295 + reg = GET_CLK_MON_OFFSET(clock->mon_index); 296 + bitmask = BIT(clock->mon_bit); 297 + error = readl_poll_timeout_atomic(priv->base + reg, value, 298 + value & bitmask, 0, 10); 299 + if (error) 300 + dev_err(dev, "Failed to enable CLK_ON %p\n", 301 + priv->base + reg); 302 + 303 + return error; 304 + } 305 + 306 + static int rzv2h_mod_clock_enable(struct clk_hw *hw) 307 + { 308 + return rzv2h_mod_clock_endisable(hw, true); 309 + } 310 + 311 + static void rzv2h_mod_clock_disable(struct clk_hw *hw) 312 + { 313 + rzv2h_mod_clock_endisable(hw, false); 314 + } 315 + 316 + static int rzv2h_mod_clock_is_enabled(struct clk_hw *hw) 317 + { 318 + struct mod_clock *clock = to_mod_clock(hw); 319 + struct rzv2h_cpg_priv *priv = clock->priv; 320 + u32 bitmask; 321 + u32 offset; 322 + 323 + if (clock->mon_index >= 0) { 324 + offset = GET_CLK_MON_OFFSET(clock->mon_index); 325 + bitmask = BIT(clock->mon_bit); 326 + } else { 327 + offset = GET_CLK_ON_OFFSET(clock->on_index); 328 + bitmask = BIT(clock->on_bit); 329 + } 330 + 331 + return readl(priv->base + offset) & bitmask; 332 + } 333 + 334 + static const struct clk_ops rzv2h_mod_clock_ops = { 335 + .enable = rzv2h_mod_clock_enable, 336 + .disable = rzv2h_mod_clock_disable, 337 + .is_enabled = rzv2h_mod_clock_is_enabled, 338 + }; 339 + 340 + static void __init 341 + rzv2h_cpg_register_mod_clk(const struct rzv2h_mod_clk *mod, 342 + struct rzv2h_cpg_priv *priv) 343 + { 344 + struct mod_clock *clock = NULL; 345 + struct device *dev = priv->dev; 346 + struct clk_init_data init; 347 + struct clk *parent, *clk; 348 + const char *parent_name; 349 + unsigned int id; 350 + int ret; 351 + 352 + id = GET_MOD_CLK_ID(priv->num_core_clks, mod->on_index, mod->on_bit); 353 + WARN_DEBUG(id >= priv->num_core_clks + priv->num_mod_clks); 354 + WARN_DEBUG(mod->parent >= priv->num_core_clks + priv->num_mod_clks); 355 + WARN_DEBUG(PTR_ERR(priv->clks[id]) != -ENOENT); 356 + 357 + parent = priv->clks[mod->parent]; 358 + if (IS_ERR(parent)) { 359 + clk = parent; 360 + goto fail; 361 + } 362 + 363 + clock = devm_kzalloc(dev, sizeof(*clock), GFP_KERNEL); 364 + if (!clock) { 365 + clk = ERR_PTR(-ENOMEM); 366 + goto fail; 367 + } 368 + 369 + init.name = mod->name; 370 + init.ops = &rzv2h_mod_clock_ops; 371 + init.flags = CLK_SET_RATE_PARENT; 372 + if (mod->critical) 373 + init.flags |= CLK_IS_CRITICAL; 374 + 375 + parent_name = __clk_get_name(parent); 376 + init.parent_names = &parent_name; 377 + init.num_parents = 1; 378 + 379 + clock->on_index = mod->on_index; 380 + clock->on_bit = mod->on_bit; 381 + clock->mon_index = mod->mon_index; 382 + clock->mon_bit = mod->mon_bit; 383 + clock->priv = priv; 384 + clock->hw.init = &init; 385 + 386 + ret = devm_clk_hw_register(dev, &clock->hw); 387 + if (ret) { 388 + clk = ERR_PTR(ret); 389 + goto fail; 390 + } 391 + 392 + priv->clks[id] = clock->hw.clk; 393 + 394 + return; 395 + 396 + fail: 397 + dev_err(dev, "Failed to register module clock %s: %ld\n", 398 + mod->name, PTR_ERR(clk)); 399 + } 400 + 401 + static int rzv2h_cpg_assert(struct reset_controller_dev *rcdev, 402 + unsigned long id) 403 + { 404 + struct rzv2h_cpg_priv *priv = rcdev_to_priv(rcdev); 405 + unsigned int reg = GET_RST_OFFSET(priv->resets[id].reset_index); 406 + u32 mask = BIT(priv->resets[id].reset_bit); 407 + u8 monbit = priv->resets[id].mon_bit; 408 + u32 value = mask << 16; 409 + 410 + dev_dbg(rcdev->dev, "assert id:%ld offset:0x%x\n", id, reg); 411 + 412 + writel(value, priv->base + reg); 413 + 414 + reg = GET_RST_MON_OFFSET(priv->resets[id].mon_index); 415 + mask = BIT(monbit); 416 + 417 + return readl_poll_timeout_atomic(priv->base + reg, value, 418 + value & mask, 10, 200); 419 + } 420 + 421 + static int rzv2h_cpg_deassert(struct reset_controller_dev *rcdev, 422 + unsigned long id) 423 + { 424 + struct rzv2h_cpg_priv *priv = rcdev_to_priv(rcdev); 425 + unsigned int reg = GET_RST_OFFSET(priv->resets[id].reset_index); 426 + u32 mask = BIT(priv->resets[id].reset_bit); 427 + u8 monbit = priv->resets[id].mon_bit; 428 + u32 value = (mask << 16) | mask; 429 + 430 + dev_dbg(rcdev->dev, "deassert id:%ld offset:0x%x\n", id, reg); 431 + 432 + writel(value, priv->base + reg); 433 + 434 + reg = GET_RST_MON_OFFSET(priv->resets[id].mon_index); 435 + mask = BIT(monbit); 436 + 437 + return readl_poll_timeout_atomic(priv->base + reg, value, 438 + !(value & mask), 10, 200); 439 + } 440 + 441 + static int rzv2h_cpg_reset(struct reset_controller_dev *rcdev, 442 + unsigned long id) 443 + { 444 + int ret; 445 + 446 + ret = rzv2h_cpg_assert(rcdev, id); 447 + if (ret) 448 + return ret; 449 + 450 + return rzv2h_cpg_deassert(rcdev, id); 451 + } 452 + 453 + static int rzv2h_cpg_status(struct reset_controller_dev *rcdev, 454 + unsigned long id) 455 + { 456 + struct rzv2h_cpg_priv *priv = rcdev_to_priv(rcdev); 457 + unsigned int reg = GET_RST_MON_OFFSET(priv->resets[id].mon_index); 458 + u8 monbit = priv->resets[id].mon_bit; 459 + 460 + return !!(readl(priv->base + reg) & BIT(monbit)); 461 + } 462 + 463 + static const struct reset_control_ops rzv2h_cpg_reset_ops = { 464 + .reset = rzv2h_cpg_reset, 465 + .assert = rzv2h_cpg_assert, 466 + .deassert = rzv2h_cpg_deassert, 467 + .status = rzv2h_cpg_status, 468 + }; 469 + 470 + static int rzv2h_cpg_reset_xlate(struct reset_controller_dev *rcdev, 471 + const struct of_phandle_args *reset_spec) 472 + { 473 + struct rzv2h_cpg_priv *priv = rcdev_to_priv(rcdev); 474 + unsigned int id = reset_spec->args[0]; 475 + u8 rst_index = id / 16; 476 + u8 rst_bit = id % 16; 477 + unsigned int i; 478 + 479 + for (i = 0; i < rcdev->nr_resets; i++) { 480 + if (rst_index == priv->resets[i].reset_index && 481 + rst_bit == priv->resets[i].reset_bit) 482 + return i; 483 + } 484 + 485 + return -EINVAL; 486 + } 487 + 488 + static int rzv2h_cpg_reset_controller_register(struct rzv2h_cpg_priv *priv) 489 + { 490 + priv->rcdev.ops = &rzv2h_cpg_reset_ops; 491 + priv->rcdev.of_node = priv->dev->of_node; 492 + priv->rcdev.dev = priv->dev; 493 + priv->rcdev.of_reset_n_cells = 1; 494 + priv->rcdev.of_xlate = rzv2h_cpg_reset_xlate; 495 + priv->rcdev.nr_resets = priv->num_resets; 496 + 497 + return devm_reset_controller_register(priv->dev, &priv->rcdev); 498 + } 499 + 500 + /** 501 + * struct rzv2h_cpg_pd - RZ/V2H power domain data structure 502 + * @priv: pointer to CPG private data structure 503 + * @genpd: generic PM domain 504 + */ 505 + struct rzv2h_cpg_pd { 506 + struct rzv2h_cpg_priv *priv; 507 + struct generic_pm_domain genpd; 508 + }; 509 + 510 + static int rzv2h_cpg_attach_dev(struct generic_pm_domain *domain, struct device *dev) 511 + { 512 + struct device_node *np = dev->of_node; 513 + struct of_phandle_args clkspec; 514 + bool once = true; 515 + struct clk *clk; 516 + int error; 517 + int i = 0; 518 + 519 + while (!of_parse_phandle_with_args(np, "clocks", "#clock-cells", i, 520 + &clkspec)) { 521 + if (once) { 522 + once = false; 523 + error = pm_clk_create(dev); 524 + if (error) { 525 + of_node_put(clkspec.np); 526 + goto err; 527 + } 528 + } 529 + clk = of_clk_get_from_provider(&clkspec); 530 + of_node_put(clkspec.np); 531 + if (IS_ERR(clk)) { 532 + error = PTR_ERR(clk); 533 + goto fail_destroy; 534 + } 535 + 536 + error = pm_clk_add_clk(dev, clk); 537 + if (error) { 538 + dev_err(dev, "pm_clk_add_clk failed %d\n", 539 + error); 540 + goto fail_put; 541 + } 542 + i++; 543 + } 544 + 545 + return 0; 546 + 547 + fail_put: 548 + clk_put(clk); 549 + 550 + fail_destroy: 551 + pm_clk_destroy(dev); 552 + err: 553 + return error; 554 + } 555 + 556 + static void rzv2h_cpg_detach_dev(struct generic_pm_domain *unused, struct device *dev) 557 + { 558 + if (!pm_clk_no_clocks(dev)) 559 + pm_clk_destroy(dev); 560 + } 561 + 562 + static void rzv2h_cpg_genpd_remove_simple(void *data) 563 + { 564 + pm_genpd_remove(data); 565 + } 566 + 567 + static int __init rzv2h_cpg_add_pm_domains(struct rzv2h_cpg_priv *priv) 568 + { 569 + struct device *dev = priv->dev; 570 + struct device_node *np = dev->of_node; 571 + struct rzv2h_cpg_pd *pd; 572 + int ret; 573 + 574 + pd = devm_kzalloc(dev, sizeof(*pd), GFP_KERNEL); 575 + if (!pd) 576 + return -ENOMEM; 577 + 578 + pd->genpd.name = np->name; 579 + pd->priv = priv; 580 + pd->genpd.flags |= GENPD_FLAG_ALWAYS_ON | GENPD_FLAG_PM_CLK | GENPD_FLAG_ACTIVE_WAKEUP; 581 + pd->genpd.attach_dev = rzv2h_cpg_attach_dev; 582 + pd->genpd.detach_dev = rzv2h_cpg_detach_dev; 583 + ret = pm_genpd_init(&pd->genpd, &pm_domain_always_on_gov, false); 584 + if (ret) 585 + return ret; 586 + 587 + ret = devm_add_action_or_reset(dev, rzv2h_cpg_genpd_remove_simple, &pd->genpd); 588 + if (ret) 589 + return ret; 590 + 591 + return of_genpd_add_provider_simple(np, &pd->genpd); 592 + } 593 + 594 + static void rzv2h_cpg_del_clk_provider(void *data) 595 + { 596 + of_clk_del_provider(data); 597 + } 598 + 599 + static int __init rzv2h_cpg_probe(struct platform_device *pdev) 600 + { 601 + struct device *dev = &pdev->dev; 602 + struct device_node *np = dev->of_node; 603 + const struct rzv2h_cpg_info *info; 604 + struct rzv2h_cpg_priv *priv; 605 + unsigned int nclks, i; 606 + struct clk **clks; 607 + int error; 608 + 609 + info = of_device_get_match_data(dev); 610 + 611 + priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); 612 + if (!priv) 613 + return -ENOMEM; 614 + 615 + priv->dev = dev; 616 + 617 + priv->base = devm_platform_ioremap_resource(pdev, 0); 618 + if (IS_ERR(priv->base)) 619 + return PTR_ERR(priv->base); 620 + 621 + nclks = info->num_total_core_clks + info->num_hw_mod_clks; 622 + clks = devm_kmalloc_array(dev, nclks, sizeof(*clks), GFP_KERNEL); 623 + if (!clks) 624 + return -ENOMEM; 625 + 626 + priv->resets = devm_kmemdup(dev, info->resets, sizeof(*info->resets) * 627 + info->num_resets, GFP_KERNEL); 628 + if (!priv->resets) 629 + return -ENOMEM; 630 + 631 + dev_set_drvdata(dev, priv); 632 + priv->clks = clks; 633 + priv->num_core_clks = info->num_total_core_clks; 634 + priv->num_mod_clks = info->num_hw_mod_clks; 635 + priv->last_dt_core_clk = info->last_dt_core_clk; 636 + priv->num_resets = info->num_resets; 637 + 638 + for (i = 0; i < nclks; i++) 639 + clks[i] = ERR_PTR(-ENOENT); 640 + 641 + for (i = 0; i < info->num_core_clks; i++) 642 + rzv2h_cpg_register_core_clk(&info->core_clks[i], priv); 643 + 644 + for (i = 0; i < info->num_mod_clks; i++) 645 + rzv2h_cpg_register_mod_clk(&info->mod_clks[i], priv); 646 + 647 + error = of_clk_add_provider(np, rzv2h_cpg_clk_src_twocell_get, priv); 648 + if (error) 649 + return error; 650 + 651 + error = devm_add_action_or_reset(dev, rzv2h_cpg_del_clk_provider, np); 652 + if (error) 653 + return error; 654 + 655 + error = rzv2h_cpg_add_pm_domains(priv); 656 + if (error) 657 + return error; 658 + 659 + error = rzv2h_cpg_reset_controller_register(priv); 660 + if (error) 661 + return error; 662 + 663 + return 0; 664 + } 665 + 666 + static const struct of_device_id rzv2h_cpg_match[] = { 667 + { /* sentinel */ } 668 + }; 669 + 670 + static struct platform_driver rzv2h_cpg_driver = { 671 + .driver = { 672 + .name = "rzv2h-cpg", 673 + .of_match_table = rzv2h_cpg_match, 674 + }, 675 + }; 676 + 677 + static int __init rzv2h_cpg_init(void) 678 + { 679 + return platform_driver_probe(&rzv2h_cpg_driver, rzv2h_cpg_probe); 680 + } 681 + 682 + subsys_initcall(rzv2h_cpg_init); 683 + 684 + MODULE_DESCRIPTION("Renesas RZ/V2H CPG Driver");
+149
drivers/clk/renesas/rzv2h-cpg.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0 */ 2 + /* 3 + * Renesas RZ/V2H(P) Clock Pulse Generator 4 + * 5 + * Copyright (C) 2024 Renesas Electronics Corp. 6 + */ 7 + 8 + #ifndef __RENESAS_RZV2H_CPG_H__ 9 + #define __RENESAS_RZV2H_CPG_H__ 10 + 11 + /** 12 + * Definitions of CPG Core Clocks 13 + * 14 + * These include: 15 + * - Clock outputs exported to DT 16 + * - External input clocks 17 + * - Internal CPG clocks 18 + */ 19 + struct cpg_core_clk { 20 + const char *name; 21 + unsigned int id; 22 + unsigned int parent; 23 + unsigned int div; 24 + unsigned int mult; 25 + unsigned int type; 26 + unsigned int conf; 27 + }; 28 + 29 + enum clk_types { 30 + /* Generic */ 31 + CLK_TYPE_IN, /* External Clock Input */ 32 + CLK_TYPE_FF, /* Fixed Factor Clock */ 33 + CLK_TYPE_PLL, 34 + }; 35 + 36 + /* BIT(31) indicates if CLK1/2 are accessible or not */ 37 + #define PLL_CONF(n) (BIT(31) | ((n) & ~GENMASK(31, 16))) 38 + #define PLL_CLK_ACCESS(n) ((n) & BIT(31) ? 1 : 0) 39 + #define PLL_CLK1_OFFSET(n) ((n) & ~GENMASK(31, 16)) 40 + #define PLL_CLK2_OFFSET(n) (((n) & ~GENMASK(31, 16)) + (0x4)) 41 + 42 + #define DEF_TYPE(_name, _id, _type...) \ 43 + { .name = _name, .id = _id, .type = _type } 44 + #define DEF_BASE(_name, _id, _type, _parent...) \ 45 + DEF_TYPE(_name, _id, _type, .parent = _parent) 46 + #define DEF_PLL(_name, _id, _parent, _conf) \ 47 + DEF_TYPE(_name, _id, CLK_TYPE_PLL, .parent = _parent, .conf = _conf) 48 + #define DEF_INPUT(_name, _id) \ 49 + DEF_TYPE(_name, _id, CLK_TYPE_IN) 50 + #define DEF_FIXED(_name, _id, _parent, _mult, _div) \ 51 + DEF_BASE(_name, _id, CLK_TYPE_FF, _parent, .div = _div, .mult = _mult) 52 + 53 + /** 54 + * struct rzv2h_mod_clk - Module Clocks definitions 55 + * 56 + * @name: handle between common and hardware-specific interfaces 57 + * @parent: id of parent clock 58 + * @critical: flag to indicate the clock is critical 59 + * @on_index: control register index 60 + * @on_bit: ON bit 61 + * @mon_index: monitor register index 62 + * @mon_bit: monitor bit 63 + */ 64 + struct rzv2h_mod_clk { 65 + const char *name; 66 + u16 parent; 67 + bool critical; 68 + u8 on_index; 69 + u8 on_bit; 70 + s8 mon_index; 71 + u8 mon_bit; 72 + }; 73 + 74 + #define DEF_MOD_BASE(_name, _parent, _critical, _onindex, _onbit, _monindex, _monbit) \ 75 + { \ 76 + .name = (_name), \ 77 + .parent = (_parent), \ 78 + .critical = (_critical), \ 79 + .on_index = (_onindex), \ 80 + .on_bit = (_onbit), \ 81 + .mon_index = (_monindex), \ 82 + .mon_bit = (_monbit), \ 83 + } 84 + 85 + #define DEF_MOD(_name, _parent, _onindex, _onbit, _monindex, _monbit) \ 86 + DEF_MOD_BASE(_name, _parent, false, _onindex, _onbit, _monindex, _monbit) 87 + 88 + #define DEF_MOD_CRITICAL(_name, _parent, _onindex, _onbit, _monindex, _monbit) \ 89 + DEF_MOD_BASE(_name, _parent, true, _onindex, _onbit, _monindex, _monbit) 90 + 91 + /** 92 + * struct rzv2h_reset - Reset definitions 93 + * 94 + * @reset_index: reset register index 95 + * @reset_bit: reset bit 96 + * @mon_index: monitor register index 97 + * @mon_bit: monitor bit 98 + */ 99 + struct rzv2h_reset { 100 + u8 reset_index; 101 + u8 reset_bit; 102 + u8 mon_index; 103 + u8 mon_bit; 104 + }; 105 + 106 + #define DEF_RST_BASE(_resindex, _resbit, _monindex, _monbit) \ 107 + { \ 108 + .reset_index = (_resindex), \ 109 + .reset_bit = (_resbit), \ 110 + .mon_index = (_monindex), \ 111 + .mon_bit = (_monbit), \ 112 + } 113 + 114 + #define DEF_RST(_resindex, _resbit, _monindex, _monbit) \ 115 + DEF_RST_BASE(_resindex, _resbit, _monindex, _monbit) 116 + 117 + /** 118 + * struct rzv2h_cpg_info - SoC-specific CPG Description 119 + * 120 + * @core_clks: Array of Core Clock definitions 121 + * @num_core_clks: Number of entries in core_clks[] 122 + * @last_dt_core_clk: ID of the last Core Clock exported to DT 123 + * @num_total_core_clks: Total number of Core Clocks (exported + internal) 124 + * 125 + * @mod_clks: Array of Module Clock definitions 126 + * @num_mod_clks: Number of entries in mod_clks[] 127 + * @num_hw_mod_clks: Number of Module Clocks supported by the hardware 128 + * 129 + * @resets: Array of Module Reset definitions 130 + * @num_resets: Number of entries in resets[] 131 + */ 132 + struct rzv2h_cpg_info { 133 + /* Core Clocks */ 134 + const struct cpg_core_clk *core_clks; 135 + unsigned int num_core_clks; 136 + unsigned int last_dt_core_clk; 137 + unsigned int num_total_core_clks; 138 + 139 + /* Module Clocks */ 140 + const struct rzv2h_mod_clk *mod_clks; 141 + unsigned int num_mod_clks; 142 + unsigned int num_hw_mod_clks; 143 + 144 + /* Resets */ 145 + const struct rzv2h_reset *resets; 146 + unsigned int num_resets; 147 + }; 148 + 149 + #endif /* __RENESAS_RZV2H_CPG_H__ */