1 // SPDX-License-Identifier: GPL-2.0
3 * Renesas Clock Pulse Generator / Module Standby and Software Reset
5 * Copyright (C) 2015 Glider bvba
7 * Based on clk-mstp.c, clk-rcar-gen2.c, and clk-rcar-gen3.c
9 * Copyright (C) 2013 Ideas On Board SPRL
10 * Copyright (C) 2015 Renesas Electronics Corp.
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>
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>
31 #include <dt-bindings/clock/renesas-cpg-mssr.h>
33 #include "renesas-cpg-mssr.h"
37 #define WARN_DEBUG(x) WARN_ON(x)
39 #define WARN_DEBUG(x) do { } while (0)
44 * Module Standby and Software Reset register offets.
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!
52 * Module Stop Status Register offsets
55 static const u16 mstpsr[] = {
56 0x030, 0x038, 0x040, 0x048, 0x04C, 0x03C, 0x1C0, 0x1C4,
57 0x9A0, 0x9A4, 0x9A8, 0x9AC,
60 static 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,
68 * System Module Stop Control Register offsets
71 static const u16 smstpcr[] = {
72 0x130, 0x134, 0x138, 0x13C, 0x140, 0x144, 0x148, 0x14C,
73 0x990, 0x994, 0x998, 0x99C,
76 static 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,
84 * Standby Control Register offsets (RZ/A)
85 * Base address is FRQCR register
88 static const u16 stbcr[] = {
89 0xFFFF/*dummy*/, 0x010, 0x014, 0x410, 0x414, 0x418, 0x41C, 0x420,
94 * Software Reset Register offsets
97 static const u16 srcr[] = {
98 0x0A0, 0x0A8, 0x0B0, 0x0B8, 0x0BC, 0x0C4, 0x1C8, 0x1CC,
99 0x920, 0x924, 0x928, 0x92C,
102 static 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,
110 * Software Reset Clearing Register offsets
113 static const u16 srstclr[] = {
114 0x940, 0x944, 0x948, 0x94C, 0x950, 0x954, 0x958, 0x95C,
115 0x960, 0x964, 0x968, 0x96C,
118 static 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,
126 * struct cpg_mssr_priv - Clock Pulse Generator / Module Standby
127 * and Software Reset Private Data
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
147 struct cpg_mssr_priv {
148 #ifdef CONFIG_RESET_CONTROLLER
149 struct reset_controller_dev rcdev;
153 enum clk_reg_layout reg_layout;
155 struct device_node *np;
157 unsigned int num_core_clks;
158 unsigned int num_mod_clks;
159 unsigned int last_dt_core_clk;
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;
169 } smstpcr_saved[ARRAY_SIZE(mstpsr_for_gen4)];
174 static struct cpg_mssr_priv *cpg_mssr_priv;
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
185 struct cpg_mssr_priv *priv;
188 #define to_mstp_clock(_hw) container_of(_hw, struct mstp_clock, hw)
190 static int cpg_mstp_clock_endisable(struct clk_hw *hw, bool enable)
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);
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);
206 if (priv->reg_layout == CLK_REG_LAYOUT_RZ_A) {
207 value = readb(priv->base + priv->control_regs[reg]);
212 writeb(value, priv->base + priv->control_regs[reg]);
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]);
218 value = readl(priv->base + priv->control_regs[reg]);
223 writel(value, priv->base + priv->control_regs[reg]);
226 spin_unlock_irqrestore(&priv->rmw_lock, flags);
228 if (!enable || priv->reg_layout == CLK_REG_LAYOUT_RZ_A)
231 for (i = 1000; i > 0; --i) {
232 if (!(readl(priv->base + priv->status_regs[reg]) & bitmask))
238 dev_err(dev, "Failed to enable SMSTP %p[%d]\n",
239 priv->base + priv->control_regs[reg], bit);
246 static int cpg_mstp_clock_enable(struct clk_hw *hw)
248 return cpg_mstp_clock_endisable(hw, true);
251 static void cpg_mstp_clock_disable(struct clk_hw *hw)
253 cpg_mstp_clock_endisable(hw, false);
256 static int cpg_mstp_clock_is_enabled(struct clk_hw *hw)
258 struct mstp_clock *clock = to_mstp_clock(hw);
259 struct cpg_mssr_priv *priv = clock->priv;
262 if (priv->reg_layout == CLK_REG_LAYOUT_RZ_A)
263 value = readb(priv->base + priv->control_regs[clock->index / 32]);
265 value = readl(priv->base + priv->status_regs[clock->index / 32]);
267 return !(value & BIT(clock->index % 32));
270 static 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,
277 struct clk *cpg_mssr_clk_src_twocell_get(struct of_phandle_args *clkspec,
280 unsigned int clkidx = clkspec->args[1];
281 struct cpg_mssr_priv *priv = data;
282 struct device *dev = priv->dev;
288 switch (clkspec->args[0]) {
291 if (clkidx > priv->last_dt_core_clk) {
292 dev_err(dev, "Invalid %s clock index %u\n", type,
294 return ERR_PTR(-EINVAL);
296 clk = priv->clks[clkidx];
301 if (priv->reg_layout == CLK_REG_LAYOUT_RZ_A) {
302 idx = MOD_CLK_PACK_10(clkidx);
303 range_check = 7 - (clkidx % 10);
305 idx = MOD_CLK_PACK(clkidx);
306 range_check = 31 - (clkidx % 100);
308 if (range_check < 0 || idx >= priv->num_mod_clks) {
309 dev_err(dev, "Invalid %s clock index %u\n", type,
311 return ERR_PTR(-EINVAL);
313 clk = priv->clks[priv->num_core_clks + idx];
317 dev_err(dev, "Invalid CPG clock type %u\n", clkspec->args[0]);
318 return ERR_PTR(-EINVAL);
322 dev_err(dev, "Cannot get %s clock %u: %ld", type, clkidx,
325 dev_dbg(dev, "clock (%u, %u) is %pC at %lu Hz\n",
326 clkspec->args[0], clkspec->args[1], clk,
331 static 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)
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;
340 WARN_DEBUG(id >= priv->num_core_clks);
341 WARN_DEBUG(PTR_ERR(priv->clks[id]) != -ENOENT);
344 /* Skip NULLified clock */
348 switch (core->type) {
350 clk = of_clk_get_by_name(priv->np, core->name);
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)) {
363 parent_name = __clk_get_name(parent);
365 if (core->type == CLK_TYPE_DIV6_RO)
366 /* Multiply with the DIV6 register value */
367 div *= (readl(priv->base + core->offset) & 0x3f) + 1;
369 if (core->type == CLK_TYPE_DIV6P1) {
370 clk = cpg_div6_register(core->name, 1, &parent_name,
371 priv->base + core->offset,
374 clk = clk_register_fixed_factor(NULL, core->name,
381 clk = clk_register_fixed_rate(NULL, core->name, NULL, 0,
386 if (info->cpg_clk_register)
387 clk = info->cpg_clk_register(dev, core, info,
388 priv->clks, priv->base,
391 dev_err(dev, "%s has unsupported core clock type %u\n",
392 core->name, core->type);
396 if (IS_ERR_OR_NULL(clk))
399 dev_dbg(dev, "Core clock %pC at %lu Hz\n", clk, clk_get_rate(clk));
400 priv->clks[id] = clk;
404 dev_err(dev, "Failed to register %s clock %s: %ld\n", "core",
405 core->name, PTR_ERR(clk));
408 static 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)
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;
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);
426 /* Skip NULLified clock */
430 parent = priv->clks[mod->parent];
431 if (IS_ERR(parent)) {
436 clock = kzalloc(sizeof(*clock), GFP_KERNEL);
438 clk = ERR_PTR(-ENOMEM);
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;
449 clock->index = id - priv->num_core_clks;
451 clock->hw.init = &init;
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",
458 init.flags |= CLK_IS_CRITICAL;
462 clk = clk_register(NULL, &clock->hw);
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);
472 dev_err(dev, "Failed to register %s clock %s: %ld\n", "module",
473 mod->name, PTR_ERR(clk));
477 struct cpg_mssr_clk_domain {
478 struct generic_pm_domain genpd;
479 unsigned int num_core_pm_clks;
480 unsigned int core_pm_clks[];
483 static struct cpg_mssr_clk_domain *cpg_mssr_clk_domain;
485 static bool cpg_mssr_is_pm_clk(const struct of_phandle_args *clkspec,
486 struct cpg_mssr_clk_domain *pd)
490 if (clkspec->np != pd->genpd.dev.of_node || clkspec->args_count != 2)
493 switch (clkspec->args[0]) {
495 for (i = 0; i < pd->num_core_pm_clks; i++)
496 if (clkspec->args[1] == pd->core_pm_clks[i])
508 int cpg_mssr_attach_dev(struct generic_pm_domain *unused, struct device *dev)
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;
518 dev_dbg(dev, "CPG/MSSR clock domain not yet available\n");
519 return -EPROBE_DEFER;
522 while (!of_parse_phandle_with_args(np, "clocks", "#clock-cells", i,
524 if (cpg_mssr_is_pm_clk(&clkspec, pd))
527 of_node_put(clkspec.np);
534 clk = of_clk_get_from_provider(&clkspec);
535 of_node_put(clkspec.np);
540 error = pm_clk_create(dev);
544 error = pm_clk_add_clk(dev, clk);
557 void cpg_mssr_detach_dev(struct generic_pm_domain *unused, struct device *dev)
559 if (!pm_clk_no_clocks(dev))
563 static void cpg_mssr_genpd_remove(void *data)
565 pm_genpd_remove(data);
568 static int __init cpg_mssr_add_clk_domain(struct device *dev,
569 const unsigned int *core_pm_clks,
570 unsigned int num_core_pm_clks)
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]);
578 pd = devm_kzalloc(dev, sizeof(*pd) + pm_size, GFP_KERNEL);
582 pd->num_core_pm_clks = num_core_pm_clks;
583 memcpy(pd->core_pm_clks, core_pm_clks, pm_size);
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);
595 ret = devm_add_action_or_reset(dev, cpg_mssr_genpd_remove, genpd);
599 cpg_mssr_clk_domain = pd;
601 return of_genpd_add_provider_simple(np, genpd);
604 #ifdef CONFIG_RESET_CONTROLLER
606 #define rcdev_to_priv(x) container_of(x, struct cpg_mssr_priv, rcdev)
608 static int cpg_mssr_reset(struct reset_controller_dev *rcdev,
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);
616 dev_dbg(priv->dev, "reset %u%02u\n", reg, bit);
619 writel(bitmask, priv->base + priv->reset_regs[reg]);
621 /* Wait for at least one cycle of the RCLK clock (@ ca. 32 kHz) */
624 /* Release module from reset state */
625 writel(bitmask, priv->base + priv->reset_clear_regs[reg]);
630 static int cpg_mssr_assert(struct reset_controller_dev *rcdev, unsigned long id)
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);
637 dev_dbg(priv->dev, "assert %u%02u\n", reg, bit);
639 writel(bitmask, priv->base + priv->reset_regs[reg]);
643 static int cpg_mssr_deassert(struct reset_controller_dev *rcdev,
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);
651 dev_dbg(priv->dev, "deassert %u%02u\n", reg, bit);
653 writel(bitmask, priv->base + priv->reset_clear_regs[reg]);
657 static int cpg_mssr_status(struct reset_controller_dev *rcdev,
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);
665 return !!(readl(priv->base + priv->reset_regs[reg]) & bitmask);
668 static 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,
675 static int cpg_mssr_reset_xlate(struct reset_controller_dev *rcdev,
676 const struct of_phandle_args *reset_spec)
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);
682 if (unpacked % 100 > 31 || idx >= rcdev->nr_resets) {
683 dev_err(priv->dev, "Invalid reset index %u\n", unpacked);
690 static int cpg_mssr_reset_controller_register(struct cpg_mssr_priv *priv)
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);
700 #else /* !CONFIG_RESET_CONTROLLER */
701 static inline int cpg_mssr_reset_controller_register(struct cpg_mssr_priv *priv)
705 #endif /* !CONFIG_RESET_CONTROLLER */
708 static const struct of_device_id cpg_mssr_match[] = {
709 #ifdef CONFIG_CLK_R7S9210
711 .compatible = "renesas,r7s9210-cpg-mssr",
712 .data = &r7s9210_cpg_mssr_info,
715 #ifdef CONFIG_CLK_R8A7742
717 .compatible = "renesas,r8a7742-cpg-mssr",
718 .data = &r8a7742_cpg_mssr_info,
721 #ifdef CONFIG_CLK_R8A7743
723 .compatible = "renesas,r8a7743-cpg-mssr",
724 .data = &r8a7743_cpg_mssr_info,
726 /* RZ/G1N is (almost) identical to RZ/G1M w.r.t. clocks. */
728 .compatible = "renesas,r8a7744-cpg-mssr",
729 .data = &r8a7743_cpg_mssr_info,
732 #ifdef CONFIG_CLK_R8A7745
734 .compatible = "renesas,r8a7745-cpg-mssr",
735 .data = &r8a7745_cpg_mssr_info,
738 #ifdef CONFIG_CLK_R8A77470
740 .compatible = "renesas,r8a77470-cpg-mssr",
741 .data = &r8a77470_cpg_mssr_info,
744 #ifdef CONFIG_CLK_R8A774A1
746 .compatible = "renesas,r8a774a1-cpg-mssr",
747 .data = &r8a774a1_cpg_mssr_info,
750 #ifdef CONFIG_CLK_R8A774B1
752 .compatible = "renesas,r8a774b1-cpg-mssr",
753 .data = &r8a774b1_cpg_mssr_info,
756 #ifdef CONFIG_CLK_R8A774C0
758 .compatible = "renesas,r8a774c0-cpg-mssr",
759 .data = &r8a774c0_cpg_mssr_info,
762 #ifdef CONFIG_CLK_R8A774E1
764 .compatible = "renesas,r8a774e1-cpg-mssr",
765 .data = &r8a774e1_cpg_mssr_info,
768 #ifdef CONFIG_CLK_R8A7790
770 .compatible = "renesas,r8a7790-cpg-mssr",
771 .data = &r8a7790_cpg_mssr_info,
774 #ifdef CONFIG_CLK_R8A7791
776 .compatible = "renesas,r8a7791-cpg-mssr",
777 .data = &r8a7791_cpg_mssr_info,
779 /* R-Car M2-N is (almost) identical to R-Car M2-W w.r.t. clocks. */
781 .compatible = "renesas,r8a7793-cpg-mssr",
782 .data = &r8a7791_cpg_mssr_info,
785 #ifdef CONFIG_CLK_R8A7792
787 .compatible = "renesas,r8a7792-cpg-mssr",
788 .data = &r8a7792_cpg_mssr_info,
791 #ifdef CONFIG_CLK_R8A7794
793 .compatible = "renesas,r8a7794-cpg-mssr",
794 .data = &r8a7794_cpg_mssr_info,
797 #ifdef CONFIG_CLK_R8A7795
799 .compatible = "renesas,r8a7795-cpg-mssr",
800 .data = &r8a7795_cpg_mssr_info,
803 #ifdef CONFIG_CLK_R8A77960
805 .compatible = "renesas,r8a7796-cpg-mssr",
806 .data = &r8a7796_cpg_mssr_info,
809 #ifdef CONFIG_CLK_R8A77961
811 .compatible = "renesas,r8a77961-cpg-mssr",
812 .data = &r8a7796_cpg_mssr_info,
815 #ifdef CONFIG_CLK_R8A77965
817 .compatible = "renesas,r8a77965-cpg-mssr",
818 .data = &r8a77965_cpg_mssr_info,
821 #ifdef CONFIG_CLK_R8A77970
823 .compatible = "renesas,r8a77970-cpg-mssr",
824 .data = &r8a77970_cpg_mssr_info,
827 #ifdef CONFIG_CLK_R8A77980
829 .compatible = "renesas,r8a77980-cpg-mssr",
830 .data = &r8a77980_cpg_mssr_info,
833 #ifdef CONFIG_CLK_R8A77990
835 .compatible = "renesas,r8a77990-cpg-mssr",
836 .data = &r8a77990_cpg_mssr_info,
839 #ifdef CONFIG_CLK_R8A77995
841 .compatible = "renesas,r8a77995-cpg-mssr",
842 .data = &r8a77995_cpg_mssr_info,
845 #ifdef CONFIG_CLK_R8A779A0
847 .compatible = "renesas,r8a779a0-cpg-mssr",
848 .data = &r8a779a0_cpg_mssr_info,
851 #ifdef CONFIG_CLK_R8A779F0
853 .compatible = "renesas,r8a779f0-cpg-mssr",
854 .data = &r8a779f0_cpg_mssr_info,
857 #ifdef CONFIG_CLK_R8A779G0
859 .compatible = "renesas,r8a779g0-cpg-mssr",
860 .data = &r8a779g0_cpg_mssr_info,
866 static void cpg_mssr_del_clk_provider(void *data)
868 of_clk_del_provider(data);
871 #if defined(CONFIG_PM_SLEEP) && defined(CONFIG_ARM_PSCI_FW)
872 static int cpg_mssr_suspend_noirq(struct device *dev)
874 struct cpg_mssr_priv *priv = dev_get_drvdata(dev);
877 /* This is the best we can do to check for the presence of PSCI */
878 if (!psci_ops.cpu_suspend)
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]);
890 /* Save core clocks */
891 raw_notifier_call_chain(&priv->notifiers, PM_EVENT_SUSPEND, NULL);
896 static int cpg_mssr_resume_noirq(struct device *dev)
898 struct cpg_mssr_priv *priv = dev_get_drvdata(dev);
900 u32 mask, oldval, newval;
902 /* This is the best we can do to check for the presence of PSCI */
903 if (!psci_ops.cpu_suspend)
906 /* Restore core clocks */
907 raw_notifier_call_chain(&priv->notifiers, PM_EVENT_RESUME, NULL);
909 /* Restore module clocks */
910 for (reg = 0; reg < ARRAY_SIZE(priv->smstpcr_saved); reg++) {
911 mask = priv->smstpcr_saved[reg].mask;
915 if (priv->reg_layout == CLK_REG_LAYOUT_RZ_A)
916 oldval = readb(priv->base + priv->control_regs[reg]);
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)
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]);
931 writel(newval, priv->base + priv->control_regs[reg]);
933 /* Wait until enabled clocks are really enabled */
934 mask &= ~priv->smstpcr_saved[reg].val;
938 for (i = 1000; i > 0; --i) {
939 oldval = readl(priv->base + priv->status_regs[reg]);
940 if (!(oldval & mask))
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);
954 static const struct dev_pm_ops cpg_mssr_pm = {
955 SET_NOIRQ_SYSTEM_SLEEP_PM_OPS(cpg_mssr_suspend_noirq,
956 cpg_mssr_resume_noirq)
958 #define DEV_PM_OPS &cpg_mssr_pm
960 #define DEV_PM_OPS NULL
961 #endif /* CONFIG_PM_SLEEP && CONFIG_ARM_PSCI_FW */
963 static int __init cpg_mssr_common_init(struct device *dev,
964 struct device_node *np,
965 const struct cpg_mssr_info *info)
967 struct cpg_mssr_priv *priv;
968 unsigned int nclks, i;
972 error = info->init(dev);
977 nclks = info->num_total_core_clks + info->num_hw_mod_clks;
978 priv = kzalloc(struct_size(priv, clks, nclks), GFP_KERNEL);
984 spin_lock_init(&priv->rmw_lock);
986 priv->base = of_iomap(np, 0);
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;
1015 for (i = 0; i < nclks; i++)
1016 priv->clks[i] = ERR_PTR(-ENOENT);
1018 error = of_clk_add_provider(np, cpg_mssr_clk_src_twocell_get, priv);
1026 iounmap(priv->base);
1032 void __init cpg_mssr_early_init(struct device_node *np,
1033 const struct cpg_mssr_info *info)
1038 error = cpg_mssr_common_init(NULL, np, info);
1042 for (i = 0; i < info->num_early_core_clks; i++)
1043 cpg_mssr_register_core_clk(&info->early_core_clks[i], info,
1046 for (i = 0; i < info->num_early_mod_clks; i++)
1047 cpg_mssr_register_mod_clk(&info->early_mod_clks[i], info,
1052 static int __init cpg_mssr_probe(struct platform_device *pdev)
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;
1061 info = of_device_get_match_data(dev);
1063 if (!cpg_mssr_priv) {
1064 error = cpg_mssr_common_init(dev, dev->of_node, info);
1069 priv = cpg_mssr_priv;
1071 dev_set_drvdata(dev, priv);
1073 for (i = 0; i < info->num_core_clks; i++)
1074 cpg_mssr_register_core_clk(&info->core_clks[i], info, priv);
1076 for (i = 0; i < info->num_mod_clks; i++)
1077 cpg_mssr_register_mod_clk(&info->mod_clks[i], info, priv);
1079 error = devm_add_action_or_reset(dev,
1080 cpg_mssr_del_clk_provider,
1085 error = cpg_mssr_add_clk_domain(dev, info->core_pm_clks,
1086 info->num_core_pm_clks);
1090 /* Reset Controller not supported for Standby Control SoCs */
1091 if (priv->reg_layout == CLK_REG_LAYOUT_RZ_A)
1094 error = cpg_mssr_reset_controller_register(priv);
1101 static struct platform_driver cpg_mssr_driver = {
1103 .name = "renesas-cpg-mssr",
1104 .of_match_table = cpg_mssr_match,
1109 static int __init cpg_mssr_init(void)
1111 return platform_driver_probe(&cpg_mssr_driver, cpg_mssr_probe);
1114 subsys_initcall(cpg_mssr_init);
1116 void __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)
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;
1129 void __init mssr_mod_nullify(struct mssr_mod_clk *mod_clks,
1130 unsigned int num_mod_clks,
1131 const unsigned int *clks, unsigned int n)
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;
1142 void __init mssr_mod_reparent(struct mssr_mod_clk *mod_clks,
1143 unsigned int num_mod_clks,
1144 const struct mssr_mod_reparent *clks,
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;
1156 MODULE_DESCRIPTION("Renesas CPG/MSSR Driver");
1157 MODULE_LICENSE("GPL v2");