Skip to content

Commit c3e67ad

Browse files
bijudasgeertu
authored andcommitted
dt-bindings: clock: r9a07g044-cpg: Update clock/reset definitions
Update clock and reset definitions as per RZ/G2L_clock_list_r02_02.xlsx and RZ/G2L HW(Rev.0.50) manual. Update {GIC,IA55,SCIF} clock and reset entries in the CPG driver, and separate reset from module clocks in order to handle them efficiently. Update the SCIF0 clock and reset index in the SoC DTSI. Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com> Reviewed-by: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com> Link: https://lore.kernel.org/r/20210626081344.5783-6-biju.das.jz@bp.renesas.com Link: https://lore.kernel.org/r/20210626081344.5783-7-biju.das.jz@bp.renesas.com Link: https://lore.kernel.org/r/20210626081344.5783-8-biju.das.jz@bp.renesas.com [geert: Squashed 3 commits] Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
1 parent 668756f commit c3e67ad

5 files changed

Lines changed: 278 additions & 119 deletions

File tree

arch/arm64/boot/dts/renesas/r9a07g044.dtsi

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -82,10 +82,10 @@
8282
<GIC_SPI 384 IRQ_TYPE_LEVEL_HIGH>;
8383
interrupt-names = "eri", "rxi", "txi",
8484
"bri", "dri", "tei";
85-
clocks = <&cpg CPG_MOD R9A07G044_CLK_SCIF0>;
85+
clocks = <&cpg CPG_MOD R9A07G044_SCIF0_CLK_PCK>;
8686
clock-names = "fck";
8787
power-domains = <&cpg>;
88-
resets = <&cpg R9A07G044_CLK_SCIF0>;
88+
resets = <&cpg R9A07G044_SCIF0_RST_SYSTEM_N>;
8989
status = "disabled";
9090
};
9191

drivers/clk/renesas/r9a07g044-cpg.c

Lines changed: 36 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -84,34 +84,40 @@ static const struct cpg_core_clk r9a07g044_core_clks[] __initconst = {
8484
};
8585

8686
static struct rzg2l_mod_clk r9a07g044_mod_clks[] = {
87-
DEF_MOD("gic", R9A07G044_CLK_GIC600,
88-
R9A07G044_CLK_P1,
89-
0x514, BIT(0), (BIT(0) | BIT(1))),
90-
DEF_MOD("ia55", R9A07G044_CLK_IA55,
91-
R9A07G044_CLK_P1,
92-
0x518, (BIT(0) | BIT(1)), BIT(0)),
93-
DEF_MOD("scif0", R9A07G044_CLK_SCIF0,
94-
R9A07G044_CLK_P0,
95-
0x584, BIT(0), BIT(0)),
96-
DEF_MOD("scif1", R9A07G044_CLK_SCIF1,
97-
R9A07G044_CLK_P0,
98-
0x584, BIT(1), BIT(1)),
99-
DEF_MOD("scif2", R9A07G044_CLK_SCIF2,
100-
R9A07G044_CLK_P0,
101-
0x584, BIT(2), BIT(2)),
102-
DEF_MOD("scif3", R9A07G044_CLK_SCIF3,
103-
R9A07G044_CLK_P0,
104-
0x584, BIT(3), BIT(3)),
105-
DEF_MOD("scif4", R9A07G044_CLK_SCIF4,
106-
R9A07G044_CLK_P0,
107-
0x584, BIT(4), BIT(4)),
108-
DEF_MOD("sci0", R9A07G044_CLK_SCI0,
109-
R9A07G044_CLK_P0,
110-
0x588, BIT(0), BIT(0)),
87+
DEF_MOD("gic", R9A07G044_GIC600_GICCLK, R9A07G044_CLK_P1,
88+
0x514, 0),
89+
DEF_MOD("ia55_pclk", R9A07G044_IA55_PCLK, R9A07G044_CLK_P2,
90+
0x518, 0),
91+
DEF_MOD("ia55_clk", R9A07G044_IA55_CLK, R9A07G044_CLK_P1,
92+
0x518, 1),
93+
DEF_MOD("scif0", R9A07G044_SCIF0_CLK_PCK, R9A07G044_CLK_P0,
94+
0x584, 0),
95+
DEF_MOD("scif1", R9A07G044_SCIF1_CLK_PCK, R9A07G044_CLK_P0,
96+
0x584, 1),
97+
DEF_MOD("scif2", R9A07G044_SCIF2_CLK_PCK, R9A07G044_CLK_P0,
98+
0x584, 2),
99+
DEF_MOD("scif3", R9A07G044_SCIF3_CLK_PCK, R9A07G044_CLK_P0,
100+
0x584, 3),
101+
DEF_MOD("scif4", R9A07G044_SCIF4_CLK_PCK, R9A07G044_CLK_P0,
102+
0x584, 4),
103+
DEF_MOD("sci0", R9A07G044_SCI0_CLKP, R9A07G044_CLK_P0,
104+
0x588, 0),
105+
};
106+
107+
static struct rzg2l_reset r9a07g044_resets[] = {
108+
DEF_RST(R9A07G044_GIC600_GICRESET_N, 0x814, 0),
109+
DEF_RST(R9A07G044_GIC600_DBG_GICRESET_N, 0x814, 1),
110+
DEF_RST(R9A07G044_IA55_RESETN, 0x818, 0),
111+
DEF_RST(R9A07G044_SCIF0_RST_SYSTEM_N, 0x884, 0),
112+
DEF_RST(R9A07G044_SCIF1_RST_SYSTEM_N, 0x884, 1),
113+
DEF_RST(R9A07G044_SCIF2_RST_SYSTEM_N, 0x884, 2),
114+
DEF_RST(R9A07G044_SCIF3_RST_SYSTEM_N, 0x884, 3),
115+
DEF_RST(R9A07G044_SCIF4_RST_SYSTEM_N, 0x884, 4),
116+
DEF_RST(R9A07G044_SCI0_RST, 0x888, 0),
111117
};
112118

113119
static const unsigned int r9a07g044_crit_mod_clks[] __initconst = {
114-
MOD_CLK_BASE + R9A07G044_CLK_GIC600,
120+
MOD_CLK_BASE + R9A07G044_GIC600_GICCLK,
115121
};
116122

117123
const struct rzg2l_cpg_info r9a07g044_cpg_info = {
@@ -128,5 +134,9 @@ const struct rzg2l_cpg_info r9a07g044_cpg_info = {
128134
/* Module Clocks */
129135
.mod_clks = r9a07g044_mod_clks,
130136
.num_mod_clks = ARRAY_SIZE(r9a07g044_mod_clks),
131-
.num_hw_mod_clks = R9A07G044_CLK_MIPI_DSI_PIN + 1,
137+
.num_hw_mod_clks = R9A07G044_TSU_PCLK + 1,
138+
139+
/* Resets */
140+
.resets = r9a07g044_resets,
141+
.num_resets = ARRAY_SIZE(r9a07g044_resets),
132142
};

drivers/clk/renesas/renesas-rzg2l-cpg.c

Lines changed: 30 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -47,9 +47,9 @@
4747
#define SDIV(val) DIV_RSMASK(val, 0, 0x7)
4848

4949
#define CLK_ON_R(reg) (reg)
50-
#define CLK_MON_R(reg) (0x680 - 0x500 + (reg))
51-
#define CLK_RST_R(reg) (0x800 - 0x500 + (reg))
52-
#define CLK_MRST_R(reg) (0x980 - 0x500 + (reg))
50+
#define CLK_MON_R(reg) (0x180 + (reg))
51+
#define CLK_RST_R(reg) (reg)
52+
#define CLK_MRST_R(reg) (0x180 + (reg))
5353

5454
#define GET_REG_OFFSET(val) ((val >> 20) & 0xfff)
5555
#define GET_REG_SAMPLL_CLK1(val) ((val >> 22) & 0xfff)
@@ -78,6 +78,7 @@ struct rzg2l_cpg_priv {
7878
struct clk **clks;
7979
unsigned int num_core_clks;
8080
unsigned int num_mod_clks;
81+
unsigned int num_resets;
8182
unsigned int last_dt_core_clk;
8283

8384
struct raw_notifier_head notifiers;
@@ -315,15 +316,13 @@ rzg2l_cpg_register_core_clk(const struct cpg_core_clk *core,
315316
*
316317
* @hw: handle between common and hardware-specific interfaces
317318
* @off: register offset
318-
* @onoff: ON/MON bits
319-
* @reset: reset bits
319+
* @bit: ON/MON bit
320320
* @priv: CPG/MSTP private data
321321
*/
322322
struct mstp_clock {
323323
struct clk_hw hw;
324324
u16 off;
325-
u8 onoff;
326-
u8 reset;
325+
u8 bit;
327326
struct rzg2l_cpg_priv *priv;
328327
};
329328

@@ -337,6 +336,7 @@ static int rzg2l_mod_clock_endisable(struct clk_hw *hw, bool enable)
337336
struct device *dev = priv->dev;
338337
unsigned long flags;
339338
unsigned int i;
339+
u32 bitmask = BIT(clock->bit);
340340
u32 value;
341341

342342
if (!clock->off) {
@@ -349,9 +349,9 @@ static int rzg2l_mod_clock_endisable(struct clk_hw *hw, bool enable)
349349
spin_lock_irqsave(&priv->rmw_lock, flags);
350350

351351
if (enable)
352-
value = (clock->onoff << 16) | clock->onoff;
352+
value = (bitmask << 16) | bitmask;
353353
else
354-
value = clock->onoff << 16;
354+
value = bitmask << 16;
355355
writel(value, priv->base + CLK_ON_R(reg));
356356

357357
spin_unlock_irqrestore(&priv->rmw_lock, flags);
@@ -360,7 +360,7 @@ static int rzg2l_mod_clock_endisable(struct clk_hw *hw, bool enable)
360360
return 0;
361361

362362
for (i = 1000; i > 0; --i) {
363-
if (((readl(priv->base + CLK_MON_R(reg))) & clock->onoff))
363+
if (((readl(priv->base + CLK_MON_R(reg))) & bitmask))
364364
break;
365365
cpu_relax();
366366
}
@@ -388,6 +388,7 @@ static int rzg2l_mod_clock_is_enabled(struct clk_hw *hw)
388388
{
389389
struct mstp_clock *clock = to_mod_clock(hw);
390390
struct rzg2l_cpg_priv *priv = clock->priv;
391+
u32 bitmask = BIT(clock->bit);
391392
u32 value;
392393

393394
if (!clock->off) {
@@ -397,7 +398,7 @@ static int rzg2l_mod_clock_is_enabled(struct clk_hw *hw)
397398

398399
value = readl(priv->base + CLK_MON_R(clock->off));
399400

400-
return !(value & clock->onoff);
401+
return !(value & bitmask);
401402
}
402403

403404
static const struct clk_ops rzg2l_mod_clock_ops = {
@@ -457,8 +458,7 @@ rzg2l_cpg_register_mod_clk(const struct rzg2l_mod_clk *mod,
457458
init.num_parents = 1;
458459

459460
clock->off = mod->off;
460-
clock->onoff = mod->onoff;
461-
clock->reset = mod->reset;
461+
clock->bit = mod->bit;
462462
clock->priv = priv;
463463
clock->hw.init = &init;
464464

@@ -483,12 +483,11 @@ static int rzg2l_cpg_reset(struct reset_controller_dev *rcdev,
483483
{
484484
struct rzg2l_cpg_priv *priv = rcdev_to_priv(rcdev);
485485
const struct rzg2l_cpg_info *info = priv->info;
486-
unsigned int reg = info->mod_clks[id].off;
487-
u32 dis = info->mod_clks[id].reset;
486+
unsigned int reg = info->resets[id].off;
487+
u32 dis = BIT(info->resets[id].bit);
488488
u32 we = dis << 16;
489489

490-
dev_dbg(rcdev->dev, "reset name:%s id:%ld offset:0x%x\n",
491-
info->mod_clks[id].name, id, CLK_RST_R(reg));
490+
dev_dbg(rcdev->dev, "reset id:%ld offset:0x%x\n", id, CLK_RST_R(reg));
492491

493492
/* Reset module */
494493
writel(we, priv->base + CLK_RST_R(reg));
@@ -507,11 +506,10 @@ static int rzg2l_cpg_assert(struct reset_controller_dev *rcdev,
507506
{
508507
struct rzg2l_cpg_priv *priv = rcdev_to_priv(rcdev);
509508
const struct rzg2l_cpg_info *info = priv->info;
510-
unsigned int reg = info->mod_clks[id].off;
511-
u32 value = info->mod_clks[id].reset << 16;
509+
unsigned int reg = info->resets[id].off;
510+
u32 value = BIT(info->resets[id].bit) << 16;
512511

513-
dev_dbg(rcdev->dev, "assert name:%s id:%ld offset:0x%x\n",
514-
info->mod_clks[id].name, id, CLK_RST_R(reg));
512+
dev_dbg(rcdev->dev, "assert id:%ld offset:0x%x\n", id, CLK_RST_R(reg));
515513

516514
writel(value, priv->base + CLK_RST_R(reg));
517515
return 0;
@@ -522,12 +520,12 @@ static int rzg2l_cpg_deassert(struct reset_controller_dev *rcdev,
522520
{
523521
struct rzg2l_cpg_priv *priv = rcdev_to_priv(rcdev);
524522
const struct rzg2l_cpg_info *info = priv->info;
525-
unsigned int reg = info->mod_clks[id].off;
526-
u32 dis = info->mod_clks[id].reset;
523+
unsigned int reg = info->resets[id].off;
524+
u32 dis = BIT(info->resets[id].bit);
527525
u32 value = (dis << 16) | dis;
528526

529-
dev_dbg(rcdev->dev, "deassert name:%s id:%ld offset:0x%x\n",
530-
info->mod_clks[id].name, id, CLK_RST_R(reg));
527+
dev_dbg(rcdev->dev, "deassert id:%ld offset:0x%x\n", id,
528+
CLK_RST_R(reg));
531529

532530
writel(value, priv->base + CLK_RST_R(reg));
533531
return 0;
@@ -538,8 +536,8 @@ static int rzg2l_cpg_status(struct reset_controller_dev *rcdev,
538536
{
539537
struct rzg2l_cpg_priv *priv = rcdev_to_priv(rcdev);
540538
const struct rzg2l_cpg_info *info = priv->info;
541-
unsigned int reg = info->mod_clks[id].off;
542-
u32 bitmask = info->mod_clks[id].reset;
539+
unsigned int reg = info->resets[id].off;
540+
u32 bitmask = BIT(info->resets[id].bit);
543541

544542
return !(readl(priv->base + CLK_MRST_R(reg)) & bitmask);
545543
}
@@ -554,9 +552,11 @@ static const struct reset_control_ops rzg2l_cpg_reset_ops = {
554552
static int rzg2l_cpg_reset_xlate(struct reset_controller_dev *rcdev,
555553
const struct of_phandle_args *reset_spec)
556554
{
555+
struct rzg2l_cpg_priv *priv = rcdev_to_priv(rcdev);
556+
const struct rzg2l_cpg_info *info = priv->info;
557557
unsigned int id = reset_spec->args[0];
558558

559-
if (id >= rcdev->nr_resets) {
559+
if (id >= rcdev->nr_resets || !info->resets[id].off) {
560560
dev_err(rcdev->dev, "Invalid reset index %u\n", id);
561561
return -EINVAL;
562562
}
@@ -571,7 +571,7 @@ static int rzg2l_cpg_reset_controller_register(struct rzg2l_cpg_priv *priv)
571571
priv->rcdev.dev = priv->dev;
572572
priv->rcdev.of_reset_n_cells = 1;
573573
priv->rcdev.of_xlate = rzg2l_cpg_reset_xlate;
574-
priv->rcdev.nr_resets = priv->num_mod_clks;
574+
priv->rcdev.nr_resets = priv->num_resets;
575575

576576
return devm_reset_controller_register(priv->dev, &priv->rcdev);
577577
}
@@ -699,6 +699,7 @@ static int __init rzg2l_cpg_probe(struct platform_device *pdev)
699699
priv->clks = clks;
700700
priv->num_core_clks = info->num_total_core_clks;
701701
priv->num_mod_clks = info->num_hw_mod_clks;
702+
priv->num_resets = info->num_resets;
702703
priv->last_dt_core_clk = info->last_dt_core_clk;
703704

704705
for (i = 0; i < nclks; i++)

drivers/clk/renesas/renesas-rzg2l-cpg.h

Lines changed: 27 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -77,26 +77,40 @@ enum clk_types {
7777
* @id: clock index in array containing all Core and Module Clocks
7878
* @parent: id of parent clock
7979
* @off: register offset
80-
* @onoff: ON/MON bits
81-
* @reset: reset bits
80+
* @bit: ON/MON bit
8281
*/
8382
struct rzg2l_mod_clk {
8483
const char *name;
8584
unsigned int id;
8685
unsigned int parent;
8786
u16 off;
88-
u8 onoff;
89-
u8 reset;
87+
u8 bit;
9088
};
9189

92-
#define DEF_MOD(_name, _id, _parent, _off, _onoff, _reset) \
93-
[_id] = { \
90+
#define DEF_MOD(_name, _id, _parent, _off, _bit) \
91+
{ \
9492
.name = _name, \
95-
.id = MOD_CLK_BASE + _id, \
93+
.id = MOD_CLK_BASE + (_id), \
9694
.parent = (_parent), \
9795
.off = (_off), \
98-
.onoff = (_onoff), \
99-
.reset = (_reset) \
96+
.bit = (_bit), \
97+
}
98+
99+
/**
100+
* struct rzg2l_reset - Reset definitions
101+
*
102+
* @off: register offset
103+
* @bit: reset bit
104+
*/
105+
struct rzg2l_reset {
106+
u16 off;
107+
u8 bit;
108+
};
109+
110+
#define DEF_RST(_id, _off, _bit) \
111+
[_id] = { \
112+
.off = (_off), \
113+
.bit = (_bit) \
100114
}
101115

102116
/**
@@ -127,6 +141,10 @@ struct rzg2l_cpg_info {
127141
unsigned int num_mod_clks;
128142
unsigned int num_hw_mod_clks;
129143

144+
/* Resets */
145+
const struct rzg2l_reset *resets;
146+
unsigned int num_resets;
147+
130148
/* Critical Module Clocks that should not be disabled */
131149
const unsigned int *crit_mod_clks;
132150
unsigned int num_crit_mod_clks;

0 commit comments

Comments
 (0)