WIP FPC-III support
[linux/fpc-iii.git] / drivers / clk / renesas / renesas-cpg-mssr.c
blob1c3215dc4877c8b6cf31d544f07cadaefca9f7b7
1 // SPDX-License-Identifier: GPL-2.0
2 /*
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>
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>
31 #include <dt-bindings/clock/renesas-cpg-mssr.h>
33 #include "renesas-cpg-mssr.h"
34 #include "clk-div6.h"
36 #ifdef DEBUG
37 #define WARN_DEBUG(x) WARN_ON(x)
38 #else
39 #define WARN_DEBUG(x) do { } while (0)
40 #endif
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_v3u[] = {
61 0x2E00, 0x2E04, 0x2E08, 0x2E0C, 0x2E10, 0x2E14, 0x2E18, 0x2E1C,
62 0x2E20, 0x2E24, 0x2E28, 0x2E2C, 0x2E30, 0x2E34, 0x2E38,
66 * System Module Stop Control Register offsets
69 static const u16 smstpcr[] = {
70 0x130, 0x134, 0x138, 0x13C, 0x140, 0x144, 0x148, 0x14C,
71 0x990, 0x994, 0x998, 0x99C,
74 static const u16 mstpcr_for_v3u[] = {
75 0x2D00, 0x2D04, 0x2D08, 0x2D0C, 0x2D10, 0x2D14, 0x2D18, 0x2D1C,
76 0x2D20, 0x2D24, 0x2D28, 0x2D2C, 0x2D30, 0x2D34, 0x2D38,
80 * Standby Control Register offsets (RZ/A)
81 * Base address is FRQCR register
84 static const u16 stbcr[] = {
85 0xFFFF/*dummy*/, 0x010, 0x014, 0x410, 0x414, 0x418, 0x41C, 0x420,
86 0x424, 0x428, 0x42C,
90 * Software Reset Register offsets
93 static const u16 srcr[] = {
94 0x0A0, 0x0A8, 0x0B0, 0x0B8, 0x0BC, 0x0C4, 0x1C8, 0x1CC,
95 0x920, 0x924, 0x928, 0x92C,
98 static const u16 srcr_for_v3u[] = {
99 0x2C00, 0x2C04, 0x2C08, 0x2C0C, 0x2C10, 0x2C14, 0x2C18, 0x2C1C,
100 0x2C20, 0x2C24, 0x2C28, 0x2C2C, 0x2C30, 0x2C34, 0x2C38,
103 /* Realtime Module Stop Control Register offsets */
104 #define RMSTPCR(i) (smstpcr[i] - 0x20)
106 /* Modem Module Stop Control Register offsets (r8a73a4) */
107 #define MMSTPCR(i) (smstpcr[i] + 0x20)
109 /* Software Reset Clearing Register offsets */
111 static const u16 srstclr[] = {
112 0x940, 0x944, 0x948, 0x94C, 0x950, 0x954, 0x958, 0x95C,
113 0x960, 0x964, 0x968, 0x96C,
116 static const u16 srstclr_for_v3u[] = {
117 0x2C80, 0x2C84, 0x2C88, 0x2C8C, 0x2C90, 0x2C94, 0x2C98, 0x2C9C,
118 0x2CA0, 0x2CA4, 0x2CA8, 0x2CAC, 0x2CB0, 0x2CB4, 0x2CB8,
122 * struct cpg_mssr_priv - Clock Pulse Generator / Module Standby
123 * and Software Reset Private Data
125 * @rcdev: Optional reset controller entity
126 * @dev: CPG/MSSR device
127 * @base: CPG/MSSR register block base address
128 * @reg_layout: CPG/MSSR register layout
129 * @rmw_lock: protects RMW register accesses
130 * @np: Device node in DT for this CPG/MSSR module
131 * @num_core_clks: Number of Core Clocks in clks[]
132 * @num_mod_clks: Number of Module Clocks in clks[]
133 * @last_dt_core_clk: ID of the last Core Clock exported to DT
134 * @notifiers: Notifier chain to save/restore clock state for system resume
135 * @status_regs: Pointer to status registers array
136 * @control_regs: Pointer to control registers array
137 * @reset_regs: Pointer to reset registers array
138 * @reset_clear_regs: Pointer to reset clearing registers array
139 * @smstpcr_saved[].mask: Mask of SMSTPCR[] bits under our control
140 * @smstpcr_saved[].val: Saved values of SMSTPCR[]
141 * @clks: Array containing all Core and Module Clocks
143 struct cpg_mssr_priv {
144 #ifdef CONFIG_RESET_CONTROLLER
145 struct reset_controller_dev rcdev;
146 #endif
147 struct device *dev;
148 void __iomem *base;
149 enum clk_reg_layout reg_layout;
150 spinlock_t rmw_lock;
151 struct device_node *np;
153 unsigned int num_core_clks;
154 unsigned int num_mod_clks;
155 unsigned int last_dt_core_clk;
157 struct raw_notifier_head notifiers;
158 const u16 *status_regs;
159 const u16 *control_regs;
160 const u16 *reset_regs;
161 const u16 *reset_clear_regs;
162 struct {
163 u32 mask;
164 u32 val;
165 } smstpcr_saved[ARRAY_SIZE(mstpsr_for_v3u)];
167 struct clk *clks[];
170 static struct cpg_mssr_priv *cpg_mssr_priv;
173 * struct mstp_clock - MSTP gating clock
174 * @hw: handle between common and hardware-specific interfaces
175 * @index: MSTP clock number
176 * @priv: CPG/MSSR private data
178 struct mstp_clock {
179 struct clk_hw hw;
180 u32 index;
181 struct cpg_mssr_priv *priv;
184 #define to_mstp_clock(_hw) container_of(_hw, struct mstp_clock, hw)
186 static int cpg_mstp_clock_endisable(struct clk_hw *hw, bool enable)
188 struct mstp_clock *clock = to_mstp_clock(hw);
189 struct cpg_mssr_priv *priv = clock->priv;
190 unsigned int reg = clock->index / 32;
191 unsigned int bit = clock->index % 32;
192 struct device *dev = priv->dev;
193 u32 bitmask = BIT(bit);
194 unsigned long flags;
195 unsigned int i;
196 u32 value;
198 dev_dbg(dev, "MSTP %u%02u/%pC %s\n", reg, bit, hw->clk,
199 enable ? "ON" : "OFF");
200 spin_lock_irqsave(&priv->rmw_lock, flags);
202 if (priv->reg_layout == CLK_REG_LAYOUT_RZ_A) {
203 value = readb(priv->base + priv->control_regs[reg]);
204 if (enable)
205 value &= ~bitmask;
206 else
207 value |= bitmask;
208 writeb(value, priv->base + priv->control_regs[reg]);
210 /* dummy read to ensure write has completed */
211 readb(priv->base + priv->control_regs[reg]);
212 barrier_data(priv->base + priv->control_regs[reg]);
213 } else {
214 value = readl(priv->base + priv->control_regs[reg]);
215 if (enable)
216 value &= ~bitmask;
217 else
218 value |= bitmask;
219 writel(value, priv->base + priv->control_regs[reg]);
222 spin_unlock_irqrestore(&priv->rmw_lock, flags);
224 if (!enable || priv->reg_layout == CLK_REG_LAYOUT_RZ_A)
225 return 0;
227 for (i = 1000; i > 0; --i) {
228 if (!(readl(priv->base + priv->status_regs[reg]) & bitmask))
229 break;
230 cpu_relax();
233 if (!i) {
234 dev_err(dev, "Failed to enable SMSTP %p[%d]\n",
235 priv->base + priv->control_regs[reg], bit);
236 return -ETIMEDOUT;
239 return 0;
242 static int cpg_mstp_clock_enable(struct clk_hw *hw)
244 return cpg_mstp_clock_endisable(hw, true);
247 static void cpg_mstp_clock_disable(struct clk_hw *hw)
249 cpg_mstp_clock_endisable(hw, false);
252 static int cpg_mstp_clock_is_enabled(struct clk_hw *hw)
254 struct mstp_clock *clock = to_mstp_clock(hw);
255 struct cpg_mssr_priv *priv = clock->priv;
256 u32 value;
258 if (priv->reg_layout == CLK_REG_LAYOUT_RZ_A)
259 value = readb(priv->base + priv->control_regs[clock->index / 32]);
260 else
261 value = readl(priv->base + priv->status_regs[clock->index / 32]);
263 return !(value & BIT(clock->index % 32));
266 static const struct clk_ops cpg_mstp_clock_ops = {
267 .enable = cpg_mstp_clock_enable,
268 .disable = cpg_mstp_clock_disable,
269 .is_enabled = cpg_mstp_clock_is_enabled,
272 static
273 struct clk *cpg_mssr_clk_src_twocell_get(struct of_phandle_args *clkspec,
274 void *data)
276 unsigned int clkidx = clkspec->args[1];
277 struct cpg_mssr_priv *priv = data;
278 struct device *dev = priv->dev;
279 unsigned int idx;
280 const char *type;
281 struct clk *clk;
282 int range_check;
284 switch (clkspec->args[0]) {
285 case CPG_CORE:
286 type = "core";
287 if (clkidx > priv->last_dt_core_clk) {
288 dev_err(dev, "Invalid %s clock index %u\n", type,
289 clkidx);
290 return ERR_PTR(-EINVAL);
292 clk = priv->clks[clkidx];
293 break;
295 case CPG_MOD:
296 type = "module";
297 if (priv->reg_layout == CLK_REG_LAYOUT_RZ_A) {
298 idx = MOD_CLK_PACK_10(clkidx);
299 range_check = 7 - (clkidx % 10);
300 } else {
301 idx = MOD_CLK_PACK(clkidx);
302 range_check = 31 - (clkidx % 100);
304 if (range_check < 0 || idx >= priv->num_mod_clks) {
305 dev_err(dev, "Invalid %s clock index %u\n", type,
306 clkidx);
307 return ERR_PTR(-EINVAL);
309 clk = priv->clks[priv->num_core_clks + idx];
310 break;
312 default:
313 dev_err(dev, "Invalid CPG clock type %u\n", clkspec->args[0]);
314 return ERR_PTR(-EINVAL);
317 if (IS_ERR(clk))
318 dev_err(dev, "Cannot get %s clock %u: %ld", type, clkidx,
319 PTR_ERR(clk));
320 else
321 dev_dbg(dev, "clock (%u, %u) is %pC at %lu Hz\n",
322 clkspec->args[0], clkspec->args[1], clk,
323 clk_get_rate(clk));
324 return clk;
327 static void __init cpg_mssr_register_core_clk(const struct cpg_core_clk *core,
328 const struct cpg_mssr_info *info,
329 struct cpg_mssr_priv *priv)
331 struct clk *clk = ERR_PTR(-ENOTSUPP), *parent;
332 struct device *dev = priv->dev;
333 unsigned int id = core->id, div = core->div;
334 const char *parent_name;
336 WARN_DEBUG(id >= priv->num_core_clks);
337 WARN_DEBUG(PTR_ERR(priv->clks[id]) != -ENOENT);
339 if (!core->name) {
340 /* Skip NULLified clock */
341 return;
344 switch (core->type) {
345 case CLK_TYPE_IN:
346 clk = of_clk_get_by_name(priv->np, core->name);
347 break;
349 case CLK_TYPE_FF:
350 case CLK_TYPE_DIV6P1:
351 case CLK_TYPE_DIV6_RO:
352 WARN_DEBUG(core->parent >= priv->num_core_clks);
353 parent = priv->clks[core->parent];
354 if (IS_ERR(parent)) {
355 clk = parent;
356 goto fail;
359 parent_name = __clk_get_name(parent);
361 if (core->type == CLK_TYPE_DIV6_RO)
362 /* Multiply with the DIV6 register value */
363 div *= (readl(priv->base + core->offset) & 0x3f) + 1;
365 if (core->type == CLK_TYPE_DIV6P1) {
366 clk = cpg_div6_register(core->name, 1, &parent_name,
367 priv->base + core->offset,
368 &priv->notifiers);
369 } else {
370 clk = clk_register_fixed_factor(NULL, core->name,
371 parent_name, 0,
372 core->mult, div);
374 break;
376 case CLK_TYPE_FR:
377 clk = clk_register_fixed_rate(NULL, core->name, NULL, 0,
378 core->mult);
379 break;
381 default:
382 if (info->cpg_clk_register)
383 clk = info->cpg_clk_register(dev, core, info,
384 priv->clks, priv->base,
385 &priv->notifiers);
386 else
387 dev_err(dev, "%s has unsupported core clock type %u\n",
388 core->name, core->type);
389 break;
392 if (IS_ERR_OR_NULL(clk))
393 goto fail;
395 dev_dbg(dev, "Core clock %pC at %lu Hz\n", clk, clk_get_rate(clk));
396 priv->clks[id] = clk;
397 return;
399 fail:
400 dev_err(dev, "Failed to register %s clock %s: %ld\n", "core",
401 core->name, PTR_ERR(clk));
404 static void __init cpg_mssr_register_mod_clk(const struct mssr_mod_clk *mod,
405 const struct cpg_mssr_info *info,
406 struct cpg_mssr_priv *priv)
408 struct mstp_clock *clock = NULL;
409 struct device *dev = priv->dev;
410 unsigned int id = mod->id;
411 struct clk_init_data init;
412 struct clk *parent, *clk;
413 const char *parent_name;
414 unsigned int i;
416 WARN_DEBUG(id < priv->num_core_clks);
417 WARN_DEBUG(id >= priv->num_core_clks + priv->num_mod_clks);
418 WARN_DEBUG(mod->parent >= priv->num_core_clks + priv->num_mod_clks);
419 WARN_DEBUG(PTR_ERR(priv->clks[id]) != -ENOENT);
421 if (!mod->name) {
422 /* Skip NULLified clock */
423 return;
426 parent = priv->clks[mod->parent];
427 if (IS_ERR(parent)) {
428 clk = parent;
429 goto fail;
432 clock = kzalloc(sizeof(*clock), GFP_KERNEL);
433 if (!clock) {
434 clk = ERR_PTR(-ENOMEM);
435 goto fail;
438 init.name = mod->name;
439 init.ops = &cpg_mstp_clock_ops;
440 init.flags = CLK_SET_RATE_PARENT;
441 parent_name = __clk_get_name(parent);
442 init.parent_names = &parent_name;
443 init.num_parents = 1;
445 clock->index = id - priv->num_core_clks;
446 clock->priv = priv;
447 clock->hw.init = &init;
449 for (i = 0; i < info->num_crit_mod_clks; i++)
450 if (id == info->crit_mod_clks[i] &&
451 cpg_mstp_clock_is_enabled(&clock->hw)) {
452 dev_dbg(dev, "MSTP %s setting CLK_IS_CRITICAL\n",
453 mod->name);
454 init.flags |= CLK_IS_CRITICAL;
455 break;
458 clk = clk_register(NULL, &clock->hw);
459 if (IS_ERR(clk))
460 goto fail;
462 dev_dbg(dev, "Module clock %pC at %lu Hz\n", clk, clk_get_rate(clk));
463 priv->clks[id] = clk;
464 priv->smstpcr_saved[clock->index / 32].mask |= BIT(clock->index % 32);
465 return;
467 fail:
468 dev_err(dev, "Failed to register %s clock %s: %ld\n", "module",
469 mod->name, PTR_ERR(clk));
470 kfree(clock);
473 struct cpg_mssr_clk_domain {
474 struct generic_pm_domain genpd;
475 unsigned int num_core_pm_clks;
476 unsigned int core_pm_clks[];
479 static struct cpg_mssr_clk_domain *cpg_mssr_clk_domain;
481 static bool cpg_mssr_is_pm_clk(const struct of_phandle_args *clkspec,
482 struct cpg_mssr_clk_domain *pd)
484 unsigned int i;
486 if (clkspec->np != pd->genpd.dev.of_node || clkspec->args_count != 2)
487 return false;
489 switch (clkspec->args[0]) {
490 case CPG_CORE:
491 for (i = 0; i < pd->num_core_pm_clks; i++)
492 if (clkspec->args[1] == pd->core_pm_clks[i])
493 return true;
494 return false;
496 case CPG_MOD:
497 return true;
499 default:
500 return false;
504 int cpg_mssr_attach_dev(struct generic_pm_domain *unused, struct device *dev)
506 struct cpg_mssr_clk_domain *pd = cpg_mssr_clk_domain;
507 struct device_node *np = dev->of_node;
508 struct of_phandle_args clkspec;
509 struct clk *clk;
510 int i = 0;
511 int error;
513 if (!pd) {
514 dev_dbg(dev, "CPG/MSSR clock domain not yet available\n");
515 return -EPROBE_DEFER;
518 while (!of_parse_phandle_with_args(np, "clocks", "#clock-cells", i,
519 &clkspec)) {
520 if (cpg_mssr_is_pm_clk(&clkspec, pd))
521 goto found;
523 of_node_put(clkspec.np);
524 i++;
527 return 0;
529 found:
530 clk = of_clk_get_from_provider(&clkspec);
531 of_node_put(clkspec.np);
533 if (IS_ERR(clk))
534 return PTR_ERR(clk);
536 error = pm_clk_create(dev);
537 if (error)
538 goto fail_put;
540 error = pm_clk_add_clk(dev, clk);
541 if (error)
542 goto fail_destroy;
544 return 0;
546 fail_destroy:
547 pm_clk_destroy(dev);
548 fail_put:
549 clk_put(clk);
550 return error;
553 void cpg_mssr_detach_dev(struct generic_pm_domain *unused, struct device *dev)
555 if (!pm_clk_no_clocks(dev))
556 pm_clk_destroy(dev);
559 static int __init cpg_mssr_add_clk_domain(struct device *dev,
560 const unsigned int *core_pm_clks,
561 unsigned int num_core_pm_clks)
563 struct device_node *np = dev->of_node;
564 struct generic_pm_domain *genpd;
565 struct cpg_mssr_clk_domain *pd;
566 size_t pm_size = num_core_pm_clks * sizeof(core_pm_clks[0]);
568 pd = devm_kzalloc(dev, sizeof(*pd) + pm_size, GFP_KERNEL);
569 if (!pd)
570 return -ENOMEM;
572 pd->num_core_pm_clks = num_core_pm_clks;
573 memcpy(pd->core_pm_clks, core_pm_clks, pm_size);
575 genpd = &pd->genpd;
576 genpd->name = np->name;
577 genpd->flags = GENPD_FLAG_PM_CLK | GENPD_FLAG_ALWAYS_ON |
578 GENPD_FLAG_ACTIVE_WAKEUP;
579 genpd->attach_dev = cpg_mssr_attach_dev;
580 genpd->detach_dev = cpg_mssr_detach_dev;
581 pm_genpd_init(genpd, &pm_domain_always_on_gov, false);
582 cpg_mssr_clk_domain = pd;
584 of_genpd_add_provider_simple(np, genpd);
585 return 0;
588 #ifdef CONFIG_RESET_CONTROLLER
590 #define rcdev_to_priv(x) container_of(x, struct cpg_mssr_priv, rcdev)
592 static int cpg_mssr_reset(struct reset_controller_dev *rcdev,
593 unsigned long id)
595 struct cpg_mssr_priv *priv = rcdev_to_priv(rcdev);
596 unsigned int reg = id / 32;
597 unsigned int bit = id % 32;
598 u32 bitmask = BIT(bit);
600 dev_dbg(priv->dev, "reset %u%02u\n", reg, bit);
602 /* Reset module */
603 writel(bitmask, priv->base + priv->reset_regs[reg]);
605 /* Wait for at least one cycle of the RCLK clock (@ ca. 32 kHz) */
606 udelay(35);
608 /* Release module from reset state */
609 writel(bitmask, priv->base + priv->reset_clear_regs[reg]);
611 return 0;
614 static int cpg_mssr_assert(struct reset_controller_dev *rcdev, unsigned long id)
616 struct cpg_mssr_priv *priv = rcdev_to_priv(rcdev);
617 unsigned int reg = id / 32;
618 unsigned int bit = id % 32;
619 u32 bitmask = BIT(bit);
621 dev_dbg(priv->dev, "assert %u%02u\n", reg, bit);
623 writel(bitmask, priv->base + priv->reset_regs[reg]);
624 return 0;
627 static int cpg_mssr_deassert(struct reset_controller_dev *rcdev,
628 unsigned long id)
630 struct cpg_mssr_priv *priv = rcdev_to_priv(rcdev);
631 unsigned int reg = id / 32;
632 unsigned int bit = id % 32;
633 u32 bitmask = BIT(bit);
635 dev_dbg(priv->dev, "deassert %u%02u\n", reg, bit);
637 writel(bitmask, priv->base + priv->reset_clear_regs[reg]);
638 return 0;
641 static int cpg_mssr_status(struct reset_controller_dev *rcdev,
642 unsigned long id)
644 struct cpg_mssr_priv *priv = rcdev_to_priv(rcdev);
645 unsigned int reg = id / 32;
646 unsigned int bit = id % 32;
647 u32 bitmask = BIT(bit);
649 return !!(readl(priv->base + priv->reset_regs[reg]) & bitmask);
652 static const struct reset_control_ops cpg_mssr_reset_ops = {
653 .reset = cpg_mssr_reset,
654 .assert = cpg_mssr_assert,
655 .deassert = cpg_mssr_deassert,
656 .status = cpg_mssr_status,
659 static int cpg_mssr_reset_xlate(struct reset_controller_dev *rcdev,
660 const struct of_phandle_args *reset_spec)
662 struct cpg_mssr_priv *priv = rcdev_to_priv(rcdev);
663 unsigned int unpacked = reset_spec->args[0];
664 unsigned int idx = MOD_CLK_PACK(unpacked);
666 if (unpacked % 100 > 31 || idx >= rcdev->nr_resets) {
667 dev_err(priv->dev, "Invalid reset index %u\n", unpacked);
668 return -EINVAL;
671 return idx;
674 static int cpg_mssr_reset_controller_register(struct cpg_mssr_priv *priv)
676 priv->rcdev.ops = &cpg_mssr_reset_ops;
677 priv->rcdev.of_node = priv->dev->of_node;
678 priv->rcdev.of_reset_n_cells = 1;
679 priv->rcdev.of_xlate = cpg_mssr_reset_xlate;
680 priv->rcdev.nr_resets = priv->num_mod_clks;
681 return devm_reset_controller_register(priv->dev, &priv->rcdev);
684 #else /* !CONFIG_RESET_CONTROLLER */
685 static inline int cpg_mssr_reset_controller_register(struct cpg_mssr_priv *priv)
687 return 0;
689 #endif /* !CONFIG_RESET_CONTROLLER */
692 static const struct of_device_id cpg_mssr_match[] = {
693 #ifdef CONFIG_CLK_R7S9210
695 .compatible = "renesas,r7s9210-cpg-mssr",
696 .data = &r7s9210_cpg_mssr_info,
698 #endif
699 #ifdef CONFIG_CLK_R8A7742
701 .compatible = "renesas,r8a7742-cpg-mssr",
702 .data = &r8a7742_cpg_mssr_info,
704 #endif
705 #ifdef CONFIG_CLK_R8A7743
707 .compatible = "renesas,r8a7743-cpg-mssr",
708 .data = &r8a7743_cpg_mssr_info,
710 /* RZ/G1N is (almost) identical to RZ/G1M w.r.t. clocks. */
712 .compatible = "renesas,r8a7744-cpg-mssr",
713 .data = &r8a7743_cpg_mssr_info,
715 #endif
716 #ifdef CONFIG_CLK_R8A7745
718 .compatible = "renesas,r8a7745-cpg-mssr",
719 .data = &r8a7745_cpg_mssr_info,
721 #endif
722 #ifdef CONFIG_CLK_R8A77470
724 .compatible = "renesas,r8a77470-cpg-mssr",
725 .data = &r8a77470_cpg_mssr_info,
727 #endif
728 #ifdef CONFIG_CLK_R8A774A1
730 .compatible = "renesas,r8a774a1-cpg-mssr",
731 .data = &r8a774a1_cpg_mssr_info,
733 #endif
734 #ifdef CONFIG_CLK_R8A774B1
736 .compatible = "renesas,r8a774b1-cpg-mssr",
737 .data = &r8a774b1_cpg_mssr_info,
739 #endif
740 #ifdef CONFIG_CLK_R8A774C0
742 .compatible = "renesas,r8a774c0-cpg-mssr",
743 .data = &r8a774c0_cpg_mssr_info,
745 #endif
746 #ifdef CONFIG_CLK_R8A774E1
748 .compatible = "renesas,r8a774e1-cpg-mssr",
749 .data = &r8a774e1_cpg_mssr_info,
751 #endif
752 #ifdef CONFIG_CLK_R8A7790
754 .compatible = "renesas,r8a7790-cpg-mssr",
755 .data = &r8a7790_cpg_mssr_info,
757 #endif
758 #ifdef CONFIG_CLK_R8A7791
760 .compatible = "renesas,r8a7791-cpg-mssr",
761 .data = &r8a7791_cpg_mssr_info,
763 /* R-Car M2-N is (almost) identical to R-Car M2-W w.r.t. clocks. */
765 .compatible = "renesas,r8a7793-cpg-mssr",
766 .data = &r8a7791_cpg_mssr_info,
768 #endif
769 #ifdef CONFIG_CLK_R8A7792
771 .compatible = "renesas,r8a7792-cpg-mssr",
772 .data = &r8a7792_cpg_mssr_info,
774 #endif
775 #ifdef CONFIG_CLK_R8A7794
777 .compatible = "renesas,r8a7794-cpg-mssr",
778 .data = &r8a7794_cpg_mssr_info,
780 #endif
781 #ifdef CONFIG_CLK_R8A7795
783 .compatible = "renesas,r8a7795-cpg-mssr",
784 .data = &r8a7795_cpg_mssr_info,
786 #endif
787 #ifdef CONFIG_CLK_R8A77960
789 .compatible = "renesas,r8a7796-cpg-mssr",
790 .data = &r8a7796_cpg_mssr_info,
792 #endif
793 #ifdef CONFIG_CLK_R8A77961
795 .compatible = "renesas,r8a77961-cpg-mssr",
796 .data = &r8a7796_cpg_mssr_info,
798 #endif
799 #ifdef CONFIG_CLK_R8A77965
801 .compatible = "renesas,r8a77965-cpg-mssr",
802 .data = &r8a77965_cpg_mssr_info,
804 #endif
805 #ifdef CONFIG_CLK_R8A77970
807 .compatible = "renesas,r8a77970-cpg-mssr",
808 .data = &r8a77970_cpg_mssr_info,
810 #endif
811 #ifdef CONFIG_CLK_R8A77980
813 .compatible = "renesas,r8a77980-cpg-mssr",
814 .data = &r8a77980_cpg_mssr_info,
816 #endif
817 #ifdef CONFIG_CLK_R8A77990
819 .compatible = "renesas,r8a77990-cpg-mssr",
820 .data = &r8a77990_cpg_mssr_info,
822 #endif
823 #ifdef CONFIG_CLK_R8A77995
825 .compatible = "renesas,r8a77995-cpg-mssr",
826 .data = &r8a77995_cpg_mssr_info,
828 #endif
829 #ifdef CONFIG_CLK_R8A779A0
831 .compatible = "renesas,r8a779a0-cpg-mssr",
832 .data = &r8a779a0_cpg_mssr_info,
834 #endif
835 { /* sentinel */ }
838 static void cpg_mssr_del_clk_provider(void *data)
840 of_clk_del_provider(data);
843 #if defined(CONFIG_PM_SLEEP) && defined(CONFIG_ARM_PSCI_FW)
844 static int cpg_mssr_suspend_noirq(struct device *dev)
846 struct cpg_mssr_priv *priv = dev_get_drvdata(dev);
847 unsigned int reg;
849 /* This is the best we can do to check for the presence of PSCI */
850 if (!psci_ops.cpu_suspend)
851 return 0;
853 /* Save module registers with bits under our control */
854 for (reg = 0; reg < ARRAY_SIZE(priv->smstpcr_saved); reg++) {
855 if (priv->smstpcr_saved[reg].mask)
856 priv->smstpcr_saved[reg].val =
857 priv->reg_layout == CLK_REG_LAYOUT_RZ_A ?
858 readb(priv->base + priv->control_regs[reg]) :
859 readl(priv->base + priv->control_regs[reg]);
862 /* Save core clocks */
863 raw_notifier_call_chain(&priv->notifiers, PM_EVENT_SUSPEND, NULL);
865 return 0;
868 static int cpg_mssr_resume_noirq(struct device *dev)
870 struct cpg_mssr_priv *priv = dev_get_drvdata(dev);
871 unsigned int reg, i;
872 u32 mask, oldval, newval;
874 /* This is the best we can do to check for the presence of PSCI */
875 if (!psci_ops.cpu_suspend)
876 return 0;
878 /* Restore core clocks */
879 raw_notifier_call_chain(&priv->notifiers, PM_EVENT_RESUME, NULL);
881 /* Restore module clocks */
882 for (reg = 0; reg < ARRAY_SIZE(priv->smstpcr_saved); reg++) {
883 mask = priv->smstpcr_saved[reg].mask;
884 if (!mask)
885 continue;
887 if (priv->reg_layout == CLK_REG_LAYOUT_RZ_A)
888 oldval = readb(priv->base + priv->control_regs[reg]);
889 else
890 oldval = readl(priv->base + priv->control_regs[reg]);
891 newval = oldval & ~mask;
892 newval |= priv->smstpcr_saved[reg].val & mask;
893 if (newval == oldval)
894 continue;
896 if (priv->reg_layout == CLK_REG_LAYOUT_RZ_A) {
897 writeb(newval, priv->base + priv->control_regs[reg]);
898 /* dummy read to ensure write has completed */
899 readb(priv->base + priv->control_regs[reg]);
900 barrier_data(priv->base + priv->control_regs[reg]);
901 continue;
902 } else
903 writel(newval, priv->base + priv->control_regs[reg]);
905 /* Wait until enabled clocks are really enabled */
906 mask &= ~priv->smstpcr_saved[reg].val;
907 if (!mask)
908 continue;
910 for (i = 1000; i > 0; --i) {
911 oldval = readl(priv->base + priv->status_regs[reg]);
912 if (!(oldval & mask))
913 break;
914 cpu_relax();
917 if (!i)
918 dev_warn(dev, "Failed to enable %s%u[0x%x]\n",
919 priv->reg_layout == CLK_REG_LAYOUT_RZ_A ?
920 "STB" : "SMSTP", reg, oldval & mask);
923 return 0;
926 static const struct dev_pm_ops cpg_mssr_pm = {
927 SET_NOIRQ_SYSTEM_SLEEP_PM_OPS(cpg_mssr_suspend_noirq,
928 cpg_mssr_resume_noirq)
930 #define DEV_PM_OPS &cpg_mssr_pm
931 #else
932 #define DEV_PM_OPS NULL
933 #endif /* CONFIG_PM_SLEEP && CONFIG_ARM_PSCI_FW */
935 static int __init cpg_mssr_common_init(struct device *dev,
936 struct device_node *np,
937 const struct cpg_mssr_info *info)
939 struct cpg_mssr_priv *priv;
940 unsigned int nclks, i;
941 int error;
943 if (info->init) {
944 error = info->init(dev);
945 if (error)
946 return error;
949 nclks = info->num_total_core_clks + info->num_hw_mod_clks;
950 priv = kzalloc(struct_size(priv, clks, nclks), GFP_KERNEL);
951 if (!priv)
952 return -ENOMEM;
954 priv->np = np;
955 priv->dev = dev;
956 spin_lock_init(&priv->rmw_lock);
958 priv->base = of_iomap(np, 0);
959 if (!priv->base) {
960 error = -ENOMEM;
961 goto out_err;
964 cpg_mssr_priv = priv;
965 priv->num_core_clks = info->num_total_core_clks;
966 priv->num_mod_clks = info->num_hw_mod_clks;
967 priv->last_dt_core_clk = info->last_dt_core_clk;
968 RAW_INIT_NOTIFIER_HEAD(&priv->notifiers);
969 priv->reg_layout = info->reg_layout;
970 if (priv->reg_layout == CLK_REG_LAYOUT_RCAR_GEN2_AND_GEN3) {
971 priv->status_regs = mstpsr;
972 priv->control_regs = smstpcr;
973 priv->reset_regs = srcr;
974 priv->reset_clear_regs = srstclr;
975 } else if (priv->reg_layout == CLK_REG_LAYOUT_RZ_A) {
976 priv->control_regs = stbcr;
977 } else if (priv->reg_layout == CLK_REG_LAYOUT_RCAR_V3U) {
978 priv->status_regs = mstpsr_for_v3u;
979 priv->control_regs = mstpcr_for_v3u;
980 priv->reset_regs = srcr_for_v3u;
981 priv->reset_clear_regs = srstclr_for_v3u;
982 } else {
983 error = -EINVAL;
984 goto out_err;
987 for (i = 0; i < nclks; i++)
988 priv->clks[i] = ERR_PTR(-ENOENT);
990 error = of_clk_add_provider(np, cpg_mssr_clk_src_twocell_get, priv);
991 if (error)
992 goto out_err;
994 return 0;
996 out_err:
997 if (priv->base)
998 iounmap(priv->base);
999 kfree(priv);
1001 return error;
1004 void __init cpg_mssr_early_init(struct device_node *np,
1005 const struct cpg_mssr_info *info)
1007 int error;
1008 int i;
1010 error = cpg_mssr_common_init(NULL, np, info);
1011 if (error)
1012 return;
1014 for (i = 0; i < info->num_early_core_clks; i++)
1015 cpg_mssr_register_core_clk(&info->early_core_clks[i], info,
1016 cpg_mssr_priv);
1018 for (i = 0; i < info->num_early_mod_clks; i++)
1019 cpg_mssr_register_mod_clk(&info->early_mod_clks[i], info,
1020 cpg_mssr_priv);
1024 static int __init cpg_mssr_probe(struct platform_device *pdev)
1026 struct device *dev = &pdev->dev;
1027 struct device_node *np = dev->of_node;
1028 const struct cpg_mssr_info *info;
1029 struct cpg_mssr_priv *priv;
1030 unsigned int i;
1031 int error;
1033 info = of_device_get_match_data(dev);
1035 if (!cpg_mssr_priv) {
1036 error = cpg_mssr_common_init(dev, dev->of_node, info);
1037 if (error)
1038 return error;
1041 priv = cpg_mssr_priv;
1042 priv->dev = dev;
1043 dev_set_drvdata(dev, priv);
1045 for (i = 0; i < info->num_core_clks; i++)
1046 cpg_mssr_register_core_clk(&info->core_clks[i], info, priv);
1048 for (i = 0; i < info->num_mod_clks; i++)
1049 cpg_mssr_register_mod_clk(&info->mod_clks[i], info, priv);
1051 error = devm_add_action_or_reset(dev,
1052 cpg_mssr_del_clk_provider,
1053 np);
1054 if (error)
1055 return error;
1057 error = cpg_mssr_add_clk_domain(dev, info->core_pm_clks,
1058 info->num_core_pm_clks);
1059 if (error)
1060 return error;
1062 /* Reset Controller not supported for Standby Control SoCs */
1063 if (priv->reg_layout == CLK_REG_LAYOUT_RZ_A)
1064 return 0;
1066 error = cpg_mssr_reset_controller_register(priv);
1067 if (error)
1068 return error;
1070 return 0;
1073 static struct platform_driver cpg_mssr_driver = {
1074 .driver = {
1075 .name = "renesas-cpg-mssr",
1076 .of_match_table = cpg_mssr_match,
1077 .pm = DEV_PM_OPS,
1081 static int __init cpg_mssr_init(void)
1083 return platform_driver_probe(&cpg_mssr_driver, cpg_mssr_probe);
1086 subsys_initcall(cpg_mssr_init);
1088 void __init cpg_core_nullify_range(struct cpg_core_clk *core_clks,
1089 unsigned int num_core_clks,
1090 unsigned int first_clk,
1091 unsigned int last_clk)
1093 unsigned int i;
1095 for (i = 0; i < num_core_clks; i++)
1096 if (core_clks[i].id >= first_clk &&
1097 core_clks[i].id <= last_clk)
1098 core_clks[i].name = NULL;
1101 void __init mssr_mod_nullify(struct mssr_mod_clk *mod_clks,
1102 unsigned int num_mod_clks,
1103 const unsigned int *clks, unsigned int n)
1105 unsigned int i, j;
1107 for (i = 0, j = 0; i < num_mod_clks && j < n; i++)
1108 if (mod_clks[i].id == clks[j]) {
1109 mod_clks[i].name = NULL;
1110 j++;
1114 void __init mssr_mod_reparent(struct mssr_mod_clk *mod_clks,
1115 unsigned int num_mod_clks,
1116 const struct mssr_mod_reparent *clks,
1117 unsigned int n)
1119 unsigned int i, j;
1121 for (i = 0, j = 0; i < num_mod_clks && j < n; i++)
1122 if (mod_clks[i].id == clks[j].clk) {
1123 mod_clks[i].parent = clks[j].parent;
1124 j++;
1128 MODULE_DESCRIPTION("Renesas CPG/MSSR Driver");
1129 MODULE_LICENSE("GPL v2");