renesas-cpg-mssr.c (28174B)
1// SPDX-License-Identifier: GPL-2.0 2/* 3 * Renesas Clock Pulse Generator / Module Standby and Software Reset 4 * 5 * Copyright (C) 2015 Glider bvba 6 * 7 * Based on clk-mstp.c, clk-rcar-gen2.c, and clk-rcar-gen3.c 8 * 9 * Copyright (C) 2013 Ideas On Board SPRL 10 * Copyright (C) 2015 Renesas Electronics Corp. 11 */ 12 13#include <linux/clk.h> 14#include <linux/clk-provider.h> 15#include <linux/clk/renesas.h> 16#include <linux/delay.h> 17#include <linux/device.h> 18#include <linux/init.h> 19#include <linux/io.h> 20#include <linux/mod_devicetable.h> 21#include <linux/module.h> 22#include <linux/of_address.h> 23#include <linux/of_device.h> 24#include <linux/platform_device.h> 25#include <linux/pm_clock.h> 26#include <linux/pm_domain.h> 27#include <linux/psci.h> 28#include <linux/reset-controller.h> 29#include <linux/slab.h> 30 31#include <dt-bindings/clock/renesas-cpg-mssr.h> 32 33#include "renesas-cpg-mssr.h" 34#include "clk-div6.h" 35 36#ifdef DEBUG 37#define WARN_DEBUG(x) WARN_ON(x) 38#else 39#define WARN_DEBUG(x) do { } while (0) 40#endif 41 42 43/* 44 * Module Standby and Software Reset register offets. 45 * 46 * If the registers exist, these are valid for SH-Mobile, R-Mobile, 47 * R-Car Gen2, R-Car Gen3, and RZ/G1. 48 * These are NOT valid for R-Car Gen1 and RZ/A1! 49 */ 50 51/* 52 * Module Stop Status Register offsets 53 */ 54 55static const u16 mstpsr[] = { 56 0x030, 0x038, 0x040, 0x048, 0x04C, 0x03C, 0x1C0, 0x1C4, 57 0x9A0, 0x9A4, 0x9A8, 0x9AC, 58}; 59 60static const u16 mstpsr_for_gen4[] = { 61 0x2E00, 0x2E04, 0x2E08, 0x2E0C, 0x2E10, 0x2E14, 0x2E18, 0x2E1C, 62 0x2E20, 0x2E24, 0x2E28, 0x2E2C, 0x2E30, 0x2E34, 0x2E38, 0x2E3C, 63 0x2E40, 0x2E44, 0x2E48, 0x2E4C, 0x2E50, 0x2E54, 0x2E58, 0x2E5C, 64 0x2E60, 0x2E64, 0x2E68, 0x2E6C, 65}; 66 67/* 68 * System Module Stop Control Register offsets 69 */ 70 71static const u16 smstpcr[] = { 72 0x130, 0x134, 0x138, 0x13C, 0x140, 0x144, 0x148, 0x14C, 73 0x990, 0x994, 0x998, 0x99C, 74}; 75 76static const u16 mstpcr_for_gen4[] = { 77 0x2D00, 0x2D04, 0x2D08, 0x2D0C, 0x2D10, 0x2D14, 0x2D18, 0x2D1C, 78 0x2D20, 0x2D24, 0x2D28, 0x2D2C, 0x2D30, 0x2D34, 0x2D38, 0x2D3C, 79 0x2D40, 0x2D44, 0x2D48, 0x2D4C, 0x2D50, 0x2D54, 0x2D58, 0x2D5C, 80 0x2D60, 0x2D64, 0x2D68, 0x2D6C, 81}; 82 83/* 84 * Standby Control Register offsets (RZ/A) 85 * Base address is FRQCR register 86 */ 87 88static const u16 stbcr[] = { 89 0xFFFF/*dummy*/, 0x010, 0x014, 0x410, 0x414, 0x418, 0x41C, 0x420, 90 0x424, 0x428, 0x42C, 91}; 92 93/* 94 * Software Reset Register offsets 95 */ 96 97static const u16 srcr[] = { 98 0x0A0, 0x0A8, 0x0B0, 0x0B8, 0x0BC, 0x0C4, 0x1C8, 0x1CC, 99 0x920, 0x924, 0x928, 0x92C, 100}; 101 102static const u16 srcr_for_gen4[] = { 103 0x2C00, 0x2C04, 0x2C08, 0x2C0C, 0x2C10, 0x2C14, 0x2C18, 0x2C1C, 104 0x2C20, 0x2C24, 0x2C28, 0x2C2C, 0x2C30, 0x2C34, 0x2C38, 0x2C3C, 105 0x2C40, 0x2C44, 0x2C48, 0x2C4C, 0x2C50, 0x2C54, 0x2C58, 0x2C5C, 106 0x2C60, 0x2C64, 0x2C68, 0x2C6C, 107}; 108 109/* 110 * Software Reset Clearing Register offsets 111 */ 112 113static const u16 srstclr[] = { 114 0x940, 0x944, 0x948, 0x94C, 0x950, 0x954, 0x958, 0x95C, 115 0x960, 0x964, 0x968, 0x96C, 116}; 117 118static const u16 srstclr_for_gen4[] = { 119 0x2C80, 0x2C84, 0x2C88, 0x2C8C, 0x2C90, 0x2C94, 0x2C98, 0x2C9C, 120 0x2CA0, 0x2CA4, 0x2CA8, 0x2CAC, 0x2CB0, 0x2CB4, 0x2CB8, 0x2CBC, 121 0x2CC0, 0x2CC4, 0x2CC8, 0x2CCC, 0x2CD0, 0x2CD4, 0x2CD8, 0x2CDC, 122 0x2CE0, 0x2CE4, 0x2CE8, 0x2CEC, 123}; 124 125/** 126 * struct cpg_mssr_priv - Clock Pulse Generator / Module Standby 127 * and Software Reset Private Data 128 * 129 * @rcdev: Optional reset controller entity 130 * @dev: CPG/MSSR device 131 * @base: CPG/MSSR register block base address 132 * @reg_layout: CPG/MSSR register layout 133 * @rmw_lock: protects RMW register accesses 134 * @np: Device node in DT for this CPG/MSSR module 135 * @num_core_clks: Number of Core Clocks in clks[] 136 * @num_mod_clks: Number of Module Clocks in clks[] 137 * @last_dt_core_clk: ID of the last Core Clock exported to DT 138 * @notifiers: Notifier chain to save/restore clock state for system resume 139 * @status_regs: Pointer to status registers array 140 * @control_regs: Pointer to control registers array 141 * @reset_regs: Pointer to reset registers array 142 * @reset_clear_regs: Pointer to reset clearing registers array 143 * @smstpcr_saved: [].mask: Mask of SMSTPCR[] bits under our control 144 * [].val: Saved values of SMSTPCR[] 145 * @clks: Array containing all Core and Module Clocks 146 */ 147struct cpg_mssr_priv { 148#ifdef CONFIG_RESET_CONTROLLER 149 struct reset_controller_dev rcdev; 150#endif 151 struct device *dev; 152 void __iomem *base; 153 enum clk_reg_layout reg_layout; 154 spinlock_t rmw_lock; 155 struct device_node *np; 156 157 unsigned int num_core_clks; 158 unsigned int num_mod_clks; 159 unsigned int last_dt_core_clk; 160 161 struct raw_notifier_head notifiers; 162 const u16 *status_regs; 163 const u16 *control_regs; 164 const u16 *reset_regs; 165 const u16 *reset_clear_regs; 166 struct { 167 u32 mask; 168 u32 val; 169 } smstpcr_saved[ARRAY_SIZE(mstpsr_for_gen4)]; 170 171 struct clk *clks[]; 172}; 173 174static struct cpg_mssr_priv *cpg_mssr_priv; 175 176/** 177 * struct mstp_clock - MSTP gating clock 178 * @hw: handle between common and hardware-specific interfaces 179 * @index: MSTP clock number 180 * @priv: CPG/MSSR private data 181 */ 182struct mstp_clock { 183 struct clk_hw hw; 184 u32 index; 185 struct cpg_mssr_priv *priv; 186}; 187 188#define to_mstp_clock(_hw) container_of(_hw, struct mstp_clock, hw) 189 190static int cpg_mstp_clock_endisable(struct clk_hw *hw, bool enable) 191{ 192 struct mstp_clock *clock = to_mstp_clock(hw); 193 struct cpg_mssr_priv *priv = clock->priv; 194 unsigned int reg = clock->index / 32; 195 unsigned int bit = clock->index % 32; 196 struct device *dev = priv->dev; 197 u32 bitmask = BIT(bit); 198 unsigned long flags; 199 unsigned int i; 200 u32 value; 201 202 dev_dbg(dev, "MSTP %u%02u/%pC %s\n", reg, bit, hw->clk, 203 enable ? "ON" : "OFF"); 204 spin_lock_irqsave(&priv->rmw_lock, flags); 205 206 if (priv->reg_layout == CLK_REG_LAYOUT_RZ_A) { 207 value = readb(priv->base + priv->control_regs[reg]); 208 if (enable) 209 value &= ~bitmask; 210 else 211 value |= bitmask; 212 writeb(value, priv->base + priv->control_regs[reg]); 213 214 /* dummy read to ensure write has completed */ 215 readb(priv->base + priv->control_regs[reg]); 216 barrier_data(priv->base + priv->control_regs[reg]); 217 } else { 218 value = readl(priv->base + priv->control_regs[reg]); 219 if (enable) 220 value &= ~bitmask; 221 else 222 value |= bitmask; 223 writel(value, priv->base + priv->control_regs[reg]); 224 } 225 226 spin_unlock_irqrestore(&priv->rmw_lock, flags); 227 228 if (!enable || priv->reg_layout == CLK_REG_LAYOUT_RZ_A) 229 return 0; 230 231 for (i = 1000; i > 0; --i) { 232 if (!(readl(priv->base + priv->status_regs[reg]) & bitmask)) 233 break; 234 cpu_relax(); 235 } 236 237 if (!i) { 238 dev_err(dev, "Failed to enable SMSTP %p[%d]\n", 239 priv->base + priv->control_regs[reg], bit); 240 return -ETIMEDOUT; 241 } 242 243 return 0; 244} 245 246static int cpg_mstp_clock_enable(struct clk_hw *hw) 247{ 248 return cpg_mstp_clock_endisable(hw, true); 249} 250 251static void cpg_mstp_clock_disable(struct clk_hw *hw) 252{ 253 cpg_mstp_clock_endisable(hw, false); 254} 255 256static int cpg_mstp_clock_is_enabled(struct clk_hw *hw) 257{ 258 struct mstp_clock *clock = to_mstp_clock(hw); 259 struct cpg_mssr_priv *priv = clock->priv; 260 u32 value; 261 262 if (priv->reg_layout == CLK_REG_LAYOUT_RZ_A) 263 value = readb(priv->base + priv->control_regs[clock->index / 32]); 264 else 265 value = readl(priv->base + priv->status_regs[clock->index / 32]); 266 267 return !(value & BIT(clock->index % 32)); 268} 269 270static const struct clk_ops cpg_mstp_clock_ops = { 271 .enable = cpg_mstp_clock_enable, 272 .disable = cpg_mstp_clock_disable, 273 .is_enabled = cpg_mstp_clock_is_enabled, 274}; 275 276static 277struct clk *cpg_mssr_clk_src_twocell_get(struct of_phandle_args *clkspec, 278 void *data) 279{ 280 unsigned int clkidx = clkspec->args[1]; 281 struct cpg_mssr_priv *priv = data; 282 struct device *dev = priv->dev; 283 unsigned int idx; 284 const char *type; 285 struct clk *clk; 286 int range_check; 287 288 switch (clkspec->args[0]) { 289 case CPG_CORE: 290 type = "core"; 291 if (clkidx > priv->last_dt_core_clk) { 292 dev_err(dev, "Invalid %s clock index %u\n", type, 293 clkidx); 294 return ERR_PTR(-EINVAL); 295 } 296 clk = priv->clks[clkidx]; 297 break; 298 299 case CPG_MOD: 300 type = "module"; 301 if (priv->reg_layout == CLK_REG_LAYOUT_RZ_A) { 302 idx = MOD_CLK_PACK_10(clkidx); 303 range_check = 7 - (clkidx % 10); 304 } else { 305 idx = MOD_CLK_PACK(clkidx); 306 range_check = 31 - (clkidx % 100); 307 } 308 if (range_check < 0 || idx >= priv->num_mod_clks) { 309 dev_err(dev, "Invalid %s clock index %u\n", type, 310 clkidx); 311 return ERR_PTR(-EINVAL); 312 } 313 clk = priv->clks[priv->num_core_clks + idx]; 314 break; 315 316 default: 317 dev_err(dev, "Invalid CPG clock type %u\n", clkspec->args[0]); 318 return ERR_PTR(-EINVAL); 319 } 320 321 if (IS_ERR(clk)) 322 dev_err(dev, "Cannot get %s clock %u: %ld", type, clkidx, 323 PTR_ERR(clk)); 324 else 325 dev_dbg(dev, "clock (%u, %u) is %pC at %lu Hz\n", 326 clkspec->args[0], clkspec->args[1], clk, 327 clk_get_rate(clk)); 328 return clk; 329} 330 331static void __init cpg_mssr_register_core_clk(const struct cpg_core_clk *core, 332 const struct cpg_mssr_info *info, 333 struct cpg_mssr_priv *priv) 334{ 335 struct clk *clk = ERR_PTR(-ENOTSUPP), *parent; 336 struct device *dev = priv->dev; 337 unsigned int id = core->id, div = core->div; 338 const char *parent_name; 339 340 WARN_DEBUG(id >= priv->num_core_clks); 341 WARN_DEBUG(PTR_ERR(priv->clks[id]) != -ENOENT); 342 343 if (!core->name) { 344 /* Skip NULLified clock */ 345 return; 346 } 347 348 switch (core->type) { 349 case CLK_TYPE_IN: 350 clk = of_clk_get_by_name(priv->np, core->name); 351 break; 352 353 case CLK_TYPE_FF: 354 case CLK_TYPE_DIV6P1: 355 case CLK_TYPE_DIV6_RO: 356 WARN_DEBUG(core->parent >= priv->num_core_clks); 357 parent = priv->clks[core->parent]; 358 if (IS_ERR(parent)) { 359 clk = parent; 360 goto fail; 361 } 362 363 parent_name = __clk_get_name(parent); 364 365 if (core->type == CLK_TYPE_DIV6_RO) 366 /* Multiply with the DIV6 register value */ 367 div *= (readl(priv->base + core->offset) & 0x3f) + 1; 368 369 if (core->type == CLK_TYPE_DIV6P1) { 370 clk = cpg_div6_register(core->name, 1, &parent_name, 371 priv->base + core->offset, 372 &priv->notifiers); 373 } else { 374 clk = clk_register_fixed_factor(NULL, core->name, 375 parent_name, 0, 376 core->mult, div); 377 } 378 break; 379 380 case CLK_TYPE_FR: 381 clk = clk_register_fixed_rate(NULL, core->name, NULL, 0, 382 core->mult); 383 break; 384 385 default: 386 if (info->cpg_clk_register) 387 clk = info->cpg_clk_register(dev, core, info, 388 priv->clks, priv->base, 389 &priv->notifiers); 390 else 391 dev_err(dev, "%s has unsupported core clock type %u\n", 392 core->name, core->type); 393 break; 394 } 395 396 if (IS_ERR_OR_NULL(clk)) 397 goto fail; 398 399 dev_dbg(dev, "Core clock %pC at %lu Hz\n", clk, clk_get_rate(clk)); 400 priv->clks[id] = clk; 401 return; 402 403fail: 404 dev_err(dev, "Failed to register %s clock %s: %ld\n", "core", 405 core->name, PTR_ERR(clk)); 406} 407 408static void __init cpg_mssr_register_mod_clk(const struct mssr_mod_clk *mod, 409 const struct cpg_mssr_info *info, 410 struct cpg_mssr_priv *priv) 411{ 412 struct mstp_clock *clock = NULL; 413 struct device *dev = priv->dev; 414 unsigned int id = mod->id; 415 struct clk_init_data init = {}; 416 struct clk *parent, *clk; 417 const char *parent_name; 418 unsigned int i; 419 420 WARN_DEBUG(id < priv->num_core_clks); 421 WARN_DEBUG(id >= priv->num_core_clks + priv->num_mod_clks); 422 WARN_DEBUG(mod->parent >= priv->num_core_clks + priv->num_mod_clks); 423 WARN_DEBUG(PTR_ERR(priv->clks[id]) != -ENOENT); 424 425 if (!mod->name) { 426 /* Skip NULLified clock */ 427 return; 428 } 429 430 parent = priv->clks[mod->parent]; 431 if (IS_ERR(parent)) { 432 clk = parent; 433 goto fail; 434 } 435 436 clock = kzalloc(sizeof(*clock), GFP_KERNEL); 437 if (!clock) { 438 clk = ERR_PTR(-ENOMEM); 439 goto fail; 440 } 441 442 init.name = mod->name; 443 init.ops = &cpg_mstp_clock_ops; 444 init.flags = CLK_SET_RATE_PARENT; 445 parent_name = __clk_get_name(parent); 446 init.parent_names = &parent_name; 447 init.num_parents = 1; 448 449 clock->index = id - priv->num_core_clks; 450 clock->priv = priv; 451 clock->hw.init = &init; 452 453 for (i = 0; i < info->num_crit_mod_clks; i++) 454 if (id == info->crit_mod_clks[i] && 455 cpg_mstp_clock_is_enabled(&clock->hw)) { 456 dev_dbg(dev, "MSTP %s setting CLK_IS_CRITICAL\n", 457 mod->name); 458 init.flags |= CLK_IS_CRITICAL; 459 break; 460 } 461 462 clk = clk_register(NULL, &clock->hw); 463 if (IS_ERR(clk)) 464 goto fail; 465 466 dev_dbg(dev, "Module clock %pC at %lu Hz\n", clk, clk_get_rate(clk)); 467 priv->clks[id] = clk; 468 priv->smstpcr_saved[clock->index / 32].mask |= BIT(clock->index % 32); 469 return; 470 471fail: 472 dev_err(dev, "Failed to register %s clock %s: %ld\n", "module", 473 mod->name, PTR_ERR(clk)); 474 kfree(clock); 475} 476 477struct cpg_mssr_clk_domain { 478 struct generic_pm_domain genpd; 479 unsigned int num_core_pm_clks; 480 unsigned int core_pm_clks[]; 481}; 482 483static struct cpg_mssr_clk_domain *cpg_mssr_clk_domain; 484 485static bool cpg_mssr_is_pm_clk(const struct of_phandle_args *clkspec, 486 struct cpg_mssr_clk_domain *pd) 487{ 488 unsigned int i; 489 490 if (clkspec->np != pd->genpd.dev.of_node || clkspec->args_count != 2) 491 return false; 492 493 switch (clkspec->args[0]) { 494 case CPG_CORE: 495 for (i = 0; i < pd->num_core_pm_clks; i++) 496 if (clkspec->args[1] == pd->core_pm_clks[i]) 497 return true; 498 return false; 499 500 case CPG_MOD: 501 return true; 502 503 default: 504 return false; 505 } 506} 507 508int cpg_mssr_attach_dev(struct generic_pm_domain *unused, struct device *dev) 509{ 510 struct cpg_mssr_clk_domain *pd = cpg_mssr_clk_domain; 511 struct device_node *np = dev->of_node; 512 struct of_phandle_args clkspec; 513 struct clk *clk; 514 int i = 0; 515 int error; 516 517 if (!pd) { 518 dev_dbg(dev, "CPG/MSSR clock domain not yet available\n"); 519 return -EPROBE_DEFER; 520 } 521 522 while (!of_parse_phandle_with_args(np, "clocks", "#clock-cells", i, 523 &clkspec)) { 524 if (cpg_mssr_is_pm_clk(&clkspec, pd)) 525 goto found; 526 527 of_node_put(clkspec.np); 528 i++; 529 } 530 531 return 0; 532 533found: 534 clk = of_clk_get_from_provider(&clkspec); 535 of_node_put(clkspec.np); 536 537 if (IS_ERR(clk)) 538 return PTR_ERR(clk); 539 540 error = pm_clk_create(dev); 541 if (error) 542 goto fail_put; 543 544 error = pm_clk_add_clk(dev, clk); 545 if (error) 546 goto fail_destroy; 547 548 return 0; 549 550fail_destroy: 551 pm_clk_destroy(dev); 552fail_put: 553 clk_put(clk); 554 return error; 555} 556 557void cpg_mssr_detach_dev(struct generic_pm_domain *unused, struct device *dev) 558{ 559 if (!pm_clk_no_clocks(dev)) 560 pm_clk_destroy(dev); 561} 562 563static void cpg_mssr_genpd_remove(void *data) 564{ 565 pm_genpd_remove(data); 566} 567 568static int __init cpg_mssr_add_clk_domain(struct device *dev, 569 const unsigned int *core_pm_clks, 570 unsigned int num_core_pm_clks) 571{ 572 struct device_node *np = dev->of_node; 573 struct generic_pm_domain *genpd; 574 struct cpg_mssr_clk_domain *pd; 575 size_t pm_size = num_core_pm_clks * sizeof(core_pm_clks[0]); 576 int ret; 577 578 pd = devm_kzalloc(dev, sizeof(*pd) + pm_size, GFP_KERNEL); 579 if (!pd) 580 return -ENOMEM; 581 582 pd->num_core_pm_clks = num_core_pm_clks; 583 memcpy(pd->core_pm_clks, core_pm_clks, pm_size); 584 585 genpd = &pd->genpd; 586 genpd->name = np->name; 587 genpd->flags = GENPD_FLAG_PM_CLK | GENPD_FLAG_ALWAYS_ON | 588 GENPD_FLAG_ACTIVE_WAKEUP; 589 genpd->attach_dev = cpg_mssr_attach_dev; 590 genpd->detach_dev = cpg_mssr_detach_dev; 591 ret = pm_genpd_init(genpd, &pm_domain_always_on_gov, false); 592 if (ret) 593 return ret; 594 595 ret = devm_add_action_or_reset(dev, cpg_mssr_genpd_remove, genpd); 596 if (ret) 597 return ret; 598 599 cpg_mssr_clk_domain = pd; 600 601 return of_genpd_add_provider_simple(np, genpd); 602} 603 604#ifdef CONFIG_RESET_CONTROLLER 605 606#define rcdev_to_priv(x) container_of(x, struct cpg_mssr_priv, rcdev) 607 608static int cpg_mssr_reset(struct reset_controller_dev *rcdev, 609 unsigned long id) 610{ 611 struct cpg_mssr_priv *priv = rcdev_to_priv(rcdev); 612 unsigned int reg = id / 32; 613 unsigned int bit = id % 32; 614 u32 bitmask = BIT(bit); 615 616 dev_dbg(priv->dev, "reset %u%02u\n", reg, bit); 617 618 /* Reset module */ 619 writel(bitmask, priv->base + priv->reset_regs[reg]); 620 621 /* Wait for at least one cycle of the RCLK clock (@ ca. 32 kHz) */ 622 udelay(35); 623 624 /* Release module from reset state */ 625 writel(bitmask, priv->base + priv->reset_clear_regs[reg]); 626 627 return 0; 628} 629 630static int cpg_mssr_assert(struct reset_controller_dev *rcdev, unsigned long id) 631{ 632 struct cpg_mssr_priv *priv = rcdev_to_priv(rcdev); 633 unsigned int reg = id / 32; 634 unsigned int bit = id % 32; 635 u32 bitmask = BIT(bit); 636 637 dev_dbg(priv->dev, "assert %u%02u\n", reg, bit); 638 639 writel(bitmask, priv->base + priv->reset_regs[reg]); 640 return 0; 641} 642 643static int cpg_mssr_deassert(struct reset_controller_dev *rcdev, 644 unsigned long id) 645{ 646 struct cpg_mssr_priv *priv = rcdev_to_priv(rcdev); 647 unsigned int reg = id / 32; 648 unsigned int bit = id % 32; 649 u32 bitmask = BIT(bit); 650 651 dev_dbg(priv->dev, "deassert %u%02u\n", reg, bit); 652 653 writel(bitmask, priv->base + priv->reset_clear_regs[reg]); 654 return 0; 655} 656 657static int cpg_mssr_status(struct reset_controller_dev *rcdev, 658 unsigned long id) 659{ 660 struct cpg_mssr_priv *priv = rcdev_to_priv(rcdev); 661 unsigned int reg = id / 32; 662 unsigned int bit = id % 32; 663 u32 bitmask = BIT(bit); 664 665 return !!(readl(priv->base + priv->reset_regs[reg]) & bitmask); 666} 667 668static const struct reset_control_ops cpg_mssr_reset_ops = { 669 .reset = cpg_mssr_reset, 670 .assert = cpg_mssr_assert, 671 .deassert = cpg_mssr_deassert, 672 .status = cpg_mssr_status, 673}; 674 675static int cpg_mssr_reset_xlate(struct reset_controller_dev *rcdev, 676 const struct of_phandle_args *reset_spec) 677{ 678 struct cpg_mssr_priv *priv = rcdev_to_priv(rcdev); 679 unsigned int unpacked = reset_spec->args[0]; 680 unsigned int idx = MOD_CLK_PACK(unpacked); 681 682 if (unpacked % 100 > 31 || idx >= rcdev->nr_resets) { 683 dev_err(priv->dev, "Invalid reset index %u\n", unpacked); 684 return -EINVAL; 685 } 686 687 return idx; 688} 689 690static int cpg_mssr_reset_controller_register(struct cpg_mssr_priv *priv) 691{ 692 priv->rcdev.ops = &cpg_mssr_reset_ops; 693 priv->rcdev.of_node = priv->dev->of_node; 694 priv->rcdev.of_reset_n_cells = 1; 695 priv->rcdev.of_xlate = cpg_mssr_reset_xlate; 696 priv->rcdev.nr_resets = priv->num_mod_clks; 697 return devm_reset_controller_register(priv->dev, &priv->rcdev); 698} 699 700#else /* !CONFIG_RESET_CONTROLLER */ 701static inline int cpg_mssr_reset_controller_register(struct cpg_mssr_priv *priv) 702{ 703 return 0; 704} 705#endif /* !CONFIG_RESET_CONTROLLER */ 706 707 708static const struct of_device_id cpg_mssr_match[] = { 709#ifdef CONFIG_CLK_R7S9210 710 { 711 .compatible = "renesas,r7s9210-cpg-mssr", 712 .data = &r7s9210_cpg_mssr_info, 713 }, 714#endif 715#ifdef CONFIG_CLK_R8A7742 716 { 717 .compatible = "renesas,r8a7742-cpg-mssr", 718 .data = &r8a7742_cpg_mssr_info, 719 }, 720#endif 721#ifdef CONFIG_CLK_R8A7743 722 { 723 .compatible = "renesas,r8a7743-cpg-mssr", 724 .data = &r8a7743_cpg_mssr_info, 725 }, 726 /* RZ/G1N is (almost) identical to RZ/G1M w.r.t. clocks. */ 727 { 728 .compatible = "renesas,r8a7744-cpg-mssr", 729 .data = &r8a7743_cpg_mssr_info, 730 }, 731#endif 732#ifdef CONFIG_CLK_R8A7745 733 { 734 .compatible = "renesas,r8a7745-cpg-mssr", 735 .data = &r8a7745_cpg_mssr_info, 736 }, 737#endif 738#ifdef CONFIG_CLK_R8A77470 739 { 740 .compatible = "renesas,r8a77470-cpg-mssr", 741 .data = &r8a77470_cpg_mssr_info, 742 }, 743#endif 744#ifdef CONFIG_CLK_R8A774A1 745 { 746 .compatible = "renesas,r8a774a1-cpg-mssr", 747 .data = &r8a774a1_cpg_mssr_info, 748 }, 749#endif 750#ifdef CONFIG_CLK_R8A774B1 751 { 752 .compatible = "renesas,r8a774b1-cpg-mssr", 753 .data = &r8a774b1_cpg_mssr_info, 754 }, 755#endif 756#ifdef CONFIG_CLK_R8A774C0 757 { 758 .compatible = "renesas,r8a774c0-cpg-mssr", 759 .data = &r8a774c0_cpg_mssr_info, 760 }, 761#endif 762#ifdef CONFIG_CLK_R8A774E1 763 { 764 .compatible = "renesas,r8a774e1-cpg-mssr", 765 .data = &r8a774e1_cpg_mssr_info, 766 }, 767#endif 768#ifdef CONFIG_CLK_R8A7790 769 { 770 .compatible = "renesas,r8a7790-cpg-mssr", 771 .data = &r8a7790_cpg_mssr_info, 772 }, 773#endif 774#ifdef CONFIG_CLK_R8A7791 775 { 776 .compatible = "renesas,r8a7791-cpg-mssr", 777 .data = &r8a7791_cpg_mssr_info, 778 }, 779 /* R-Car M2-N is (almost) identical to R-Car M2-W w.r.t. clocks. */ 780 { 781 .compatible = "renesas,r8a7793-cpg-mssr", 782 .data = &r8a7791_cpg_mssr_info, 783 }, 784#endif 785#ifdef CONFIG_CLK_R8A7792 786 { 787 .compatible = "renesas,r8a7792-cpg-mssr", 788 .data = &r8a7792_cpg_mssr_info, 789 }, 790#endif 791#ifdef CONFIG_CLK_R8A7794 792 { 793 .compatible = "renesas,r8a7794-cpg-mssr", 794 .data = &r8a7794_cpg_mssr_info, 795 }, 796#endif 797#ifdef CONFIG_CLK_R8A7795 798 { 799 .compatible = "renesas,r8a7795-cpg-mssr", 800 .data = &r8a7795_cpg_mssr_info, 801 }, 802#endif 803#ifdef CONFIG_CLK_R8A77960 804 { 805 .compatible = "renesas,r8a7796-cpg-mssr", 806 .data = &r8a7796_cpg_mssr_info, 807 }, 808#endif 809#ifdef CONFIG_CLK_R8A77961 810 { 811 .compatible = "renesas,r8a77961-cpg-mssr", 812 .data = &r8a7796_cpg_mssr_info, 813 }, 814#endif 815#ifdef CONFIG_CLK_R8A77965 816 { 817 .compatible = "renesas,r8a77965-cpg-mssr", 818 .data = &r8a77965_cpg_mssr_info, 819 }, 820#endif 821#ifdef CONFIG_CLK_R8A77970 822 { 823 .compatible = "renesas,r8a77970-cpg-mssr", 824 .data = &r8a77970_cpg_mssr_info, 825 }, 826#endif 827#ifdef CONFIG_CLK_R8A77980 828 { 829 .compatible = "renesas,r8a77980-cpg-mssr", 830 .data = &r8a77980_cpg_mssr_info, 831 }, 832#endif 833#ifdef CONFIG_CLK_R8A77990 834 { 835 .compatible = "renesas,r8a77990-cpg-mssr", 836 .data = &r8a77990_cpg_mssr_info, 837 }, 838#endif 839#ifdef CONFIG_CLK_R8A77995 840 { 841 .compatible = "renesas,r8a77995-cpg-mssr", 842 .data = &r8a77995_cpg_mssr_info, 843 }, 844#endif 845#ifdef CONFIG_CLK_R8A779A0 846 { 847 .compatible = "renesas,r8a779a0-cpg-mssr", 848 .data = &r8a779a0_cpg_mssr_info, 849 }, 850#endif 851#ifdef CONFIG_CLK_R8A779F0 852 { 853 .compatible = "renesas,r8a779f0-cpg-mssr", 854 .data = &r8a779f0_cpg_mssr_info, 855 }, 856#endif 857#ifdef CONFIG_CLK_R8A779G0 858 { 859 .compatible = "renesas,r8a779g0-cpg-mssr", 860 .data = &r8a779g0_cpg_mssr_info, 861 }, 862#endif 863 { /* sentinel */ } 864}; 865 866static void cpg_mssr_del_clk_provider(void *data) 867{ 868 of_clk_del_provider(data); 869} 870 871#if defined(CONFIG_PM_SLEEP) && defined(CONFIG_ARM_PSCI_FW) 872static int cpg_mssr_suspend_noirq(struct device *dev) 873{ 874 struct cpg_mssr_priv *priv = dev_get_drvdata(dev); 875 unsigned int reg; 876 877 /* This is the best we can do to check for the presence of PSCI */ 878 if (!psci_ops.cpu_suspend) 879 return 0; 880 881 /* Save module registers with bits under our control */ 882 for (reg = 0; reg < ARRAY_SIZE(priv->smstpcr_saved); reg++) { 883 if (priv->smstpcr_saved[reg].mask) 884 priv->smstpcr_saved[reg].val = 885 priv->reg_layout == CLK_REG_LAYOUT_RZ_A ? 886 readb(priv->base + priv->control_regs[reg]) : 887 readl(priv->base + priv->control_regs[reg]); 888 } 889 890 /* Save core clocks */ 891 raw_notifier_call_chain(&priv->notifiers, PM_EVENT_SUSPEND, NULL); 892 893 return 0; 894} 895 896static int cpg_mssr_resume_noirq(struct device *dev) 897{ 898 struct cpg_mssr_priv *priv = dev_get_drvdata(dev); 899 unsigned int reg, i; 900 u32 mask, oldval, newval; 901 902 /* This is the best we can do to check for the presence of PSCI */ 903 if (!psci_ops.cpu_suspend) 904 return 0; 905 906 /* Restore core clocks */ 907 raw_notifier_call_chain(&priv->notifiers, PM_EVENT_RESUME, NULL); 908 909 /* Restore module clocks */ 910 for (reg = 0; reg < ARRAY_SIZE(priv->smstpcr_saved); reg++) { 911 mask = priv->smstpcr_saved[reg].mask; 912 if (!mask) 913 continue; 914 915 if (priv->reg_layout == CLK_REG_LAYOUT_RZ_A) 916 oldval = readb(priv->base + priv->control_regs[reg]); 917 else 918 oldval = readl(priv->base + priv->control_regs[reg]); 919 newval = oldval & ~mask; 920 newval |= priv->smstpcr_saved[reg].val & mask; 921 if (newval == oldval) 922 continue; 923 924 if (priv->reg_layout == CLK_REG_LAYOUT_RZ_A) { 925 writeb(newval, priv->base + priv->control_regs[reg]); 926 /* dummy read to ensure write has completed */ 927 readb(priv->base + priv->control_regs[reg]); 928 barrier_data(priv->base + priv->control_regs[reg]); 929 continue; 930 } else 931 writel(newval, priv->base + priv->control_regs[reg]); 932 933 /* Wait until enabled clocks are really enabled */ 934 mask &= ~priv->smstpcr_saved[reg].val; 935 if (!mask) 936 continue; 937 938 for (i = 1000; i > 0; --i) { 939 oldval = readl(priv->base + priv->status_regs[reg]); 940 if (!(oldval & mask)) 941 break; 942 cpu_relax(); 943 } 944 945 if (!i) 946 dev_warn(dev, "Failed to enable %s%u[0x%x]\n", 947 priv->reg_layout == CLK_REG_LAYOUT_RZ_A ? 948 "STB" : "SMSTP", reg, oldval & mask); 949 } 950 951 return 0; 952} 953 954static const struct dev_pm_ops cpg_mssr_pm = { 955 SET_NOIRQ_SYSTEM_SLEEP_PM_OPS(cpg_mssr_suspend_noirq, 956 cpg_mssr_resume_noirq) 957}; 958#define DEV_PM_OPS &cpg_mssr_pm 959#else 960#define DEV_PM_OPS NULL 961#endif /* CONFIG_PM_SLEEP && CONFIG_ARM_PSCI_FW */ 962 963static int __init cpg_mssr_common_init(struct device *dev, 964 struct device_node *np, 965 const struct cpg_mssr_info *info) 966{ 967 struct cpg_mssr_priv *priv; 968 unsigned int nclks, i; 969 int error; 970 971 if (info->init) { 972 error = info->init(dev); 973 if (error) 974 return error; 975 } 976 977 nclks = info->num_total_core_clks + info->num_hw_mod_clks; 978 priv = kzalloc(struct_size(priv, clks, nclks), GFP_KERNEL); 979 if (!priv) 980 return -ENOMEM; 981 982 priv->np = np; 983 priv->dev = dev; 984 spin_lock_init(&priv->rmw_lock); 985 986 priv->base = of_iomap(np, 0); 987 if (!priv->base) { 988 error = -ENOMEM; 989 goto out_err; 990 } 991 992 cpg_mssr_priv = priv; 993 priv->num_core_clks = info->num_total_core_clks; 994 priv->num_mod_clks = info->num_hw_mod_clks; 995 priv->last_dt_core_clk = info->last_dt_core_clk; 996 RAW_INIT_NOTIFIER_HEAD(&priv->notifiers); 997 priv->reg_layout = info->reg_layout; 998 if (priv->reg_layout == CLK_REG_LAYOUT_RCAR_GEN2_AND_GEN3) { 999 priv->status_regs = mstpsr; 1000 priv->control_regs = smstpcr; 1001 priv->reset_regs = srcr; 1002 priv->reset_clear_regs = srstclr; 1003 } else if (priv->reg_layout == CLK_REG_LAYOUT_RZ_A) { 1004 priv->control_regs = stbcr; 1005 } else if (priv->reg_layout == CLK_REG_LAYOUT_RCAR_GEN4) { 1006 priv->status_regs = mstpsr_for_gen4; 1007 priv->control_regs = mstpcr_for_gen4; 1008 priv->reset_regs = srcr_for_gen4; 1009 priv->reset_clear_regs = srstclr_for_gen4; 1010 } else { 1011 error = -EINVAL; 1012 goto out_err; 1013 } 1014 1015 for (i = 0; i < nclks; i++) 1016 priv->clks[i] = ERR_PTR(-ENOENT); 1017 1018 error = of_clk_add_provider(np, cpg_mssr_clk_src_twocell_get, priv); 1019 if (error) 1020 goto out_err; 1021 1022 return 0; 1023 1024out_err: 1025 if (priv->base) 1026 iounmap(priv->base); 1027 kfree(priv); 1028 1029 return error; 1030} 1031 1032void __init cpg_mssr_early_init(struct device_node *np, 1033 const struct cpg_mssr_info *info) 1034{ 1035 int error; 1036 int i; 1037 1038 error = cpg_mssr_common_init(NULL, np, info); 1039 if (error) 1040 return; 1041 1042 for (i = 0; i < info->num_early_core_clks; i++) 1043 cpg_mssr_register_core_clk(&info->early_core_clks[i], info, 1044 cpg_mssr_priv); 1045 1046 for (i = 0; i < info->num_early_mod_clks; i++) 1047 cpg_mssr_register_mod_clk(&info->early_mod_clks[i], info, 1048 cpg_mssr_priv); 1049 1050} 1051 1052static int __init cpg_mssr_probe(struct platform_device *pdev) 1053{ 1054 struct device *dev = &pdev->dev; 1055 struct device_node *np = dev->of_node; 1056 const struct cpg_mssr_info *info; 1057 struct cpg_mssr_priv *priv; 1058 unsigned int i; 1059 int error; 1060 1061 info = of_device_get_match_data(dev); 1062 1063 if (!cpg_mssr_priv) { 1064 error = cpg_mssr_common_init(dev, dev->of_node, info); 1065 if (error) 1066 return error; 1067 } 1068 1069 priv = cpg_mssr_priv; 1070 priv->dev = dev; 1071 dev_set_drvdata(dev, priv); 1072 1073 for (i = 0; i < info->num_core_clks; i++) 1074 cpg_mssr_register_core_clk(&info->core_clks[i], info, priv); 1075 1076 for (i = 0; i < info->num_mod_clks; i++) 1077 cpg_mssr_register_mod_clk(&info->mod_clks[i], info, priv); 1078 1079 error = devm_add_action_or_reset(dev, 1080 cpg_mssr_del_clk_provider, 1081 np); 1082 if (error) 1083 return error; 1084 1085 error = cpg_mssr_add_clk_domain(dev, info->core_pm_clks, 1086 info->num_core_pm_clks); 1087 if (error) 1088 return error; 1089 1090 /* Reset Controller not supported for Standby Control SoCs */ 1091 if (priv->reg_layout == CLK_REG_LAYOUT_RZ_A) 1092 return 0; 1093 1094 error = cpg_mssr_reset_controller_register(priv); 1095 if (error) 1096 return error; 1097 1098 return 0; 1099} 1100 1101static struct platform_driver cpg_mssr_driver = { 1102 .driver = { 1103 .name = "renesas-cpg-mssr", 1104 .of_match_table = cpg_mssr_match, 1105 .pm = DEV_PM_OPS, 1106 }, 1107}; 1108 1109static int __init cpg_mssr_init(void) 1110{ 1111 return platform_driver_probe(&cpg_mssr_driver, cpg_mssr_probe); 1112} 1113 1114subsys_initcall(cpg_mssr_init); 1115 1116void __init cpg_core_nullify_range(struct cpg_core_clk *core_clks, 1117 unsigned int num_core_clks, 1118 unsigned int first_clk, 1119 unsigned int last_clk) 1120{ 1121 unsigned int i; 1122 1123 for (i = 0; i < num_core_clks; i++) 1124 if (core_clks[i].id >= first_clk && 1125 core_clks[i].id <= last_clk) 1126 core_clks[i].name = NULL; 1127} 1128 1129void __init mssr_mod_nullify(struct mssr_mod_clk *mod_clks, 1130 unsigned int num_mod_clks, 1131 const unsigned int *clks, unsigned int n) 1132{ 1133 unsigned int i, j; 1134 1135 for (i = 0, j = 0; i < num_mod_clks && j < n; i++) 1136 if (mod_clks[i].id == clks[j]) { 1137 mod_clks[i].name = NULL; 1138 j++; 1139 } 1140} 1141 1142void __init mssr_mod_reparent(struct mssr_mod_clk *mod_clks, 1143 unsigned int num_mod_clks, 1144 const struct mssr_mod_reparent *clks, 1145 unsigned int n) 1146{ 1147 unsigned int i, j; 1148 1149 for (i = 0, j = 0; i < num_mod_clks && j < n; i++) 1150 if (mod_clks[i].id == clks[j].clk) { 1151 mod_clks[i].parent = clks[j].parent; 1152 j++; 1153 } 1154} 1155 1156MODULE_DESCRIPTION("Renesas CPG/MSSR Driver"); 1157MODULE_LICENSE("GPL v2");