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/iopoll.h>
21 #include <linux/mod_devicetable.h>
22 #include <linux/module.h>
23 #include <linux/of_address.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, 0x2E70, 0x2E74,
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, 0x2D70, 0x2D74,
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, 0x2C70, 0x2C74,
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, 0x2CF0, 0x2CF4,
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 error = readl_poll_timeout_atomic(priv->base + priv->status_regs[reg],
232 value, !(value & bitmask), 0, 10);
234 dev_err(dev, "Failed to enable SMSTP %p[%d]\n",
235 priv->base + priv->control_regs[reg], bit);
240 static int cpg_mstp_clock_enable(struct clk_hw *hw)
242 return cpg_mstp_clock_endisable(hw, true);
245 static void cpg_mstp_clock_disable(struct clk_hw *hw)
247 cpg_mstp_clock_endisable(hw, false);
250 static int cpg_mstp_clock_is_enabled(struct clk_hw *hw)
252 struct mstp_clock *clock = to_mstp_clock(hw);
253 struct cpg_mssr_priv *priv = clock->priv;
256 if (priv->reg_layout == CLK_REG_LAYOUT_RZ_A)
257 value = readb(priv->base + priv->control_regs[clock->index / 32]);
259 value = readl(priv->base + priv->status_regs[clock->index / 32]);
261 return !(value & BIT(clock->index % 32));
264 static const struct clk_ops cpg_mstp_clock_ops = {
265 .enable = cpg_mstp_clock_enable,
266 .disable = cpg_mstp_clock_disable,
267 .is_enabled = cpg_mstp_clock_is_enabled,
271 struct clk *cpg_mssr_clk_src_twocell_get(struct of_phandle_args *clkspec,
274 unsigned int clkidx = clkspec->args[1];
275 struct cpg_mssr_priv *priv = data;
276 struct device *dev = priv->dev;
282 switch (clkspec->args[0]) {
285 if (clkidx > priv->last_dt_core_clk) {
286 dev_err(dev, "Invalid %s clock index %u\n", type,
288 return ERR_PTR(-EINVAL);
290 clk = priv->clks[clkidx];
295 if (priv->reg_layout == CLK_REG_LAYOUT_RZ_A) {
296 idx = MOD_CLK_PACK_10(clkidx);
297 range_check = 7 - (clkidx % 10);
299 idx = MOD_CLK_PACK(clkidx);
300 range_check = 31 - (clkidx % 100);
302 if (range_check < 0 || idx >= priv->num_mod_clks) {
303 dev_err(dev, "Invalid %s clock index %u\n", type,
305 return ERR_PTR(-EINVAL);
307 clk = priv->clks[priv->num_core_clks + idx];
311 dev_err(dev, "Invalid CPG clock type %u\n", clkspec->args[0]);
312 return ERR_PTR(-EINVAL);
316 dev_err(dev, "Cannot get %s clock %u: %ld", type, clkidx,
319 dev_dbg(dev, "clock (%u, %u) is %pC at %lu Hz\n",
320 clkspec->args[0], clkspec->args[1], clk,
325 static void __init cpg_mssr_register_core_clk(const struct cpg_core_clk *core,
326 const struct cpg_mssr_info *info,
327 struct cpg_mssr_priv *priv)
329 struct clk *clk = ERR_PTR(-ENOTSUPP), *parent;
330 struct device *dev = priv->dev;
331 unsigned int id = core->id, div = core->div;
332 const char *parent_name;
334 WARN_DEBUG(id >= priv->num_core_clks);
335 WARN_DEBUG(PTR_ERR(priv->clks[id]) != -ENOENT);
338 /* Skip NULLified clock */
342 switch (core->type) {
344 clk = of_clk_get_by_name(priv->np, core->name);
348 case CLK_TYPE_DIV6P1:
349 case CLK_TYPE_DIV6_RO:
350 WARN_DEBUG(core->parent >= priv->num_core_clks);
351 parent = priv->clks[core->parent];
352 if (IS_ERR(parent)) {
357 parent_name = __clk_get_name(parent);
359 if (core->type == CLK_TYPE_DIV6_RO)
360 /* Multiply with the DIV6 register value */
361 div *= (readl(priv->base + core->offset) & 0x3f) + 1;
363 if (core->type == CLK_TYPE_DIV6P1) {
364 clk = cpg_div6_register(core->name, 1, &parent_name,
365 priv->base + core->offset,
368 clk = clk_register_fixed_factor(NULL, core->name,
375 clk = clk_register_fixed_rate(NULL, core->name, NULL, 0,
380 if (info->cpg_clk_register)
381 clk = info->cpg_clk_register(dev, core, info,
382 priv->clks, priv->base,
385 dev_err(dev, "%s has unsupported core clock type %u\n",
386 core->name, core->type);
390 if (IS_ERR_OR_NULL(clk))
393 dev_dbg(dev, "Core clock %pC at %lu Hz\n", clk, clk_get_rate(clk));
394 priv->clks[id] = clk;
398 dev_err(dev, "Failed to register %s clock %s: %ld\n", "core",
399 core->name, PTR_ERR(clk));
402 static void __init cpg_mssr_register_mod_clk(const struct mssr_mod_clk *mod,
403 const struct cpg_mssr_info *info,
404 struct cpg_mssr_priv *priv)
406 struct mstp_clock *clock = NULL;
407 struct device *dev = priv->dev;
408 unsigned int id = mod->id;
409 struct clk_init_data init = {};
410 struct clk *parent, *clk;
411 const char *parent_name;
414 WARN_DEBUG(id < priv->num_core_clks);
415 WARN_DEBUG(id >= priv->num_core_clks + priv->num_mod_clks);
416 WARN_DEBUG(mod->parent >= priv->num_core_clks + priv->num_mod_clks);
417 WARN_DEBUG(PTR_ERR(priv->clks[id]) != -ENOENT);
420 /* Skip NULLified clock */
424 parent = priv->clks[mod->parent];
425 if (IS_ERR(parent)) {
430 clock = kzalloc(sizeof(*clock), GFP_KERNEL);
432 clk = ERR_PTR(-ENOMEM);
436 init.name = mod->name;
437 init.ops = &cpg_mstp_clock_ops;
438 init.flags = CLK_SET_RATE_PARENT;
439 parent_name = __clk_get_name(parent);
440 init.parent_names = &parent_name;
441 init.num_parents = 1;
443 clock->index = id - priv->num_core_clks;
445 clock->hw.init = &init;
447 for (i = 0; i < info->num_crit_mod_clks; i++)
448 if (id == info->crit_mod_clks[i] &&
449 cpg_mstp_clock_is_enabled(&clock->hw)) {
450 dev_dbg(dev, "MSTP %s setting CLK_IS_CRITICAL\n",
452 init.flags |= CLK_IS_CRITICAL;
456 clk = clk_register(NULL, &clock->hw);
460 dev_dbg(dev, "Module clock %pC at %lu Hz\n", clk, clk_get_rate(clk));
461 priv->clks[id] = clk;
462 priv->smstpcr_saved[clock->index / 32].mask |= BIT(clock->index % 32);
466 dev_err(dev, "Failed to register %s clock %s: %ld\n", "module",
467 mod->name, PTR_ERR(clk));
471 struct cpg_mssr_clk_domain {
472 struct generic_pm_domain genpd;
473 unsigned int num_core_pm_clks;
474 unsigned int core_pm_clks[];
477 static struct cpg_mssr_clk_domain *cpg_mssr_clk_domain;
479 static bool cpg_mssr_is_pm_clk(const struct of_phandle_args *clkspec,
480 struct cpg_mssr_clk_domain *pd)
484 if (clkspec->np != pd->genpd.dev.of_node || clkspec->args_count != 2)
487 switch (clkspec->args[0]) {
489 for (i = 0; i < pd->num_core_pm_clks; i++)
490 if (clkspec->args[1] == pd->core_pm_clks[i])
502 int cpg_mssr_attach_dev(struct generic_pm_domain *unused, struct device *dev)
504 struct cpg_mssr_clk_domain *pd = cpg_mssr_clk_domain;
505 struct device_node *np = dev->of_node;
506 struct of_phandle_args clkspec;
512 dev_dbg(dev, "CPG/MSSR clock domain not yet available\n");
513 return -EPROBE_DEFER;
516 while (!of_parse_phandle_with_args(np, "clocks", "#clock-cells", i,
518 if (cpg_mssr_is_pm_clk(&clkspec, pd))
521 of_node_put(clkspec.np);
528 clk = of_clk_get_from_provider(&clkspec);
529 of_node_put(clkspec.np);
534 error = pm_clk_create(dev);
538 error = pm_clk_add_clk(dev, clk);
551 void cpg_mssr_detach_dev(struct generic_pm_domain *unused, struct device *dev)
553 if (!pm_clk_no_clocks(dev))
557 static void cpg_mssr_genpd_remove(void *data)
559 pm_genpd_remove(data);
562 static int __init cpg_mssr_add_clk_domain(struct device *dev,
563 const unsigned int *core_pm_clks,
564 unsigned int num_core_pm_clks)
566 struct device_node *np = dev->of_node;
567 struct generic_pm_domain *genpd;
568 struct cpg_mssr_clk_domain *pd;
569 size_t pm_size = num_core_pm_clks * sizeof(core_pm_clks[0]);
572 pd = devm_kzalloc(dev, sizeof(*pd) + pm_size, GFP_KERNEL);
576 pd->num_core_pm_clks = num_core_pm_clks;
577 memcpy(pd->core_pm_clks, core_pm_clks, pm_size);
580 genpd->name = np->name;
581 genpd->flags = GENPD_FLAG_PM_CLK | GENPD_FLAG_ALWAYS_ON |
582 GENPD_FLAG_ACTIVE_WAKEUP;
583 genpd->attach_dev = cpg_mssr_attach_dev;
584 genpd->detach_dev = cpg_mssr_detach_dev;
585 ret = pm_genpd_init(genpd, &pm_domain_always_on_gov, false);
589 ret = devm_add_action_or_reset(dev, cpg_mssr_genpd_remove, genpd);
593 cpg_mssr_clk_domain = pd;
595 return of_genpd_add_provider_simple(np, genpd);
598 #ifdef CONFIG_RESET_CONTROLLER
600 #define rcdev_to_priv(x) container_of(x, struct cpg_mssr_priv, rcdev)
602 static int cpg_mssr_reset(struct reset_controller_dev *rcdev,
605 struct cpg_mssr_priv *priv = rcdev_to_priv(rcdev);
606 unsigned int reg = id / 32;
607 unsigned int bit = id % 32;
608 u32 bitmask = BIT(bit);
610 dev_dbg(priv->dev, "reset %u%02u\n", reg, bit);
613 writel(bitmask, priv->base + priv->reset_regs[reg]);
615 /* Wait for at least one cycle of the RCLK clock (@ ca. 32 kHz) */
618 /* Release module from reset state */
619 writel(bitmask, priv->base + priv->reset_clear_regs[reg]);
624 static int cpg_mssr_assert(struct reset_controller_dev *rcdev, unsigned long id)
626 struct cpg_mssr_priv *priv = rcdev_to_priv(rcdev);
627 unsigned int reg = id / 32;
628 unsigned int bit = id % 32;
629 u32 bitmask = BIT(bit);
631 dev_dbg(priv->dev, "assert %u%02u\n", reg, bit);
633 writel(bitmask, priv->base + priv->reset_regs[reg]);
637 static int cpg_mssr_deassert(struct reset_controller_dev *rcdev,
640 struct cpg_mssr_priv *priv = rcdev_to_priv(rcdev);
641 unsigned int reg = id / 32;
642 unsigned int bit = id % 32;
643 u32 bitmask = BIT(bit);
645 dev_dbg(priv->dev, "deassert %u%02u\n", reg, bit);
647 writel(bitmask, priv->base + priv->reset_clear_regs[reg]);
651 static int cpg_mssr_status(struct reset_controller_dev *rcdev,
654 struct cpg_mssr_priv *priv = rcdev_to_priv(rcdev);
655 unsigned int reg = id / 32;
656 unsigned int bit = id % 32;
657 u32 bitmask = BIT(bit);
659 return !!(readl(priv->base + priv->reset_regs[reg]) & bitmask);
662 static const struct reset_control_ops cpg_mssr_reset_ops = {
663 .reset = cpg_mssr_reset,
664 .assert = cpg_mssr_assert,
665 .deassert = cpg_mssr_deassert,
666 .status = cpg_mssr_status,
669 static int cpg_mssr_reset_xlate(struct reset_controller_dev *rcdev,
670 const struct of_phandle_args *reset_spec)
672 struct cpg_mssr_priv *priv = rcdev_to_priv(rcdev);
673 unsigned int unpacked = reset_spec->args[0];
674 unsigned int idx = MOD_CLK_PACK(unpacked);
676 if (unpacked % 100 > 31 || idx >= rcdev->nr_resets) {
677 dev_err(priv->dev, "Invalid reset index %u\n", unpacked);
684 static int cpg_mssr_reset_controller_register(struct cpg_mssr_priv *priv)
686 priv->rcdev.ops = &cpg_mssr_reset_ops;
687 priv->rcdev.of_node = priv->dev->of_node;
688 priv->rcdev.of_reset_n_cells = 1;
689 priv->rcdev.of_xlate = cpg_mssr_reset_xlate;
690 priv->rcdev.nr_resets = priv->num_mod_clks;
691 return devm_reset_controller_register(priv->dev, &priv->rcdev);
694 #else /* !CONFIG_RESET_CONTROLLER */
695 static inline int cpg_mssr_reset_controller_register(struct cpg_mssr_priv *priv)
699 #endif /* !CONFIG_RESET_CONTROLLER */
702 static const struct of_device_id cpg_mssr_match[] = {
703 #ifdef CONFIG_CLK_R7S9210
705 .compatible = "renesas,r7s9210-cpg-mssr",
706 .data = &r7s9210_cpg_mssr_info,
709 #ifdef CONFIG_CLK_R8A7742
711 .compatible = "renesas,r8a7742-cpg-mssr",
712 .data = &r8a7742_cpg_mssr_info,
715 #ifdef CONFIG_CLK_R8A7743
717 .compatible = "renesas,r8a7743-cpg-mssr",
718 .data = &r8a7743_cpg_mssr_info,
720 /* RZ/G1N is (almost) identical to RZ/G1M w.r.t. clocks. */
722 .compatible = "renesas,r8a7744-cpg-mssr",
723 .data = &r8a7743_cpg_mssr_info,
726 #ifdef CONFIG_CLK_R8A7745
728 .compatible = "renesas,r8a7745-cpg-mssr",
729 .data = &r8a7745_cpg_mssr_info,
732 #ifdef CONFIG_CLK_R8A77470
734 .compatible = "renesas,r8a77470-cpg-mssr",
735 .data = &r8a77470_cpg_mssr_info,
738 #ifdef CONFIG_CLK_R8A774A1
740 .compatible = "renesas,r8a774a1-cpg-mssr",
741 .data = &r8a774a1_cpg_mssr_info,
744 #ifdef CONFIG_CLK_R8A774B1
746 .compatible = "renesas,r8a774b1-cpg-mssr",
747 .data = &r8a774b1_cpg_mssr_info,
750 #ifdef CONFIG_CLK_R8A774C0
752 .compatible = "renesas,r8a774c0-cpg-mssr",
753 .data = &r8a774c0_cpg_mssr_info,
756 #ifdef CONFIG_CLK_R8A774E1
758 .compatible = "renesas,r8a774e1-cpg-mssr",
759 .data = &r8a774e1_cpg_mssr_info,
762 #ifdef CONFIG_CLK_R8A7790
764 .compatible = "renesas,r8a7790-cpg-mssr",
765 .data = &r8a7790_cpg_mssr_info,
768 #ifdef CONFIG_CLK_R8A7791
770 .compatible = "renesas,r8a7791-cpg-mssr",
771 .data = &r8a7791_cpg_mssr_info,
773 /* R-Car M2-N is (almost) identical to R-Car M2-W w.r.t. clocks. */
775 .compatible = "renesas,r8a7793-cpg-mssr",
776 .data = &r8a7791_cpg_mssr_info,
779 #ifdef CONFIG_CLK_R8A7792
781 .compatible = "renesas,r8a7792-cpg-mssr",
782 .data = &r8a7792_cpg_mssr_info,
785 #ifdef CONFIG_CLK_R8A7794
787 .compatible = "renesas,r8a7794-cpg-mssr",
788 .data = &r8a7794_cpg_mssr_info,
791 #ifdef CONFIG_CLK_R8A7795
793 .compatible = "renesas,r8a7795-cpg-mssr",
794 .data = &r8a7795_cpg_mssr_info,
797 #ifdef CONFIG_CLK_R8A77960
799 .compatible = "renesas,r8a7796-cpg-mssr",
800 .data = &r8a7796_cpg_mssr_info,
803 #ifdef CONFIG_CLK_R8A77961
805 .compatible = "renesas,r8a77961-cpg-mssr",
806 .data = &r8a7796_cpg_mssr_info,
809 #ifdef CONFIG_CLK_R8A77965
811 .compatible = "renesas,r8a77965-cpg-mssr",
812 .data = &r8a77965_cpg_mssr_info,
815 #ifdef CONFIG_CLK_R8A77970
817 .compatible = "renesas,r8a77970-cpg-mssr",
818 .data = &r8a77970_cpg_mssr_info,
821 #ifdef CONFIG_CLK_R8A77980
823 .compatible = "renesas,r8a77980-cpg-mssr",
824 .data = &r8a77980_cpg_mssr_info,
827 #ifdef CONFIG_CLK_R8A77990
829 .compatible = "renesas,r8a77990-cpg-mssr",
830 .data = &r8a77990_cpg_mssr_info,
833 #ifdef CONFIG_CLK_R8A77995
835 .compatible = "renesas,r8a77995-cpg-mssr",
836 .data = &r8a77995_cpg_mssr_info,
839 #ifdef CONFIG_CLK_R8A779A0
841 .compatible = "renesas,r8a779a0-cpg-mssr",
842 .data = &r8a779a0_cpg_mssr_info,
845 #ifdef CONFIG_CLK_R8A779F0
847 .compatible = "renesas,r8a779f0-cpg-mssr",
848 .data = &r8a779f0_cpg_mssr_info,
851 #ifdef CONFIG_CLK_R8A779G0
853 .compatible = "renesas,r8a779g0-cpg-mssr",
854 .data = &r8a779g0_cpg_mssr_info,
860 static void cpg_mssr_del_clk_provider(void *data)
862 of_clk_del_provider(data);
865 #if defined(CONFIG_PM_SLEEP) && defined(CONFIG_ARM_PSCI_FW)
866 static int cpg_mssr_suspend_noirq(struct device *dev)
868 struct cpg_mssr_priv *priv = dev_get_drvdata(dev);
871 /* This is the best we can do to check for the presence of PSCI */
872 if (!psci_ops.cpu_suspend)
875 /* Save module registers with bits under our control */
876 for (reg = 0; reg < ARRAY_SIZE(priv->smstpcr_saved); reg++) {
877 if (priv->smstpcr_saved[reg].mask)
878 priv->smstpcr_saved[reg].val =
879 priv->reg_layout == CLK_REG_LAYOUT_RZ_A ?
880 readb(priv->base + priv->control_regs[reg]) :
881 readl(priv->base + priv->control_regs[reg]);
884 /* Save core clocks */
885 raw_notifier_call_chain(&priv->notifiers, PM_EVENT_SUSPEND, NULL);
890 static int cpg_mssr_resume_noirq(struct device *dev)
892 struct cpg_mssr_priv *priv = dev_get_drvdata(dev);
894 u32 mask, oldval, newval;
897 /* This is the best we can do to check for the presence of PSCI */
898 if (!psci_ops.cpu_suspend)
901 /* Restore core clocks */
902 raw_notifier_call_chain(&priv->notifiers, PM_EVENT_RESUME, NULL);
904 /* Restore module clocks */
905 for (reg = 0; reg < ARRAY_SIZE(priv->smstpcr_saved); reg++) {
906 mask = priv->smstpcr_saved[reg].mask;
910 if (priv->reg_layout == CLK_REG_LAYOUT_RZ_A)
911 oldval = readb(priv->base + priv->control_regs[reg]);
913 oldval = readl(priv->base + priv->control_regs[reg]);
914 newval = oldval & ~mask;
915 newval |= priv->smstpcr_saved[reg].val & mask;
916 if (newval == oldval)
919 if (priv->reg_layout == CLK_REG_LAYOUT_RZ_A) {
920 writeb(newval, priv->base + priv->control_regs[reg]);
921 /* dummy read to ensure write has completed */
922 readb(priv->base + priv->control_regs[reg]);
923 barrier_data(priv->base + priv->control_regs[reg]);
926 writel(newval, priv->base + priv->control_regs[reg]);
928 /* Wait until enabled clocks are really enabled */
929 mask &= ~priv->smstpcr_saved[reg].val;
933 error = readl_poll_timeout_atomic(priv->base + priv->status_regs[reg],
934 oldval, !(oldval & mask), 0, 10);
936 dev_warn(dev, "Failed to enable SMSTP%u[0x%x]\n", reg,
943 static const struct dev_pm_ops cpg_mssr_pm = {
944 SET_NOIRQ_SYSTEM_SLEEP_PM_OPS(cpg_mssr_suspend_noirq,
945 cpg_mssr_resume_noirq)
947 #define DEV_PM_OPS &cpg_mssr_pm
949 #define DEV_PM_OPS NULL
950 #endif /* CONFIG_PM_SLEEP && CONFIG_ARM_PSCI_FW */
952 static int __init cpg_mssr_common_init(struct device *dev,
953 struct device_node *np,
954 const struct cpg_mssr_info *info)
956 struct cpg_mssr_priv *priv;
957 unsigned int nclks, i;
961 error = info->init(dev);
966 nclks = info->num_total_core_clks + info->num_hw_mod_clks;
967 priv = kzalloc(struct_size(priv, clks, nclks), GFP_KERNEL);
973 spin_lock_init(&priv->rmw_lock);
975 priv->base = of_iomap(np, 0);
981 priv->num_core_clks = info->num_total_core_clks;
982 priv->num_mod_clks = info->num_hw_mod_clks;
983 priv->last_dt_core_clk = info->last_dt_core_clk;
984 RAW_INIT_NOTIFIER_HEAD(&priv->notifiers);
985 priv->reg_layout = info->reg_layout;
986 if (priv->reg_layout == CLK_REG_LAYOUT_RCAR_GEN2_AND_GEN3) {
987 priv->status_regs = mstpsr;
988 priv->control_regs = smstpcr;
989 priv->reset_regs = srcr;
990 priv->reset_clear_regs = srstclr;
991 } else if (priv->reg_layout == CLK_REG_LAYOUT_RZ_A) {
992 priv->control_regs = stbcr;
993 } else if (priv->reg_layout == CLK_REG_LAYOUT_RCAR_GEN4) {
994 priv->status_regs = mstpsr_for_gen4;
995 priv->control_regs = mstpcr_for_gen4;
996 priv->reset_regs = srcr_for_gen4;
997 priv->reset_clear_regs = srstclr_for_gen4;
1003 for (i = 0; i < nclks; i++)
1004 priv->clks[i] = ERR_PTR(-ENOENT);
1006 error = of_clk_add_provider(np, cpg_mssr_clk_src_twocell_get, priv);
1010 cpg_mssr_priv = priv;
1016 iounmap(priv->base);
1022 void __init cpg_mssr_early_init(struct device_node *np,
1023 const struct cpg_mssr_info *info)
1028 error = cpg_mssr_common_init(NULL, np, info);
1032 for (i = 0; i < info->num_early_core_clks; i++)
1033 cpg_mssr_register_core_clk(&info->early_core_clks[i], info,
1036 for (i = 0; i < info->num_early_mod_clks; i++)
1037 cpg_mssr_register_mod_clk(&info->early_mod_clks[i], info,
1042 static int __init cpg_mssr_probe(struct platform_device *pdev)
1044 struct device *dev = &pdev->dev;
1045 struct device_node *np = dev->of_node;
1046 const struct cpg_mssr_info *info;
1047 struct cpg_mssr_priv *priv;
1051 info = of_device_get_match_data(dev);
1053 if (!cpg_mssr_priv) {
1054 error = cpg_mssr_common_init(dev, dev->of_node, info);
1059 priv = cpg_mssr_priv;
1061 dev_set_drvdata(dev, priv);
1063 for (i = 0; i < info->num_core_clks; i++)
1064 cpg_mssr_register_core_clk(&info->core_clks[i], info, priv);
1066 for (i = 0; i < info->num_mod_clks; i++)
1067 cpg_mssr_register_mod_clk(&info->mod_clks[i], info, priv);
1069 error = devm_add_action_or_reset(dev,
1070 cpg_mssr_del_clk_provider,
1075 error = cpg_mssr_add_clk_domain(dev, info->core_pm_clks,
1076 info->num_core_pm_clks);
1080 /* Reset Controller not supported for Standby Control SoCs */
1081 if (priv->reg_layout == CLK_REG_LAYOUT_RZ_A)
1084 error = cpg_mssr_reset_controller_register(priv);
1091 static struct platform_driver cpg_mssr_driver = {
1093 .name = "renesas-cpg-mssr",
1094 .of_match_table = cpg_mssr_match,
1099 static int __init cpg_mssr_init(void)
1101 return platform_driver_probe(&cpg_mssr_driver, cpg_mssr_probe);
1104 subsys_initcall(cpg_mssr_init);
1106 void __init mssr_mod_nullify(struct mssr_mod_clk *mod_clks,
1107 unsigned int num_mod_clks,
1108 const unsigned int *clks, unsigned int n)
1112 for (i = 0, j = 0; i < num_mod_clks && j < n; i++)
1113 if (mod_clks[i].id == clks[j]) {
1114 mod_clks[i].name = NULL;
1119 MODULE_DESCRIPTION("Renesas CPG/MSSR Driver");