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

Merge tag 'clk-renesas-for-v4.11-tag2' of git://git.kernel.org/pub/scm/linux/kernel/git/geert/renesas-drivers into clk-next

Pull Renesas clk driver updates from Geert Uytterhoeven:

- Use CLK_IS_CRITICAL to handle critical clocks,
- Add Reset Control Support for R-Car Gen2 and Gen3, and RZ/G1,
- Add IIC-DVFS clocks for R-Car H3 and M3-W,
- Minor cleanups.

* tag 'clk-renesas-for-v4.11-tag2' of git://git.kernel.org/pub/scm/linux/kernel/git/geert/renesas-drivers:
clk: renesas: r8a7796: Add IIC-DVFS clock
clk: renesas: r8a7795: Add IIC-DVFS clock
clk: renesas: cpg-mssr: Add support for reset control
clk: renesas: cpg-mssr: Rename cpg_mssr_priv.mstp_lock
clk: renesas: cpg-mssr: Document suitability for RZ/G1
dt-bindings: clock: renesas: cpg-mssr: Document reset control support
clk: renesas: mstp: Reformat cpg_mstp_clock_register() for git diff
clk: renesas: mstp: Make INTC-SYS a critical clock
clk: renesas: cpg-mssr: Migrate to CLK_IS_CRITICAL

+150 -18
+6
Documentation/devicetree/bindings/clock/renesas,cpg-mssr.txt
··· 42 42 Domain bindings in 43 43 Documentation/devicetree/bindings/power/power_domain.txt. 44 44 45 + - #reset-cells: Must be 1 46 + - The single reset specifier cell must be the module number, as defined 47 + in the datasheet. 48 + 45 49 46 50 Examples 47 51 -------- ··· 59 55 clock-names = "extal", "extalr"; 60 56 #clock-cells = <2>; 61 57 #power-domain-cells = <0>; 58 + #reset-cells = <1>; 62 59 }; 63 60 64 61 ··· 74 69 dmas = <&dmac1 0x13>, <&dmac1 0x12>; 75 70 dma-names = "tx", "rx"; 76 71 power-domains = <&cpg>; 72 + resets = <&cpg 310>; 77 73 status = "disabled"; 78 74 };
+8 -3
drivers/clk/renesas/clk-mstp.c
··· 141 141 .is_enabled = cpg_mstp_clock_is_enabled, 142 142 }; 143 143 144 - static struct clk * __init 145 - cpg_mstp_clock_register(const char *name, const char *parent_name, 146 - unsigned int index, struct mstp_clock_group *group) 144 + static struct clk * __init cpg_mstp_clock_register(const char *name, 145 + const char *parent_name, unsigned int index, 146 + struct mstp_clock_group *group) 147 147 { 148 148 struct clk_init_data init; 149 149 struct mstp_clock *clock; ··· 158 158 init.name = name; 159 159 init.ops = &cpg_mstp_clock_ops; 160 160 init.flags = CLK_IS_BASIC | CLK_SET_RATE_PARENT; 161 + /* INTC-SYS is the module clock of the GIC, and must not be disabled */ 162 + if (!strcmp(name, "intc-sys")) { 163 + pr_debug("MSTP %s setting CLK_IS_CRITICAL\n", name); 164 + init.flags |= CLK_IS_CRITICAL; 165 + } 161 166 init.parent_names = &parent_name; 162 167 init.num_parents = 1; 163 168
+1
drivers/clk/renesas/r8a7795-cpg-mssr.c
··· 221 221 DEF_MOD("can-if0", 916, R8A7795_CLK_S3D4), 222 222 DEF_MOD("i2c6", 918, R8A7795_CLK_S3D2), 223 223 DEF_MOD("i2c5", 919, R8A7795_CLK_S3D2), 224 + DEF_MOD("i2c-dvfs", 926, R8A7795_CLK_CP), 224 225 DEF_MOD("i2c4", 927, R8A7795_CLK_S3D2), 225 226 DEF_MOD("i2c3", 928, R8A7795_CLK_S3D2), 226 227 DEF_MOD("i2c2", 929, R8A7795_CLK_S3D2),
+1
drivers/clk/renesas/r8a7796-cpg-mssr.c
··· 192 192 DEF_MOD("can-if0", 916, R8A7796_CLK_S3D4), 193 193 DEF_MOD("i2c6", 918, R8A7796_CLK_S0D6), 194 194 DEF_MOD("i2c5", 919, R8A7796_CLK_S0D6), 195 + DEF_MOD("i2c-dvfs", 926, R8A7796_CLK_CP), 195 196 DEF_MOD("i2c4", 927, R8A7796_CLK_S0D6), 196 197 DEF_MOD("i2c3", 928, R8A7796_CLK_S0D6), 197 198 DEF_MOD("i2c2", 929, R8A7796_CLK_S3D2),
+134 -15
drivers/clk/renesas/renesas-cpg-mssr.c
··· 16 16 #include <linux/clk.h> 17 17 #include <linux/clk-provider.h> 18 18 #include <linux/clk/renesas.h> 19 + #include <linux/delay.h> 19 20 #include <linux/device.h> 20 21 #include <linux/init.h> 21 22 #include <linux/mod_devicetable.h> ··· 26 25 #include <linux/platform_device.h> 27 26 #include <linux/pm_clock.h> 28 27 #include <linux/pm_domain.h> 28 + #include <linux/reset-controller.h> 29 29 #include <linux/slab.h> 30 30 31 31 #include <dt-bindings/clock/renesas-cpg-mssr.h> ··· 45 43 * Module Standby and Software Reset register offets. 46 44 * 47 45 * If the registers exist, these are valid for SH-Mobile, R-Mobile, 48 - * R-Car Gen 2, and R-Car Gen 3. 46 + * R-Car Gen2, R-Car Gen3, and RZ/G1. 49 47 * These are NOT valid for R-Car Gen1 and RZ/A1! 50 48 */ 51 49 ··· 98 96 /** 99 97 * Clock Pulse Generator / Module Standby and Software Reset Private Data 100 98 * 99 + * @rcdev: Optional reset controller entity 101 100 * @dev: CPG/MSSR device 102 101 * @base: CPG/MSSR register block base address 103 - * @mstp_lock: protects writes to SMSTPCR 102 + * @rmw_lock: protects RMW register accesses 104 103 * @clks: Array containing all Core and Module Clocks 105 104 * @num_core_clks: Number of Core Clocks in clks[] 106 105 * @num_mod_clks: Number of Module Clocks in clks[] 107 106 * @last_dt_core_clk: ID of the last Core Clock exported to DT 108 107 */ 109 108 struct cpg_mssr_priv { 109 + #ifdef CONFIG_RESET_CONTROLLER 110 + struct reset_controller_dev rcdev; 111 + #endif 110 112 struct device *dev; 111 113 void __iomem *base; 112 - spinlock_t mstp_lock; 114 + spinlock_t rmw_lock; 113 115 114 116 struct clk **clks; 115 117 unsigned int num_core_clks; ··· 150 144 151 145 dev_dbg(dev, "MSTP %u%02u/%pC %s\n", reg, bit, hw->clk, 152 146 enable ? "ON" : "OFF"); 153 - spin_lock_irqsave(&priv->mstp_lock, flags); 147 + spin_lock_irqsave(&priv->rmw_lock, flags); 154 148 155 149 value = readl(priv->base + SMSTPCR(reg)); 156 150 if (enable) ··· 159 153 value |= bitmask; 160 154 writel(value, priv->base + SMSTPCR(reg)); 161 155 162 - spin_unlock_irqrestore(&priv->mstp_lock, flags); 156 + spin_unlock_irqrestore(&priv->rmw_lock, flags); 163 157 164 158 if (!enable) 165 159 return 0; ··· 352 346 init.flags = CLK_IS_BASIC | CLK_SET_RATE_PARENT; 353 347 for (i = 0; i < info->num_crit_mod_clks; i++) 354 348 if (id == info->crit_mod_clks[i]) { 355 - #ifdef CLK_ENABLE_HAND_OFF 356 - dev_dbg(dev, "MSTP %s setting CLK_ENABLE_HAND_OFF\n", 349 + dev_dbg(dev, "MSTP %s setting CLK_IS_CRITICAL\n", 357 350 mod->name); 358 - init.flags |= CLK_ENABLE_HAND_OFF; 351 + init.flags |= CLK_IS_CRITICAL; 359 352 break; 360 - #else 361 - dev_dbg(dev, "Ignoring MSTP %s to prevent disabling\n", 362 - mod->name); 363 - kfree(clock); 364 - return; 365 - #endif 366 353 } 367 354 368 355 parent_name = __clk_get_name(parent); ··· 500 501 return 0; 501 502 } 502 503 504 + #ifdef CONFIG_RESET_CONTROLLER 505 + 506 + #define rcdev_to_priv(x) container_of(x, struct cpg_mssr_priv, rcdev) 507 + 508 + static int cpg_mssr_reset(struct reset_controller_dev *rcdev, 509 + unsigned long id) 510 + { 511 + struct cpg_mssr_priv *priv = rcdev_to_priv(rcdev); 512 + unsigned int reg = id / 32; 513 + unsigned int bit = id % 32; 514 + u32 bitmask = BIT(bit); 515 + unsigned long flags; 516 + u32 value; 517 + 518 + dev_dbg(priv->dev, "reset %u%02u\n", reg, bit); 519 + 520 + /* Reset module */ 521 + spin_lock_irqsave(&priv->rmw_lock, flags); 522 + value = readl(priv->base + SRCR(reg)); 523 + value |= bitmask; 524 + writel(value, priv->base + SRCR(reg)); 525 + spin_unlock_irqrestore(&priv->rmw_lock, flags); 526 + 527 + /* Wait for at least one cycle of the RCLK clock (@ ca. 32 kHz) */ 528 + udelay(35); 529 + 530 + /* Release module from reset state */ 531 + writel(bitmask, priv->base + SRSTCLR(reg)); 532 + 533 + return 0; 534 + } 535 + 536 + static int cpg_mssr_assert(struct reset_controller_dev *rcdev, unsigned long id) 537 + { 538 + struct cpg_mssr_priv *priv = rcdev_to_priv(rcdev); 539 + unsigned int reg = id / 32; 540 + unsigned int bit = id % 32; 541 + u32 bitmask = BIT(bit); 542 + unsigned long flags; 543 + u32 value; 544 + 545 + dev_dbg(priv->dev, "assert %u%02u\n", reg, bit); 546 + 547 + spin_lock_irqsave(&priv->rmw_lock, flags); 548 + value = readl(priv->base + SRCR(reg)); 549 + value |= bitmask; 550 + writel(value, priv->base + SRCR(reg)); 551 + spin_unlock_irqrestore(&priv->rmw_lock, flags); 552 + return 0; 553 + } 554 + 555 + static int cpg_mssr_deassert(struct reset_controller_dev *rcdev, 556 + unsigned long id) 557 + { 558 + struct cpg_mssr_priv *priv = rcdev_to_priv(rcdev); 559 + unsigned int reg = id / 32; 560 + unsigned int bit = id % 32; 561 + u32 bitmask = BIT(bit); 562 + 563 + dev_dbg(priv->dev, "deassert %u%02u\n", reg, bit); 564 + 565 + writel(bitmask, priv->base + SRSTCLR(reg)); 566 + return 0; 567 + } 568 + 569 + static int cpg_mssr_status(struct reset_controller_dev *rcdev, 570 + unsigned long id) 571 + { 572 + struct cpg_mssr_priv *priv = rcdev_to_priv(rcdev); 573 + unsigned int reg = id / 32; 574 + unsigned int bit = id % 32; 575 + u32 bitmask = BIT(bit); 576 + 577 + return !!(readl(priv->base + SRCR(reg)) & bitmask); 578 + } 579 + 580 + static const struct reset_control_ops cpg_mssr_reset_ops = { 581 + .reset = cpg_mssr_reset, 582 + .assert = cpg_mssr_assert, 583 + .deassert = cpg_mssr_deassert, 584 + .status = cpg_mssr_status, 585 + }; 586 + 587 + static int cpg_mssr_reset_xlate(struct reset_controller_dev *rcdev, 588 + const struct of_phandle_args *reset_spec) 589 + { 590 + struct cpg_mssr_priv *priv = rcdev_to_priv(rcdev); 591 + unsigned int unpacked = reset_spec->args[0]; 592 + unsigned int idx = MOD_CLK_PACK(unpacked); 593 + 594 + if (unpacked % 100 > 31 || idx >= rcdev->nr_resets) { 595 + dev_err(priv->dev, "Invalid reset index %u\n", unpacked); 596 + return -EINVAL; 597 + } 598 + 599 + return idx; 600 + } 601 + 602 + static int cpg_mssr_reset_controller_register(struct cpg_mssr_priv *priv) 603 + { 604 + priv->rcdev.ops = &cpg_mssr_reset_ops; 605 + priv->rcdev.of_node = priv->dev->of_node; 606 + priv->rcdev.of_reset_n_cells = 1; 607 + priv->rcdev.of_xlate = cpg_mssr_reset_xlate; 608 + priv->rcdev.nr_resets = priv->num_mod_clks; 609 + return devm_reset_controller_register(priv->dev, &priv->rcdev); 610 + } 611 + 612 + #else /* !CONFIG_RESET_CONTROLLER */ 613 + static inline int cpg_mssr_reset_controller_register(struct cpg_mssr_priv *priv) 614 + { 615 + return 0; 616 + } 617 + #endif /* !CONFIG_RESET_CONTROLLER */ 618 + 619 + 503 620 static const struct of_device_id cpg_mssr_match[] = { 504 621 #ifdef CONFIG_ARCH_R8A7743 505 622 { ··· 672 557 return -ENOMEM; 673 558 674 559 priv->dev = dev; 675 - spin_lock_init(&priv->mstp_lock); 560 + spin_lock_init(&priv->rmw_lock); 676 561 677 562 res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 678 563 priv->base = devm_ioremap_resource(dev, res); ··· 710 595 711 596 error = cpg_mssr_add_clk_domain(dev, info->core_pm_clks, 712 597 info->num_core_pm_clks); 598 + if (error) 599 + return error; 600 + 601 + error = cpg_mssr_reset_controller_register(priv); 713 602 if (error) 714 603 return error; 715 604