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_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,
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
;
149 enum clk_reg_layout reg_layout
;
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
;
165 } smstpcr_saved
[ARRAY_SIZE(mstpsr_for_v3u
)];
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
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
);
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
]);
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
]);
214 value
= readl(priv
->base
+ priv
->control_regs
[reg
]);
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
)
227 for (i
= 1000; i
> 0; --i
) {
228 if (!(readl(priv
->base
+ priv
->status_regs
[reg
]) & bitmask
))
234 dev_err(dev
, "Failed to enable SMSTP %p[%d]\n",
235 priv
->base
+ priv
->control_regs
[reg
], bit
);
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
;
258 if (priv
->reg_layout
== CLK_REG_LAYOUT_RZ_A
)
259 value
= readb(priv
->base
+ priv
->control_regs
[clock
->index
/ 32]);
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
,
273 struct clk
*cpg_mssr_clk_src_twocell_get(struct of_phandle_args
*clkspec
,
276 unsigned int clkidx
= clkspec
->args
[1];
277 struct cpg_mssr_priv
*priv
= data
;
278 struct device
*dev
= priv
->dev
;
284 switch (clkspec
->args
[0]) {
287 if (clkidx
> priv
->last_dt_core_clk
) {
288 dev_err(dev
, "Invalid %s clock index %u\n", type
,
290 return ERR_PTR(-EINVAL
);
292 clk
= priv
->clks
[clkidx
];
297 if (priv
->reg_layout
== CLK_REG_LAYOUT_RZ_A
) {
298 idx
= MOD_CLK_PACK_10(clkidx
);
299 range_check
= 7 - (clkidx
% 10);
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
,
307 return ERR_PTR(-EINVAL
);
309 clk
= priv
->clks
[priv
->num_core_clks
+ idx
];
313 dev_err(dev
, "Invalid CPG clock type %u\n", clkspec
->args
[0]);
314 return ERR_PTR(-EINVAL
);
318 dev_err(dev
, "Cannot get %s clock %u: %ld", type
, clkidx
,
321 dev_dbg(dev
, "clock (%u, %u) is %pC at %lu Hz\n",
322 clkspec
->args
[0], clkspec
->args
[1], 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
);
340 /* Skip NULLified clock */
344 switch (core
->type
) {
346 clk
= of_clk_get_by_name(priv
->np
, core
->name
);
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
)) {
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
,
370 clk
= clk_register_fixed_factor(NULL
, core
->name
,
377 clk
= clk_register_fixed_rate(NULL
, core
->name
, NULL
, 0,
382 if (info
->cpg_clk_register
)
383 clk
= info
->cpg_clk_register(dev
, core
, info
,
384 priv
->clks
, priv
->base
,
387 dev_err(dev
, "%s has unsupported core clock type %u\n",
388 core
->name
, core
->type
);
392 if (IS_ERR_OR_NULL(clk
))
395 dev_dbg(dev
, "Core clock %pC at %lu Hz\n", clk
, clk_get_rate(clk
));
396 priv
->clks
[id
] = clk
;
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
;
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
);
422 /* Skip NULLified clock */
426 parent
= priv
->clks
[mod
->parent
];
427 if (IS_ERR(parent
)) {
432 clock
= kzalloc(sizeof(*clock
), GFP_KERNEL
);
434 clk
= ERR_PTR(-ENOMEM
);
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
;
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",
454 init
.flags
|= CLK_IS_CRITICAL
;
458 clk
= clk_register(NULL
, &clock
->hw
);
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);
468 dev_err(dev
, "Failed to register %s clock %s: %ld\n", "module",
469 mod
->name
, PTR_ERR(clk
));
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
)
486 if (clkspec
->np
!= pd
->genpd
.dev
.of_node
|| clkspec
->args_count
!= 2)
489 switch (clkspec
->args
[0]) {
491 for (i
= 0; i
< pd
->num_core_pm_clks
; i
++)
492 if (clkspec
->args
[1] == pd
->core_pm_clks
[i
])
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
;
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
,
520 if (cpg_mssr_is_pm_clk(&clkspec
, pd
))
523 of_node_put(clkspec
.np
);
530 clk
= of_clk_get_from_provider(&clkspec
);
531 of_node_put(clkspec
.np
);
536 error
= pm_clk_create(dev
);
540 error
= pm_clk_add_clk(dev
, clk
);
553 void cpg_mssr_detach_dev(struct generic_pm_domain
*unused
, struct device
*dev
)
555 if (!pm_clk_no_clocks(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
);
572 pd
->num_core_pm_clks
= num_core_pm_clks
;
573 memcpy(pd
->core_pm_clks
, core_pm_clks
, pm_size
);
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
);
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
,
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
);
603 writel(bitmask
, priv
->base
+ priv
->reset_regs
[reg
]);
605 /* Wait for at least one cycle of the RCLK clock (@ ca. 32 kHz) */
608 /* Release module from reset state */
609 writel(bitmask
, priv
->base
+ priv
->reset_clear_regs
[reg
]);
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
]);
627 static int cpg_mssr_deassert(struct reset_controller_dev
*rcdev
,
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
]);
641 static int cpg_mssr_status(struct reset_controller_dev
*rcdev
,
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
);
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
)
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
,
699 #ifdef CONFIG_CLK_R8A7742
701 .compatible
= "renesas,r8a7742-cpg-mssr",
702 .data
= &r8a7742_cpg_mssr_info
,
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
,
716 #ifdef CONFIG_CLK_R8A7745
718 .compatible
= "renesas,r8a7745-cpg-mssr",
719 .data
= &r8a7745_cpg_mssr_info
,
722 #ifdef CONFIG_CLK_R8A77470
724 .compatible
= "renesas,r8a77470-cpg-mssr",
725 .data
= &r8a77470_cpg_mssr_info
,
728 #ifdef CONFIG_CLK_R8A774A1
730 .compatible
= "renesas,r8a774a1-cpg-mssr",
731 .data
= &r8a774a1_cpg_mssr_info
,
734 #ifdef CONFIG_CLK_R8A774B1
736 .compatible
= "renesas,r8a774b1-cpg-mssr",
737 .data
= &r8a774b1_cpg_mssr_info
,
740 #ifdef CONFIG_CLK_R8A774C0
742 .compatible
= "renesas,r8a774c0-cpg-mssr",
743 .data
= &r8a774c0_cpg_mssr_info
,
746 #ifdef CONFIG_CLK_R8A774E1
748 .compatible
= "renesas,r8a774e1-cpg-mssr",
749 .data
= &r8a774e1_cpg_mssr_info
,
752 #ifdef CONFIG_CLK_R8A7790
754 .compatible
= "renesas,r8a7790-cpg-mssr",
755 .data
= &r8a7790_cpg_mssr_info
,
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
,
769 #ifdef CONFIG_CLK_R8A7792
771 .compatible
= "renesas,r8a7792-cpg-mssr",
772 .data
= &r8a7792_cpg_mssr_info
,
775 #ifdef CONFIG_CLK_R8A7794
777 .compatible
= "renesas,r8a7794-cpg-mssr",
778 .data
= &r8a7794_cpg_mssr_info
,
781 #ifdef CONFIG_CLK_R8A7795
783 .compatible
= "renesas,r8a7795-cpg-mssr",
784 .data
= &r8a7795_cpg_mssr_info
,
787 #ifdef CONFIG_CLK_R8A77960
789 .compatible
= "renesas,r8a7796-cpg-mssr",
790 .data
= &r8a7796_cpg_mssr_info
,
793 #ifdef CONFIG_CLK_R8A77961
795 .compatible
= "renesas,r8a77961-cpg-mssr",
796 .data
= &r8a7796_cpg_mssr_info
,
799 #ifdef CONFIG_CLK_R8A77965
801 .compatible
= "renesas,r8a77965-cpg-mssr",
802 .data
= &r8a77965_cpg_mssr_info
,
805 #ifdef CONFIG_CLK_R8A77970
807 .compatible
= "renesas,r8a77970-cpg-mssr",
808 .data
= &r8a77970_cpg_mssr_info
,
811 #ifdef CONFIG_CLK_R8A77980
813 .compatible
= "renesas,r8a77980-cpg-mssr",
814 .data
= &r8a77980_cpg_mssr_info
,
817 #ifdef CONFIG_CLK_R8A77990
819 .compatible
= "renesas,r8a77990-cpg-mssr",
820 .data
= &r8a77990_cpg_mssr_info
,
823 #ifdef CONFIG_CLK_R8A77995
825 .compatible
= "renesas,r8a77995-cpg-mssr",
826 .data
= &r8a77995_cpg_mssr_info
,
829 #ifdef CONFIG_CLK_R8A779A0
831 .compatible
= "renesas,r8a779a0-cpg-mssr",
832 .data
= &r8a779a0_cpg_mssr_info
,
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
);
849 /* This is the best we can do to check for the presence of PSCI */
850 if (!psci_ops
.cpu_suspend
)
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
);
868 static int cpg_mssr_resume_noirq(struct device
*dev
)
870 struct cpg_mssr_priv
*priv
= dev_get_drvdata(dev
);
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
)
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
;
887 if (priv
->reg_layout
== CLK_REG_LAYOUT_RZ_A
)
888 oldval
= readb(priv
->base
+ priv
->control_regs
[reg
]);
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
)
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
]);
903 writel(newval
, priv
->base
+ priv
->control_regs
[reg
]);
905 /* Wait until enabled clocks are really enabled */
906 mask
&= ~priv
->smstpcr_saved
[reg
].val
;
910 for (i
= 1000; i
> 0; --i
) {
911 oldval
= readl(priv
->base
+ priv
->status_regs
[reg
]);
912 if (!(oldval
& mask
))
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
);
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
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
;
944 error
= info
->init(dev
);
949 nclks
= info
->num_total_core_clks
+ info
->num_hw_mod_clks
;
950 priv
= kzalloc(struct_size(priv
, clks
, nclks
), GFP_KERNEL
);
956 spin_lock_init(&priv
->rmw_lock
);
958 priv
->base
= of_iomap(np
, 0);
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
;
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
);
1004 void __init
cpg_mssr_early_init(struct device_node
*np
,
1005 const struct cpg_mssr_info
*info
)
1010 error
= cpg_mssr_common_init(NULL
, np
, info
);
1014 for (i
= 0; i
< info
->num_early_core_clks
; i
++)
1015 cpg_mssr_register_core_clk(&info
->early_core_clks
[i
], info
,
1018 for (i
= 0; i
< info
->num_early_mod_clks
; i
++)
1019 cpg_mssr_register_mod_clk(&info
->early_mod_clks
[i
], info
,
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
;
1033 info
= of_device_get_match_data(dev
);
1035 if (!cpg_mssr_priv
) {
1036 error
= cpg_mssr_common_init(dev
, dev
->of_node
, info
);
1041 priv
= cpg_mssr_priv
;
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
,
1057 error
= cpg_mssr_add_clk_domain(dev
, info
->core_pm_clks
,
1058 info
->num_core_pm_clks
);
1062 /* Reset Controller not supported for Standby Control SoCs */
1063 if (priv
->reg_layout
== CLK_REG_LAYOUT_RZ_A
)
1066 error
= cpg_mssr_reset_controller_register(priv
);
1073 static struct platform_driver cpg_mssr_driver
= {
1075 .name
= "renesas-cpg-mssr",
1076 .of_match_table
= cpg_mssr_match
,
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
)
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
)
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
;
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
,
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
;
1128 MODULE_DESCRIPTION("Renesas CPG/MSSR Driver");
1129 MODULE_LICENSE("GPL v2");